[WebAssebmly] Add support for --wrap
The code for implementing this features is taken almost verbatim
from the ELF backend.
Fixes: https://bugs.llvm.org/show_bug.cgi?id=41681
Differential Revision: https://reviews.llvm.org/D62380
llvm-svn: 361639
diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp
index 244e24e..5328e9e 100644
--- a/lld/wasm/SymbolTable.cpp
+++ b/lld/wasm/SymbolTable.cpp
@@ -65,7 +65,8 @@
}
void SymbolTable::reportRemainingUndefines() {
- for (Symbol *Sym : SymVector) {
+ for (const auto& Pair : SymMap) {
+ const Symbol *Sym = SymVector[Pair.second];
if (!Sym->isUndefined() || Sym->isWeak())
continue;
if (Config->AllowUndefinedSymbols.count(Sym->getName()) != 0)
@@ -104,6 +105,7 @@
Symbol *Sym = reinterpret_cast<Symbol *>(make<SymbolUnion>());
Sym->IsUsedInRegularObj = false;
+ Sym->CanInline = true;
Sym->Traced = Trace;
SymVector.emplace_back(Sym);
return {Sym, true};
@@ -539,6 +541,19 @@
SymMap.insert({CachedHashStringRef(Name), -1});
}
+void SymbolTable::wrap(Symbol *Sym, Symbol *Real, Symbol *Wrap) {
+ // Swap symbols as instructed by -wrap.
+ int &OrigIdx = SymMap[CachedHashStringRef(Sym->getName())];
+ int &RealIdx= SymMap[CachedHashStringRef(Real->getName())];
+ int &WrapIdx = SymMap[CachedHashStringRef(Wrap->getName())];
+ LLVM_DEBUG(dbgs() << "wrap: " << Sym->getName() << "\n");
+
+ // Anyone looking up __real symbols should get the original
+ RealIdx = OrigIdx;
+ // Anyone looking up the original should get the __wrap symbol
+ OrigIdx = WrapIdx;
+}
+
static const uint8_t UnreachableFn[] = {
0x03 /* ULEB length */, 0x00 /* ULEB num locals */,
0x00 /* opcode unreachable */, 0x0b /* opcode end */