[Lldb-commits] [lldb] 46f02fc - [lldb/DWARF] Fix hostname-stripping logic

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Mon Dec 23 05:53:03 PST 2019


Author: Pavel Labath
Date: 2019-12-23T14:54:22+01:00
New Revision: 46f02fc922e053006e34d860e9efaf29c88d8ba3

URL: https://github.com/llvm/llvm-project/commit/46f02fc922e053006e34d860e9efaf29c88d8ba3
DIFF: https://github.com/llvm/llvm-project/commit/46f02fc922e053006e34d860e9efaf29c88d8ba3.diff

LOG: [lldb/DWARF] Fix hostname-stripping logic

This bit of code is trying to strip everything up to the first colon
from all debug info paths, as dwarf2 recommends this syntax for storing
the compilation host name. However, this code was too eager, and it
ended up stripping the entire compilation directory, if it did not
contain a forward slash (or a "x:\").

Normally this does not matter, as all absolute paths will contain one of
these patterns, but this does not have to be the case in case the debug
info is produced by "clang -fdebug-compilation-dir", which can end up
producing a relative compilation directory with no slashes (this is one
of the techniques for producing "relocatable" debug info).

Added: 
    lldb/test/Shell/SymbolFile/DWARF/debug_line-relative_path.s

Modified: 
    lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index fde6459b2c61..3ced8d7f89b7 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -718,6 +718,8 @@ FileSpec DWARFUnit::GetFile(size_t file_idx) {
 // Remove the host part if present.
 static llvm::StringRef
 removeHostnameFromPathname(llvm::StringRef path_from_dwarf) {
+  if (!path_from_dwarf.contains(':'))
+    return path_from_dwarf;
   llvm::StringRef host, path;
   std::tie(host, path) = path_from_dwarf.split(':');
 

diff  --git a/lldb/test/Shell/SymbolFile/DWARF/debug_line-relative_path.s b/lldb/test/Shell/SymbolFile/DWARF/debug_line-relative_path.s
new file mode 100644
index 000000000000..8bbf30bfcc39
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/debug_line-relative_path.s
@@ -0,0 +1,49 @@
+# This tests handling of debug info with fully relative paths, such as those
+# produced by "clang -fdebug-compilation-dir <something-relative>". This is one
+# of the techniques used to produce "relocatable" debug info.
+
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux -o %t %s
+# RUN: %lldb %t -o "image dump line-table t.c" | FileCheck %s
+
+# CHECK: 0x0000000000000000: {{q[\\/]w[\\/]e[\\/]r[\\/]t}}.c:1
+
+        .text
+main:
+        .file   1 "w/e/r" "t.c"
+        .loc    1 1 0                   # w/e/r/t.c:1:0
+        retq
+
+        .section        .debug_abbrev,"", at progbits
+        .byte   1                       # Abbreviation Code
+        .byte   17                      # DW_TAG_compile_unit
+        .byte   0                       # DW_CHILDREN_no
+        .byte   37                      # DW_AT_producer
+        .byte   8                       # DW_FORM_string
+        .byte   3                       # DW_AT_name
+        .byte   8                       # DW_FORM_string
+        .byte   16                      # DW_AT_stmt_list
+        .byte   23                      # DW_FORM_sec_offset
+        .byte   27                      # DW_AT_comp_dir
+        .byte   8                       # DW_FORM_string
+        .byte   0                       # EOM(1)
+        .byte   0                       # EOM(2)
+        .byte   0                       # EOM(3)
+
+        .section        .debug_info,"", at progbits
+.Lcu_begin0:
+        .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+        .short  4                       # DWARF version number
+        .long   .debug_abbrev           # Offset Into Abbrev. Section
+        .byte   8                       # Address Size (in bytes)
+        .byte   1                       # Abbrev [1] 0xb:0x40 DW_TAG_compile_unit
+        .asciz  "Hand-written DWARF"    # DW_AT_producer
+        .asciz  "w/e/r/t.c"             # DW_AT_name
+        .long   .Lline_table_start0     # DW_AT_stmt_list
+        .asciz  "q"                     # DW_AT_comp_dir
+.Ldebug_info_end0:
+
+        .section        .debug_line,"", at progbits
+.Lline_table_start0:


        


More information about the lldb-commits mailing list