xref: /freebsd/contrib/llvm-project/lld/MachO/InputSection.h (revision 9e5787d2284e187abb5b654d924394a65772e004)
1 //===- InputSection.h -------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLD_MACHO_INPUT_SECTION_H
10 #define LLD_MACHO_INPUT_SECTION_H
11 
12 #include "lld/Common/LLVM.h"
13 #include "llvm/ADT/ArrayRef.h"
14 #include "llvm/ADT/PointerUnion.h"
15 #include "llvm/BinaryFormat/MachO.h"
16 
17 namespace lld {
18 namespace macho {
19 
20 class InputFile;
21 class InputSection;
22 class OutputSection;
23 class Symbol;
24 
25 struct Reloc {
26   uint8_t type;
27   bool pcrel;
28   uint8_t length;
29   // The offset from the start of the subsection that this relocation belongs
30   // to.
31   uint32_t offset;
32   // Adding this offset to the address of the target symbol or subsection gives
33   // the destination that this relocation refers to.
34   uint64_t addend;
35   llvm::PointerUnion<Symbol *, InputSection *> target;
36 };
37 
38 inline bool isZeroFill(uint8_t flags) {
39   return (flags & llvm::MachO::SECTION_TYPE) == llvm::MachO::S_ZEROFILL;
40 }
41 
42 class InputSection {
43 public:
44   virtual ~InputSection() = default;
45   virtual uint64_t getSize() const { return data.size(); }
46   virtual uint64_t getFileSize() const {
47     return isZeroFill(flags) ? 0 : getSize();
48   }
49   uint64_t getFileOffset() const;
50   uint64_t getVA() const;
51 
52   virtual void writeTo(uint8_t *buf);
53 
54   InputFile *file = nullptr;
55   StringRef name;
56   StringRef segname;
57 
58   OutputSection *parent = nullptr;
59   uint64_t outSecOff = 0;
60   uint64_t outSecFileOff = 0;
61 
62   uint32_t align = 1;
63   uint32_t flags = 0;
64 
65   ArrayRef<uint8_t> data;
66   std::vector<Reloc> relocs;
67 };
68 
69 extern std::vector<InputSection *> inputSections;
70 
71 } // namespace macho
72 } // namespace lld
73 
74 #endif
75