[llvm] r313872 - [dsymutil] Don't resolve DIE reference to NULL DIE.

Jonas Devlieghere via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 21 03:28:33 PDT 2017


Author: jdevlieghere
Date: Thu Sep 21 03:28:33 2017
New Revision: 313872

URL: http://llvm.org/viewvc/llvm-project?rev=313872&view=rev
Log:
[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

Added:
    llvm/trunk/test/tools/dsymutil/Inputs/null_die.o
    llvm/trunk/test/tools/dsymutil/null-die.test
Modified:
    llvm/trunk/tools/dsymutil/DwarfLinker.cpp

Added: llvm/trunk/test/tools/dsymutil/Inputs/null_die.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/null_die.o?rev=313872&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/dsymutil/Inputs/null_die.o (added) and llvm/trunk/test/tools/dsymutil/Inputs/null_die.o Thu Sep 21 03:28:33 2017 differ

Added: llvm/trunk/test/tools/dsymutil/null-die.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/null-die.test?rev=313872&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/null-die.test (added)
+++ llvm/trunk/test/tools/dsymutil/null-die.test Thu Sep 21 03:28:33 2017
@@ -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 }
+...

Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=313872&r1=313871&r2=313872&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
+++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Thu Sep 21 03:28:33 2017
@@ -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();




More information about the llvm-commits mailing list