diff options
Diffstat (limited to 'wasm/OutputSections.cpp')
-rw-r--r-- | wasm/OutputSections.cpp | 249 |
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); -} |