This allows `image lookup -a ... -v` to print variables only if the given address is covered by the valid ranges of the variables. Since variables created in dwarf plugin always has empty scope range, print the variable if it has empty scope. Differential Revision: https://reviews.llvm.org/D119963
262 lines
12 KiB
ArmAsm
262 lines
12 KiB
ArmAsm
# RUN: llvm-mc --filetype=obj --triple x86_64-pc-linux %s -o %t --defsym MAIN=0
|
|
# RUN: llvm-mc --filetype=obj --triple x86_64-pc-linux %s -o %t.dwp --defsym DWP=0
|
|
# RUN: %lldb %t -o "target variable A" -o "image lookup -v -n F1" -b | FileCheck %s
|
|
# RUN: lldb-test symbols %t | FileCheck %s --check-prefix=SYMBOLS
|
|
|
|
# CHECK-LABEL: target variable A
|
|
# CHECK: (INT0) A = 0
|
|
# CHECK: (INT1) A = 1
|
|
# CHECK: (INT2) A = 2
|
|
# CHECK: (INT3) A = 3
|
|
|
|
# CHECK-LABEL: image lookup -v -n F1
|
|
# CHECK: CompileUnit: id = {0x00000001}, file = "1.c", language = "<not loaded>"
|
|
# CHECK: Function: {{.*}}, name = "F1", range = [0x0000000000000001-0x0000000000000002)
|
|
# CHECK: Variable: {{.*}}, name = "x", type = "int", valid ranges = <block>, location = [0x0000000000000001, 0x0000000000000002) -> DW_OP_reg1 RDX
|
|
|
|
# SYMBOLS: Compile units:
|
|
# SYMBOLS-NEXT: CompileUnit{0x00000000}, language = "<not loaded>", file = '0.c'
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "A", {{.*}}, location = DW_OP_GNU_addr_index 0x0
|
|
# SYMBOLS-NEXT: Function{{.*}}, demangled = F0
|
|
# SYMBOLS-NEXT: Block{{.*}}, ranges = [0x00000000-0x00000001)
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "x", {{.*}}, location =
|
|
# SYMBOLS-NEXT: DW_LLE_startx_length (0x0000000000000001, 0x0000000000000001): DW_OP_reg0 RAX
|
|
# SYMBOLS-EMPTY:
|
|
# SYMBOLS-NEXT: CompileUnit{0x00000001}, language = "<not loaded>", file = '1.c'
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "A", {{.*}}, location = DW_OP_GNU_addr_index 0x2
|
|
# SYMBOLS-NEXT: Function{{.*}}, demangled = F1
|
|
# SYMBOLS-NEXT: Block{{.*}}, ranges = [0x00000001-0x00000002)
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "x", {{.*}}, location =
|
|
# SYMBOLS-NEXT: DW_LLE_startx_length (0x0000000000000003, 0x0000000000000001): DW_OP_reg1 RDX
|
|
# SYMBOLS-EMPTY:
|
|
# SYMBOLS-NEXT: CompileUnit{0x00000002}, language = "<not loaded>", file = '2.c'
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "A", {{.*}}, location = DW_OP_GNU_addr_index 0x4
|
|
# SYMBOLS-NEXT: Function{{.*}}, demangled = F2
|
|
# SYMBOLS-NEXT: Block{{.*}}, ranges = [0x00000002-0x00000003)
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "x", {{.*}}, location =
|
|
# SYMBOLS-NEXT: DW_LLE_startx_length (0x0000000000000005, 0x0000000000000001): DW_OP_reg2 RCX
|
|
# SYMBOLS-EMPTY:
|
|
# SYMBOLS-NEXT: CompileUnit{0x00000003}, language = "<not loaded>", file = '3.c'
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "A", {{.*}}, location = DW_OP_GNU_addr_index 0x6
|
|
# SYMBOLS-NEXT: Function{{.*}}, demangled = F3
|
|
# SYMBOLS-NEXT: Block{{.*}}, ranges = [0x00000003-0x00000004)
|
|
# SYMBOLS-NEXT: Variable{{.*}}, name = "x", {{.*}}, location =
|
|
# SYMBOLS-NEXT: DW_LLE_startx_length (0x0000000000000007, 0x0000000000000001): DW_OP_reg3 RBX
|
|
# SYMBOLS-EMPTY:
|
|
# SYMBOLS-NEXT: CompileUnit{0x00000004}, language = "<not loaded>", file = ''
|
|
# SYMBOLS-EMPTY:
|
|
|
|
.section .debug_abbrev,"",@progbits
|
|
.byte 1 # Abbreviation Code
|
|
.byte 17 # DW_TAG_compile_unit
|
|
.byte 0 # DW_CHILDREN_no
|
|
.ascii "\260B" # DW_AT_GNU_dwo_name
|
|
.byte 8 # DW_FORM_string
|
|
.ascii "\261B" # DW_AT_GNU_dwo_id
|
|
.byte 7 # DW_FORM_data8
|
|
.ascii "\263B" # DW_AT_GNU_addr_base
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 85 # DW_AT_ranges
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte 0 # EOM(3)
|
|
|
|
.ifdef MAIN
|
|
.irpc I,01234
|
|
.data
|
|
A\I:
|
|
.long \I
|
|
|
|
.text
|
|
F\I:
|
|
nop
|
|
|
|
.section .debug_info,"",@progbits
|
|
.Lcu_begin\I:
|
|
.long .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
|
|
.Ldebug_info_start\I:
|
|
.short 4 # DWARF version number
|
|
.long .debug_abbrev # Offset Into Abbrev. Section
|
|
.byte 8 # Address Size (in bytes)
|
|
.byte 1 # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
|
|
.asciz "A.dwo" # DW_AT_GNU_dwo_name
|
|
.quad \I # DW_AT_GNU_dwo_id
|
|
.long .debug_addr # DW_AT_GNU_addr_base
|
|
.long .Lranges\I # DW_AT_ranges
|
|
.Ldebug_info_end\I:
|
|
|
|
.section .debug_addr,"",@progbits
|
|
.quad A\I
|
|
.quad F\I
|
|
|
|
.section .debug_ranges,"",@progbits
|
|
.Lranges\I:
|
|
.quad F\I
|
|
.quad F\I+1
|
|
.quad 0
|
|
.quad 0
|
|
.endr
|
|
.endif
|
|
|
|
.ifdef DWP
|
|
# This deliberately excludes compile unit 4 to check test the case of a missing
|
|
# split unit.
|
|
.irpc I,0123
|
|
.section .debug_str.dwo,"MSe",@progbits,1
|
|
.Lstr\I:
|
|
.byte 'I', 'N', 'T', '0'+\I, 0
|
|
|
|
.section .debug_str_offsets.dwo,"e",@progbits
|
|
.Lstr_offsets\I:
|
|
.long .Lstr\I-.debug_str.dwo
|
|
.Lstr_offsets_end\I:
|
|
|
|
.section .debug_loc.dwo,"e",@progbits
|
|
.Lloc\I:
|
|
.byte 3 # DW_LLE_startx_length
|
|
.uleb128 \I*2+1
|
|
.long 1
|
|
.short 1 # Expression size
|
|
.byte 80+\I # super-register DW_OP_reg0+\I
|
|
.byte 0 # DW_LLE_end_of_list
|
|
.Lloc_end\I:
|
|
|
|
.section .debug_abbrev.dwo,"e",@progbits
|
|
.Labbrev\I:
|
|
.byte \I*10+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 3 # DW_AT_name
|
|
.byte 8 # DW_FORM_string
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte \I*10+2 # Abbreviation Code
|
|
.byte 52 # DW_TAG_variable
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 3 # DW_AT_name
|
|
.byte 8 # DW_FORM_string
|
|
.byte 73 # DW_AT_type
|
|
.byte 19 # DW_FORM_ref4
|
|
.byte 2 # DW_AT_location
|
|
.byte 24 # DW_FORM_exprloc
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte \I*10+3 # Abbreviation Code
|
|
.byte 36 # DW_TAG_base_type
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 3 # DW_AT_name
|
|
.byte 8 # DW_FORM_string
|
|
.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 \I*10+4 # Abbreviation Code
|
|
.byte 22 # DW_TAG_typedef
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 3 # DW_AT_name
|
|
.uleb128 0x1f02 # DW_FORM_GNU_str_index
|
|
.byte 73 # DW_AT_type
|
|
.byte 19 # DW_FORM_ref4
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte \I*10+5 # Abbreviation Code
|
|
.byte 46 # DW_TAG_subprogram
|
|
.byte 1 # DW_CHILDREN_yes
|
|
.byte 17 # DW_AT_low_pc
|
|
.uleb128 0x1f01 # DW_FORM_GNU_addr_index
|
|
.byte 18 # DW_AT_high_pc
|
|
.byte 11 # DW_FORM_data1
|
|
.byte 3 # DW_AT_name
|
|
.byte 8 # DW_FORM_string
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte \I*10+6 # Abbreviation Code
|
|
.byte 5 # DW_TAG_formal_parameter
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 2 # DW_AT_location
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 3 # DW_AT_name
|
|
.byte 8 # DW_FORM_string
|
|
.byte 73 # DW_AT_type
|
|
.byte 19 # DW_FORM_ref4
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte 0 # EOM(3)
|
|
.Labbrev_end\I:
|
|
|
|
.section .debug_info.dwo,"e",@progbits
|
|
.Lcu_begin\I:
|
|
.long .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
|
|
.Ldebug_info_start\I:
|
|
.short 4 # DWARF version number
|
|
.long 0 # Offset Into Abbrev. Section
|
|
.byte 8 # Address Size (in bytes)
|
|
.byte \I*10+1 # Abbrev DW_TAG_compile_unit
|
|
.asciz "Hand-written DWARF" # DW_AT_producer
|
|
.byte '0'+\I, '.', 'c', 0 # DW_AT_name
|
|
.byte \I*10+2 # Abbrev DW_TAG_variable
|
|
.asciz "A" # DW_AT_name
|
|
.long .Ltypedef\I-.Lcu_begin\I# DW_AT_type
|
|
.byte 2 # DW_AT_location
|
|
.byte 0xfb # DW_OP_GNU_addr_index
|
|
.byte \I*2
|
|
.Ltypedef\I:
|
|
.byte \I*10+4 # Abbrev DW_TAG_typedef
|
|
.byte 0 # DW_AT_name
|
|
.long .Ltype\I-.Lcu_begin\I # DW_AT_type
|
|
.Ltype\I:
|
|
.byte \I*10+3 # Abbrev DW_TAG_base_type
|
|
.asciz "int" # DW_AT_name
|
|
.byte 5 # DW_AT_encoding
|
|
.byte 4 # DW_AT_byte_size
|
|
|
|
.byte \I*10+5 # Abbrev DW_TAG_subprogram
|
|
.uleb128 \I*2+1 # DW_AT_low_pc
|
|
.byte 1 # DW_AT_high_pc
|
|
.byte 'F', '0'+\I, 0 # DW_AT_name
|
|
|
|
.byte \I*10+6 # Abbrev DW_TAG_formal_parameter
|
|
.long 0 # DW_AT_location
|
|
.asciz "x" # DW_AT_name
|
|
.long .Ltype\I-.Lcu_begin\I # DW_AT_type
|
|
|
|
.byte 0 # End Of Children Mark
|
|
.byte 0 # End Of Children Mark
|
|
.Ldebug_info_end\I:
|
|
.endr
|
|
|
|
.section .debug_cu_index,"",@progbits
|
|
.short 2 # DWARF version number
|
|
.short 0 # Reserved
|
|
.long 4 # Section count
|
|
.long 4 # Unit count
|
|
.long 8 # Slot count
|
|
|
|
.quad 0, 1, 2, 3, 0, 0, 0, 0 # Hash table
|
|
.long 1, 2, 3, 4, 0, 0, 0, 0 # Index table
|
|
|
|
.long 1 # DW_SECT_INFO
|
|
.long 3 # DW_SECT_ABBREV
|
|
.long 5 # DW_SECT_LOC
|
|
.long 6 # DW_SECT_STR_OFFSETS
|
|
|
|
.irpc I,0123
|
|
.long .Lcu_begin\I-.debug_info.dwo
|
|
.long .Labbrev\I-.debug_abbrev.dwo
|
|
.long .Lloc\I-.debug_loc.dwo
|
|
.long .Lstr_offsets\I-.debug_str_offsets.dwo
|
|
.endr
|
|
.irpc I,0123
|
|
.long .Ldebug_info_end\I-.Lcu_begin\I
|
|
.long .Labbrev_end\I-.Labbrev\I
|
|
.long .Lloc_end\I-.Lloc\I
|
|
.long .Lstr_offsets_end\I-.Lstr_offsets\I
|
|
.endr
|
|
|
|
.endif
|