ipa-sra: Prevent constructing debug info from wrong argument
The mechanism generating debug info for removed parameters did not adjust index of the argument in the call statement to take into account extra arguments IPA-SRA might have produced when splitting a strucutre. This patch addresses that omission and stops gdb from showing incorrect value for the removed parameter and says "value optimized out" instead. The guality testcase will end up as UNSUPPORTED in the results which is how Richi told me on IRC we deal with this. It is possible to generate debug info to actually show the value of the removed parameter but so far my approaches to do just that seem toocontroversial (https://gcc.gnu.org/pipermail/gcc-patches/2020-May/546705.html), so before I come up with something better I'd like to push this to master and the gcc-10 branch in time for the GCC 10.2 release. gcc/ChangeLog: 2020-07-01 Martin Jambor <mjambor@suse.cz> PR debug/95343 * ipa-param-manipulation.c (ipa_param_adjustments::modify_call): Adjust argument index if necessary. gcc/testsuite/ChangeLog: 2020-07-01 Martin Jambor <mjambor@suse.cz> PR debug/95343 * gcc.dg/guality/pr95343.c: New test.
This commit is contained in:
parent
1ac9258cca
commit
053c88093a
2 changed files with 50 additions and 1 deletions
|
@ -790,7 +790,11 @@ ipa_param_adjustments::modify_call (gcall *stmt,
|
|||
if (!is_gimple_reg (old_parm) || kept[i])
|
||||
continue;
|
||||
tree origin = DECL_ORIGIN (old_parm);
|
||||
tree arg = gimple_call_arg (stmt, i);
|
||||
tree arg;
|
||||
if (transitive_remapping)
|
||||
arg = gimple_call_arg (stmt, index_map[i]);
|
||||
else
|
||||
arg = gimple_call_arg (stmt, i);
|
||||
|
||||
if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
|
||||
{
|
||||
|
|
45
gcc/testsuite/gcc.dg/guality/pr95343.c
Normal file
45
gcc/testsuite/gcc.dg/guality/pr95343.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-g -fno-ipa-icf" } */
|
||||
|
||||
volatile int v;
|
||||
|
||||
int __attribute__((noipa))
|
||||
get_val0 (void) {return 0;}
|
||||
int __attribute__((noipa))
|
||||
get_val2 (void) {return 2;}
|
||||
|
||||
struct S
|
||||
{
|
||||
int a, b, c;
|
||||
};
|
||||
|
||||
static int __attribute__((noinline))
|
||||
bar (struct S s, int x, int y, int z, int i)
|
||||
{
|
||||
int r;
|
||||
v = s.a + s.b; /* { dg-final { gdb-test . "i+1" "3" } } */
|
||||
return r;
|
||||
}
|
||||
|
||||
static int __attribute__((noinline))
|
||||
foo (struct S s, int i)
|
||||
{
|
||||
int r;
|
||||
r = bar (s, 3, 4, 5, i);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
struct S s;
|
||||
int i;
|
||||
i = get_val2 ();
|
||||
s.a = get_val0 ();
|
||||
s.b = get_val0 ();
|
||||
s.c = get_val0 ();
|
||||
int r = foo (s, i);
|
||||
v = r + i;
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue