xref: /freebsd-src/contrib/llvm-project/lld/MachO/OutputSegment.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
15ffd83dbSDimitry Andric //===- OutputSegment.h ------------------------------------------*- C++ -*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric 
95ffd83dbSDimitry Andric #ifndef LLD_MACHO_OUTPUT_SEGMENT_H
105ffd83dbSDimitry Andric #define LLD_MACHO_OUTPUT_SEGMENT_H
115ffd83dbSDimitry Andric 
125ffd83dbSDimitry Andric #include "OutputSection.h"
13fe6060f1SDimitry Andric #include "Symbols.h"
145ffd83dbSDimitry Andric #include "lld/Common/LLVM.h"
15fe6060f1SDimitry Andric #include "llvm/ADT/TinyPtrVector.h"
16fe6060f1SDimitry Andric 
17fe6060f1SDimitry Andric #include <limits>
18fe6060f1SDimitry Andric #include <vector>
195ffd83dbSDimitry Andric 
20*bdd1243dSDimitry Andric namespace lld::macho {
215ffd83dbSDimitry Andric 
225ffd83dbSDimitry Andric namespace segment_names {
235ffd83dbSDimitry Andric 
245ffd83dbSDimitry Andric constexpr const char dataConst[] = "__DATA_CONST";
25fe6060f1SDimitry Andric constexpr const char dataDirty[] = "__DATA_DIRTY";
26fe6060f1SDimitry Andric constexpr const char data[] = "__DATA";
27e8d8bef9SDimitry Andric constexpr const char dwarf[] = "__DWARF";
28fe6060f1SDimitry Andric constexpr const char import[] = "__IMPORT";
29fe6060f1SDimitry Andric constexpr const char ld[] = "__LD"; // output only with -r
30fe6060f1SDimitry Andric constexpr const char linkEdit[] = "__LINKEDIT";
31fe6060f1SDimitry Andric constexpr const char llvm[] = "__LLVM";
32fe6060f1SDimitry Andric constexpr const char pageZero[] = "__PAGEZERO";
33fe6060f1SDimitry Andric constexpr const char textExec[] = "__TEXT_EXEC";
34fe6060f1SDimitry Andric constexpr const char text[] = "__TEXT";
355ffd83dbSDimitry Andric 
365ffd83dbSDimitry Andric } // namespace segment_names
375ffd83dbSDimitry Andric 
385ffd83dbSDimitry Andric class OutputSection;
395ffd83dbSDimitry Andric class InputSection;
405ffd83dbSDimitry Andric 
415ffd83dbSDimitry Andric class OutputSegment {
425ffd83dbSDimitry Andric public:
435ffd83dbSDimitry Andric   void addOutputSection(OutputSection *os);
44fe6060f1SDimitry Andric   void sortOutputSections();
45fe6060f1SDimitry Andric   void assignAddressesToStartEndSymbols();
465ffd83dbSDimitry Andric 
getSections()475ffd83dbSDimitry Andric   const std::vector<OutputSection *> &getSections() const { return sections; }
485ffd83dbSDimitry Andric   size_t numNonHiddenSections() const;
495ffd83dbSDimitry Andric 
505ffd83dbSDimitry Andric   uint64_t fileOff = 0;
51fe6060f1SDimitry Andric   uint64_t fileSize = 0;
52fe6060f1SDimitry Andric   uint64_t addr = 0;
53fe6060f1SDimitry Andric   uint64_t vmSize = 0;
54fe6060f1SDimitry Andric   int inputOrder = UnspecifiedInputOrder;
555ffd83dbSDimitry Andric   StringRef name;
565ffd83dbSDimitry Andric   uint32_t maxProt = 0;
575ffd83dbSDimitry Andric   uint32_t initProt = 0;
58*bdd1243dSDimitry Andric   uint32_t flags = 0;
595ffd83dbSDimitry Andric   uint8_t index;
605ffd83dbSDimitry Andric 
61fe6060f1SDimitry Andric   llvm::TinyPtrVector<Defined *> segmentStartSymbols;
62fe6060f1SDimitry Andric   llvm::TinyPtrVector<Defined *> segmentEndSymbols;
63fe6060f1SDimitry Andric 
645ffd83dbSDimitry Andric private:
655ffd83dbSDimitry Andric   std::vector<OutputSection *> sections;
665ffd83dbSDimitry Andric };
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric extern std::vector<OutputSegment *> outputSegments;
695ffd83dbSDimitry Andric 
70fe6060f1SDimitry Andric void sortOutputSegments();
71349cc55cSDimitry Andric void resetOutputSegments();
72fe6060f1SDimitry Andric 
735ffd83dbSDimitry Andric OutputSegment *getOrCreateOutputSegment(StringRef name);
745ffd83dbSDimitry Andric 
75*bdd1243dSDimitry Andric } // namespace lld::macho
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric #endif
78