forked from OSchip/llvm-project
[dsymutil] Don't resolve DIE reference to NULL DIE.
This patch prevents dsymutil from resolving a reference to a NULL DIE when a bogus reference happens to be coincidentally referencing a NULL DIE. Now this is detected as an invalid reference and a warning is printed. Fixes: https://bugs.llvm.org/show_bug.cgi?id=33873 Differential revision: https://reviews.llvm.org/D38078 llvm-svn: 313872
This commit is contained in:
parent
c14b5f210f
commit
2b029e830f
Binary file not shown.
|
@ -0,0 +1,41 @@
|
|||
#RUN: llvm-dsymutil -f -oso-prepend-path=%p/Inputs/ -y %s -no-output 2>&1 \
|
||||
#RUN: | FileCheck %s
|
||||
|
||||
# CHECK: warning: could not find referenced DIE
|
||||
|
||||
# We've modified the DW_AT_abstract_origin offset to reference a NULL DIE.
|
||||
#
|
||||
# Source:
|
||||
#
|
||||
# void f1() {}
|
||||
# __attribute__((always_inline)) void f2() {
|
||||
# f1();
|
||||
# }
|
||||
# int main() {
|
||||
# f2();
|
||||
# }
|
||||
#
|
||||
# Compile with:
|
||||
#
|
||||
# $ clang -g null_die.c -O0 -S -o null_die.s
|
||||
#
|
||||
# Manually patch the DW_AT_abstract_origin to point to a NULL DIE.
|
||||
#
|
||||
# $ llvm-mc -triple x86_64-apple-darwin -filetype=obj -o null_die.o null_die.s
|
||||
#
|
||||
# To generate the debug map:
|
||||
#
|
||||
# $ ld -arch x86_64 -macosx_version_min 10.13.0 -lSystem null_die.o -o null_die
|
||||
# $ llvm-dsymutil -dump-debug-map null_die
|
||||
|
||||
---
|
||||
triple: 'x86_64-apple-darwin'
|
||||
binary-path: null_die
|
||||
objects:
|
||||
- filename: /null_die.o
|
||||
timestamp: 1505928022
|
||||
symbols:
|
||||
- { sym: _main, objAddr: 0x0000000000000020, binAddr: 0x0000000100000F10, size: 0x0000000D }
|
||||
- { sym: _f1, objAddr: 0x0000000000000000, binAddr: 0x0000000100000EF0, size: 0x00000010 }
|
||||
- { sym: _f2, objAddr: 0x0000000000000010, binAddr: 0x0000000100000F00, size: 0x00000010 }
|
||||
...
|
|
@ -1495,8 +1495,12 @@ static DWARFDie resolveDIEReference(
|
|||
uint64_t RefOffset = *RefValue.getAsReference();
|
||||
|
||||
if ((RefCU = getUnitForOffset(Units, RefOffset)))
|
||||
if (const auto RefDie = RefCU->getOrigUnit().getDIEForOffset(RefOffset))
|
||||
return RefDie;
|
||||
if (const auto RefDie = RefCU->getOrigUnit().getDIEForOffset(RefOffset)) {
|
||||
// In a file with broken references, an attribute might point to a NULL
|
||||
// DIE.
|
||||
if(!RefDie.isNULL())
|
||||
return RefDie;
|
||||
}
|
||||
|
||||
Linker.reportWarning("could not find referenced DIE", &DIE);
|
||||
return DWARFDie();
|
||||
|
|
Loading…
Reference in New Issue