diff options
author | Sam Clegg <sbc@chromium.org> | 2018-01-19 21:49:41 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2018-01-19 21:49:41 +0000 |
commit | 04b76f40778d6eda730a06f8e494e66c94fceb3b (patch) | |
tree | 370eb43b3b52d7af6d9df35ebf2940136e3febd7 | |
parent | d2e371f046c5d400d87f232020c61743b4dafb8e (diff) | |
download | bcm5719-llvm-04b76f40778d6eda730a06f8e494e66c94fceb3b.tar.gz bcm5719-llvm-04b76f40778d6eda730a06f8e494e66c94fceb3b.zip |
[WebAssembly] Include SYMBOL_INFO for imports as well as exports
Only effects --emit-relocs/--relocatable
Patch by Nicholas Wilson!
Differential Revision: https://reviews.llvm.org/D42306
llvm-svn: 322994
-rw-r--r-- | lld/test/wasm/init-fini.ll | 2 | ||||
-rw-r--r-- | lld/test/wasm/relocatable.ll | 2 | ||||
-rw-r--r-- | lld/wasm/Writer.cpp | 19 |
3 files changed, 17 insertions, 6 deletions
diff --git a/lld/test/wasm/init-fini.ll b/lld/test/wasm/init-fini.ll index 0fa9b20a3f8..a83a5129c63 100644 --- a/lld/test/wasm/init-fini.ll +++ b/lld/test/wasm/init-fini.ll @@ -108,6 +108,8 @@ entry: ; RELOC: Name: linking ; RELOC-NEXT: DataSize: 0 ; RELOC-NEXT: SymbolInfo: +; RELOC-NEXT: - Name: __dso_handle +; RELOC-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN ] ; RELOC-NEXT: - Name: func1 ; RELOC-NEXT: Flags: [ VISIBILITY_HIDDEN ] ; RELOC-NEXT: - Name: func2 diff --git a/lld/test/wasm/relocatable.ll b/lld/test/wasm/relocatable.ll index 6167353c6c0..8efb240ccfc 100644 --- a/lld/test/wasm/relocatable.ll +++ b/lld/test/wasm/relocatable.ll @@ -229,6 +229,8 @@ entry: ; CHECK-NEXT: Name: linking ; CHECK-NEXT: DataSize: 31 ; CHECK-NEXT: SymbolInfo: +; CHECK-NEXT: - Name: bar_import +; CHECK-NEXT: Flags: [ BINDING_WEAK ] ; CHECK-NEXT: - Name: hello ; CHECK-NEXT: Flags: [ VISIBILITY_HIDDEN ] ; CHECK-NEXT: - Name: my_func diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index ab1ce2c683f..a6d21c10cc9 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -386,14 +386,21 @@ void Writer::createLinkingSection() { return; std::vector<std::pair<StringRef, uint32_t>> SymbolInfo; - for (const WasmExportEntry &E : ExportedSymbols) { + auto addSymInfo = [&](const Symbol *Sym, StringRef ExternalName) { uint32_t Flags = - (E.Sym->isLocal() ? WASM_SYMBOL_BINDING_LOCAL : - E.Sym->isWeak() ? WASM_SYMBOL_BINDING_WEAK : 0) | - (E.Sym->isHidden() ? WASM_SYMBOL_VISIBILITY_HIDDEN : 0); + (Sym->isLocal() ? WASM_SYMBOL_BINDING_LOCAL : + Sym->isWeak() ? WASM_SYMBOL_BINDING_WEAK : 0) | + (Sym->isHidden() ? WASM_SYMBOL_VISIBILITY_HIDDEN : 0); if (Flags) - SymbolInfo.emplace_back(E.FieldName, Flags); - } + SymbolInfo.emplace_back(ExternalName, Flags); + }; + // (Imports can't have internal linkage, their names don't need to be budged.) + for (const Symbol *Sym : ImportedFunctions) + addSymInfo(Sym, Sym->getName()); + for (const Symbol *Sym : ImportedGlobals) + addSymInfo(Sym, Sym->getName()); + for (const WasmExportEntry &E : ExportedSymbols) + addSymInfo(E.Sym, E.FieldName); if (!SymbolInfo.empty()) { SubSection SubSection(WASM_SYMBOL_INFO); writeUleb128(SubSection.getStream(), SymbolInfo.size(), "num sym info"); |