-
Notifications
You must be signed in to change notification settings - Fork 12.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] - Teach LLD to report line numbers for data symbols.
This is PR34826. Currently LLD is unable to report line number when reporting duplicate declaration of some variable. That happens because for extracting line information we always use .debug_line section content which describes mapping from machine instructions to source file locations, what does not help for variables as does not describe them. In this patch I am taking the approproate information about variables locations from the .debug_info section. Differential revision: https://reviews.llvm.org/D38721 llvm-svn: 317080
- Loading branch information
George Rimar
committed
Nov 1, 2017
1 parent
688f0ca
commit 82f0c42
Showing
7 changed files
with
246 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o | ||
# RUN: llvm-dwarfdump %t.o | FileCheck -check-prefix=INPUT %s | ||
# RUN: not ld.lld %t.o %t.o -o %t 2>&1 | FileCheck %s | ||
|
||
# INPUT: .debug_info contents: | ||
# INPUT: DW_TAG_variable | ||
# INPUT-NEXT: DW_AT_name ("foo") | ||
# INPUT-NEXT: DW_AT_decl_file ("1.c") | ||
# INPUT-NEXT: DW_AT_decl_line (1) | ||
# INPUT-NEXT: DW_AT_type (cu + 0x0032 "int") | ||
# INPUT-NEXT: DW_AT_external (true) | ||
# INPUT-NEXT: DW_AT_location (DW_OP_addr 0x0) | ||
# INPUT: DW_TAG_variable | ||
# INPUT-NEXT: DW_AT_name ("bar") | ||
# INPUT-NEXT: DW_AT_decl_file ("1.c") | ||
# INPUT-NEXT: DW_AT_decl_line (2) | ||
# INPUT-NEXT: DW_AT_type (cu + 0x0032 "int") | ||
# INPUT-NEXT: DW_AT_external (true) | ||
# INPUT-NEXT: DW_AT_location (DW_OP_addr 0x0) | ||
|
||
## Check we use information from .debug_info in messages. | ||
# CHECK: duplicate symbol: bar | ||
# CHECK-NEXT: >>> defined at 1.c:2 | ||
# CHECK-NEXT: >>> {{.*}}:(bar) | ||
# CHECK-NEXT: >>> defined at 1.c:2 | ||
# CHECK-NEXT: >>> {{.*}}:(.data+0x0) | ||
# CHECK: duplicate symbol: foo | ||
# CHECK-NEXT: >>> defined at 1.c:1 | ||
# CHECK-NEXT: >>> {{.*}}:(foo) | ||
# CHECK-NEXT: >>> defined at 1.c:1 | ||
# CHECK-NEXT: >>> {{.*}}:(.bss+0x0) | ||
|
||
# Used reduced output from following code and gcc 7.1.0 | ||
# to produce this input file: | ||
# Source (1.c): | ||
# int foo = 0; | ||
# int bar = 1; | ||
# Invocation: g++ -g -S 1.c | ||
|
||
.bss | ||
.globl foo | ||
.type foo, @object | ||
.size foo, 4 | ||
foo: | ||
|
||
.data | ||
.globl bar | ||
.type bar, @object | ||
.size bar, 4 | ||
bar: | ||
|
||
.text | ||
.file 1 "1.c" | ||
|
||
.section .debug_info,"",@progbits | ||
.long 0x4b # Compile Unit: length = 0x0000004b) | ||
.value 0x4 # version = 0x0004 | ||
.long 0 # abbr_offset = 0x0 | ||
.byte 0x8 # addr_size = 0x08 | ||
|
||
.uleb128 0x1 # DW_TAG_compile_unit [1] * | ||
.long 0 # DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] = ) | ||
.byte 0x4 # DW_AT_language [DW_FORM_data1] (DW_LANG_C_plus_plus) | ||
.string "1.c" # DW_AT_name [DW_FORM_string] ("1.c") | ||
.long 0 # DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000000] = ) | ||
.long 0 # DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) | ||
|
||
.uleb128 0x2 # DW_TAG_variable [2] | ||
.string "foo" # DW_AT_name [DW_FORM_string] ("foo") | ||
.byte 0x1 # DW_AT_decl_file [DW_FORM_data1] ("1.c") | ||
.byte 0x1 # DW_AT_decl_line [DW_FORM_data1] (1) | ||
.long 0x32 # DW_AT_type [DW_FORM_ref4] (cu + 0x0032 => {0x00000032}) | ||
.uleb128 0x9 # DW_AT_external [DW_FORM_flag_present] (true) | ||
.byte 0x3 | ||
.quad foo # DW_AT_location [DW_FORM_exprloc] (DW_OP_addr 0x0) | ||
|
||
.uleb128 0x3 # DW_TAG_base_type [3] | ||
.byte 0x4 # DW_AT_byte_size [DW_FORM_data1] (0x04) | ||
.byte 0x5 # DW_AT_encoding [DW_FORM_data1] (DW_ATE_signed) | ||
.string "int" # DW_AT_name [DW_FORM_string] ("int") | ||
|
||
.uleb128 0x2 # DW_TAG_variable [2] | ||
.string "bar" # DW_AT_name [DW_FORM_string] ("bar") | ||
.byte 0x1 # DW_AT_decl_file [DW_FORM_data1] ("1.c") | ||
.byte 0x2 # DW_AT_decl_line [DW_FORM_data1] (2) | ||
.long 0x32 # DW_AT_type [DW_FORM_ref4] (cu + 0x0032 => {0x00000032}) | ||
.uleb128 0x9 # DW_AT_external [DW_FORM_flag_present] (true) | ||
.byte 0x3 | ||
.quad bar # DW_AT_location [DW_FORM_exprloc] (DW_OP_addr 0x0) | ||
.byte 0 # END | ||
|
||
|
||
.section .debug_abbrev,"",@progbits | ||
.uleb128 0x1 # Abbreviation code. | ||
.uleb128 0x11 # DW_TAG_compile_unit | ||
|
||
.byte 0x1 # ID | ||
.uleb128 0x25 # DW_AT_producer, DW_FORM_strp | ||
.uleb128 0xe | ||
.uleb128 0x13 # DW_AT_language, DW_FORM_data1 | ||
.uleb128 0xb | ||
.uleb128 0x3 # DW_AT_name, DW_FORM_string | ||
.uleb128 0x8 | ||
.uleb128 0x1b # DW_AT_comp_dir, DW_FORM_strp | ||
.uleb128 0xe | ||
.uleb128 0x10 # DW_AT_stmt_list, DW_FORM_sec_offset | ||
.uleb128 0x17 | ||
.byte 0 | ||
.byte 0 | ||
|
||
.uleb128 0x2 # ID | ||
.uleb128 0x34 # DW_TAG_variable, DW_CHILDREN_no | ||
.byte 0 | ||
.uleb128 0x3 # DW_AT_name, DW_FORM_string | ||
.uleb128 0x8 | ||
.uleb128 0x3a # DW_AT_decl_file, DW_FORM_data1 | ||
.uleb128 0xb | ||
.uleb128 0x3b # DW_AT_decl_line, DW_FORM_data1 | ||
.uleb128 0xb | ||
.uleb128 0x49 # DW_AT_type, DW_FORM_ref4 | ||
.uleb128 0x13 | ||
.uleb128 0x3f # DW_AT_external, DW_FORM_flag_present | ||
.uleb128 0x19 | ||
.uleb128 0x2 # DW_AT_location, DW_FORM_exprloc | ||
.uleb128 0x18 | ||
.byte 0 | ||
.byte 0 | ||
|
||
.uleb128 0x3 # ID | ||
.uleb128 0x24 # DW_TAG_base_type, DW_CHILDREN_no | ||
.byte 0 | ||
.uleb128 0xb # DW_AT_byte_size, DW_FORM_data1 | ||
.uleb128 0xb | ||
.uleb128 0x3e # DW_AT_encoding, DW_FORM_data1 | ||
.uleb128 0xb | ||
.uleb128 0x3 # DW_AT_name, DW_FORM_string | ||
.uleb128 0x8 | ||
.byte 0 | ||
.byte 0 | ||
.byte 0 | ||
|