From f2f6d5e03b3fffaac49866a4e6cba59db12a0eef Mon Sep 17 00:00:00 2001 From: Nicholas Wilson Date: Fri, 2 Mar 2018 14:51:36 +0000 Subject: [PATCH] [WebAssembly] Export non-hidden defined data symbols via wasm globals This fixes a TODO introduced in rLLD325861. Differential Revision: https://reviews.llvm.org/D43930 llvm-svn: 326581 --- lld/test/wasm/call-indirect.ll | 11 ++++++++++- lld/test/wasm/comdats.ll | 9 +++++++++ lld/test/wasm/local-symbols.ll | 9 +++++++++ lld/test/wasm/locals-duplicate.test | 18 ++++++++++++++++++ lld/test/wasm/weak-symbols.ll | 9 +++++++++ lld/wasm/Writer.cpp | 8 +------- 6 files changed, 56 insertions(+), 8 deletions(-) diff --git a/lld/test/wasm/call-indirect.ll b/lld/test/wasm/call-indirect.ll index 5e739dcd0e54..c4fa35502da0 100644 --- a/lld/test/wasm/call-indirect.ll +++ b/lld/test/wasm/call-indirect.ll @@ -85,9 +85,15 @@ define void @call_ptr(i64 (i64)* %arg) { ; CHECK-NEXT: - Index: 2 ; CHECK-NEXT: Type: I32 ; CHECK-NEXT: Mutable: false -; CHECK-NEXT: InitExpr: +; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1036 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1032 ; CHECK-NEXT: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -111,6 +117,9 @@ define void @call_ptr(i64 (i64)* %arg) { ; CHECK-NEXT: - Name: foo ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Name: indirect_func +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Name: call_ptr ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 4 diff --git a/lld/test/wasm/comdats.ll b/lld/test/wasm/comdats.ll index 145ed0f69ea9..65e74dbdbcf2 100644 --- a/lld/test/wasm/comdats.ll +++ b/lld/test/wasm/comdats.ll @@ -34,6 +34,12 @@ entry: ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1027 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1024 ; CHECK-NEXT: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -51,6 +57,9 @@ entry: ; CHECK-NEXT: - Name: inlineFn ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: constantData +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Name: callInline1 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 diff --git a/lld/test/wasm/local-symbols.ll b/lld/test/wasm/local-symbols.ll index dfed8bf8c287..149ba0302b16 100644 --- a/lld/test/wasm/local-symbols.ll +++ b/lld/test/wasm/local-symbols.ll @@ -63,6 +63,12 @@ entry: ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1032 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1024 ; CHECK-NEXT: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -77,6 +83,9 @@ entry: ; CHECK-NEXT: - Name: _start ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: foo +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Type: CODE ; CHECK-NEXT: Functions: ; CHECK-NEXT: - Index: 0 diff --git a/lld/test/wasm/locals-duplicate.test b/lld/test/wasm/locals-duplicate.test index 5d0bd53d5cd7..0eee7b6209ac 100644 --- a/lld/test/wasm/locals-duplicate.test +++ b/lld/test/wasm/locals-duplicate.test @@ -48,6 +48,18 @@ ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1048 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1028 +; CHECK-NEXT: - Index: 4 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1036 ; CHECK-NEXT: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -68,6 +80,9 @@ ; CHECK-NEXT: - Name: get_global2A ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 4 +; CHECK-NEXT: - Name: colliding_global2 +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Name: get_global3A ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 5 @@ -86,6 +101,9 @@ ; CHECK-NEXT: - Name: get_global1B ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 12 +; CHECK-NEXT: - Name: colliding_global1 +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 4 ; CHECK-NEXT: - Name: get_global2B ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 13 diff --git a/lld/test/wasm/weak-symbols.ll b/lld/test/wasm/weak-symbols.ll index e742af50dd55..9724e81ad90e 100644 --- a/lld/test/wasm/weak-symbols.ll +++ b/lld/test/wasm/weak-symbols.ll @@ -60,6 +60,12 @@ entry: ; CHECK-NEXT: InitExpr: ; CHECK-NEXT: Opcode: I32_CONST ; CHECK-NEXT: Value: 1032 +; CHECK-NEXT: - Index: 3 +; CHECK-NEXT: Type: I32 +; CHECK-NEXT: Mutable: false +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1024 ; CHECK-NEXT: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -80,6 +86,9 @@ entry: ; CHECK-NEXT: - Name: exportWeak1 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Name: weakGlobal +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Name: exportWeak2 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 4 diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 1b7cde1e91b0..ce5a92cb0bd0 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -677,14 +677,8 @@ void Writer::calculateExports() { DEBUG(dbgs() << "exporting sym: " << Sym->getName() << "\n"); - if (auto *D = dyn_cast(Sym)) { - // TODO Remove this check here; for non-relocatable output we actually - // used only to create fake-global exports for the synthetic symbols. Fix - // this in a future commit - if (Sym != WasmSym::DataEnd && Sym != WasmSym::HeapBase) - continue; + if (auto *D = dyn_cast(Sym)) DefinedFakeGlobals.emplace_back(D); - } ExportedSymbols.emplace_back(Sym); } }