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 61 llvm::TinyPtrVector<Defined *> segmentStartSymbols; 62 llvm::TinyPtrVector<Defined *> segmentEndSymbols; 63 64 private: 65 std::vector<OutputSection *> sections; 66 }; 67 68 extern std::vector<OutputSegment *> outputSegments; 69 70 void sortOutputSegments(); 71 void resetOutputSegments(); 72 73 OutputSegment *getOrCreateOutputSegment(StringRef name); 74 75 } // namespace lld::macho 76 77 #endif 78