[lld] [llvm] [Symbolizer] Support for Missing Line Numbers. (PR #82240)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 13 16:43:49 PDT 2024


bd1976bris wrote:

> I will _try_ to post up an improved test if I can.

@ampandey-1995 below is my attempt. I think that it contains the testcases from both the of current tests and IMO it is more readable/understandable.

```
## Test the --skip-line-zero option.
##
## This test uses hand written assembly to produce the following line table:
## Address            Line   Column File   ISA Discriminator Flags
## ------------------ ------ ------ ------ --- ------------- -------------
## 0x0000000000000000     10      0      1   0             0
## 0x0000000000000001      9      0      1   0             0
## 0x0000000000000002      0      0      1   0             0
## 0x0000000000000003      8      0      1   0             0  end_sequence
## 0x0000000000000006      0      0      1   0             0
## 0x0000000000000007      0      0      1   0             0
## 0x0000000000000016      5      0      1   0             0  end_sequence

# REQUIRES: x86-registered-target

# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o

## Check that without --skip-line-zero line zero is displayed for a line with no source correspondence.
# RUN: llvm-symbolizer --obj=%t.o 0x2 | \
# RUN:   FileCheck --check-prefix=SKIP-DISABLED %s
# SKIP-DISABLED:foo
# SKIP-DISABLED-NEXT:two.c:0:0

## Check that with --skip-line-zero the last line non-zero line in the current sequence is displayed.
# RUN: llvm-symbolizer --obj=%t.o 0x2 --skip-line-zero | \
# RUN:   FileCheck --check-prefix=SKIP-ENABLED %s
# SKIP-ENABLED:foo
# SKIP-ENABLED-NEXT:two.c:9:0 (approximate)

## Check that that --skip-line-zero only affects line zero addresses when more than one address is specified.
# RUN: llvm-symbolizer --obj=%t.o --skip-line-zero 0x2 0x1 | \
# RUN:   FileCheck --check-prefixes=SKIP-ENABLED,NO-SKIP %s
# NO-SKIP:foo
# NO-SKIP-NEXT:two.c:9:0

## Check --verbose output is correct with --skip-line-zero.
# RUN: llvm-symbolizer --obj=%t.o --skip-line-zero --verbose 0x2 | \
# RUN:   FileCheck --check-prefix=SKIP-VERBOSE %s
# SKIP-VERBOSE:foo
# SKIP-VERBOSE-NEXT:  Filename: {{.*}}two.c
# SKIP-VERBOSE-NEXT:  Function start address: 0x0
# SKIP-VERBOSE-NEXT:  Line: 9
# SKIP-VERBOSE-NEXT:  Column: 0
# SKIP-VERBOSE-NEXT:  Approximate: true

## Check --output-style=JSON output is correct with --skip-line-zero.
# RUN: llvm-symbolizer --obj=%t.o --skip-line-zero --output-style=JSON 0x2 | \
# RUN:   FileCheck --check-prefix=SKIP-JSON %s
# SKIP-JSON:[{"Address":"0x2","ModuleName":"{{.*}}skip-line-zero.s.tmp.o","Symbol":[{"Approximate":true,"Column":0,"Discriminator":0,"FileName":"{{.*}}two.c","FunctionName":"foo","Line":9,"StartAddress":"0x0","StartFileName":"","StartLine":0}]}]

## Check that that --skip-line-zero does not cross sequence boundaries.
# RUN: llvm-symbolizer --obj=%t.o --skip-line-zero 0x7 | \
# RUN:   FileCheck --check-prefixes=SKIP-BOUNDARY %s
# SKIP-BOUNDARY:bar
# SKIP-BOUNDARY:two.c:0:0

	.text
	.section	.text.foo,"ax", at progbits
	.hidden	foo
	.globl	foo
	.type	foo, at function
foo:
.Lfunc_begin0:
	movl	$10, %eax
	retq
.Ltmp0:
.Lfunc_end0:
	.size	foo, .Lfunc_end0-foo

	.hidden	bar
	.globl	bar
	.type	bar, at function
bar:
.Lfunc_begin1:
# %bb.0:
	pushq	%rbp
	movq	%rsp, %rbp
.Ltmp1:
	callq	foo
	movl	$20, %eax
	popq	%rbp
	retq
.Ltmp2:
.Lfunc_end1:
	.size	bar, .Lfunc_end1-bar

	.section	.debug_abbrev,"", at progbits
	.byte	1                               # Abbreviation Code
	.byte	17                              # DW_TAG_compile_unit
	.byte	0                               # DW_CHILDREN_no
	.byte	37                              # DW_AT_producer
	.byte	14                              # DW_FORM_strp
	.byte	19                              # DW_AT_language
	.byte	5                               # DW_FORM_data2
	.byte	3                               # DW_AT_name
	.byte	14                              # DW_FORM_strp
	.byte	16                              # DW_AT_stmt_list
	.byte	23                              # DW_FORM_sec_offset
	.byte	27                              # DW_AT_comp_dir
	.byte	14                              # DW_FORM_strp
	.byte	83                              # DW_AT_use_UTF8
	.byte	25                              # DW_FORM_flag_present
	.byte	17                              # DW_AT_low_pc
	.byte	1                               # DW_FORM_addr
	.byte	85                              # DW_AT_ranges
	.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	4                               # DWARF version number
	.long	.debug_abbrev                   # Offset Into Abbrev. Section
	.byte	8                               # Address Size (in bytes)
	.byte	1                               # Abbrev [1] 0xb:0x1f DW_TAG_compile_unit
	.long	.Linfo_string0                  # DW_AT_producer
	.short	29                              # DW_AT_language
	.long	.Linfo_string1                  # DW_AT_name
	.long	.Lline_table_start0             # DW_AT_stmt_list
	.long	.Linfo_string2                  # DW_AT_comp_dir
                                        # DW_AT_use_UTF8
	.quad	0                               # DW_AT_low_pc
	.long	.Ldebug_ranges0                 # DW_AT_ranges
.Ldebug_info_end0:
	.section	.debug_aranges,"", at progbits
	.section	.debug_ranges,"", at progbits
.Ldebug_ranges0:
	.quad	.Lfunc_begin0
	.quad	.Lfunc_end0
	.quad	.Lfunc_begin1
	.quad	.Lfunc_end1
	.quad	0
	.quad	0
	.section	.debug_str,"MS", at progbits,1
.Linfo_string0:
	.asciz	"clang version 16.0.5 ---------------------------------------" # string offset=0
.Linfo_string1:
	.asciz	"two.c"                         # string offset=61
.Linfo_string2:
	.asciz	"c:\\Temp\\dwarfline"           # string offset=67
	.ident	"clang version 16.0.5 ---------------------------------------"
	.section	".note.GNU-stack","", at progbits
.function_and_data_sections
	.section	.debug_line,"", at progbits
.Lline_table_start0:
        .long .Lunit_end - .Lunit_start # unit length
.Lunit_start:
        .short 4   # version
        .long .Lprologue_end - .Lprologue_start # header length
.Lprologue_start:
	.byte 1                                # minimum_instruction_length
	.byte 1                                # maximum_operations_per_instruction
	.byte 0                                # default_is_stmt
	.byte -5                               # line_base
	.byte 14                               # line_range
	.byte 13                               # opcode_base
	.byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # arguments in standard opcodes
	.asciz "dir0"                          # include directory
	.asciz "dir1"                          # include directory
	.byte 0                                # end of include directories
	.asciz "two.c"                         # filename
	.byte 0                                # reference to dir0
	.byte 0                                # modification time
	.byte 0                                # length of file (unavailable)
	.byte 0                                # end of filenames
.Lprologue_end:
        .byte 0, 9, 2        # DW_LNE_set_address
        .quad 0x0            #  baz (to 0)
        .byte 3              # DW_LNS_advance_line
        .sleb128 9           #  by 9 (to 10)
        .byte 1              # DW_LNS_copy
        .byte 3              # DW_LNS_advance_line
        .sleb128 -1          #  by -1 (to 9)
        .byte 2              # DW_LNS_advance_pc
        .byte 1              #  += (1 * min instruction length) (to 1)
        .byte 1              # DW_LNS_copy
        .byte 3              # DW_LNS_advance_line
        .sleb128 -9          #  by -9 (to 0)
        .byte 2              # DW_LNS_advance_pc
        .byte 1              #  += (1 * min instruction length) (to 2)
        .byte 1              # DW_LNS_copy
        .byte 3              # DW_LNS_advance_line
        .sleb128 8           #  by 8 (to 8)
        .byte 2              # DW_LNS_advance_pc
        .byte 1              #  += (1 * min instruction length) (to 3)
        .byte 0, 1, 1        # DW_LNE_end_sequence
        .byte 0, 9, 2        # DW_LNE_set_address
        .quad .Lfunc_begin1 - .Lfunc_begin0 #  wibble (to 6)
        .byte 3              # DW_LNS_advance_line
        .sleb128 -1          #  by -1 (to 0)
        .byte 1              # DW_LNS_copy
        .byte 2              # DW_LNS_advance_pc
        .byte 1              #  += (1 * min instruction length) (to 7)
        .byte 1              # DW_LNS_copy
        .byte 3              # DW_LNS_advance_line
        .sleb128 5           #  by 5 (to 5)
        .byte 2              # DW_LNS_advance_pc
        .byte 15             #  += (15 * min instruction length) (to 22)
        .byte 0, 1, 1        # DW_LNE_end_sequence
.Lunit_end:
```

https://github.com/llvm/llvm-project/pull/82240


More information about the llvm-commits mailing list