xref: /llvm-project/lld/MachO/OutputSegment.h (revision 58f3c5e696021d9e571f868ed3bb4b27b3722df4)
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