annotate lld/wasm/OutputSections.h @ 213:25ca0248ac32

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Jul 2021 17:05:31 +0900
parents 2e18cbf3894f
children c4bab56944e8
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_WASM_OUTPUT_SECTIONS_H
anatofuz
parents:
diff changeset
10 #define LLD_WASM_OUTPUT_SECTIONS_H
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include "InputChunks.h"
anatofuz
parents:
diff changeset
13 #include "WriterUtils.h"
anatofuz
parents:
diff changeset
14 #include "lld/Common/ErrorHandler.h"
anatofuz
parents:
diff changeset
15 #include "lld/Common/LLVM.h"
anatofuz
parents:
diff changeset
16 #include "llvm/ADT/DenseMap.h"
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 namespace lld {
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 namespace wasm {
anatofuz
parents:
diff changeset
21 class OutputSection;
anatofuz
parents:
diff changeset
22 }
anatofuz
parents:
diff changeset
23 std::string toString(const wasm::OutputSection &section);
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 namespace wasm {
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 class OutputSegment;
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 class OutputSection {
anatofuz
parents:
diff changeset
30 public:
anatofuz
parents:
diff changeset
31 OutputSection(uint32_t type, std::string name = "")
anatofuz
parents:
diff changeset
32 : type(type), name(name) {}
anatofuz
parents:
diff changeset
33 virtual ~OutputSection() = default;
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 StringRef getSectionName() const;
anatofuz
parents:
diff changeset
36 void setOffset(size_t newOffset) {
anatofuz
parents:
diff changeset
37 log("setOffset: " + toString(*this) + ": " + Twine(newOffset));
anatofuz
parents:
diff changeset
38 offset = newOffset;
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40 void createHeader(size_t bodySize);
anatofuz
parents:
diff changeset
41 virtual bool isNeeded() const { return true; }
anatofuz
parents:
diff changeset
42 virtual size_t getSize() const = 0;
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
43 virtual size_t getOffset() { return offset; }
150
anatofuz
parents:
diff changeset
44 virtual void writeTo(uint8_t *buf) = 0;
anatofuz
parents:
diff changeset
45 virtual void finalizeContents() = 0;
anatofuz
parents:
diff changeset
46 virtual uint32_t getNumRelocations() const { return 0; }
anatofuz
parents:
diff changeset
47 virtual void writeRelocations(raw_ostream &os) const {}
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 std::string header;
anatofuz
parents:
diff changeset
50 uint32_t type;
anatofuz
parents:
diff changeset
51 uint32_t sectionIndex = UINT32_MAX;
anatofuz
parents:
diff changeset
52 std::string name;
anatofuz
parents:
diff changeset
53 OutputSectionSymbol *sectionSym = nullptr;
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 protected:
anatofuz
parents:
diff changeset
56 size_t offset = 0;
anatofuz
parents:
diff changeset
57 };
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 class CodeSection : public OutputSection {
anatofuz
parents:
diff changeset
60 public:
anatofuz
parents:
diff changeset
61 explicit CodeSection(ArrayRef<InputFunction *> functions)
anatofuz
parents:
diff changeset
62 : OutputSection(llvm::wasm::WASM_SEC_CODE), functions(functions) {}
anatofuz
parents:
diff changeset
63
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
64 static bool classof(const OutputSection *sec) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
65 return sec->type == llvm::wasm::WASM_SEC_CODE;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
67
150
anatofuz
parents:
diff changeset
68 size_t getSize() const override { return header.size() + bodySize; }
anatofuz
parents:
diff changeset
69 void writeTo(uint8_t *buf) override;
anatofuz
parents:
diff changeset
70 uint32_t getNumRelocations() const override;
anatofuz
parents:
diff changeset
71 void writeRelocations(raw_ostream &os) const override;
anatofuz
parents:
diff changeset
72 bool isNeeded() const override { return functions.size() > 0; }
anatofuz
parents:
diff changeset
73 void finalizeContents() override;
anatofuz
parents:
diff changeset
74
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
75 ArrayRef<InputFunction *> functions;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
76
150
anatofuz
parents:
diff changeset
77 protected:
anatofuz
parents:
diff changeset
78 std::string codeSectionHeader;
anatofuz
parents:
diff changeset
79 size_t bodySize = 0;
anatofuz
parents:
diff changeset
80 };
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 class DataSection : public OutputSection {
anatofuz
parents:
diff changeset
83 public:
anatofuz
parents:
diff changeset
84 explicit DataSection(ArrayRef<OutputSegment *> segments)
anatofuz
parents:
diff changeset
85 : OutputSection(llvm::wasm::WASM_SEC_DATA), segments(segments) {}
anatofuz
parents:
diff changeset
86
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
87 static bool classof(const OutputSection *sec) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
88 return sec->type == llvm::wasm::WASM_SEC_DATA;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
89 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
90
150
anatofuz
parents:
diff changeset
91 size_t getSize() const override { return header.size() + bodySize; }
anatofuz
parents:
diff changeset
92 void writeTo(uint8_t *buf) override;
anatofuz
parents:
diff changeset
93 uint32_t getNumRelocations() const override;
anatofuz
parents:
diff changeset
94 void writeRelocations(raw_ostream &os) const override;
anatofuz
parents:
diff changeset
95 bool isNeeded() const override;
anatofuz
parents:
diff changeset
96 void finalizeContents() override;
anatofuz
parents:
diff changeset
97
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
98 ArrayRef<OutputSegment *> segments;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
99
150
anatofuz
parents:
diff changeset
100 protected:
anatofuz
parents:
diff changeset
101 std::string dataSectionHeader;
anatofuz
parents:
diff changeset
102 size_t bodySize = 0;
anatofuz
parents:
diff changeset
103 };
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 // Represents a custom section in the output file. Wasm custom sections are
anatofuz
parents:
diff changeset
106 // used for storing user-defined metadata. Unlike the core sections types
anatofuz
parents:
diff changeset
107 // they are identified by their string name.
anatofuz
parents:
diff changeset
108 // The linker combines custom sections that have the same name by simply
anatofuz
parents:
diff changeset
109 // concatenating them.
anatofuz
parents:
diff changeset
110 // Note that some custom sections such as "name" and "linking" are handled
anatofuz
parents:
diff changeset
111 // separately and are instead synthesized by the linker.
anatofuz
parents:
diff changeset
112 class CustomSection : public OutputSection {
anatofuz
parents:
diff changeset
113 public:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
114 CustomSection(std::string name, ArrayRef<InputChunk *> inputSections)
150
anatofuz
parents:
diff changeset
115 : OutputSection(llvm::wasm::WASM_SEC_CUSTOM, name),
anatofuz
parents:
diff changeset
116 inputSections(inputSections) {}
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
118 static bool classof(const OutputSection *sec) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
119 return sec->type == llvm::wasm::WASM_SEC_CUSTOM;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
120 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
121
150
anatofuz
parents:
diff changeset
122 size_t getSize() const override {
anatofuz
parents:
diff changeset
123 return header.size() + nameData.size() + payloadSize;
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125 void writeTo(uint8_t *buf) override;
anatofuz
parents:
diff changeset
126 uint32_t getNumRelocations() const override;
anatofuz
parents:
diff changeset
127 void writeRelocations(raw_ostream &os) const override;
anatofuz
parents:
diff changeset
128 void finalizeContents() override;
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 protected:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
131 void finalizeInputSections();
150
anatofuz
parents:
diff changeset
132 size_t payloadSize = 0;
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 std::vector<InputChunk *> inputSections;
150
anatofuz
parents:
diff changeset
134 std::string nameData;
anatofuz
parents:
diff changeset
135 };
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 } // namespace wasm
anatofuz
parents:
diff changeset
138 } // namespace lld
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 #endif // LLD_WASM_OUTPUT_SECTIONS_H