//===- InputSegment.h -------------------------------------------*- C++ -*-===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Represents a WebAssembly data segment which can be included as part of // an output data segments. Note that in WebAssembly, unlike ELF and other // formats, used the term "data segment" to refer to the continous regions of // memory that make on the data section. See: // https://webassembly.github.io/spec/syntax/modules.html#syntax-data // // For example, by default, clang will produce a separate data section for // each global variable. // //===----------------------------------------------------------------------===// #ifndef LLD_WASM_INPUT_SEGMENT_H #define LLD_WASM_INPUT_SEGMENT_H #include "WriterUtils.h" #include "lld/Common/ErrorHandler.h" #include "llvm/Object/Wasm.h" using llvm::object::WasmSegment; using llvm::wasm::WasmRelocation; namespace lld { namespace wasm { class ObjFile; class OutputSegment; class InputSegment { public: InputSegment(const WasmSegment *Seg, const ObjFile *F) : Segment(Seg), File(F) {} // Translate an offset in the input segment to an offset in the output // segment. uint32_t translateVA(uint32_t Address) const; const OutputSegment *getOutputSegment() const { return OutputSeg; } uint32_t getOutputSegmentOffset() const { return OutputSegmentOffset; } uint32_t getInputSectionOffset() const { return Segment->SectionOffset; } void setOutputSegment(const OutputSegment *Segment, uint32_t Offset) { OutputSeg = Segment; OutputSegmentOffset = Offset; } uint32_t getSize() const { return Segment->Data.Content.size(); } uint32_t getAlignment() const { return Segment->Data.Alignment; } uint32_t startVA() const { return Segment->Data.Offset.Value.Int32; } uint32_t endVA() const { return startVA() + getSize(); } StringRef getName() const { return Segment->Data.Name; } const WasmSegment *Segment; const ObjFile *File; std::vector Relocations; std::vector OutRelocations; protected: const OutputSegment *OutputSeg = nullptr; uint32_t OutputSegmentOffset = 0; }; } // namespace wasm } // namespace lld #endif // LLD_WASM_INPUT_SEGMENT_H