Author: Caroline Tice
Date: 2021-04-15T14:43:47-07:00
New Revision: b241f3cb292d0ba1ad5a33b3bbd4a8a3a9c909dc

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

LOG: [LLDB] Use path relative to binary for finding .dwo files.

DWARF allows .dwo file paths to be relative rather than absolute. When
they are relative, DWARF uses DW_AT_comp_dir to find the .dwo
file. DW_AT_comp_dir can also be relative, making the entire search
patch for the .dwo file relative. In this case, LLDB currently
searches relative to its current working directory, i.e. the directory
from which the debugger was launched. This is not right, as the
compiler, which generated the relative paths, can have no idea where
the debugger will be launched. The correct thing is to search relative
to the location of the executable binary. That is what this patch
does.

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

Added: 
    lldb/test/Shell/SymbolFile/DWARF/dwo-relative-path.s

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

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp 
b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 3a04f429c7c75..da170383405fb 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1651,6 +1651,13 @@ SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(
       return nullptr;
 
     dwo_file.SetFile(comp_dir, FileSpec::Style::native);
+    if (dwo_file.IsRelative()) {
+      // if DW_AT_comp_dir is relative, it should be relative to the location
+      // of the executable, not to the location from which the debugger was
+      // launched.
+      dwo_file.PrependPathComponent(
+          m_objfile_sp->GetFileSpec().GetDirectory().GetStringRef());
+    }
     FileSystem::Instance().Resolve(dwo_file);
     dwo_file.AppendPathComponent(dwo_name);
   }

diff  --git a/lldb/test/Shell/SymbolFile/DWARF/dwo-relative-path.s 
b/lldb/test/Shell/SymbolFile/DWARF/dwo-relative-path.s
new file mode 100644
index 0000000000000..cc05434261e4e
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/dwo-relative-path.s
@@ -0,0 +1,417 @@
+# Test to verify LLDB searches for dwos with relative paths relative to the
+# binary location, not relative to LLDB's launch location.
+
+# RUN: llvm-mc --filetype=obj --triple x86_64-pc-linux %s -o %t.o
+# RUN: llvm-objcopy --split-dwo=%T/dwo-relative-path.dwo %t.o
+
+# RUN: cd ../..
+
+# RUN: %lldb %t.o -o "target var x" -b 2>&1 | FileCheck %s
+
+# CHECK: x = 0
+
+       .text
+       .file   "dwo-relative-path.cpp"
+       .file   0 "." "dwo-relative-path.cpp" md5 
0xadc61d242247514c5d402d62db34b825
+       .globl  main                            # -- Begin function main
+       .p2align        4, 0x90
+       .type   main,@function
+main:                                   # @main
+.Lfunc_begin0:
+       .loc    0 14 0                          # dwo-relative-path.cpp:14:0
+       .cfi_startproc
+# %bb.0:                                # %entry
+       pushq   %rbp
+       .cfi_def_cfa_offset 16
+       .cfi_offset %rbp, -16
+       movq    %rsp, %rbp
+       .cfi_def_cfa_register %rbp
+       movl    $0, -4(%rbp)
+       movl    %edi, -8(%rbp)
+       movq    %rsi, -16(%rbp)
+.Ltmp0:
+       .loc    0 15 8 prologue_end             # dwo-relative-path.cpp:15:8
+       movw    .L__const.main.y, %ax
+       movw    %ax, -19(%rbp)
+       movb    .L__const.main.y+2, %al
+       movb    %al, -17(%rbp)
+       .loc    0 17 14                         # dwo-relative-path.cpp:17:14
+       movsbl  -19(%rbp), %eax
+       .loc    0 17 27 is_stmt 0               # dwo-relative-path.cpp:17:27
+       movsbl  -18(%rbp), %ecx
+       .loc    0 17 19                         # dwo-relative-path.cpp:17:19
+       addl    %ecx, %eax
+       .loc    0 17 5                          # dwo-relative-path.cpp:17:5
+       addl    x, %eax
+       movl    %eax, x
+       .loc    0 19 3 is_stmt 1                # dwo-relative-path.cpp:19:3
+       xorl    %eax, %eax
+       popq    %rbp
+       .cfi_def_cfa %rsp, 8
+       retq
+.Ltmp1:
+.Lfunc_end0:
+       .size   main, .Lfunc_end0-main
+       .cfi_endproc
+                                        # -- End function
+       .type   x,@object                       # @x
+       .data
+       .globl  x
+       .p2align        2
+x:
+       .long   10                              # 0xa
+       .size   x, 4
+
+       .type   .L__const.main.y,@object        # @__const.main.y
+       .section        .rodata,"a",@progbits
+.L__const.main.y:
+       .ascii  "abc"
+       .size   .L__const.main.y, 3
+
+       .section        .debug_abbrev,"",@progbits
+       .byte   1                               # Abbreviation Code
+       .byte   74                              # DW_TAG_skeleton_unit
+       .byte   0                               # DW_CHILDREN_no
+       .byte   16                              # DW_AT_stmt_list
+       .byte   23                              # DW_FORM_sec_offset
+       .byte   114                             # DW_AT_str_offsets_base
+       .byte   23                              # DW_FORM_sec_offset
+       .byte   27                              # DW_AT_comp_dir
+       .byte   37                              # DW_FORM_strx1
+       .ascii  "\264B"                         # DW_AT_GNU_pubnames
+       .byte   25                              # DW_FORM_flag_present
+       .byte   118                             # DW_AT_dwo_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   17                              # DW_AT_low_pc
+       .byte   27                              # DW_FORM_addrx
+       .byte   18                              # DW_AT_high_pc
+       .byte   6                               # DW_FORM_data4
+       .byte   115                             # DW_AT_addr_base
+       .byte   23                              # DW_FORM_sec_offset
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   0                               # EOM(3)
+       .section        .debug_info,"",@progbits
+.Lcu_begin0:
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  5                               # DWARF version number
+       .byte   4                               # DWARF Unit Type
+       .byte   8                               # Address Size (in bytes)
+       .long   .debug_abbrev                   # Offset Into Abbrev. Section
+       .quad   3752513468363206953
+       .byte   1                               # Abbrev [1] 0x14:0x14 
DW_TAG_skeleton_unit
+       .long   .Lline_table_start0             # DW_AT_stmt_list
+       .long   .Lstr_offsets_base0             # DW_AT_str_offsets_base
+       .byte   0                               # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+       .byte   1                               # DW_AT_dwo_name
+       .byte   1                               # DW_AT_low_pc
+       .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+       .long   .Laddr_table_base0              # DW_AT_addr_base
+.Ldebug_info_end0:
+       .section        .debug_str_offsets,"",@progbits
+       .long   12                              # Length of String Offsets Set
+       .short  5
+       .short  0
+.Lstr_offsets_base0:
+       .section        .debug_str,"MS",@progbits,1
+.Lskel_string0:
+       .asciz  "."                             # string offset=0
+.Lskel_string1:
+       .asciz  "dwo-relative-path.dwo"         # string offset=2
+       .section        .debug_str_offsets,"",@progbits
+       .long   .Lskel_string0
+       .long   .Lskel_string1
+       .section        .debug_str_offsets.dwo,"e",@progbits
+       .long   48                              # Length of String Offsets Set
+       .short  5
+       .short  0
+       .section        .debug_str.dwo,"eMS",@progbits,1
+.Linfo_string0:
+       .asciz  "x"                             # string offset=0
+.Linfo_string1:
+       .asciz  "int"                           # string offset=2
+.Linfo_string2:
+       .asciz  "main"                          # string offset=6
+.Linfo_string3:
+       .asciz  "argc"                          # string offset=11
+.Linfo_string4:
+       .asciz  "argv"                          # string offset=16
+.Linfo_string5:
+       .asciz  "char"                          # string offset=21
+.Linfo_string6:
+       .asciz  "y"                             # string offset=26
+.Linfo_string7:
+       .asciz  "__ARRAY_SIZE_TYPE__"           # string offset=28
+.Linfo_string8:
+       .asciz  "clang version 13.0.0 
(https://chromium.googlesource.com/external/github.com/llvm/llvm-project 
6666e0d7a29c639df7a1652b6d3bf16f28edd45a)" # string offset=48
+.Linfo_string9:
+       .asciz  "dwo-relative-path.cpp"         # string offset=184
+.Linfo_string10:
+       .asciz  "dwo-relative-path.dwo"         # string offset=206
+       .section        .debug_str_offsets.dwo,"e",@progbits
+       .long   0
+       .long   2
+       .long   6
+       .long   11
+       .long   16
+       .long   21
+       .long   26
+       .long   28
+       .long   48
+       .long   184
+       .long   206
+       .section        .debug_info.dwo,"e",@progbits
+       .long   .Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+       .short  5                               # DWARF version number
+       .byte   5                               # DWARF Unit Type
+       .byte   8                               # Address Size (in bytes)
+       .long   0                               # Offset Into Abbrev. Section
+       .quad   3752513468363206953
+       .byte   1                               # Abbrev [1] 0x14:0x65 
DW_TAG_compile_unit
+       .byte   8                               # DW_AT_producer
+       .short  33                              # DW_AT_language
+       .byte   9                               # DW_AT_name
+       .byte   10                              # DW_AT_dwo_name
+       .byte   2                               # Abbrev [2] 0x1a:0xb 
DW_TAG_variable
+       .byte   0                               # DW_AT_name
+       .long   37                              # DW_AT_type
+                                        # DW_AT_external
+       .byte   0                               # DW_AT_decl_file
+       .byte   11                              # DW_AT_decl_line
+       .byte   2                               # DW_AT_location
+       .byte   161
+       .byte   0
+       .byte   3                               # Abbrev [3] 0x25:0x4 
DW_TAG_base_type
+       .byte   1                               # DW_AT_name
+       .byte   5                               # DW_AT_encoding
+       .byte   4                               # DW_AT_byte_size
+       .byte   4                               # Abbrev [4] 0x29:0x31 
DW_TAG_subprogram
+       .byte   1                               # DW_AT_low_pc
+       .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+       .byte   1                               # DW_AT_frame_base
+       .byte   86
+       .byte   2                               # DW_AT_name
+       .byte   0                               # DW_AT_decl_file
+       .byte   13                              # DW_AT_decl_line
+       .long   37                              # DW_AT_type
+                                        # DW_AT_external
+       .byte   5                               # Abbrev [5] 0x38:0xb 
DW_TAG_formal_parameter
+       .byte   2                               # DW_AT_location
+       .byte   145
+       .byte   120
+       .byte   3                               # DW_AT_name
+       .byte   0                               # DW_AT_decl_file
+       .byte   13                              # DW_AT_decl_line
+       .long   37                              # DW_AT_type
+       .byte   5                               # Abbrev [5] 0x43:0xb 
DW_TAG_formal_parameter
+       .byte   2                               # DW_AT_location
+       .byte   145
+       .byte   112
+       .byte   4                               # DW_AT_name
+       .byte   0                               # DW_AT_decl_file
+       .byte   13                              # DW_AT_decl_line
+       .long   90                              # DW_AT_type
+       .byte   6                               # Abbrev [6] 0x4e:0xb 
DW_TAG_variable
+       .byte   2                               # DW_AT_location
+       .byte   145
+       .byte   109
+       .byte   6                               # DW_AT_name
+       .byte   0                               # DW_AT_decl_file
+       .byte   15                              # DW_AT_decl_line
+       .long   104                             # DW_AT_type
+       .byte   0                               # End Of Children Mark
+       .byte   7                               # Abbrev [7] 0x5a:0x5 
DW_TAG_pointer_type
+       .long   95                              # DW_AT_type
+       .byte   7                               # Abbrev [7] 0x5f:0x5 
DW_TAG_pointer_type
+       .long   100                             # DW_AT_type
+       .byte   3                               # Abbrev [3] 0x64:0x4 
DW_TAG_base_type
+       .byte   5                               # DW_AT_name
+       .byte   6                               # DW_AT_encoding
+       .byte   1                               # DW_AT_byte_size
+       .byte   8                               # Abbrev [8] 0x68:0xc 
DW_TAG_array_type
+       .long   100                             # DW_AT_type
+       .byte   9                               # Abbrev [9] 0x6d:0x6 
DW_TAG_subrange_type
+       .long   116                             # DW_AT_type
+       .byte   3                               # DW_AT_count
+       .byte   0                               # End Of Children Mark
+       .byte   10                              # Abbrev [10] 0x74:0x4 
DW_TAG_base_type
+       .byte   7                               # DW_AT_name
+       .byte   8                               # DW_AT_byte_size
+       .byte   7                               # DW_AT_encoding
+       .byte   0                               # End Of Children Mark
+.Ldebug_info_dwo_end0:
+       .section        .debug_abbrev.dwo,"e",@progbits
+       .byte   1                               # Abbreviation Code
+       .byte   17                              # DW_TAG_compile_unit
+       .byte   1                               # DW_CHILDREN_yes
+       .byte   37                              # DW_AT_producer
+       .byte   37                              # DW_FORM_strx1
+       .byte   19                              # DW_AT_language
+       .byte   5                               # DW_FORM_data2
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   118                             # DW_AT_dwo_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   2                               # Abbreviation Code
+       .byte   52                              # DW_TAG_variable
+       .byte   0                               # DW_CHILDREN_no
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   63                              # DW_AT_external
+       .byte   25                              # DW_FORM_flag_present
+       .byte   58                              # DW_AT_decl_file
+       .byte   11                              # DW_FORM_data1
+       .byte   59                              # DW_AT_decl_line
+       .byte   11                              # DW_FORM_data1
+       .byte   2                               # DW_AT_location
+       .byte   24                              # DW_FORM_exprloc
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   3                               # Abbreviation Code
+       .byte   36                              # DW_TAG_base_type
+       .byte   0                               # DW_CHILDREN_no
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   62                              # DW_AT_encoding
+       .byte   11                              # DW_FORM_data1
+       .byte   11                              # DW_AT_byte_size
+       .byte   11                              # DW_FORM_data1
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   4                               # Abbreviation Code
+       .byte   46                              # DW_TAG_subprogram
+       .byte   1                               # DW_CHILDREN_yes
+       .byte   17                              # DW_AT_low_pc
+       .byte   27                              # DW_FORM_addrx
+       .byte   18                              # DW_AT_high_pc
+       .byte   6                               # DW_FORM_data4
+       .byte   64                              # DW_AT_frame_base
+       .byte   24                              # DW_FORM_exprloc
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   58                              # DW_AT_decl_file
+       .byte   11                              # DW_FORM_data1
+       .byte   59                              # DW_AT_decl_line
+       .byte   11                              # DW_FORM_data1
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   63                              # DW_AT_external
+       .byte   25                              # DW_FORM_flag_present
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   5                               # Abbreviation Code
+       .byte   5                               # DW_TAG_formal_parameter
+       .byte   0                               # DW_CHILDREN_no
+       .byte   2                               # DW_AT_location
+       .byte   24                              # DW_FORM_exprloc
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   58                              # DW_AT_decl_file
+       .byte   11                              # DW_FORM_data1
+       .byte   59                              # DW_AT_decl_line
+       .byte   11                              # DW_FORM_data1
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   6                               # Abbreviation Code
+       .byte   52                              # DW_TAG_variable
+       .byte   0                               # DW_CHILDREN_no
+       .byte   2                               # DW_AT_location
+       .byte   24                              # DW_FORM_exprloc
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   58                              # DW_AT_decl_file
+       .byte   11                              # DW_FORM_data1
+       .byte   59                              # DW_AT_decl_line
+       .byte   11                              # DW_FORM_data1
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   7                               # Abbreviation Code
+       .byte   15                              # DW_TAG_pointer_type
+       .byte   0                               # DW_CHILDREN_no
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   8                               # Abbreviation Code
+       .byte   1                               # DW_TAG_array_type
+       .byte   1                               # DW_CHILDREN_yes
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   9                               # Abbreviation Code
+       .byte   33                              # DW_TAG_subrange_type
+       .byte   0                               # DW_CHILDREN_no
+       .byte   73                              # DW_AT_type
+       .byte   19                              # DW_FORM_ref4
+       .byte   55                              # DW_AT_count
+       .byte   11                              # DW_FORM_data1
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   10                              # Abbreviation Code
+       .byte   36                              # DW_TAG_base_type
+       .byte   0                               # DW_CHILDREN_no
+       .byte   3                               # DW_AT_name
+       .byte   37                              # DW_FORM_strx1
+       .byte   11                              # DW_AT_byte_size
+       .byte   11                              # DW_FORM_data1
+       .byte   62                              # DW_AT_encoding
+       .byte   11                              # DW_FORM_data1
+       .byte   0                               # EOM(1)
+       .byte   0                               # EOM(2)
+       .byte   0                               # EOM(3)
+       .section        .debug_addr,"",@progbits
+       .long   .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+       .short  5                               # DWARF version number
+       .byte   8                               # Address size
+       .byte   0                               # Segment selector size
+.Laddr_table_base0:
+       .quad   x
+       .quad   .Lfunc_begin0
+.Ldebug_addr_end0:
+       .section        .debug_gnu_pubnames,"",@progbits
+       .long   .LpubNames_end0-.LpubNames_start0 # Length of Public Names Info
+.LpubNames_start0:
+       .short  2                               # DWARF Version
+       .long   .Lcu_begin0                     # Offset of Compilation Unit 
Info
+       .long   40                              # Compilation Unit Length
+       .long   41                              # DIE offset
+       .byte   48                              # Attributes: FUNCTION, EXTERNAL
+       .asciz  "main"                          # External Name
+       .long   26                              # DIE offset
+       .byte   32                              # Attributes: VARIABLE, EXTERNAL
+       .asciz  "x"                             # External Name
+       .long   0                               # End Mark
+.LpubNames_end0:
+       .section        .debug_gnu_pubtypes,"",@progbits
+       .long   .LpubTypes_end0-.LpubTypes_start0 # Length of Public Types Info
+.LpubTypes_start0:
+       .short  2                               # DWARF Version
+       .long   .Lcu_begin0                     # Offset of Compilation Unit 
Info
+       .long   40                              # Compilation Unit Length
+       .long   37                              # DIE offset
+       .byte   144                             # Attributes: TYPE, STATIC
+       .asciz  "int"                           # External Name
+       .long   100                             # DIE offset
+       .byte   144                             # Attributes: TYPE, STATIC
+       .asciz  "char"                          # External Name
+       .long   0                               # End Mark
+.LpubTypes_end0:
+       .ident  "clang version 13.0.0 
(https://chromium.googlesource.com/external/github.com/llvm/llvm-project 
6666e0d7a29c639df7a1652b6d3bf16f28edd45a)"
+       .section        ".note.GNU-stack","",@progbits
+       .addrsig
+       .addrsig_sym x
+       .section        .debug_line,"",@progbits
+.Lline_table_start0:


        
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to