xref: /freebsd/contrib/llvm-project/lld/MachO/OutputSegment.h (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric //===- OutputSegment.h ------------------------------------------*- C++ -*-===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric 
9*5ffd83dbSDimitry Andric #ifndef LLD_MACHO_OUTPUT_SEGMENT_H
10*5ffd83dbSDimitry Andric #define LLD_MACHO_OUTPUT_SEGMENT_H
11*5ffd83dbSDimitry Andric 
12*5ffd83dbSDimitry Andric #include "OutputSection.h"
13*5ffd83dbSDimitry Andric #include "lld/Common/LLVM.h"
14*5ffd83dbSDimitry Andric 
15*5ffd83dbSDimitry Andric namespace lld {
16*5ffd83dbSDimitry Andric namespace macho {
17*5ffd83dbSDimitry Andric 
18*5ffd83dbSDimitry Andric namespace segment_names {
19*5ffd83dbSDimitry Andric 
20*5ffd83dbSDimitry Andric constexpr const char pageZero[] = "__PAGEZERO";
21*5ffd83dbSDimitry Andric constexpr const char text[] = "__TEXT";
22*5ffd83dbSDimitry Andric constexpr const char data[] = "__DATA";
23*5ffd83dbSDimitry Andric constexpr const char linkEdit[] = "__LINKEDIT";
24*5ffd83dbSDimitry Andric constexpr const char dataConst[] = "__DATA_CONST";
25*5ffd83dbSDimitry Andric 
26*5ffd83dbSDimitry Andric } // namespace segment_names
27*5ffd83dbSDimitry Andric 
28*5ffd83dbSDimitry Andric class OutputSection;
29*5ffd83dbSDimitry Andric class InputSection;
30*5ffd83dbSDimitry Andric 
31*5ffd83dbSDimitry Andric class OutputSegment {
32*5ffd83dbSDimitry Andric public:
33*5ffd83dbSDimitry Andric   const OutputSection *firstSection() const { return sections.front(); }
34*5ffd83dbSDimitry Andric   const OutputSection *lastSection() const { return sections.back(); }
35*5ffd83dbSDimitry Andric 
36*5ffd83dbSDimitry Andric   void addOutputSection(OutputSection *os);
37*5ffd83dbSDimitry Andric   void sortOutputSections(
38*5ffd83dbSDimitry Andric       llvm::function_ref<bool(OutputSection *, OutputSection *)> comparator) {
39*5ffd83dbSDimitry Andric     llvm::stable_sort(sections, comparator);
40*5ffd83dbSDimitry Andric   }
41*5ffd83dbSDimitry Andric 
42*5ffd83dbSDimitry Andric   const std::vector<OutputSection *> &getSections() const { return sections; }
43*5ffd83dbSDimitry Andric   size_t numNonHiddenSections() const;
44*5ffd83dbSDimitry Andric 
45*5ffd83dbSDimitry Andric   uint64_t fileOff = 0;
46*5ffd83dbSDimitry Andric   StringRef name;
47*5ffd83dbSDimitry Andric   uint32_t maxProt = 0;
48*5ffd83dbSDimitry Andric   uint32_t initProt = 0;
49*5ffd83dbSDimitry Andric   uint8_t index;
50*5ffd83dbSDimitry Andric 
51*5ffd83dbSDimitry Andric private:
52*5ffd83dbSDimitry Andric   std::vector<OutputSection *> sections;
53*5ffd83dbSDimitry Andric };
54*5ffd83dbSDimitry Andric 
55*5ffd83dbSDimitry Andric extern std::vector<OutputSegment *> outputSegments;
56*5ffd83dbSDimitry Andric 
57*5ffd83dbSDimitry Andric OutputSegment *getOrCreateOutputSegment(StringRef name);
58*5ffd83dbSDimitry Andric 
59*5ffd83dbSDimitry Andric } // namespace macho
60*5ffd83dbSDimitry Andric } // namespace lld
61*5ffd83dbSDimitry Andric 
62*5ffd83dbSDimitry Andric #endif
63