1//===- OutputSegment.h ------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLD_MACHO_OUTPUT_SEGMENT_H
10#define LLD_MACHO_OUTPUT_SEGMENT_H
11
12#include "OutputSection.h"
13#include "Symbols.h"
14#include "lld/Common/LLVM.h"
15#include "llvm/ADT/TinyPtrVector.h"
16
17#include <limits>
18#include <vector>
19
20namespace lld::macho {
21
22namespace segment_names {
23
24constexpr const char dataConst[] = "__DATA_CONST";
25constexpr const char dataDirty[] = "__DATA_DIRTY";
26constexpr const char data[] = "__DATA";
27constexpr const char dwarf[] = "__DWARF";
28constexpr const char import[] = "__IMPORT";
29constexpr const char ld[] = "__LD"; // output only with -r
30constexpr const char linkEdit[] = "__LINKEDIT";
31constexpr const char llvm[] = "__LLVM";
32constexpr const char pageZero[] = "__PAGEZERO";
33constexpr const char textExec[] = "__TEXT_EXEC";
34constexpr const char text[] = "__TEXT";
35
36} // namespace segment_names
37
38class OutputSection;
39class InputSection;
40
41class OutputSegment {
42public:
43 void addOutputSection(OutputSection *os);
44 void sortOutputSections();
45 void assignAddressesToStartEndSymbols();
46
47 const std::vector<OutputSection *> &getSections() const { return sections; }
48 size_t numNonHiddenSections() const;
49
50 uint64_t fileOff = 0;
51 uint64_t fileSize = 0;
52 uint64_t addr = 0;
53 uint64_t vmSize = 0;
54 int inputOrder = UnspecifiedInputOrder;
55 StringRef name;
56 uint32_t maxProt = 0;
57 uint32_t initProt = 0;
58 uint32_t flags = 0;
59 uint8_t index;
60
61 llvm::TinyPtrVector<Defined *> segmentStartSymbols;
62 llvm::TinyPtrVector<Defined *> segmentEndSymbols;
63
64private:
65 std::vector<OutputSection *> sections;
66};
67
68extern std::vector<OutputSegment *> outputSegments;
69
70void sortOutputSegments();
71void resetOutputSegments();
72
73OutputSegment *getOrCreateOutputSegment(StringRef name);
74
75} // namespace lld::macho
76
77#endif
78