Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
DWARF: Add some support for non-native directory separators
Summary: If we opened a file which was produced on system with different path syntax, we would parse the paths from the debug info incorrectly. The reason for that is that we would parse the paths as they were native. For example this meant that on linux we would treat the entire windows path as a single file name with no directory component, and then we would concatenate that with the single directory component from the DW_AT_comp_dir attribute. When parsing posix paths on windows, we would at least get the directory separators right, but we still would treat the posix paths as relative, and concatenate them where we shouldn't. This patch attempts to remedy this by guessing the path syntax used in each compile unit. (Unfortunately, there is no info in DWARF which would give the definitive path style used by the produces, so guessing is all we can do.) Currently, this guessing is based on the DW_AT_comp_dir attribute of the compile unit, but this can be refined later if needed (for example, the DW_AT_name of the compile unit may also contain some useful info). This style is then used when parsing the line table of that compile unit. This patch is sufficient to make the line tables come out right, and enable breakpoint setting by file name work correctly. Setting a breakpoint by full path still has some kinks (specifically, using a windows-style full path will not work on linux because the path will be parsed as a linux path), but this will require larger changes in how breakpoint setting works. Reviewers: clayborg, zturner, JDevlieghere Subscribers: aprantl, lldb-commits Differential Revision: https://reviews.llvm.org/D56543 llvm-svn: 351328
- Loading branch information
Showing
15 changed files
with
382 additions
and
77 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
3 changes: 3 additions & 0 deletions
3
lldb/lit/SymbolFile/DWARF/Inputs/dir-separator-no-comp-dir-relative-name.lldbinit
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,3 @@ | ||
image dump line-table a.c | ||
breakpoint set -f a.c -l 1 | ||
breakpoint set -f foo/b.c -l 1 |
3 changes: 3 additions & 0 deletions
3
lldb/lit/SymbolFile/DWARF/Inputs/dir-separator-posix.lldbinit
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,3 @@ | ||
image dump line-table a.c | ||
breakpoint set -f a.c -l 1 | ||
breakpoint set -f /tmp/b.c -l 1 |
7 changes: 7 additions & 0 deletions
7
lldb/lit/SymbolFile/DWARF/Inputs/dir-separator-windows.lldbinit
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,7 @@ | ||
image dump line-table a.c | ||
breakpoint set -f a.c -l 1 | ||
breakpoint set -f C:/tmp/b.c -l 1 | ||
|
||
# This will fail on non-windows systems because the path will by parsed | ||
# according to posix rules | ||
# breakpoint set -f 'C:\tmp\b.c' -l 1 |
62 changes: 62 additions & 0 deletions
62
lldb/lit/SymbolFile/DWARF/dir-separator-no-comp-dir-relative-name.s
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,62 @@ | ||
# Test that parsing of line tables works reasonably, even if the host directory | ||
# separator does not match the separator of the compile unit. | ||
|
||
# REQUIRES: lld | ||
|
||
# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj > %t.o | ||
# RUN: ld.lld %t.o -o %t | ||
# RUN: %lldb %t -s %S/Inputs/dir-separator-no-comp-dir-relative-name.lldbinit -o exit | FileCheck %s | ||
|
||
# CHECK-LABEL: image dump line-table a.c | ||
# CHECK: Line table for foo/a.c | ||
# CHECK-NEXT: 0x0000000000201000: foo/a.c:1 | ||
# CHECK-NEXT: 0x0000000000201001: foo/b.c:1 | ||
# CHECK-NEXT: 0x0000000000201002: foo/b.c:1 | ||
# CHECK-EMPTY: | ||
|
||
# CHECK-LABEL: breakpoint set -f a.c -l 1 | ||
# CHECK: Breakpoint 1: {{.*}}`_start, | ||
|
||
# CHECK-LABEL: breakpoint set -f foo/b.c -l 1 | ||
# CHECK: Breakpoint 2: {{.*}}`_start + 1, | ||
|
||
.text | ||
.globl _start | ||
_start: | ||
.file 1 "foo/a.c" | ||
.loc 1 1 0 | ||
nop | ||
.file 2 "foo/b.c" | ||
.loc 2 1 0 | ||
nop | ||
|
||
.section .debug_str,"MS",@progbits,1 | ||
.Linfo_string1: | ||
.asciz "foo/a.c" | ||
.section .debug_abbrev,"",@progbits | ||
.byte 1 # Abbreviation Code | ||
.byte 17 # DW_TAG_compile_unit | ||
.byte 0 # DW_CHILDREN_no | ||
.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 0 # EOM(1) | ||
.byte 0 # EOM(2) | ||
.byte 0 # EOM(3) | ||
.section .debug_info,"",@progbits | ||
.Lcu_begin0: | ||
.long .Lcu_end0-.Lcu_start0 # Length of Unit | ||
.Lcu_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 | ||
.short 12 # DW_AT_language | ||
.long .Linfo_string1 # DW_AT_name | ||
.long .Lline_table_start0 # DW_AT_stmt_list | ||
.Lcu_end0: | ||
.section .debug_line,"",@progbits | ||
.Lline_table_start0: |
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,62 @@ | ||
# Test that we properly determine the path syntax of a compile unit even if the | ||
# compile unit does not have a DW_AT_comp_dir attribute. | ||
|
||
# REQUIRES: lld | ||
|
||
# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj > %t.o | ||
# RUN: ld.lld %t.o -o %t | ||
# RUN: %lldb %t -s %S/Inputs/dir-separator-windows.lldbinit -o exit | FileCheck %s | ||
|
||
# CHECK-LABEL: image dump line-table a.c | ||
# CHECK: Line table for C:\tmp\a.c | ||
# CHECK-NEXT: 0x0000000000201000: C:\tmp\a.c:1 | ||
# CHECK-NEXT: 0x0000000000201001: C:\tmp\b.c:1 | ||
# CHECK-NEXT: 0x0000000000201002: C:\tmp\b.c:1 | ||
# CHECK-EMPTY: | ||
|
||
# CHECK-LABEL: breakpoint set -f a.c -l 1 | ||
# CHECK: Breakpoint 1: {{.*}}`_start, | ||
|
||
# CHECK-LABEL: breakpoint set -f C:/tmp/b.c -l 1 | ||
# CHECK: Breakpoint 2: {{.*}}`_start + 1, | ||
|
||
.text | ||
.globl _start | ||
_start: | ||
.file 1 "C:\\tmp\\a.c" | ||
.loc 1 1 0 | ||
nop | ||
.file 2 "C:\\tmp\\b.c" | ||
.loc 2 1 0 | ||
nop | ||
|
||
.section .debug_str,"MS",@progbits,1 | ||
.Linfo_string1: | ||
.asciz "C:\\tmp\\a.c" | ||
.section .debug_abbrev,"",@progbits | ||
.byte 1 # Abbreviation Code | ||
.byte 17 # DW_TAG_compile_unit | ||
.byte 0 # DW_CHILDREN_no | ||
.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 0 # EOM(1) | ||
.byte 0 # EOM(2) | ||
.byte 0 # EOM(3) | ||
.section .debug_info,"",@progbits | ||
.Lcu_begin0: | ||
.long .Lcu_end0-.Lcu_start0 # Length of Unit | ||
.Lcu_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 | ||
.short 12 # DW_AT_language | ||
.long .Linfo_string1 # DW_AT_name | ||
.long .Lline_table_start0 # DW_AT_stmt_list | ||
.Lcu_end0: | ||
.section .debug_line,"",@progbits | ||
.Lline_table_start0: |
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,67 @@ | ||
# Test that parsing of line tables works reasonably, even if the host directory | ||
# separator does not match the separator of the compile unit. | ||
|
||
# REQUIRES: lld | ||
|
||
# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj > %t.o | ||
# RUN: ld.lld %t.o -o %t | ||
# RUN: %lldb %t -s %S/Inputs/dir-separator-posix.lldbinit -o exit | FileCheck %s | ||
|
||
# CHECK-LABEL: image dump line-table a.c | ||
# CHECK: Line table for /tmp/a.c | ||
# CHECK-NEXT: 0x0000000000201000: /tmp/a.c:1 | ||
# CHECK-NEXT: 0x0000000000201001: /tmp/b.c:1 | ||
# CHECK-NEXT: 0x0000000000201002: /tmp/b.c:1 | ||
# CHECK-EMPTY: | ||
|
||
# CHECK-LABEL: breakpoint set -f a.c -l 1 | ||
# CHECK: Breakpoint 1: {{.*}}`_start, | ||
|
||
# CHECK-LABEL: breakpoint set -f /tmp/b.c -l 1 | ||
# CHECK: Breakpoint 2: {{.*}}`_start + 1, | ||
|
||
.text | ||
.globl _start | ||
_start: | ||
.file 1 "/tmp/a.c" | ||
.loc 1 1 0 | ||
nop | ||
.file 2 "/tmp/b.c" | ||
.loc 2 1 0 | ||
nop | ||
|
||
.section .debug_str,"MS",@progbits,1 | ||
.Linfo_string1: | ||
.asciz "a.c" | ||
.Linfo_string2: | ||
.asciz "/tmp" | ||
.section .debug_abbrev,"",@progbits | ||
.byte 1 # Abbreviation Code | ||
.byte 17 # DW_TAG_compile_unit | ||
.byte 0 # DW_CHILDREN_no | ||
.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 0 # EOM(1) | ||
.byte 0 # EOM(2) | ||
.byte 0 # EOM(3) | ||
.section .debug_info,"",@progbits | ||
.Lcu_begin0: | ||
.long .Lcu_end0-.Lcu_start0 # Length of Unit | ||
.Lcu_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 | ||
.short 12 # DW_AT_language | ||
.long .Linfo_string1 # DW_AT_name | ||
.long .Lline_table_start0 # DW_AT_stmt_list | ||
.long .Linfo_string2 # DW_AT_comp_dir | ||
.Lcu_end0: | ||
.section .debug_line,"",@progbits | ||
.Lline_table_start0: |
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,67 @@ | ||
# Test that parsing of line tables works reasonably, even if the host directory | ||
# separator does not match the separator of the compile unit. | ||
|
||
# REQUIRES: lld | ||
|
||
# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj > %t.o | ||
# RUN: ld.lld %t.o -o %t | ||
# RUN: %lldb %t -s %S/Inputs/dir-separator-windows.lldbinit -o exit | FileCheck %s | ||
|
||
# CHECK-LABEL: image dump line-table a.c | ||
# CHECK: Line table for C:\tmp\a.c | ||
# CHECK-NEXT: 0x0000000000201000: C:\tmp\a.c:1 | ||
# CHECK-NEXT: 0x0000000000201001: C:\tmp\b.c:1 | ||
# CHECK-NEXT: 0x0000000000201002: C:\tmp\b.c:1 | ||
# CHECK-EMPTY: | ||
|
||
# CHECK-LABEL: breakpoint set -f a.c -l 1 | ||
# CHECK: Breakpoint 1: {{.*}}`_start, | ||
|
||
# CHECK-LABEL: breakpoint set -f C:/tmp/b.c -l 1 | ||
# CHECK: Breakpoint 2: {{.*}}`_start + 1, | ||
|
||
.text | ||
.globl _start | ||
_start: | ||
.file 1 "C:\\tmp\\a.c" | ||
.loc 1 1 0 | ||
nop | ||
.file 2 "C:\\tmp\\b.c" | ||
.loc 2 1 0 | ||
nop | ||
|
||
.section .debug_str,"MS",@progbits,1 | ||
.Linfo_string1: | ||
.asciz "a.c" | ||
.Linfo_string2: | ||
.asciz "C:\\tmp" | ||
.section .debug_abbrev,"",@progbits | ||
.byte 1 # Abbreviation Code | ||
.byte 17 # DW_TAG_compile_unit | ||
.byte 0 # DW_CHILDREN_no | ||
.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 0 # EOM(1) | ||
.byte 0 # EOM(2) | ||
.byte 0 # EOM(3) | ||
.section .debug_info,"",@progbits | ||
.Lcu_begin0: | ||
.long .Lcu_end0-.Lcu_start0 # Length of Unit | ||
.Lcu_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 | ||
.short 12 # DW_AT_language | ||
.long .Linfo_string1 # DW_AT_name | ||
.long .Lline_table_start0 # DW_AT_stmt_list | ||
.long .Linfo_string2 # DW_AT_comp_dir | ||
.Lcu_end0: | ||
.section .debug_line,"",@progbits | ||
.Lline_table_start0: |
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
Oops, something went wrong.