[PATCH v2 2/2] gdb/dwarf2: fix "info locals" for clang-compiled inlined functions
Andrew Burgess
andrew.burgess@embecosm.com
Wed Apr 14 15:46:34 GMT 2021
* Aktemur, Tankut Baris via Gdb-patches <gdb-patches@sourceware.org> [2021-04-14 12:18:26 +0000]:
> On Wednesday, April 14, 2021 10:15 AM, Aktemur, Tankut Baris wrote:
> > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
> > b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
> > new file mode 100644
> > index 00000000000..e815c859639
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
> > @@ -0,0 +1,137 @@
> > +# Copyright 2021 Free Software Foundation, Inc.
> > +
> > +# This program is free software; you can redistribute it and/or modify
> > +# it under the terms of the GNU General Public License as published by
> > +# the Free Software Foundation; either version 3 of the License, or
> > +# (at your option) any later version.
> > +#
> > +# This program is distributed in the hope that it will be useful,
> > +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > +# GNU General Public License for more details.
> > +#
> > +# You should have received a copy of the GNU General Public License
> > +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> > +
> > +# Test that scoped local variables in an inlined function are printed
> > +# properly.
> > +
> > +load_lib dwarf.exp
> > +
> > +# This test can only be run on targets that support DWARF-2 and use
> > +# gas.
> > +if {![dwarf2_support]} {
> > + return 0
> > +}
> > +
> > +standard_testfile .c .S
> > +
> > +# Make some DWARF for the test. The concrete inlined instance
> > +# (i.e. the DW_TAG_inlined_subroutine) has a DW_TAG_lexical_block that
> > +# does not contain a DW_AT_abstract_origin attribute. This is
> > +# deliberate. Bad GDB printed duplicate local variables with
> > +# "optimized out" values in this case.
> > +
> > +set asm_file [standard_output_file $srcfile2]
> > +Dwarf::assemble $asm_file {
> > + global srcfile srcdir subdir
> > + declare_labels int_label func_label num_label value_label lines_label
> > +
> > + get_func_info main
> > + set func_call [gdb_get_line_number "func call"]
> > +
> > + cu {} {
> > + compile_unit {
> > + {language @DW_LANG_C99}
> > + {name $srcfile}
> > + {low_pc $main_start addr}
> > + {high_pc "$main_start + $main_len" addr}
> > + {stmt_list ${lines_label} DW_FORM_sec_offset}
> > + } {
> > + int_label: base_type {
> > + {name "int"}
> > + {byte_size 4 sdata}
> > + {encoding @DW_ATE_signed}
> > + }
> > +
> > + func_label: subprogram {
> > + {name func}
> > + {inline 3 data1}
> > + } {
> > + num_label: DW_TAG_variable {
> > + {name num}
> > + {type :$int_label}
> > + }
> > + lexical_block {
> > + } {
> > + value_label: DW_TAG_variable {
> > + {name value}
> > + {type :$int_label}
> > + }
> > + }
> > + }
> > +
> > + subprogram {
> > + {name main}
> > + {frame_base {DW_OP_reg6} SPECIAL_expr}
>
> I think I'll have to limit the test to X86_64 targets.
As I understand the problem description, the important part of this
test is the lack of DW_AT_abstract_origin, not the location of the
variables.
The approach I usually take for tests like this is to mirror the
variables into global parameters, and just have the location attribute
point to the global location.
I tested this approach with your patch, the test still fails before
the fix, and works afterwards, so I think we're good - but now there's
no need to reference specific stack locations, or register numbers.
The patch below is what I came up with, feel free to use this if you
think it is helpful. It should apply on top of your two patches.
Thanks,
Andrew
---
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.c b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.c
index 0fd909459ba..57ef6a8f035 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.c
+++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.c
@@ -16,6 +16,9 @@
along with this program. If not, see
<http://www.gnu.org/licenses/>. */
+int global_num = 0;
+int global_value = 0;
+
#ifdef __GNUC__
#define ATTR __attribute__((always_inline))
#else
@@ -26,12 +29,15 @@ inline ATTR
static void
func ()
{ /* func prologue */
- int num= 42;
+ global_num = 42;
+ int num = 42;
if (num > 2)
{
asm ("scope_label1: .globl scope_label1");
+ global_value = num;
int value = num;
asm ("breakpoint_label: .globl breakpoint_label");
+ global_value += 10;
value += 10; /* break here */
asm ("scope_label2: .globl scope_label2");
}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
index e815c859639..d85d2fe06b0 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-with-lexical-scope.exp
@@ -40,6 +40,9 @@ Dwarf::assemble $asm_file {
get_func_info main
set func_call [gdb_get_line_number "func call"]
+ set num_var [gdb_target_symbol global_num]
+ set value_var [gdb_target_symbol global_value]
+
cu {} {
compile_unit {
{language @DW_LANG_C99}
@@ -73,7 +76,6 @@ Dwarf::assemble $asm_file {
subprogram {
{name main}
- {frame_base {DW_OP_reg6} SPECIAL_expr}
{external 1 flag}
{low_pc $main_start addr}
{high_pc "$main_start + $main_len" addr}
@@ -87,7 +89,7 @@ Dwarf::assemble $asm_file {
} {
DW_TAG_variable {
{abstract_origin %$num_label}
- {location {DW_OP_fbreg -4} SPECIAL_expr}
+ {location {addr $num_var} SPECIAL_expr}
}
lexical_block {
{low_pc scope_label1 addr}
@@ -95,7 +97,7 @@ Dwarf::assemble $asm_file {
} {
DW_TAG_variable {
{abstract_origin %$value_label}
- {location {DW_OP_fbreg -8} SPECIAL_expr}
+ {location {addr $value_var} SPECIAL_expr}
}
}
}
More information about the Gdb-patches
mailing list