From af3b9d0570bb2e5d67554a705ffe383377305660 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Thu, 7 Feb 2019 01:53:50 +0000 Subject: [PATCH] [WebAssembly] Honor WASM_SYMBOL_EXPORT symbol flag This flag means that symbol should be exported in the final binary. The reason for this change is to allow source level annotations to trigger a given symbol to be exported: https://github.com/emscripten-core/emscripten/issues/7702 Differential Revision: https://reviews.llvm.org/D57869 llvm-svn: 353364 --- lld/test/wasm/export.ll | 23 ++++++++++++++++++++++- lld/wasm/Symbols.cpp | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lld/test/wasm/export.ll b/lld/test/wasm/export.ll index 519aafebbe23..48b66ee10f7b 100644 --- a/lld/test/wasm/export.ll +++ b/lld/test/wasm/export.ll @@ -3,13 +3,29 @@ ; RUN: wasm-ld --export=hidden_function -o %t.wasm %t.o ; RUN: obj2yaml %t.wasm | FileCheck %s +@llvm.used = appending global [1 x i8*] [i8* bitcast (i32 ()* @used_function to i8*)], section "llvm.metadata" + target triple = "wasm32-unknown-unknown" +; Not exported by default, but forced via commandline define hidden i32 @hidden_function() local_unnamed_addr { entry: ret i32 0 } +; Not exported by default +define i32 @default_function() local_unnamed_addr { +entry: + ret i32 0 +} + +; Exported because its part of llvm.used +define i32 @used_function() local_unnamed_addr { +entry: + ret i32 0 +} + +; Exported by default define void @_start() local_unnamed_addr { entry: ret void @@ -17,6 +33,8 @@ entry: ; CHECK-ERROR: error: symbol exported via --export not found: missing +; CHECK-NOT: - Name: default_function + ; CHECK: - Type: EXPORT ; CHECK-NEXT: Exports: ; CHECK-NEXT: - Name: memory @@ -31,7 +49,10 @@ entry: ; CHECK-NEXT: - Name: hidden_function ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 -; CHECK-NEXT: - Name: _start +; CHECK-NEXT: - Name: used_function ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Type: CODE diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp index 4721e35f9f86..60030bef3fa6 100644 --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -116,7 +116,7 @@ bool Symbol::isExported() const { if (Config->ExportDynamic && !isHidden()) return true; - return false; + return Flags & WASM_SYMBOL_EXPORTED; } uint32_t FunctionSymbol::getFunctionIndex() const {