Index: test/wasm/lto/Inputs/used.ll =================================================================== --- test/wasm/lto/Inputs/used.ll +++ test/wasm/lto/Inputs/used.ll @@ -0,0 +1,8 @@ +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +@foo = hidden global i32 1 + +define hidden void @bar() { + ret void +} Index: test/wasm/lto/used.ll =================================================================== --- test/wasm/lto/used.ll +++ test/wasm/lto/used.ll @@ -0,0 +1,45 @@ +; RUN: llc %s -o %t.o -filetype=obj +; RUN: llvm-as %S/Inputs/used.ll -o %t1.o +; RUN: wasm-ld %t.o %t1.o -o %t.wasm +; RUN: obj2yaml %t.wasm | FileCheck %s + +; Verify that symbols references from regular objects are preserved by LTO + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +declare void @bar() + +@foo = external global i32 + +define void @_start() { + %val = load i32, i32* @foo, align 4 + %tobool = icmp ne i32 %val, 0 + br i1 %tobool, label %callbar, label %return + +callbar: + call void @bar() + br label %return + +return: + ret void +} + +; CHECK: - Type: DATA +; CHECK-NEXT: Segments: +; CHECK-NEXT: - SectionOffset: 7 +; CHECK-NEXT: MemoryIndex: 0 +; CHECK-NEXT: Offset: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 1024 +; CHECK-NEXT: Content: '01000000' + +; CHECK: - Type: CUSTOM +; CHECK-NEXT: Name: name +; CHECK-NEXT: FunctionNames: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Name: __wasm_call_ctors +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Name: _start +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Name: bar Index: wasm/SymbolTable.cpp =================================================================== --- wasm/SymbolTable.cpp +++ wasm/SymbolTable.cpp @@ -307,6 +307,9 @@ bool WasInserted; std::tie(S, WasInserted) = insert(Name); + if (!File || File->kind() == InputFile::ObjectKind) + S->IsUsedInRegularObj = true; + if (WasInserted) replaceSymbol(S, Name, Flags, File); else if (auto *Lazy = dyn_cast(S))