summaryrefslogtreecommitdiff
path: root/wasm/OutputSections.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-08-20 18:01:33 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-08-20 18:01:33 +0000
commit7d6988fdd2aee0e033034e147f16fe05594a60e4 (patch)
tree8aa90abd4e0cce6f71fd338ee32e9957135bc642 /wasm/OutputSections.cpp
parente2fd426bdafe9f5c10066d3926ece6e342184a67 (diff)
Notes
Diffstat (limited to 'wasm/OutputSections.cpp')
-rw-r--r--wasm/OutputSections.cpp249
1 files changed, 0 insertions, 249 deletions
diff --git a/wasm/OutputSections.cpp b/wasm/OutputSections.cpp
deleted file mode 100644
index 4123d63b7466..000000000000
--- a/wasm/OutputSections.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-//===- OutputSections.cpp -------------------------------------------------===//
-//
-// The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "OutputSections.h"
-#include "InputChunks.h"
-#include "InputFiles.h"
-#include "OutputSegment.h"
-#include "WriterUtils.h"
-#include "lld/Common/ErrorHandler.h"
-#include "lld/Common/Threads.h"
-#include "llvm/ADT/Twine.h"
-#include "llvm/Support/LEB128.h"
-
-#define DEBUG_TYPE "lld"
-
-using namespace llvm;
-using namespace llvm::wasm;
-using namespace lld;
-using namespace lld::wasm;
-
-static StringRef sectionTypeToString(uint32_t SectionType) {
- switch (SectionType) {
- case WASM_SEC_CUSTOM:
- return "CUSTOM";
- case WASM_SEC_TYPE:
- return "TYPE";
- case WASM_SEC_IMPORT:
- return "IMPORT";
- case WASM_SEC_FUNCTION:
- return "FUNCTION";
- case WASM_SEC_TABLE:
- return "TABLE";
- case WASM_SEC_MEMORY:
- return "MEMORY";
- case WASM_SEC_GLOBAL:
- return "GLOBAL";
- case WASM_SEC_EVENT:
- return "EVENT";
- case WASM_SEC_EXPORT:
- return "EXPORT";
- case WASM_SEC_START:
- return "START";
- case WASM_SEC_ELEM:
- return "ELEM";
- case WASM_SEC_CODE:
- return "CODE";
- case WASM_SEC_DATA:
- return "DATA";
- default:
- fatal("invalid section type");
- }
-}
-
-// Returns a string, e.g. "FUNCTION(.text)".
-std::string lld::toString(const OutputSection &Sec) {
- if (!Sec.Name.empty())
- return (Sec.getSectionName() + "(" + Sec.Name + ")").str();
- return Sec.getSectionName();
-}
-
-StringRef OutputSection::getSectionName() const {
- return sectionTypeToString(Type);
-}
-
-void OutputSection::createHeader(size_t BodySize) {
- raw_string_ostream OS(Header);
- debugWrite(OS.tell(), "section type [" + getSectionName() + "]");
- encodeULEB128(Type, OS);
- writeUleb128(OS, BodySize, "section size");
- OS.flush();
- log("createHeader: " + toString(*this) + " body=" + Twine(BodySize) +
- " total=" + Twine(getSize()));
-}
-
-CodeSection::CodeSection(ArrayRef<InputFunction *> Functions)
- : OutputSection(WASM_SEC_CODE), Functions(Functions) {
- assert(Functions.size() > 0);
-
- raw_string_ostream OS(CodeSectionHeader);
- writeUleb128(OS, Functions.size(), "function count");
- OS.flush();
- BodySize = CodeSectionHeader.size();
-
- for (InputFunction *Func : Functions) {
- Func->OutputOffset = BodySize;
- Func->calculateSize();
- BodySize += Func->getSize();
- }
-
- createHeader(BodySize);
-}
-
-void CodeSection::writeTo(uint8_t *Buf) {
- log("writing " + toString(*this));
- log(" size=" + Twine(getSize()));
- log(" headersize=" + Twine(Header.size()));
- log(" codeheadersize=" + Twine(CodeSectionHeader.size()));
- Buf += Offset;
-
- // Write section header
- memcpy(Buf, Header.data(), Header.size());
- Buf += Header.size();
-
- // Write code section headers
- memcpy(Buf, CodeSectionHeader.data(), CodeSectionHeader.size());
-
- // Write code section bodies
- parallelForEach(Functions,
- [&](const InputChunk *Chunk) { Chunk->writeTo(Buf); });
-}
-
-uint32_t CodeSection::numRelocations() const {
- uint32_t Count = 0;
- for (const InputChunk *Func : Functions)
- Count += Func->NumRelocations();
- return Count;
-}
-
-void CodeSection::writeRelocations(raw_ostream &OS) const {
- for (const InputChunk *C : Functions)
- C->writeRelocations(OS);
-}
-
-DataSection::DataSection(ArrayRef<OutputSegment *> Segments)
- : OutputSection(WASM_SEC_DATA), Segments(Segments) {
- raw_string_ostream OS(DataSectionHeader);
-
- writeUleb128(OS, Segments.size(), "data segment count");
- OS.flush();
- BodySize = DataSectionHeader.size();
-
- for (OutputSegment *Segment : Segments) {
- raw_string_ostream OS(Segment->Header);
- writeUleb128(OS, 0, "memory index");
- WasmInitExpr InitExpr;
- if (Config->Pic) {
- assert(Segments.size() <= 1 &&
- "Currenly only a single data segment is supported in PIC mode");
- InitExpr.Opcode = WASM_OPCODE_GLOBAL_GET;
- InitExpr.Value.Global = WasmSym::MemoryBase->getGlobalIndex();
- } else {
- InitExpr.Opcode = WASM_OPCODE_I32_CONST;
- InitExpr.Value.Int32 = Segment->StartVA;
- }
- writeInitExpr(OS, InitExpr);
- writeUleb128(OS, Segment->Size, "segment size");
- OS.flush();
-
- Segment->SectionOffset = BodySize;
- BodySize += Segment->Header.size() + Segment->Size;
- log("Data segment: size=" + Twine(Segment->Size));
-
- for (InputSegment *InputSeg : Segment->InputSegments)
- InputSeg->OutputOffset = Segment->SectionOffset + Segment->Header.size() +
- InputSeg->OutputSegmentOffset;
- }
-
- createHeader(BodySize);
-}
-
-void DataSection::writeTo(uint8_t *Buf) {
- log("writing " + toString(*this) + " size=" + Twine(getSize()) +
- " body=" + Twine(BodySize));
- Buf += Offset;
-
- // Write section header
- memcpy(Buf, Header.data(), Header.size());
- Buf += Header.size();
-
- // Write data section headers
- memcpy(Buf, DataSectionHeader.data(), DataSectionHeader.size());
-
- parallelForEach(Segments, [&](const OutputSegment *Segment) {
- // Write data segment header
- uint8_t *SegStart = Buf + Segment->SectionOffset;
- memcpy(SegStart, Segment->Header.data(), Segment->Header.size());
-
- // Write segment data payload
- for (const InputChunk *Chunk : Segment->InputSegments)
- Chunk->writeTo(Buf);
- });
-}
-
-uint32_t DataSection::numRelocations() const {
- uint32_t Count = 0;
- for (const OutputSegment *Seg : Segments)
- for (const InputChunk *InputSeg : Seg->InputSegments)
- Count += InputSeg->NumRelocations();
- return Count;
-}
-
-void DataSection::writeRelocations(raw_ostream &OS) const {
- for (const OutputSegment *Seg : Segments)
- for (const InputChunk *C : Seg->InputSegments)
- C->writeRelocations(OS);
-}
-
-CustomSection::CustomSection(std::string Name,
- ArrayRef<InputSection *> InputSections)
- : OutputSection(WASM_SEC_CUSTOM, Name), PayloadSize(0),
- InputSections(InputSections) {
- raw_string_ostream OS(NameData);
- encodeULEB128(Name.size(), OS);
- OS << Name;
- OS.flush();
-
- for (InputSection *Section : InputSections) {
- Section->OutputOffset = PayloadSize;
- PayloadSize += Section->getSize();
- }
-
- createHeader(PayloadSize + NameData.size());
-}
-
-void CustomSection::writeTo(uint8_t *Buf) {
- log("writing " + toString(*this) + " size=" + Twine(getSize()) +
- " chunks=" + Twine(InputSections.size()));
-
- assert(Offset);
- Buf += Offset;
-
- // Write section header
- memcpy(Buf, Header.data(), Header.size());
- Buf += Header.size();
- memcpy(Buf, NameData.data(), NameData.size());
- Buf += NameData.size();
-
- // Write custom sections payload
- parallelForEach(InputSections,
- [&](const InputSection *Section) { Section->writeTo(Buf); });
-}
-
-uint32_t CustomSection::numRelocations() const {
- uint32_t Count = 0;
- for (const InputSection *InputSect : InputSections)
- Count += InputSect->NumRelocations();
- return Count;
-}
-
-void CustomSection::writeRelocations(raw_ostream &OS) const {
- for (const InputSection *S : InputSections)
- S->writeRelocations(OS);
-}