summaryrefslogtreecommitdiff
path: root/wasm/Symbols.h
diff options
context:
space:
mode:
Diffstat (limited to 'wasm/Symbols.h')
-rw-r--r--wasm/Symbols.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/wasm/Symbols.h b/wasm/Symbols.h
new file mode 100644
index 000000000000..8194bcaca383
--- /dev/null
+++ b/wasm/Symbols.h
@@ -0,0 +1,128 @@
+//===- Symbols.h ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLD_WASM_SYMBOLS_H
+#define LLD_WASM_SYMBOLS_H
+
+#include "lld/Common/LLVM.h"
+#include "llvm/Object/Archive.h"
+#include "llvm/Object/Wasm.h"
+
+using llvm::object::Archive;
+using llvm::object::WasmSymbol;
+using llvm::wasm::WasmExport;
+using llvm::wasm::WasmImport;
+using llvm::wasm::WasmSignature;
+
+namespace lld {
+namespace wasm {
+
+class InputFile;
+class InputSegment;
+
+class Symbol {
+public:
+ enum Kind {
+ DefinedFunctionKind,
+ DefinedGlobalKind,
+
+ LazyKind,
+ UndefinedFunctionKind,
+ UndefinedGlobalKind,
+
+ LastDefinedKind = DefinedGlobalKind,
+ InvalidKind,
+ };
+
+ Symbol(StringRef Name, bool IsLocal)
+ : WrittenToSymtab(0), WrittenToNameSec(0), IsLocal(IsLocal), Name(Name) {}
+
+ Kind getKind() const { return SymbolKind; }
+
+ bool isLazy() const { return SymbolKind == LazyKind; }
+ bool isDefined() const { return SymbolKind <= LastDefinedKind; }
+ bool isUndefined() const {
+ return SymbolKind == UndefinedGlobalKind ||
+ SymbolKind == UndefinedFunctionKind;
+ }
+ bool isFunction() const {
+ return SymbolKind == DefinedFunctionKind ||
+ SymbolKind == UndefinedFunctionKind;
+ }
+ bool isGlobal() const { return !isFunction(); }
+ bool isLocal() const { return IsLocal; }
+ bool isWeak() const;
+ bool isHidden() const;
+
+ // Returns the symbol name.
+ StringRef getName() const { return Name; }
+
+ // Returns the file from which this symbol was created.
+ InputFile *getFile() const { return File; }
+
+ uint32_t getGlobalIndex() const;
+ uint32_t getFunctionIndex() const;
+
+ bool hasFunctionType() const { return FunctionType != nullptr; }
+ const WasmSignature &getFunctionType() const;
+ uint32_t getOutputIndex() const;
+ uint32_t getTableIndex() const { return TableIndex.getValue(); }
+
+ // Returns the virtual address of a defined global.
+ // Only works for globals, not functions.
+ uint32_t getVirtualAddress() const;
+
+ // Set the output index of the symbol (in the function or global index
+ // space of the output object.
+ void setOutputIndex(uint32_t Index);
+
+ // Returns true if a table index has been set for this symbol
+ bool hasTableIndex() const { return TableIndex.hasValue(); }
+
+ // Set the table index of the symbol
+ void setTableIndex(uint32_t Index);
+
+ void setVirtualAddress(uint32_t VA);
+
+ void update(Kind K, InputFile *F = nullptr, const WasmSymbol *Sym = nullptr,
+ const InputSegment *Segment = nullptr,
+ const WasmSignature *Sig = nullptr);
+
+ void setArchiveSymbol(const Archive::Symbol &Sym) { ArchiveSymbol = Sym; }
+ const Archive::Symbol &getArchiveSymbol() { return ArchiveSymbol; }
+
+ // This bit is used by Writer::writeNameSection() to prevent
+ // symbols from being written to the symbol table more than once.
+ unsigned WrittenToSymtab : 1;
+ unsigned WrittenToNameSec : 1;
+
+protected:
+ unsigned IsLocal : 1;
+
+ StringRef Name;
+ Archive::Symbol ArchiveSymbol = {nullptr, 0, 0};
+ Kind SymbolKind = InvalidKind;
+ InputFile *File = nullptr;
+ const WasmSymbol *Sym = nullptr;
+ const InputSegment *Segment = nullptr;
+ llvm::Optional<uint32_t> OutputIndex;
+ llvm::Optional<uint32_t> TableIndex;
+ llvm::Optional<uint32_t> VirtualAddress;
+ const WasmSignature *FunctionType;
+};
+
+} // namespace wasm
+
+// Returns a symbol name for an error message.
+std::string toString(const wasm::Symbol &Sym);
+std::string toString(wasm::Symbol::Kind Kind);
+
+} // namespace lld
+
+#endif