Files
clang-p2996/lldb/test/Shell/SymbolFile/DWARF/debug_rnglists.s
Pavel Labath f5767e284b [lldb/DWARF] Switch to llvm debug_rnglists parser
Summary:
Our rnglist support was working only for the trivial cases (one CU),
because we only ever parsed one contribution out of the debug_rnglists
section. This means we were never able to resolve range lists for the
second and subsequent units (DW_FORM_sec_offset references came out
blang, and DW_FORM_rnglistx references always used the ranges lists from
the first unit).

Since both llvm and lldb rnglist parsers are sufficiently
self-contained, and operate similarly, we can fix this problem by
switching to the llvm parser instead. Besides the changes which are due
to variations in the interface, the main thing is that now the range
list object is a member of the DWARFUnit, instead of the entire symbol
file. This ensures that each unit can get it's own private set of range
list indices, and is consistent with how llvm's DWARFUnit does it
(overall, I've tried to structure the code the same way as the llvm
version).

I've also added a test case for the two unit scenario.

Reviewers: JDevlieghere, aprantl, clayborg

Subscribers: dblaikie, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D71021
2019-12-05 13:02:03 +01:00

152 lines
7.0 KiB
ArmAsm

# REQUIRES: x86
# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s > %t
# RUN: %lldb %t -o "image lookup -v -s lookup_rnglists" \
# RUN: -o "image lookup -v -s lookup_rnglists2" -o exit | FileCheck %s
# CHECK-LABEL: image lookup -v -s lookup_rnglists
# CHECK: Function: id = {0x7fffffff00000030}, name = "rnglists", range = [0x0000000000000000-0x0000000000000004)
# CHECK: Blocks: id = {0x7fffffff00000030}, range = [0x00000000-0x00000004)
# CHECK-NEXT: id = {0x7fffffff00000046}, ranges = [0x00000001-0x00000002)[0x00000003-0x00000004)
# CHECK-LABEL: image lookup -v -s lookup_rnglists2
# CHECK: Function: id = {0x7fffffff0000007a}, name = "rnglists2", range = [0x0000000000000004-0x0000000000000007)
# CHECK: Blocks: id = {0x7fffffff0000007a}, range = [0x00000004-0x00000007)
# CHECK-NEXT: id = {0x7fffffff00000091}, range = [0x00000005-0x00000007)
.text
.p2align 12
rnglists:
nop
.Lblock1_begin:
lookup_rnglists:
nop
.Lblock1_end:
nop
.Lblock2_begin:
nop
.Lblock2_end:
.Lrnglists_end:
rnglists2:
nop
.Lblock3_begin:
lookup_rnglists2:
nop
nop
.Lblock3_end:
.Lrnglists2_end:
.section .debug_abbrev,"",@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 17 # DW_AT_low_pc
.byte 1 # DW_FORM_addr
.byte 18 # DW_AT_high_pc
.byte 6 # DW_FORM_data4
.byte 116 # DW_AT_rnglists_base
.byte 23 # DW_FORM_sec_offset
.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 1 # DW_FORM_addr
.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,"",@progbits
.Lcu_begin0:
.long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
.Ldebug_info_start0:
.short 5 # DWARF version number
.byte 1 # DWARF Unit Type
.byte 8 # Address Size (in bytes)
.long .debug_abbrev # Offset Into Abbrev. Section
.byte 1 # Abbrev [1] 0xc:0x5f DW_TAG_compile_unit
.asciz "Hand-written DWARF" # DW_AT_producer
.quad rnglists # DW_AT_low_pc
.long .Lrnglists_end-rnglists # DW_AT_high_pc
.long .Lrnglists_table_base0 # DW_AT_rnglists_base
.byte 2 # Abbrev [2] 0x2b:0x37 DW_TAG_subprogram
.quad rnglists # 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_end0:
.Lcu_begin1:
.long .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
.Ldebug_info_start1:
.short 5 # DWARF version number
.byte 1 # DWARF Unit Type
.byte 8 # Address Size (in bytes)
.long .debug_abbrev # Offset Into Abbrev. Section
.byte 1 # Abbrev [1] 0xc:0x5f DW_TAG_compile_unit
.asciz "Hand-written DWARF" # DW_AT_producer
.quad rnglists2 # DW_AT_low_pc
.long .Lrnglists2_end-rnglists2 # DW_AT_high_pc
.long .Lrnglists_table_base1 # DW_AT_rnglists_base
.byte 2 # Abbrev [2] 0x2b:0x37 DW_TAG_subprogram
.quad rnglists2 # DW_AT_low_pc
.long .Lrnglists2_end-rnglists2 # DW_AT_high_pc
.asciz "rnglists2" # 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,"",@progbits
.long .Ldebug_rnglist_table_end0-.Ldebug_rnglist_table_start0 # Length
.Ldebug_rnglist_table_start0:
.short 5 # Version
.byte 8 # Address size
.byte 0 # Segment selector size
.long 1 # Offset entry count
.Lrnglists_table_base0:
.long .Ldebug_ranges0-.Lrnglists_table_base0
.Ldebug_ranges0:
.byte 4 # DW_RLE_offset_pair
.uleb128 .Lblock1_begin-rnglists # starting offset
.uleb128 .Lblock1_end-rnglists # ending offset
.byte 4 # DW_RLE_offset_pair
.uleb128 .Lblock2_begin-rnglists # starting offset
.uleb128 .Lblock2_end-rnglists # ending offset
.byte 0 # DW_RLE_end_of_list
.Ldebug_rnglist_table_end0:
.long .Ldebug_rnglist_table_end1-.Ldebug_rnglist_table_start1 # Length
.Ldebug_rnglist_table_start1:
.short 5 # Version
.byte 8 # Address size
.byte 0 # Segment selector size
.long 1 # Offset entry count
.Lrnglists_table_base1:
.long .Ldebug_ranges1-.Lrnglists_table_base1
.Ldebug_ranges1:
.byte 4 # DW_RLE_offset_pair
.uleb128 .Lblock3_begin-rnglists2 # starting offset
.uleb128 .Lblock3_end-rnglists2 # ending offset
.byte 0 # DW_RLE_end_of_list
.Ldebug_rnglist_table_end1: