summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-01-19 21:49:41 +0000
committerSam Clegg <sbc@chromium.org>2018-01-19 21:49:41 +0000
commit04b76f40778d6eda730a06f8e494e66c94fceb3b (patch)
tree370eb43b3b52d7af6d9df35ebf2940136e3febd7
parentd2e371f046c5d400d87f232020c61743b4dafb8e (diff)
downloadbcm5719-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.ll2
-rw-r--r--lld/test/wasm/relocatable.ll2
-rw-r--r--lld/wasm/Writer.cpp19
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");
OpenPOWER on IntegriCloud