[PATCH] [gdb/testsuite] Use function_range in gdb.dwarf2/dw2-ref-missing-frame.exp
Kumar N, Bhuvanendra
Bhuvanendra.KumarN@amd.com
Mon Oct 4 07:16:27 GMT 2021
[AMD Official Use Only]
Hi all,
Problem: Following 2 test points are failing with clang compiler
(gdb) FAIL: gdb.dwarf2/dw2-ref-missing-frame.exp: func_nofb print
(gdb) FAIL: gdb.dwarf2/dw2-ref-missing-frame.exp: func_loopfb print
Reason is same as the below commit by Tom, i.e. compile unit and functions address range are becoming zero, hence we need to use the function_range in this case also. Now the testcase is passing with gcc and clang, could you please review this patch. All the required details are mentioned in the commit message.
I have attached the patch with this email and also inlined it below.
. . .
commit f677852bbdaeac38c7d8ef859905879a21d5bb71
Author: Tom de Vries tdevries@suse.de<mailto:tdevries@suse.de>
Date: Wed Sep 15 15:53:18 2021 +0200
[gdb/testsuite] Use function_range in gdb.dwarf2/dw2-abs-hi-pc.exp
. . .
regards,
bhuvan
Patch content inlined:
>From fc265d5b74c517c2781fb6cf0f67c28b37fecc60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9Cbhkumarn=E2=80=9D?= Bhuvanendra.KumarN@amd.com<mailto:Bhuvanendra.KumarN@amd.com>
Date: Mon, 4 Oct 2021 12:21:19 +0530
Subject: [PATCH] [gdb/testsuite] Use function_range in
gdb.dwarf2/dw2-ref-missing-frame.exp
Following 2 test points are failing with clang compiler
(gdb) FAIL: gdb.dwarf2/dw2-ref-missing-frame.exp: func_nofb print
(gdb) FAIL: gdb.dwarf2/dw2-ref-missing-frame.exp: func_loopfb print
The problem is that the CU and functions have an empty address range:
...
0x0000000b: DW_TAG_compile_unit [1] *
DW_AT_high_pc [DW_FORM_addr] (0x002016c0)
DW_AT_low_pc [DW_FORM_addr] (0x002016c0)
DW_AT_name [DW_FORM_string] ("file1.txt")
0x00000032: DW_TAG_subprogram [5] *
DW_AT_name [DW_FORM_string] ("func_nofb")
DW_AT_low_pc [DW_FORM_addr] (0x002016c0)
DW_AT_high_pc [DW_FORM_addr] (0x002016c0)
0x0000005c: DW_TAG_subprogram [6] *
DW_AT_name [DW_FORM_string] ("func_loopfb")
DW_AT_low_pc [DW_FORM_addr] (0x002016c0)
DW_AT_high_pc [DW_FORM_addr] (0x002016c0)
...
The address ranges are set like this in dw2-ref-missing-frame.S:
...
.4byte cu_text_end /* DW_AT_high_pc */
.4byte cu_text_start /* DW_AT_low_pc */
.4byte func_nofb_start /* DW_AT_low_pc */
.4byte func_nofb_end /* DW_AT_high_pc */
.4byte func_loopfb_start /* DW_AT_low_pc */
.4byte func_loopfb_end /* DW_AT_high_pc */
...
where the labels refer to dw2-ref-missing-frame-func.c:
...
asm (".globl cu_text_start");
asm ("cu_text_start:");
asm (".globl func_nofb_start");
asm (".p2align 4");
asm ("func_nofb_start:");
void
func_nofb (void)
{
/* int func_nofb_var; */
}
asm (".globl func_nofb_end");
asm ("func_nofb_end:");
asm (".globl func_loopfb_start");
asm (".p2align 4");
asm ("func_loopfb_start:");
void
func_loopfb (void)
{
/* int func_loopfb_var; */
}
asm (".globl func_loopfb_end");
asm ("func_loopfb_end:");
asm (".globl cu_text_end");
asm ("cu_text_end:");
...
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.
---
.../gdb.dwarf2/dw2-ref-missing-frame-func.c | 22 ++-----------
.../gdb.dwarf2/dw2-ref-missing-frame.S | 12 +++----
.../gdb.dwarf2/dw2-ref-missing-frame.exp | 33 +++++++++++++++----
3 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame-func.c b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame-func.c
index 1ec1897b9e9..90772d65993 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame-func.c
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame-func.c
@@ -15,34 +15,16 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/. */
-asm (".globl cu_text_start");
-asm ("cu_text_start:");
-
-asm (".globl func_nofb_start");
-asm (".p2align 4");
-asm ("func_nofb_start:");
-
void
func_nofb (void)
{
+asm ("func_nofb_label: .globl func_nofb_label\n");
/* int func_nofb_var; */
}
-asm (".globl func_nofb_end");
-asm ("func_nofb_end:");
-
-asm (".globl func_loopfb_start");
-asm (".p2align 4");
-asm ("func_loopfb_start:");
-
void
func_loopfb (void)
{
+asm ("func_loopfb_label: .globl func_loopfb_label\n");
/* int func_loopfb_var; */
}
-
-asm (".globl func_loopfb_end");
-asm ("func_loopfb_end:");
-
-asm (".globl cu_text_end");
-asm ("cu_text_end:");
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S
index a64f03b0443..293eb0eca43 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S
@@ -28,8 +28,8 @@
/* CU die */
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
- .4byte cu_text_end /* DW_AT_high_pc */
- .4byte cu_text_start /* DW_AT_low_pc */
+ .4byte FUNC_LOOPFB_END /* DW_AT_high_pc */
+ .4byte FUNC_NOFB_START /* DW_AT_low_pc */
.ascii "file1.txt\0" /* DW_AT_name */
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
.byte 1 /* DW_AT_language (C) */
@@ -43,8 +43,8 @@
/* func_nofb */
.uleb128 5 /* Abbrev: DW_TAG_subprogram (no fb) */
.ascii "func_nofb\0" /* DW_AT_name */
- .4byte func_nofb_start /* DW_AT_low_pc */
- .4byte func_nofb_end /* DW_AT_high_pc */
+ .4byte FUNC_NOFB_START /* DW_AT_low_pc */
+ .4byte FUNC_NOFB_END /* DW_AT_high_pc */
.uleb128 7 /* Abbrev: DW_TAG_variable (location) */
.ascii "func_nofb_var\0" /* DW_AT_name */
@@ -58,8 +58,8 @@
/* func_loopfb */
.uleb128 6 /* Abbrev: DW_TAG_subprogram (loop fb) */
.ascii "func_loopfb\0" /* DW_AT_name */
- .4byte func_loopfb_start /* DW_AT_low_pc */
- .4byte func_loopfb_end /* DW_AT_high_pc */
+ .4byte FUNC_LOOPFB_START /* DW_AT_low_pc */
+ .4byte FUNC_LOOPFB_END /* DW_AT_high_pc */
.byte 2f - 1f /* DW_AT_frame_base */
1: .byte 0x91 /* DW_OP_fbreg */
.sleb128 0 /* 0 */
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.exp b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.exp
index 1b871445cc3..c45a99b3efa 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.exp
@@ -19,17 +19,38 @@ if {![dwarf2_support]} {
return 0
}
-standard_testfile .S
-set srcfuncfile ${testfile}-func.c
-set srcmainfile ${testfile}-main.c
+standard_testfile
+set sources \
+ [list \
+ ${testfile}-main.c \
+ ${testfile}-func.c]
+set sources [lmap i $sources { string cat "${srcdir}/${subdir}/" $i }]
+lassign [function_range func_nofb $sources] \
+ func_nofb_start func_nofb_len
+lassign [function_range func_loopfb $sources] \
+ func_loopfb_start func_loopfb_len
+
+set sources \
+ [list \
+ ${testfile}-main.c \
+ ${testfile}.S \
+ ${testfile}-func.c]
+set flags \
+ [list \
+ "debug" \
+ "additional_flags=\"-DFUNC_NOFB_START=$func_nofb_start\"" \
+ "additional_flags=\"-DFUNC_NOFB_END=$func_nofb_start + $func_nofb_len\"" \
+ "additional_flags=\"-DFUNC_LOOPFB_START=$func_loopfb_start\"" \
+ "additional_flags=\"-DFUNC_LOOPFB_END=$func_loopfb_start + $func_loopfb_len\""]
set executable ${testfile}
-if {[prepare_for_testing_full "failed to prepare" \
- [list $testfile {} $srcfile {} $srcfuncfile {} \
- $srcmainfile debug]]} {
+if {[build_executable ${testfile}.exp ${executable} $sources $flags] == -1} {
+
return -1
}
+clean_restart $executable
+
# First try referencing DW_AT_frame_base which is not defined.
if [runto func_nofb] {
gdb_test "p func_nofb_var" {Could not find the frame base for "func_nofb".} "func_nofb print"
--
2.17.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gdb-testsuite-Use-function_range-in-gdb.dwarf2-dw2-r.patch
Type: application/octet-stream
Size: 7121 bytes
Desc: 0001-gdb-testsuite-Use-function_range-in-gdb.dwarf2-dw2-r.patch
URL: <https://sourceware.org/pipermail/gdb-patches/attachments/20211004/dbd7578a/attachment-0001.obj>
More information about the Gdb-patches
mailing list