[Lldb-commits] [lldb] 3dc24bc - [LLDB] Re-land: Use path relative to binary for finding .dwo files.

David Blaikie via lldb-commits lldb-commits at lists.llvm.org
Fri Apr 16 11:19:31 PDT 2021


For future reference it'd be good to include some details in a
recommit including the original commit hash, the revert hash, the
reason for the revert and what's changed in this commit to address
that problem.

For others reading along, according to the phab review this test hit a
bug in lldb and the test has been tweaked to avoid the bug - Pavel
Labath's going to look into the bug in the future.

On Fri, Apr 16, 2021 at 11:13 AM Caroline Tice via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
>
> Author: Caroline Tice
> Date: 2021-04-16T11:12:39-07:00
> New Revision: 3dc24bc31edbc01dea085b24a6a6b024d7ae531c
>
> URL: https://github.com/llvm/llvm-project/commit/3dc24bc31edbc01dea085b24a6a6b024d7ae531c
> DIFF: https://github.com/llvm/llvm-project/commit/3dc24bc31edbc01dea085b24a6a6b024d7ae531c.diff
>
> LOG: [LLDB] Re-land: 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..1916461e3ce8b
> --- /dev/null
> +++ b/lldb/test/Shell/SymbolFile/DWARF/dwo-relative-path.s
> @@ -0,0 +1,173 @@
> +# 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 = 10
> +
> +       .file   "dwo-relative-path.cpp"
> +       .file   0 "." "dwo-relative-path.cpp" md5 0xadc61d242247514c5d402d62db34b825
> +       .type   x, at object                       # @x
> +       .data
> +       .globl  x
> +       .p2align        2
> +x:
> +       .long   10                              # 0xa
> +       .size   x, 4
> +
> +       .section        .debug_abbrev,"", at 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   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,"", at 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
> +       .long   .Laddr_table_base0              # DW_AT_addr_base
> +.Ldebug_info_end0:
> +       .section        .debug_str_offsets,"", at progbits
> +       .long   12                              # Length of String Offsets Set
> +       .short  5
> +       .short  0
> +.Lstr_offsets_base0:
> +       .section        .debug_str,"MS", at progbits,1
> +.Lskel_string0:
> +       .asciz  "."                             # string offset=0
> +.Lskel_string1:
> +       .asciz  "dwo-relative-path.dwo"         # string offset=2
> +       .section        .debug_str_offsets,"", at progbits
> +       .long   .Lskel_string0
> +       .long   .Lskel_string1
> +       .section        .debug_str_offsets.dwo,"e", at progbits
> +       .long   24                              # Length of String Offsets Set
> +       .short  5
> +       .short  0
> +       .section        .debug_str.dwo,"eMS", at progbits,1
> +.Linfo_string0:
> +       .asciz  "x"
> +.Linfo_string1:
> +       .asciz  "int"
> +.Linfo_string2:
> +       .asciz  "clang version 13.0.0 (https://chromium.googlesource.com/external/github.com/llvm/llvm-project 6666e0d7a29c639df7a1652b6d3bf16f28edd45a)"
> +.Linfo_string3:
> +       .asciz  "dwo-relative-path.cpp"
> +.Linfo_string10:
> +       .asciz  "dwo-relative-path.dwo"
> +       .section        .debug_str_offsets.dwo,"e", at progbits
> +       .long   .Linfo_string0-.debug_str.dwo
> +       .long   .Linfo_string1-.debug_str.dwo
> +       .long   .Linfo_string2-.debug_str.dwo
> +       .long   .Linfo_string3-.debug_str.dwo
> +       .section        .debug_info.dwo,"e", at 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   0                               # End Of Children Mark
> +.Ldebug_info_dwo_end0:
> +       .section        .debug_abbrev.dwo,"e", at 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   0                               # EOM(3)
> +       .section        .debug_addr,"", at 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
> +.Ldebug_addr_end0:
> +       .section        .debug_line,"", at progbits
> +.Lline_table_start0:
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list