[lld] 6f5c5cb - [lld][WebAssembly] Fix for debug relocations against undefined function symbols

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 2 08:40:38 PST 2021


Author: Sam Clegg
Date: 2021-12-02T08:36:28-08:00
New Revision: 6f5c5cbe5f8209de3f4d91de75d7f3a716e9f131

URL: https://github.com/llvm/llvm-project/commit/6f5c5cbe5f8209de3f4d91de75d7f3a716e9f131
DIFF: https://github.com/llvm/llvm-project/commit/6f5c5cbe5f8209de3f4d91de75d7f3a716e9f131.diff

LOG: [lld][WebAssembly] Fix for debug relocations against undefined function symbols

This is very similar to https://reviews.llvm.org/D103557 but applies to
symbols which are undefined at link time rather than compile time.

We already have code that handles symbols which were defined at link
time but dead stripped by `--gc-sections` (See
`test/wasm/debug-removed-fn.ll`). In that case the symbols are not live
(!isLive()).  However, we can also have live symbols (which are
references by the program) but which are undefined at link time and are
imported by the linker.

In the test case here the symbol `undef` is used but is not defined
in the program but is imported by the linker due to the
`--import-undefined` flag.

Fixes: https://github.com/emscripten-core/emscripten/issues/15528

Differential Revision: https://reviews.llvm.org/D114921

Added: 
    lld/test/wasm/debug-undefined-fs.s

Modified: 
    lld/wasm/InputFiles.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/debug-undefined-fs.s b/lld/test/wasm/debug-undefined-fs.s
new file mode 100644
index 0000000000000..4426e840c944d
--- /dev/null
+++ b/lld/test/wasm/debug-undefined-fs.s
@@ -0,0 +1,37 @@
+# Verify that we can handle R_WASM_FUNCTION_OFFSET relocations against live but
+# undefined symbols.  Test that the .debug_info and .debug_int sections are
+# generated without error
+#
+# Based on llvm/test/MC/WebAssembly/debuginfo-relocs.s
+#
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld --import-undefined %t.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+.functype undef () -> ()
+
+bar:
+    .functype bar () -> ()
+    end_function
+
+    .globl _start
+_start:
+    .functype _start () -> ()
+    call bar
+    call undef
+    end_function
+
+.section .debug_int,"",@
+.Ld:
+  .int32 1
+.size .Ld, 4
+
+.section .debug_info,"",@
+    .int32 bar
+    .int32 undef
+    .int32 .Ld
+
+# CHECK:          Name:            .debug_info
+# CHECK-NEXT:     Payload:         02000000FFFFFFFF00000000
+# CHECK:          Name:            .debug_int
+# CHECK-NEXT:     Payload:         '01000000'

diff  --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index 3fe8846984bf3..e3a7f56ab884a 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -197,6 +197,9 @@ uint64_t ObjFile::calcNewValue(const WasmRelocation &reloc, uint64_t tombstone,
     return getTagSymbol(reloc.Index)->getTagIndex();
   case R_WASM_FUNCTION_OFFSET_I32:
   case R_WASM_FUNCTION_OFFSET_I64: {
+    if (isa<UndefinedFunction>(sym)) {
+      return tombstone ? tombstone : reloc.Addend;
+    }
     auto *f = cast<DefinedFunction>(sym);
     return f->function->getOffset(f->function->getFunctionCodeOffset() +
                                   reloc.Addend);


        


More information about the llvm-commits mailing list