xref: /freebsd/contrib/llvm-project/lld/MachO/OutputSegment.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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"
13*fe6060f1SDimitry Andric #include "Symbols.h"
145ffd83dbSDimitry Andric #include "lld/Common/LLVM.h"
15*fe6060f1SDimitry Andric #include "llvm/ADT/TinyPtrVector.h"
16*fe6060f1SDimitry Andric 
17*fe6060f1SDimitry Andric #include <limits>
18*fe6060f1SDimitry Andric #include <vector>
195ffd83dbSDimitry Andric 
205ffd83dbSDimitry Andric namespace lld {
215ffd83dbSDimitry Andric namespace macho {
225ffd83dbSDimitry Andric 
235ffd83dbSDimitry Andric namespace segment_names {
245ffd83dbSDimitry Andric 
255ffd83dbSDimitry Andric constexpr const char dataConst[] = "__DATA_CONST";
26*fe6060f1SDimitry Andric constexpr const char dataDirty[] = "__DATA_DIRTY";
27*fe6060f1SDimitry Andric constexpr const char data[] = "__DATA";
28e8d8bef9SDimitry Andric constexpr const char dwarf[] = "__DWARF";
29*fe6060f1SDimitry Andric constexpr const char import[] = "__IMPORT";
30*fe6060f1SDimitry Andric constexpr const char ld[] = "__LD"; // output only with -r
31*fe6060f1SDimitry Andric constexpr const char linkEdit[] = "__LINKEDIT";
32*fe6060f1SDimitry Andric constexpr const char llvm[] = "__LLVM";
33*fe6060f1SDimitry Andric constexpr const char pageZero[] = "__PAGEZERO";
34*fe6060f1SDimitry Andric constexpr const char textExec[] = "__TEXT_EXEC";
35*fe6060f1SDimitry Andric constexpr const char text[] = "__TEXT";
365ffd83dbSDimitry Andric 
375ffd83dbSDimitry Andric } // namespace segment_names
385ffd83dbSDimitry Andric 
395ffd83dbSDimitry Andric class OutputSection;
405ffd83dbSDimitry Andric class InputSection;
415ffd83dbSDimitry Andric 
425ffd83dbSDimitry Andric class OutputSegment {
435ffd83dbSDimitry Andric public:
445ffd83dbSDimitry Andric   void addOutputSection(OutputSection *os);
45*fe6060f1SDimitry Andric   void sortOutputSections();
46*fe6060f1SDimitry Andric   void assignAddressesToStartEndSymbols();
475ffd83dbSDimitry Andric 
485ffd83dbSDimitry Andric   const std::vector<OutputSection *> &getSections() const { return sections; }
495ffd83dbSDimitry Andric   size_t numNonHiddenSections() const;
505ffd83dbSDimitry Andric 
515ffd83dbSDimitry Andric   uint64_t fileOff = 0;
52*fe6060f1SDimitry Andric   uint64_t fileSize = 0;
53*fe6060f1SDimitry Andric   uint64_t addr = 0;
54*fe6060f1SDimitry Andric   uint64_t vmSize = 0;
55*fe6060f1SDimitry Andric   int inputOrder = UnspecifiedInputOrder;
565ffd83dbSDimitry Andric   StringRef name;
575ffd83dbSDimitry Andric   uint32_t maxProt = 0;
585ffd83dbSDimitry Andric   uint32_t initProt = 0;
595ffd83dbSDimitry Andric   uint8_t index;
605ffd83dbSDimitry Andric 
61*fe6060f1SDimitry Andric   llvm::TinyPtrVector<Defined *> segmentStartSymbols;
62*fe6060f1SDimitry Andric   llvm::TinyPtrVector<Defined *> segmentEndSymbols;
63*fe6060f1SDimitry Andric 
645ffd83dbSDimitry Andric private:
655ffd83dbSDimitry Andric   std::vector<OutputSection *> sections;
665ffd83dbSDimitry Andric };
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric extern std::vector<OutputSegment *> outputSegments;
695ffd83dbSDimitry Andric 
70*fe6060f1SDimitry Andric void sortOutputSegments();
71*fe6060f1SDimitry Andric 
725ffd83dbSDimitry Andric OutputSegment *getOrCreateOutputSegment(StringRef name);
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric } // namespace macho
755ffd83dbSDimitry Andric } // namespace lld
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric #endif
78