Files
clang-p2996/lldb/test/Shell/SymbolFile/DWARF/dwarf5-debug_line.s
Pavel Labath 57f8a998ce [lldb] Don't put compile unit name into the support file list and support DWARF5 line tables
Summary:
Lldb's "format-independent" debug info made use of the fact that DWARF
(<=4) did not use the file index zero, and reused the support file index
zero for storing the compile unit name.

While this provided some convenience for DWARF<=4, it meant that the PDB
plugin needed to artificially remap file indices in order to free up
index 0. Furthermore, DWARF v5 make file index 0 legal, which meant that
similar remapping would be needed in the dwarf plugin too.

What this patch does instead is remove the requirement of having the
compile unit name in the index 0. It is not that useful since the name
can always be fetched from the CompileUnit object. Remapping code in the
pdb plugin(s) has been removed or simplified.

DWARF plugin has started inserting an empty FileSpec at index 0 to
ensure the indices keep matching up (in case of DWARF<=4). For DWARF5,
we insert the file 0 from the line table.

I add a test to ensure we can correctly lookup line table entries
referencing file 0, and in particular the case where the file 0 is also
duplicated in another file entry, as this is how clang produces line
tables in some circumstances (see pr44170). Though this is probably a
bug in clang, this is not forbidden by DWARF, and lldb already has
support for that in some (but not all) cases -- this adds a test for the
code path which was not fixed in this patch.

Reviewers: clayborg, JDevlieghere, jdoerfert

Subscribers: aprantl, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D70954
2019-12-05 11:37:18 +01:00

130 lines
5.3 KiB
ArmAsm

# Test handling of DWARF5 line tables. In particular, test that we handle files
# which are present in the line table more than once.
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -o %t -triple x86_64-pc-linux %s
# RUN: %lldb %t -o "source info -f file0.c" -o "source info -f file1.c" \
# RUN: -o "breakpoint set -f file0.c -l 42" \
# RUN: -o "breakpoint set -f file0.c -l 47" \
# RUN: -o exit | FileCheck %s
# CHECK-LABEL: source info -f file0.c
# CHECK: [0x0000000000000000-0x0000000000000001): /file0.c:42
# CHECK-LABEL: source info -f file1.c
# CHECK: [0x0000000000000001-0x0000000000000002): /file1.c:47
# CHECK-LABEL: breakpoint set -f file0.c -l 42
# CHECK: Breakpoint 1: {{.*}}`foo,
# CHECK-LABEL: breakpoint set -f file0.c -l 47
# CHECK: Breakpoint 2: {{.*}}`foo + 2,
.text
.globl foo
foo:
nop
nop
nop
.Lfoo_end:
.section .debug_abbrev,"",@progbits
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 0 # DW_CHILDREN_no
.byte 37 # DW_AT_producer
.byte 8 # DW_FORM_string
.byte 19 # DW_AT_language
.byte 5 # DW_FORM_data2
.byte 3 # DW_AT_name
.byte 8 # DW_FORM_string
.byte 16 # DW_AT_stmt_list
.byte 23 # DW_FORM_sec_offset
.byte 27 # DW_AT_comp_dir
.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 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:0x23 DW_TAG_compile_unit
.asciz "Hand-written DWARF" # DW_AT_producer
.short 12 # DW_AT_language
.asciz "file0.c" # DW_AT_name
.long .Lline_table_begin # DW_AT_stmt_list
.asciz "/" # DW_AT_comp_dir
.quad foo # DW_AT_low_pc
.long .Lfoo_end-foo # DW_AT_high_pc
.Ldebug_info_end0:
.section .debug_line,"",@progbits
.Lline_table_begin:
.long .Lline_end-.Lline_start
.Lline_start:
.short 5 # DWARF version number
.byte 8 # Address Size (in bytes)
.byte 0 # Segment Selector Size
.long .Lheader_end-.Lheader_start
.Lheader_start:
.byte 1 # Minimum Instruction Length
.byte 1 # Maximum Operations per Instruction
.byte 1 # Default is_stmt
.byte 0 # Line Base
.byte 0 # Line Range
.byte 5 # Opcode Base
.byte 0, 1, 1, 1 # Standard Opcode Lengths
# Directory table format
.byte 1 # One element per directory entry
.byte 1 # DW_LNCT_path
.byte 0x08 # DW_FORM_string
# Directory table entries
.byte 1 # 1 directory
.asciz "/"
# File table format
.byte 2 # 2 elements per file entry
.byte 1 # DW_LNCT_path
.byte 0x08 # DW_FORM_string
.byte 2 # DW_LNCT_directory_index
.byte 0x0b # DW_FORM_data1
# File table entries
.byte 3 # 3 files
.asciz "file0.c"
.byte 0
.asciz "file1.c"
.byte 0
.asciz "file0.c"
.byte 0
.Lheader_end:
.byte 4, 0 # DW_LNS_set_file 0
.byte 0, 9, 2 # DW_LNE_set_address
.quad foo
.byte 3, 41 # DW_LNS_advance_line 41
.byte 1 # DW_LNS_copy
.byte 4, 1 # DW_LNS_set_file 1
.byte 2, 1 # DW_LNS_advance_pc 1
.byte 3, 5 # DW_LNS_advance_line 5
.byte 1 # DW_LNS_copy
.byte 4, 2 # DW_LNS_set_file 2
.byte 2, 1 # DW_LNS_advance_pc 1
.byte 1 # DW_LNS_copy
.byte 2, 1 # DW_LNS_advance_pc 1
.byte 0, 1, 1 # DW_LNE_end_sequence
.Lline_end: