16acd3003SFangrui Song //===- OutputSegment.h ------------------------------------------*- C++ -*-===// 26acd3003SFangrui Song // 36acd3003SFangrui Song // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 46acd3003SFangrui Song // See https://llvm.org/LICENSE.txt for license information. 56acd3003SFangrui Song // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66acd3003SFangrui Song // 76acd3003SFangrui Song //===----------------------------------------------------------------------===// 86acd3003SFangrui Song 96acd3003SFangrui Song #ifndef LLD_MACHO_OUTPUT_SEGMENT_H 106acd3003SFangrui Song #define LLD_MACHO_OUTPUT_SEGMENT_H 116acd3003SFangrui Song 126cb07313SKellie Medlin #include "OutputSection.h" 1380caa1ebSNico Weber #include "Symbols.h" 146acd3003SFangrui Song #include "lld/Common/LLVM.h" 1580caa1ebSNico Weber #include "llvm/ADT/TinyPtrVector.h" 166acd3003SFangrui Song 17fcab06bdSJez Ng #include <limits> 18d93b678aSNikita Popov #include <vector> 19fcab06bdSJez Ng 20bf20d43fSNico Weber namespace lld::macho { 216acd3003SFangrui Song 226f63216cSJez Ng namespace segment_names { 236f63216cSJez Ng 243646ee50SJez Ng constexpr const char dataConst[] = "__DATA_CONST"; 25465204d6SGreg McGary constexpr const char dataDirty[] = "__DATA_DIRTY"; 26465204d6SGreg McGary constexpr const char data[] = "__DATA"; 273fcb0eebSJez Ng constexpr const char dwarf[] = "__DWARF"; 28465204d6SGreg McGary constexpr const char import[] = "__IMPORT"; 29465204d6SGreg McGary constexpr const char ld[] = "__LD"; // output only with -r 30465204d6SGreg McGary constexpr const char linkEdit[] = "__LINKEDIT"; 31ca675104SJez Ng constexpr const char llvm[] = "__LLVM"; 32465204d6SGreg McGary constexpr const char pageZero[] = "__PAGEZERO"; 33465204d6SGreg McGary constexpr const char textExec[] = "__TEXT_EXEC"; 34465204d6SGreg McGary constexpr const char text[] = "__TEXT"; 356f63216cSJez Ng 366f63216cSJez Ng } // namespace segment_names 376f63216cSJez Ng 386cb07313SKellie Medlin class OutputSection; 396acd3003SFangrui Song class InputSection; 406acd3003SFangrui Song 416acd3003SFangrui Song class OutputSegment { 426acd3003SFangrui Song public: 436cb07313SKellie Medlin void addOutputSection(OutputSection *os); 447599e98aSJez Ng void sortOutputSections(); 4580caa1ebSNico Weber void assignAddressesToStartEndSymbols(); 466f63216cSJez Ng 473646ee50SJez Ng const std::vector<OutputSection *> &getSections() const { return sections; } 486cb07313SKellie Medlin size_t numNonHiddenSections() const; 496f63216cSJez Ng 506f63216cSJez Ng uint64_t fileOff = 0; 51151990ddSGreg McGary uint64_t fileSize = 0; 529482aa98SNico Weber uint64_t addr = 0; 53bb62ef99SJez Ng uint64_t vmSize = 0; 54f79e7a5aSJez Ng int inputOrder = UnspecifiedInputOrder; 556acd3003SFangrui Song StringRef name; 566f63216cSJez Ng uint32_t maxProt = 0; 576f63216cSJez Ng uint32_t initProt = 0; 58f7b752d2SDaniel Bertalan uint32_t flags = 0; 59060efd24SJez Ng uint8_t index; 60*58f3c5e6SLeonard Grey bool needsThunks = false; 616f63216cSJez Ng 6280caa1ebSNico Weber llvm::TinyPtrVector<Defined *> segmentStartSymbols; 6380caa1ebSNico Weber llvm::TinyPtrVector<Defined *> segmentEndSymbols; 6480caa1ebSNico Weber 656f63216cSJez Ng private: 663646ee50SJez Ng std::vector<OutputSection *> sections; 676acd3003SFangrui Song }; 686acd3003SFangrui Song 696acd3003SFangrui Song extern std::vector<OutputSegment *> outputSegments; 706acd3003SFangrui Song 717599e98aSJez Ng void sortOutputSegments(); 720f6d720fSShoaib Meenai void resetOutputSegments(); 737599e98aSJez Ng 746f63216cSJez Ng OutputSegment *getOrCreateOutputSegment(StringRef name); 756acd3003SFangrui Song 76bf20d43fSNico Weber } // namespace lld::macho 776acd3003SFangrui Song 786acd3003SFangrui Song #endif 79