1//===- OutputSegment.h ------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLD_WASM_OUTPUT_SEGMENT_H
10#define LLD_WASM_OUTPUT_SEGMENT_H
11
12#include "InputChunks.h"
13#include "lld/Common/ErrorHandler.h"
14#include "llvm/BinaryFormat/Wasm.h"
15#include "llvm/Object/Wasm.h"
16
17namespace lld::wasm {
18
19class InputSegment;
20
21class OutputSegment {
22public:
23 OutputSegment(StringRef n) : name(n) {}
24
25 void addInputSegment(InputChunk *inSeg);
26 void finalizeInputSegments();
27 // In most circumstances BSS segments don't need to be written
28 // to the output binary. However if the memory is imported, and
29 // we can't use memory.fill during startup (due to lack of bulk
30 // memory feature) then we include BSS segments verbatim.
31 bool requiredInBinary() const { return !isBss || ctx.emitBssSegments; }
32
33 bool isTLS() const { return name == ".tdata"; }
34
35 StringRef name;
36 bool isBss = false;
37 uint32_t index = 0;
38 uint32_t linkingFlags = 0;
39 uint32_t initFlags = 0;
40 uint32_t sectionOffset = 0;
41 uint32_t alignment = 0;
42 uint64_t startVA = 0;
43 std::vector<InputChunk *> inputSegments;
44
45 // Sum of the size of the all the input segments
46 uint32_t size = 0;
47
48 // Segment header
49 std::string header;
50
51 bool isPassive() const {
52 return (initFlags & llvm::wasm::WASM_DATA_SEGMENT_IS_PASSIVE) != 0;
53 }
54
55 bool isActive() const { return !isPassive(); }
56};
57
58} // namespace lld::wasm
59
60#endif // LLD_WASM_OUTPUT_SEGMENT_H
61