From 0191240cbf6f4f1c4194234e58858671532981be Mon Sep 17 00:00:00 2001
From: Sam Clegg <sbc@chromium.org>
Date: Mon, 19 Aug 2024 15:18:49 -0700
Subject: [PATCH] [lld][WebAssembly] Ignore local symbols when parsing lazy
 object files.

This was broken back in #78658 when we transitioned away from archive
indexes to parsing lazy object files.

Fixes: #94077
Fixes: https://github.com/emscripten-core/emscripten/issues/22008
---
 lld/test/wasm/archive-local-sym.s | 24 ++++++++++++++++++++++++
 lld/wasm/InputFiles.cpp           |  2 +-
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 lld/test/wasm/archive-local-sym.s

diff --git a/lld/test/wasm/archive-local-sym.s b/lld/test/wasm/archive-local-sym.s
new file mode 100644
index 0000000000000..53e95b9bbb105
--- /dev/null
+++ b/lld/test/wasm/archive-local-sym.s
@@ -0,0 +1,24 @@
+## Test that local symbols in archive files are ignored.
+# RUN: split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/foo.o %t/foo.s
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/main.o %t/main.s
+# RUN: rm -f %t/libfoo.a
+# RUN: llvm-ar rcs %t/libfoo.a %t/foo.o
+# RUN: not wasm-ld %t/libfoo.a %t/main.o -o out.wasm 2>&1 | FileCheck %s
+
+#--- main.s
+
+.functype foo () -> ()
+
+.globl _start
+_start:
+  .functype _start () -> ()
+  call foo
+# CHECK: main.o: undefined symbol: foo
+  end_function
+
+#--- foo.s
+
+foo:
+  .functype foo () -> ()
+  end_function
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index 706ee25d5aae2..de8e707ab2b49 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -392,7 +392,7 @@ void ObjFile::parseLazy() {
                     << wasmObj.get() << "\n");
   for (const SymbolRef &sym : wasmObj->symbols()) {
     const WasmSymbol &wasmSym = wasmObj->getWasmSymbol(sym.getRawDataRefImpl());
-    if (!wasmSym.isDefined())
+    if (wasmSym.isUndefined() || wasmSym.isBindingLocal())
       continue;
     symtab->addLazy(wasmSym.Info.Name, this);
     // addLazy() may trigger this->extract() if an existing symbol is an