aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/Object/WasmObjectFile.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-12-24 01:04:58 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-12-24 01:04:58 +0000
commitda09e106efc76da569f2bad3d59b6b19b503bf39 (patch)
tree3dc7690165275d86df8841532970801b0dc1230d /contrib/llvm/lib/Object/WasmObjectFile.cpp
parentfb142d88715c407bebf777730d5bd6cbf73e2bc7 (diff)
parentc7dac04c3480f3c20487f912f77343139fce2d99 (diff)
Notes
Diffstat (limited to 'contrib/llvm/lib/Object/WasmObjectFile.cpp')
-rw-r--r--contrib/llvm/lib/Object/WasmObjectFile.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/contrib/llvm/lib/Object/WasmObjectFile.cpp b/contrib/llvm/lib/Object/WasmObjectFile.cpp
index 7a0c05ed8a15..48f98df6f34d 100644
--- a/contrib/llvm/lib/Object/WasmObjectFile.cpp
+++ b/contrib/llvm/lib/Object/WasmObjectFile.cpp
@@ -303,7 +303,6 @@ Error WasmObjectFile::parseNameSection(const uint8_t *Ptr, const uint8_t *End) {
void WasmObjectFile::populateSymbolTable() {
// Add imports to symbol table
- size_t ImportIndex = 0;
size_t GlobalIndex = 0;
size_t FunctionIndex = 0;
for (const wasm::WasmImport& Import : Imports) {
@@ -312,7 +311,7 @@ void WasmObjectFile::populateSymbolTable() {
assert(Import.Global.Type == wasm::WASM_TYPE_I32);
SymbolMap.try_emplace(Import.Field, Symbols.size());
Symbols.emplace_back(Import.Field, WasmSymbol::SymbolType::GLOBAL_IMPORT,
- ImportSection, GlobalIndex++, ImportIndex);
+ ImportSection, GlobalIndex++);
DEBUG(dbgs() << "Adding import: " << Symbols.back()
<< " sym index:" << Symbols.size() << "\n");
break;
@@ -320,14 +319,13 @@ void WasmObjectFile::populateSymbolTable() {
SymbolMap.try_emplace(Import.Field, Symbols.size());
Symbols.emplace_back(Import.Field,
WasmSymbol::SymbolType::FUNCTION_IMPORT,
- ImportSection, FunctionIndex++, ImportIndex);
+ ImportSection, FunctionIndex++, Import.SigIndex);
DEBUG(dbgs() << "Adding import: " << Symbols.back()
<< " sym index:" << Symbols.size() << "\n");
break;
default:
break;
}
- ImportIndex++;
}
// Add exports to symbol table
@@ -338,11 +336,22 @@ void WasmObjectFile::populateSymbolTable() {
Export.Kind == wasm::WASM_EXTERNAL_FUNCTION
? WasmSymbol::SymbolType::FUNCTION_EXPORT
: WasmSymbol::SymbolType::GLOBAL_EXPORT;
- SymbolMap.try_emplace(Export.Name, Symbols.size());
- Symbols.emplace_back(Export.Name, ExportType,
- ExportSection, Export.Index);
- DEBUG(dbgs() << "Adding export: " << Symbols.back()
- << " sym index:" << Symbols.size() << "\n");
+ auto Pair = SymbolMap.try_emplace(Export.Name, Symbols.size());
+ if (Pair.second) {
+ Symbols.emplace_back(Export.Name, ExportType,
+ ExportSection, Export.Index);
+ DEBUG(dbgs() << "Adding export: " << Symbols.back()
+ << " sym index:" << Symbols.size() << "\n");
+ } else {
+ uint32_t SymIndex = Pair.first->second;
+ const WasmSymbol &OldSym = Symbols[SymIndex];
+ WasmSymbol NewSym(Export.Name, ExportType, ExportSection, Export.Index);
+ NewSym.setAltIndex(OldSym.ElementIndex);
+ Symbols[SymIndex] = NewSym;
+
+ DEBUG(dbgs() << "Replacing existing symbol: " << NewSym
+ << " sym index:" << SymIndex << "\n");
+ }
}
}
}
@@ -1017,7 +1026,7 @@ void WasmObjectFile::getRelocationTypeName(
break;
switch (Rel.Type) {
-#include "llvm/BinaryFormat/WasmRelocs/WebAssembly.def"
+#include "llvm/BinaryFormat/WasmRelocs.def"
}
#undef WASM_RELOC