Author: Pavel Labath Date: 2019-12-06T10:26:52+01:00 New Revision: 5ee8e673135891072789f0f9bf14a5d82f0f8e01
URL: https://github.com/llvm/llvm-project/commit/5ee8e673135891072789f0f9bf14a5d82f0f8e01 DIFF: https://github.com/llvm/llvm-project/commit/5ee8e673135891072789f0f9bf14a5d82f0f8e01.diff LOG: [lldb/DWARF] Fix DW_AT_rnglists_base handling for dwo files the value of DW_AT_rnglists_base of the skeleton unit is for that unit alone (e.g. used in DW_AT_ranges of the unit DIE) and should not apply to the split unit. The split unit has a hardcoded range list base value -- we should initialize range list code whenever we detect a nonempty debug_rnglists.dwo section. Added: lldb/test/Shell/SymbolFile/DWARF/debug_rnglists-dwo.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 ab8b3cfc280e..35f5c30e1778 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -358,10 +358,12 @@ void DWARFUnit::AddUnitDIE(const DWARFDebugInfoEntry &cu_die) { else if (gnu_addr_base) dwo_cu->SetAddrBase(*gnu_addr_base); - if (ranges_base) - dwo_cu->SetRangesBase(*ranges_base); - else if (gnu_ranges_base) + if (GetVersion() <= 4 && gnu_ranges_base) dwo_cu->SetRangesBase(*gnu_ranges_base); + else if (m_dwo_symbol_file->GetDWARFContext() + .getOrLoadRngListsData() + .GetByteSize() > 0) + dwo_cu->SetRangesBase(llvm::DWARFListTableHeader::getHeaderSize(DWARF32)); for (size_t i = 0; i < m_dwo_symbol_file->DebugInfo()->GetNumUnits(); ++i) { DWARFUnit *unit = m_dwo_symbol_file->DebugInfo()->GetUnitAtIndex(i); diff --git a/lldb/test/Shell/SymbolFile/DWARF/debug_rnglists-dwo.s b/lldb/test/Shell/SymbolFile/DWARF/debug_rnglists-dwo.s new file mode 100644 index 000000000000..17ed6a76b7eb --- /dev/null +++ b/lldb/test/Shell/SymbolFile/DWARF/debug_rnglists-dwo.s @@ -0,0 +1,156 @@ +# REQUIRES: x86 + +# RUN: cd %T +# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s >debug_rnglists-dwo.o +# RUN: %lldb debug_rnglists-dwo.o -o "image lookup -v -s lookup_rnglists" \ +# RUN: -o exit | FileCheck %s + +# CHECK-LABEL: image lookup -v -s lookup_rnglists +# CHECK: Function: id = {0x00000028}, name = "rnglists", range = [0x0000000000000000-0x0000000000000003) +# CHECK: Blocks: id = {0x00000028}, range = [0x00000000-0x00000003) +# CHECK-NEXT: id = {0x00000037}, range = [0x00000001-0x00000002) + + .text +rnglists: + nop +.Lblock1_begin: +lookup_rnglists: + nop +.Lblock1_end: + nop +.Lrnglists_end: + + .section .debug_abbrev,"",@progbits + .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 0 # DW_CHILDREN_no + .byte 0x76 # DW_AT_dwo_name + .byte 8 # DW_FORM_string + .byte 115 # DW_AT_addr_base + .byte 23 # DW_FORM_sec_offset + .byte 85 # DW_AT_ranges + .byte 35 # DW_FORM_rnglistx + .byte 116 # DW_AT_rnglists_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 0xdeadbeefbaadf00d # DWO id + .byte 1 # Abbrev [1] 0xc:0x5f DW_TAG_compile_unit + .asciz "debug_rnglists-dwo.o" # DW_AT_dwo_name + .long .Laddr_table_base0 # DW_AT_addr_base + .byte 0 # DW_AT_ranges + .long .Lskel_rnglists_table_base # DW_AT_rnglists_base +.Ldebug_info_end0: + + .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 rnglists + .quad .Lblock1_begin +.Ldebug_addr_end0: + + .section .debug_rnglists,"",@progbits + # A fake rnglists contribution so that range list bases for the skeleton + # and split units diff er. + .long .Lfake_rnglist_table_end-.Lfake_rnglist_table_start # Length +.Lfake_rnglist_table_start: + .short 5 # Version + .byte 8 # Address size + .byte 0 # Segment selector size + .long 0 # Offset entry count +.Lfake_rnglists_table_base: +.Lfake_rnglist_table_end: + + .long .Lskel_rnglist_table_end-.Lskel_rnglist_table_start # Length +.Lskel_rnglist_table_start: + .short 5 # Version + .byte 8 # Address size + .byte 0 # Segment selector size + .long 1 # Offset entry count +.Lskel_rnglists_table_base: + .long .Lskel_ranges0-.Lskel_rnglists_table_base +.Lskel_ranges0: + .byte 7 # DW_RLE_start_length + .quad rnglists + .uleb128 .Lrnglists_end-rnglists + .byte 0 # DW_RLE_end_of_list +.Lskel_rnglist_table_end: + + .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 8 # DW_FORM_string + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 2 # 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 3 # DW_AT_name + .byte 8 # DW_FORM_string + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 5 # Abbreviation Code + .byte 11 # DW_TAG_lexical_block + .byte 0 # DW_CHILDREN_no + .byte 85 # DW_AT_ranges + .byte 35 # DW_FORM_rnglistx + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 0 # EOM(3) + + .section .debug_info.dwo,"e",@progbits +.Lcu_begin1: + .long .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit +.Ldebug_info_start1: + .short 5 # DWARF version number + .byte 5 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev # Offset Into Abbrev. Section + .quad 0xdeadbeefbaadf00d # DWO id + .byte 1 # Abbrev [1] 0xc:0x5f DW_TAG_compile_unit + .asciz "Hand-written DWARF" # DW_AT_producer + .byte 2 # Abbrev [2] 0x2b:0x37 DW_TAG_subprogram + .byte 0 # DW_AT_low_pc + .long .Lrnglists_end-rnglists # DW_AT_high_pc + .asciz "rnglists" # DW_AT_name + .byte 5 # Abbrev [5] 0x52:0xf DW_TAG_lexical_block + .byte 0 # DW_AT_ranges + .byte 0 # End Of Children Mark + .byte 0 # End Of Children Mark +.Ldebug_info_end1: + + .section .debug_rnglists.dwo,"e",@progbits + .long .Ldwo_rnglist_table_end-.Ldwo_rnglist_table_start # Length +.Ldwo_rnglist_table_start: + .short 5 # Version + .byte 8 # Address size + .byte 0 # Segment selector size + .long 1 # Offset entry count +.Ldwo_rnglists_table_base: + .long .Ldwo_ranges-.Ldwo_rnglists_table_base +.Ldwo_ranges: + .byte 3 # DW_RLE_startx_length + .uleb128 1 + .uleb128 .Lblock1_end-.Lblock1_begin + .byte 0 # DW_RLE_end_of_list +.Ldwo_rnglist_table_end: _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits