]> granicus.if.org Git - llvm/commitdiff
DWARF v5: fix directory index in the line table
authorFangrui Song <maskray@google.com>
Mon, 6 May 2019 08:03:46 +0000 (08:03 +0000)
committerFangrui Song <maskray@google.com>
Mon, 6 May 2019 08:03:46 +0000 (08:03 +0000)
Summary:
Prior to DWARF v5, a directory index of 0 represents DW_AT_comp_dir.

In DWARF v5, the index starts with 0 and Entry.DirIdx is the index into
Prologue.IncludeDirectories.

Reviewed By: labath

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360015 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/DWARF/DWARFDebugLine.cpp
test/DebugInfo/symbolize-directory.s [new file with mode: 0644]

index 1f18973f1d48c3c871d87b34f9c6befc05fc43aa..9f9aaabf1e89dec3de5b489295ea162a2b13da97 100644 (file)
@@ -1020,20 +1020,24 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex,
   }
 
   SmallString<16> FilePath;
-  uint64_t IncludeDirIndex = Entry.DirIdx;
   StringRef IncludeDir;
   // Be defensive about the contents of Entry.
-  if (IncludeDirIndex > 0 &&
-      IncludeDirIndex <= Prologue.IncludeDirectories.size())
-    IncludeDir = Prologue.IncludeDirectories[IncludeDirIndex - 1]
-                     .getAsCString()
-                     .getValue();
-
-  // We may still need to append compilation directory of compile unit.
-  // We know that FileName is not absolute, the only way to have an
-  // absolute path at this point would be if IncludeDir is absolute.
-  if (CompDir && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
-    sys::path::append(FilePath, CompDir);
+  if (Prologue.getVersion() >= 5) {
+    if (Entry.DirIdx < Prologue.IncludeDirectories.size())
+      IncludeDir =
+          Prologue.IncludeDirectories[Entry.DirIdx].getAsCString().getValue();
+  } else {
+    if (0 < Entry.DirIdx && Entry.DirIdx <= Prologue.IncludeDirectories.size())
+      IncludeDir = Prologue.IncludeDirectories[Entry.DirIdx - 1]
+                       .getAsCString()
+                       .getValue();
+
+    // We may still need to append compilation directory of compile unit.
+    // We know that FileName is not absolute, the only way to have an
+    // absolute path at this point would be if IncludeDir is absolute.
+    if (CompDir && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
+      sys::path::append(FilePath, CompDir);
+  }
 
   // sys::path::append skips empty strings.
   sys::path::append(FilePath, IncludeDir, FileName);
diff --git a/test/DebugInfo/symbolize-directory.s b/test/DebugInfo/symbolize-directory.s
new file mode 100644 (file)
index 0000000..5dbd0b5
--- /dev/null
@@ -0,0 +1,62 @@
+# REQUIRES: x86-registered-target
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 -dwarf-version=5 %s -o %t.o
+# RUN: llvm-symbolizer --obj=%t.o --functions=none 0 1 | FileCheck %s
+
+# CHECK: /home/0.cc:1:0
+# CHECK: /tmp/1.cc:2:1
+
+.Lfunc_begin0:
+  .file 0 "/home" "0.cc"
+  .file 1 "/tmp" "1.cc"
+  .loc 0 1 0                 # 0.cc:1:0
+  nop
+  .loc 1 2 1                 # 1.cc:2:1
+  nop
+  .loc 0 1 1 prologue_end    # 0.cc:1:1
+.Lfunc_end0:
+
+.section .debug_abbrev,"",@progbits
+  .byte 1     # Abbreviation Code
+  .byte 17    # DW_TAG_compile_unit
+  .byte 1     # DW_children_yes
+  .byte 16    # DW_AT_stmt_list
+  .byte 23    # DW_FROM_sec_offset
+  .byte 17    # DW_AT_low_pc
+  .byte 1     # DW_FORM_addr
+  .byte 18    # DW_AT_high_pc
+  .byte 6     # DW_FORM_data4
+  .byte 0     # EOM(1)
+  .byte 0     # EOM(2)
+
+  .byte 2     # Abbreviation Code
+  .byte 46    # DW_TAG_subprogram
+  .byte 0     # DW_children_no
+  .byte 3     # DW_AT_name
+  .byte 8     # DW_FORM_string
+  .byte 17    # DW_AT_low_pc
+  .byte 1     # DW_FORM_addr
+  .byte 18    # DW_AT_high_pc
+  .byte 6     # DW_FORM_data4
+  .byte 0     # EOM(1)
+  .byte 0     # EOM(2)
+
+  .byte 0     # EOM(3)
+
+.section .debug_info,"",@progbits
+.Lcu_begin0:
+  .long .Lcu_end0-.Lcu_begin0-4 # Length of Unit
+  .short 5                      # DWARF version number
+  .byte 1                       # DWARF Unit Type
+  .byte 8                       # Address Size (in bytes)
+  .long .debug_abbrev           # Offset Into Abbrev.
+  .byte 1                       # Abbrev [1]
+  .long 0                       # DW_AT_stmt_list
+  .quad 0                       # DW_AT_low_pc
+  .long 2                       # DW_AT_high_pc
+  .byte 2                       # Abbrev [2] DW_TAG_subprogram
+  .asciz "0.c"                  # DW_AT_name
+  .quad 0                       # DW_AT_low_pc
+  .long 2                       # DW_AT_high_pc
+  .byte 0
+.Lcu_end0: