//===- InputChunks.h --------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // An InputChunks represents an indivisible opaque region of a input wasm file. // i.e. a single wasm data segment or a single wasm function. // // They are written directly to the mmap'd output file after which relocations // are applied. Because each Chunk is independent they can be written in // parallel. // // Chunks are also unit on which garbage collection (--gc-sections) operates. // //===----------------------------------------------------------------------===// #ifndef LLD_WASM_INPUT_CHUNKS_H #define LLD_WASM_INPUT_CHUNKS_H #include "Config.h" #include "InputFiles.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/LLVM.h" #include "llvm/ADT/CachedHashString.h" #include "llvm/MC/StringTableBuilder.h" #include "llvm/Object/Wasm.h" #include <optional> namespace lld { namespace wasm { class ObjFile; class OutputSegment; class OutputSection; class InputChunk { … }; // 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 continuous 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. class InputSegment : public InputChunk { … }; class SyntheticMergedChunk; // Merge segment handling copied from lld/ELF/InputSection.h. Keep in sync // where possible. // SectionPiece represents a piece of splittable segment contents. // We allocate a lot of these and binary search on them. This means that they // have to be as compact as possible, which is why we don't store the size (can // be found by looking at the next one). struct SectionPiece { … }; static_assert …; // This corresponds segments marked as WASM_SEG_FLAG_STRINGS. class MergeInputChunk : public InputChunk { … }; // SyntheticMergedChunk is a class that allows us to put mergeable // sections with different attributes in a single output sections. To do that we // put them into SyntheticMergedChunk synthetic input sections which are // attached to regular output sections. class SyntheticMergedChunk : public InputChunk { … }; // Represents a single wasm function within and input file. These are // combined to create the final output CODE section. class InputFunction : public InputChunk { … }; class SyntheticFunction : public InputFunction { … }; // Represents a single Wasm Section within an input file. class InputSection : public InputChunk { … }; } // namespace wasm std::string toString(const wasm::InputChunk *); StringRef relocTypeToString(uint8_t relocType); } // namespace lld #endif // LLD_WASM_INPUT_CHUNKS_H