annotate lld/ELF/OutputSections.h @ 192:d7606dcf6fce

Added tag llvm10 for changeset 0572611fdcc8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2020 18:01:34 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- OutputSections.h -----------------------------------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #ifndef LLD_ELF_OUTPUT_SECTIONS_H
anatofuz
parents:
diff changeset
10 #define LLD_ELF_OUTPUT_SECTIONS_H
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include "Config.h"
anatofuz
parents:
diff changeset
13 #include "InputSection.h"
anatofuz
parents:
diff changeset
14 #include "LinkerScript.h"
anatofuz
parents:
diff changeset
15 #include "Relocations.h"
anatofuz
parents:
diff changeset
16 #include "lld/Common/LLVM.h"
anatofuz
parents:
diff changeset
17 #include "llvm/MC/StringTableBuilder.h"
anatofuz
parents:
diff changeset
18 #include "llvm/Object/ELF.h"
anatofuz
parents:
diff changeset
19 #include <array>
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 namespace lld {
anatofuz
parents:
diff changeset
22 namespace elf {
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 struct PhdrEntry;
anatofuz
parents:
diff changeset
25 class InputSection;
anatofuz
parents:
diff changeset
26 class InputSectionBase;
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 // This represents a section in an output file.
anatofuz
parents:
diff changeset
29 // It is composed of multiple InputSections.
anatofuz
parents:
diff changeset
30 // The writer creates multiple OutputSections and assign them unique,
anatofuz
parents:
diff changeset
31 // non-overlapping file offsets and VAs.
anatofuz
parents:
diff changeset
32 class OutputSection final : public BaseCommand, public SectionBase {
anatofuz
parents:
diff changeset
33 public:
anatofuz
parents:
diff changeset
34 OutputSection(StringRef name, uint32_t type, uint64_t flags);
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 static bool classof(const SectionBase *s) {
anatofuz
parents:
diff changeset
37 return s->kind() == SectionBase::Output;
anatofuz
parents:
diff changeset
38 }
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 static bool classof(const BaseCommand *c);
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 uint64_t getLMA() const { return ptLoad ? addr + ptLoad->lmaOffset : addr; }
anatofuz
parents:
diff changeset
43 template <typename ELFT> void writeHeaderTo(typename ELFT::Shdr *sHdr);
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 uint32_t sectionIndex = UINT32_MAX;
anatofuz
parents:
diff changeset
46 unsigned sortRank;
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 uint32_t getPhdrFlags() const;
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 // Pointer to the PT_LOAD segment, which this section resides in. This field
anatofuz
parents:
diff changeset
51 // is used to correctly compute file offset of a section. When two sections
anatofuz
parents:
diff changeset
52 // share the same load segment, difference between their file offsets should
anatofuz
parents:
diff changeset
53 // be equal to difference between their virtual addresses. To compute some
anatofuz
parents:
diff changeset
54 // section offset we use the following formula: Off = Off_first + VA -
anatofuz
parents:
diff changeset
55 // VA_first, where Off_first and VA_first is file offset and VA of first
anatofuz
parents:
diff changeset
56 // section in PT_LOAD.
anatofuz
parents:
diff changeset
57 PhdrEntry *ptLoad = nullptr;
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 // Pointer to a relocation section for this section. Usually nullptr because
anatofuz
parents:
diff changeset
60 // we consume relocations, but if --emit-relocs is specified (which is rare),
anatofuz
parents:
diff changeset
61 // it may have a non-null value.
anatofuz
parents:
diff changeset
62 OutputSection *relocationSection = nullptr;
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 // Initially this field is the number of InputSections that have been added to
anatofuz
parents:
diff changeset
65 // the OutputSection so far. Later on, after a call to assignAddresses, it
anatofuz
parents:
diff changeset
66 // corresponds to the Elf_Shdr member.
anatofuz
parents:
diff changeset
67 uint64_t size = 0;
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 // The following fields correspond to Elf_Shdr members.
anatofuz
parents:
diff changeset
70 uint64_t offset = 0;
anatofuz
parents:
diff changeset
71 uint64_t addr = 0;
anatofuz
parents:
diff changeset
72 uint32_t shName = 0;
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 void recordSection(InputSectionBase *isec);
anatofuz
parents:
diff changeset
75 void commitSection(InputSection *isec);
anatofuz
parents:
diff changeset
76 void finalizeInputSections();
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 // The following members are normally only used in linker scripts.
anatofuz
parents:
diff changeset
79 MemoryRegion *memRegion = nullptr;
anatofuz
parents:
diff changeset
80 MemoryRegion *lmaRegion = nullptr;
anatofuz
parents:
diff changeset
81 Expr addrExpr;
anatofuz
parents:
diff changeset
82 Expr alignExpr;
anatofuz
parents:
diff changeset
83 Expr lmaExpr;
anatofuz
parents:
diff changeset
84 Expr subalignExpr;
anatofuz
parents:
diff changeset
85 std::vector<BaseCommand *> sectionCommands;
anatofuz
parents:
diff changeset
86 std::vector<StringRef> phdrs;
anatofuz
parents:
diff changeset
87 llvm::Optional<std::array<uint8_t, 4>> filler;
anatofuz
parents:
diff changeset
88 ConstraintKind constraint = ConstraintKind::NoConstraint;
anatofuz
parents:
diff changeset
89 std::string location;
anatofuz
parents:
diff changeset
90 std::string memoryRegionName;
anatofuz
parents:
diff changeset
91 std::string lmaRegionName;
anatofuz
parents:
diff changeset
92 bool nonAlloc = false;
anatofuz
parents:
diff changeset
93 bool noload = false;
anatofuz
parents:
diff changeset
94 bool expressionsUseSymbols = false;
anatofuz
parents:
diff changeset
95 bool usedInExpression = false;
anatofuz
parents:
diff changeset
96 bool inOverlay = false;
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 // Tracks whether the section has ever had an input section added to it, even
anatofuz
parents:
diff changeset
99 // if the section was later removed (e.g. because it is a synthetic section
anatofuz
parents:
diff changeset
100 // that wasn't needed). This is needed for orphan placement.
anatofuz
parents:
diff changeset
101 bool hasInputSections = false;
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 void finalize();
anatofuz
parents:
diff changeset
104 template <class ELFT> void writeTo(uint8_t *buf);
anatofuz
parents:
diff changeset
105 template <class ELFT> void maybeCompress();
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 void sort(llvm::function_ref<int(InputSectionBase *s)> order);
anatofuz
parents:
diff changeset
108 void sortInitFini();
anatofuz
parents:
diff changeset
109 void sortCtorsDtors();
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 private:
anatofuz
parents:
diff changeset
112 // Used for implementation of --compress-debug-sections option.
anatofuz
parents:
diff changeset
113 std::vector<uint8_t> zDebugHeader;
anatofuz
parents:
diff changeset
114 llvm::SmallVector<char, 1> compressedData;
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 std::array<uint8_t, 4> getFiller();
anatofuz
parents:
diff changeset
117 };
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 int getPriority(StringRef s);
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 InputSection *getFirstInputSection(const OutputSection *os);
anatofuz
parents:
diff changeset
122 std::vector<InputSection *> getInputSections(const OutputSection *os);
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 // All output sections that are handled by the linker specially are
anatofuz
parents:
diff changeset
125 // globally accessible. Writer initializes them, so don't use them
anatofuz
parents:
diff changeset
126 // until Writer is initialized.
anatofuz
parents:
diff changeset
127 struct Out {
anatofuz
parents:
diff changeset
128 static uint8_t *bufferStart;
anatofuz
parents:
diff changeset
129 static uint8_t first;
anatofuz
parents:
diff changeset
130 static PhdrEntry *tlsPhdr;
anatofuz
parents:
diff changeset
131 static OutputSection *elfHeader;
anatofuz
parents:
diff changeset
132 static OutputSection *programHeaders;
anatofuz
parents:
diff changeset
133 static OutputSection *preinitArray;
anatofuz
parents:
diff changeset
134 static OutputSection *initArray;
anatofuz
parents:
diff changeset
135 static OutputSection *finiArray;
anatofuz
parents:
diff changeset
136 };
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 } // namespace elf
anatofuz
parents:
diff changeset
139 } // namespace lld
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 namespace lld {
anatofuz
parents:
diff changeset
142 namespace elf {
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 uint64_t getHeaderSize();
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 extern std::vector<OutputSection *> outputSections;
anatofuz
parents:
diff changeset
147 } // namespace elf
anatofuz
parents:
diff changeset
148 } // namespace lld
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 #endif