1 //===- InputElement.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_INPUT_ELEMENT_H 10 #define LLD_WASM_INPUT_ELEMENT_H 11 12 #include "Config.h" 13 #include "InputFiles.h" 14 #include "WriterUtils.h" 15 #include "lld/Common/LLVM.h" 16 #include "llvm/Object/Wasm.h" 17 18 namespace lld { 19 namespace wasm { 20 21 // Represents a single element (Global, Event, Table, etc) within an input 22 // file. 23 class InputElement { 24 protected: 25 InputElement(StringRef name, ObjFile *f) 26 : file(f), live(!config->gcSections), name(name) {} 27 28 public: 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; 35 } 36 37 ObjFile *file; 38 bool live = false; 39 40 protected: 41 StringRef name; 42 llvm::Optional<uint32_t> assignedIndex; 43 }; 44 45 class InputGlobal : public InputElement { 46 public: 47 InputGlobal(const WasmGlobal &g, ObjFile *f) 48 : InputElement(g.SymbolName, f), type(g.Type), initExpr(g.InitExpr) {} 49 50 const WasmGlobalType &getType() const { return type; } 51 const WasmInitExpr &getInitExpr() const { return initExpr; } 52 53 void setPointerValue(uint64_t value) { 54 if (config->is64.getValueOr(false)) { 55 assert(initExpr.Opcode == llvm::wasm::WASM_OPCODE_I64_CONST); 56 initExpr.Value.Int64 = value; 57 } else { 58 assert(initExpr.Opcode == llvm::wasm::WASM_OPCODE_I32_CONST); 59 initExpr.Value.Int32 = value; 60 } 61 } 62 63 private: 64 WasmGlobalType type; 65 WasmInitExpr initExpr; 66 }; 67 68 class InputEvent : public InputElement { 69 public: 70 InputEvent(const WasmSignature &s, const WasmEvent &e, ObjFile *f) 71 : InputElement(e.SymbolName, f), signature(s), type(e.Type) {} 72 73 const WasmEventType &getType() const { return type; } 74 75 const WasmSignature &signature; 76 77 private: 78 WasmEventType type; 79 }; 80 81 class InputTable : public InputElement { 82 public: 83 InputTable(const WasmTable &t, ObjFile *f) 84 : InputElement(t.SymbolName, f), type(t.Type) {} 85 86 const WasmTableType &getType() const { return type; } 87 void setLimits(const WasmLimits &limits) { type.Limits = limits; } 88 89 private: 90 WasmTableType type; 91 }; 92 93 } // namespace wasm 94 95 inline std::string toString(const wasm::InputElement *d) { 96 return (toString(d->file) + ":(" + d->getName() + ")").str(); 97 } 98 99 } // namespace lld 100 101 #endif // LLD_WASM_INPUT_ELEMENT_H 102