xref: /llvm-project/lld/wasm/OutputSegment.h (revision 184c22dd3aa3513244401fcced9a447c2577e2d3)
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/Object/Wasm.h"
15 
16 namespace lld::wasm {
17 
18 class InputSegment;
19 
20 class OutputSegment {
21 public:
OutputSegment(StringRef n)22   OutputSegment(StringRef n) : name(n) {}
23 
24   void addInputSegment(InputChunk *inSeg);
25   void finalizeInputSegments();
26   // In most circumstances BSS segments don't need to be written
27   // to the output binary.  However if the memory is imported, and
28   // we can't use memory.fill during startup (due to lack of bulk
29   // memory feature) then we include BSS segments verbatim.
requiredInBinary()30   bool requiredInBinary() const { return !isBss || ctx.emitBssSegments; }
31 
isTLS()32   bool isTLS() const { return name == ".tdata"; }
33 
34   StringRef name;
35   bool isBss = false;
36   uint32_t index = 0;
37   uint32_t linkingFlags = 0;
38   uint32_t initFlags = 0;
39   uint32_t sectionOffset = 0;
40   uint32_t alignment = 0;
41   uint64_t startVA = 0;
42   std::vector<InputChunk *> inputSegments;
43 
44   // Sum of the size of the all the input segments
45   uint32_t size = 0;
46 
47   // Segment header
48   std::string header;
49 };
50 
51 } // namespace lld::wasm
52 
53 #endif // LLD_WASM_OUTPUT_SEGMENT_H
54