diff options
author | Tom de Vries <tdevries@suse.de> | 2021-09-15 15:53:18 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-09-15 15:53:18 +0200 |
commit | f677852bbdaeac38c7d8ef859905879a21d5bb71 (patch) | |
tree | 9a4a66677ed20586e4f18c98af615e4f97df79cc /gdb | |
parent | 720f6ee0959d9b493051d63f75d0d609d3d392ad (diff) | |
download | gdb-f677852bbdaeac38c7d8ef859905879a21d5bb71.zip gdb-f677852bbdaeac38c7d8ef859905879a21d5bb71.tar.gz gdb-f677852bbdaeac38c7d8ef859905879a21d5bb71.tar.bz2 |
[gdb/testsuite] Use function_range in gdb.dwarf2/dw2-abs-hi-pc.exp
When I run test-case gdb.dwarf2/dw2-abs-hi-pc.exp with gcc, we have:
...
(gdb) break hello^M
Breakpoint 1 at 0x4004c0: file dw2-abs-hi-pc-hello.c, line 24.^M
(gdb) PASS: gdb.dwarf2/dw2-abs-hi-pc.exp: break hello
...
but with clang, I run into:
...
(gdb) break hello^M
Breakpoint 1 at 0x4004e4^M
(gdb) FAIL: gdb.dwarf2/dw2-abs-hi-pc.exp: break hello
...
The problem is that the CU and function both have an empty address range:
...
<0><d2>: Abbrev Number: 1 (DW_TAG_compile_unit)
<108> DW_AT_name : dw2-abs-hi-pc-hello.c
<123> DW_AT_low_pc : 0x4004e0
<127> DW_AT_high_pc : 0x4004e0
<1><12f>: Abbrev Number: 2 (DW_TAG_subprogram)
<131> DW_AT_name : hello
<13a> DW_AT_low_pc : 0x4004e0
<13e> DW_AT_high_pc : 0x4004e0
...
The address ranges are set like this in dw2-abs-hi-pc-hello-dbg.S:
...
.4byte .hello_start /* DW_AT_low_pc */
.4byte .hello_end /* DW_AT_high_pc */
...
where the labels refer to dw2-abs-hi-pc-hello.c:
...
extern int v;
asm (".hello_start: .globl .hello_start\n");
void
hello (void)
{
asm (".hello0: .globl .hello0\n");
v++;
asm (".hello1: .globl .hello1\n");
}
asm (".hello_end: .globl .hello_end\n");
...
Using asm labels in global scope is a known source of problems, as explained
in the comment of proc function_range in gdb/testsuite/lib/dwarf.exp.
Fix this by using function_range instead.
Tested on x86_64-linux with gcc and clang-7 and clang-12.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S | 12 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S | 12 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp | 29 |
5 files changed, 41 insertions, 18 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S index bfe3889..8f7103d 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S +++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S @@ -24,8 +24,8 @@ .byte 0x1 /* DW_AT_language */ .ascii "dw2-abs-hi-pc-hello.c\0" /* DW_AT_name */ .ascii "/tmp\0" /* DW_AT_comp_dir */ - .4byte .hello_start /* DW_AT_low_pc */ - .4byte .hello_end /* DW_AT_high_pc */ + .4byte HELLO_START /* DW_AT_low_pc */ + .4byte HELLO_END /* DW_AT_high_pc */ .4byte .Ldebug_line0 /* DW_AT_stmt_list */ .uleb128 0x2 /* (DIE (0x2d) DW_TAG_subprogram) */ .byte 0x1 /* DW_AT_external */ @@ -33,8 +33,8 @@ .byte 0x1 /* DW_AT_decl_file (hello.c) */ .byte 0x13 /* DW_AT_decl_line */ .byte 0x1 /* DW_AT_prototyped */ - .4byte .hello_start /* DW_AT_low_pc */ - .4byte .hello_end /* DW_AT_high_pc */ + .4byte HELLO_START /* DW_AT_low_pc */ + .4byte HELLO_END /* DW_AT_high_pc */ .byte 0 /* end of children of DIE 0xb */ .Ledebug_info0: @@ -114,7 +114,7 @@ LELTP: .byte 0 /* set address to .hello_start */ .uleb128 0x5 .byte 0x2 - .4byte .hello_start + .4byte HELLO_START .byte 0x3 /* DW_LNS_advance_line */ .sleb128 22 /* ... to 23 */ .byte 0x5 /* column 0 */ @@ -144,7 +144,7 @@ LELTP: .byte 0 /* set address to .hello_end */ .uleb128 0x5 .byte 0x2 - .4byte .hello_end + .4byte HELLO_END .byte 0 /* end sequence */ .uleb128 0x1 .byte 0x1 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c index 4d26968..ab24c9e 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c +++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c @@ -17,12 +17,11 @@ extern int v; -asm (".hello_start: .globl .hello_start\n"); void hello (void) { +asm ("hello_label: .globl hello_label\n"); asm (".hello0: .globl .hello0\n"); v++; asm (".hello1: .globl .hello1\n"); } -asm (".hello_end: .globl .hello_end\n"); diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S index 4e19f66..ed74c99 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S +++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S @@ -24,8 +24,8 @@ .byte 0x1 /* DW_AT_language */ .ascii "dw2-abs-hi-pc-world.c\0" /* DW_AT_name */ .ascii "/tmp\0" /* DW_AT_comp_dir */ - .4byte .world_start /* DW_AT_low_pc */ - .4byte .world_end /* DW_AT_high_pc */ + .4byte WORLD_START /* DW_AT_low_pc */ + .4byte WORLD_END /* DW_AT_high_pc */ .4byte .Ldebug_line0 /* DW_AT_stmt_list */ .uleb128 0x2 /* (DIE (0x2d) DW_TAG_subprogram) */ .byte 0x1 /* DW_AT_external */ @@ -33,8 +33,8 @@ .byte 0x1 /* DW_AT_decl_file (world.c) */ .byte 0x13 /* DW_AT_decl_line */ .byte 0x1 /* DW_AT_prototyped */ - .4byte .world_start /* DW_AT_low_pc */ - .4byte .world_end /* DW_AT_high_pc */ + .4byte WORLD_START /* DW_AT_low_pc */ + .4byte WORLD_END /* DW_AT_high_pc */ .byte 0 /* end of children of DIE 0xb */ .Ledebug_info0: @@ -114,7 +114,7 @@ LELTP: .byte 0 /* set address to .world_start */ .uleb128 0x5 .byte 0x2 - .4byte .world_start + .4byte WORLD_START .byte 0x3 /* DW_LNS_advance_line */ .sleb128 22 /* ... to 23 */ .byte 0x5 /* column 0 */ @@ -144,7 +144,7 @@ LELTP: .byte 0 /* set address to .world_end */ .uleb128 0x5 .byte 0x2 - .4byte .world_end + .4byte WORLD_END .byte 0 /* end sequence */ .uleb128 0x1 .byte 0x1 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c index 0e4a60d..d06734c 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c +++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c @@ -17,12 +17,11 @@ extern int v; -asm (".world_start: .globl .world_start\n"); void world (void) { +asm ("world_label: .globl world_label\n"); asm (".world0: .globl .world0\n"); v++; asm (".world1: .globl .world1\n"); } -asm (".world_end: .globl .world_end\n"); diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp index 9a30b61..0bb49f1 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp @@ -20,9 +20,34 @@ if {![dwarf2_support]} { } standard_testfile -set executable ${testfile} -if {[build_executable ${testfile}.exp ${executable} "${testfile}.c ${testfile}-hello-dbg.S ${testfile}-hello.c ${testfile}-world-dbg.S ${testfile}-world.c" "nodebug"] == -1} { +set sources \ + [list \ + ${testfile}.c \ + ${testfile}-hello.c \ + ${testfile}-world.c] +set sources [lmap i $sources { string cat "${srcdir}/${subdir}/" $i }] +lassign [function_range hello $sources] \ + hello_start hello_len +lassign [function_range world $sources] \ + world_start world_len + +set sources \ + [list \ + ${testfile}.c \ + ${testfile}-hello-dbg.S \ + ${testfile}-hello.c \ + ${testfile}-world-dbg.S \ + ${testfile}-world.c] +set flags \ + [list \ + "nodebug" \ + "additional_flags=\"-DHELLO_START=$hello_start\"" \ + "additional_flags=\"-DHELLO_END=$hello_start + $hello_len\"" \ + "additional_flags=\"-DWORLD_START=$world_start\"" \ + "additional_flags=\"-DWORLD_END=$world_start + $world_len\""] +set executable ${testfile} +if {[build_executable ${testfile}.exp ${executable} $sources $flags] == -1} { return -1 } |