1 //===- InputElement.h ----------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLD_WASM_INPUT_ELEMENT_H
10 #define LLD_WASM_INPUT_ELEMENT_H
13 #include "InputFiles.h"
14 #include "WriterUtils.h"
15 #include "lld/Common/LLVM.h"
16 #include "llvm/Object/Wasm.h"
21 // Represents a single element (Global, Tag, Table, etc) within an input
25 InputElement(StringRef name
, ObjFile
*f
)
26 : file(f
), live(!config
->gcSections
), name(name
) {}
29 StringRef
getName() const { return name
; }
30 uint32_t getAssignedIndex() const { return assignedIndex
.getValue(); }
31 bool hasAssignedIndex() const { return assignedIndex
.hasValue(); }
32 void assignIndex(uint32_t index
) {
33 assert(!hasAssignedIndex());
34 assignedIndex
= index
;
42 llvm::Optional
<uint32_t> assignedIndex
;
45 inline WasmInitExpr
intConst(uint64_t value
, bool is64
) {
48 ie
.Opcode
= llvm::wasm::WASM_OPCODE_I64_CONST
;
49 ie
.Value
.Int64
= static_cast<int64_t>(value
);
51 ie
.Opcode
= llvm::wasm::WASM_OPCODE_I32_CONST
;
52 ie
.Value
.Int32
= static_cast<int32_t>(value
);
57 class InputGlobal
: public InputElement
{
59 InputGlobal(const WasmGlobal
&g
, ObjFile
*f
)
60 : InputElement(g
.SymbolName
, f
), type(g
.Type
), initExpr(g
.InitExpr
) {}
62 const WasmGlobalType
&getType() const { return type
; }
63 const WasmInitExpr
&getInitExpr() const { return initExpr
; }
65 void setPointerValue(uint64_t value
) {
66 initExpr
= intConst(value
, config
->is64
.getValueOr(false));
71 WasmInitExpr initExpr
;
74 class InputTag
: public InputElement
{
76 InputTag(const WasmSignature
&s
, const WasmTag
&t
, ObjFile
*f
)
77 : InputElement(t
.SymbolName
, f
), signature(s
), type(t
.Type
) {}
79 const WasmTagType
&getType() const { return type
; }
81 const WasmSignature
&signature
;
87 class InputTable
: public InputElement
{
89 InputTable(const WasmTable
&t
, ObjFile
*f
)
90 : InputElement(t
.SymbolName
, f
), type(t
.Type
) {}
92 const WasmTableType
&getType() const { return type
; }
93 void setLimits(const WasmLimits
&limits
) { type
.Limits
= limits
; }
101 inline std::string
toString(const wasm::InputElement
*d
) {
102 return (toString(d
->file
) + ":(" + d
->getName() + ")").str();
107 #endif // LLD_WASM_INPUT_ELEMENT_H