[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