[PATCH] D66435: [WebAssembly][lld] Fix crash when appling relocations to debug sections

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 19 12:25:37 PDT 2019


sbc100 created this revision.
Herald added subscribers: llvm-commits, sunfish, aheejin, hiraditya, jgravelle-google, dschuff.
Herald added a project: LLVM.

Debug sections are special in that they can contain relocations against
symbols that are not present in the final output (i.e. not live).
However it is also possible to have R_WASM_TABLE_INDEX relocations
against symbols that don't have a table index assigned (since they are
not address taken by actual code.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66435

Files:
  lld/test/wasm/debuginfo-relocs.s
  lld/wasm/InputChunks.cpp
  lld/wasm/InputFiles.cpp
  llvm/lib/MC/MCParser/WasmAsmParser.cpp


Index: llvm/lib/MC/MCParser/WasmAsmParser.cpp
===================================================================
--- llvm/lib/MC/MCParser/WasmAsmParser.cpp
+++ llvm/lib/MC/MCParser/WasmAsmParser.cpp
@@ -123,6 +123,7 @@
                     // See use of .init_array in WasmObjectWriter and
                     // TargetLoweringObjectFileWasm
                     .StartsWith(".init_array", SectionKind::getData())
+                    .StartsWith(".debug_", SectionKind::getMetadata())
                     .Default(Optional<SectionKind>());
     if (!Kind.hasValue())
       return Parser->Error(Lexer->getLoc(), "unknown section kind: " + Name);
Index: lld/wasm/InputFiles.cpp
===================================================================
--- lld/wasm/InputFiles.cpp
+++ lld/wasm/InputFiles.cpp
@@ -166,7 +166,7 @@
   case R_WASM_TABLE_INDEX_I32:
   case R_WASM_TABLE_INDEX_SLEB:
   case R_WASM_TABLE_INDEX_REL_SLEB:
-    if (config->isPic && !getFunctionSymbol(reloc.Index)->hasTableIndex())
+    if (!getFunctionSymbol(reloc.Index)->hasTableIndex())
       return 0;
     return getFunctionSymbol(reloc.Index)->getTableIndex();
   case R_WASM_MEMORY_ADDR_SLEB:
Index: lld/wasm/InputChunks.cpp
===================================================================
--- lld/wasm/InputChunks.cpp
+++ lld/wasm/InputChunks.cpp
@@ -100,7 +100,7 @@
   verifyRelocTargets();
 #endif
 
-  LLVM_DEBUG(dbgs() << "applying relocations: " << getName()
+  LLVM_DEBUG(dbgs() << "applying relocations: " << toString(this)
                     << " count=" << relocations.size() << "\n");
   int32_t off = outputOffset - getInputSectionOffset();
 
Index: lld/test/wasm/debuginfo-relocs.s
===================================================================
--- /dev/null
+++ lld/test/wasm/debuginfo-relocs.s
@@ -0,0 +1,23 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld %t.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+bar:
+    .functype bar () -> ()
+    end_function
+
+    .globl _start
+_start:
+    .functype _start () -> ()
+    call bar
+    end_function
+
+    .section .debug_info,"",@
+    .int32 bar
+
+# Even though `bar` is live in the final binary it doesn't have a table entry
+# since its not address taken in the code.  In this case any relocations in the
+# debug sections see a address of zero.
+
+# CHECK:         Name:            .debug_info
+# CHECK-NEXT:    Payload:         '00000000'


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66435.215967.patch
Type: text/x-patch
Size: 2454 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190819/fa948ee1/attachment.bin>


More information about the llvm-commits mailing list