xref: /llvm-project/lld/MachO/OutputSegment.h (revision 58f3c5e696021d9e571f868ed3bb4b27b3722df4)
1 //===- OutputSegment.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_OUTPUT_SEGMENT_H
10 #define LLD_MACHO_OUTPUT_SEGMENT_H
11 
12 #include "OutputSection.h"
13 #include "Symbols.h"
14 #include "lld/Common/LLVM.h"
15 #include "llvm/ADT/TinyPtrVector.h"
16 
17 #include <limits>
18 #include <vector>
19 
20 namespace lld::macho {
21 
22 namespace segment_names {
23 
24 constexpr const char dataConst[] = "__DATA_CONST";
25 constexpr const char dataDirty[] = "__DATA_DIRTY";
26 constexpr const char data[] = "__DATA";
27 constexpr const char dwarf[] = "__DWARF";
28 constexpr const char import[] = "__IMPORT";
29 constexpr const char ld[] = "__LD"; // output only with -r
30 constexpr const char linkEdit[] = "__LINKEDIT";
31 constexpr const char llvm[] = "__LLVM";
32 constexpr const char pageZero[] = "__PAGEZERO";
33 constexpr const char textExec[] = "__TEXT_EXEC";
34 constexpr const char text[] = "__TEXT";
35 
36 } // namespace segment_names
37 
38 class OutputSection;
39 class InputSection;
40 
41 class OutputSegment {
42 public:
43   void addOutputSection(OutputSection *os);
44   void sortOutputSections();
45   void assignAddressesToStartEndSymbols();
46 
47   const std::vector<OutputSection *> &getSections() const { return sections; }
48   size_t numNonHiddenSections() const;
49 
50   uint64_t fileOff = 0;
51   uint64_t fileSize = 0;
52   uint64_t addr = 0;
53   uint64_t vmSize = 0;
54   int inputOrder = UnspecifiedInputOrder;
55   StringRef name;
56   uint32_t maxProt = 0;
57   uint32_t initProt = 0;
58   uint32_t flags = 0;
59   uint8_t index;
60   bool needsThunks = false;
61 
62   llvm::TinyPtrVector<Defined *> segmentStartSymbols;
63   llvm::TinyPtrVector<Defined *> segmentEndSymbols;
64 
65 private:
66   std::vector<OutputSection *> sections;
67 };
68 
69 extern std::vector<OutputSegment *> outputSegments;
70 
71 void sortOutputSegments();
72 void resetOutputSegments();
73 
74 OutputSegment *getOrCreateOutputSegment(StringRef name);
75 
76 } // namespace lld::macho
77 
78 #endif
79