Message ID | 51152DBB.2090007@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, Feb 08, 2013 at 09:54:19AM -0700, Jeff Law wrote: > PR debug/53948 > * emit-rtl.c (reg_is_parm_p): New function. > * regs.h (reg_is_parm_p): New prototype. > * ira-conflicts.c (ira_build_conflicts): Allow parameters in > callee-clobbered registers. This looks good to me. > * gcc.dg/debug/dwarf2/pr53948.c: New test. But the testcase is problematic. > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c > @@ -0,0 +1,10 @@ > +/* Test that we emit a .line directive for the line > + with local variable initializations. */ > +/* { dg-options "-O0 -g" } */ > +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ It will fail on any target which doesn't support .loc directives. I'd say better would be to scan the -fdump-rtl-final for pr53948.c:8 regex. Jakub
On Fri, Feb 08, 2013 at 06:55:08PM +0100, Jakub Jelinek wrote: > But the testcase is problematic. > > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c > > @@ -0,0 +1,10 @@ > > +/* Test that we emit a .line directive for the line > > + with local variable initializations. */ > > +/* { dg-options "-O0 -g" } */ > > +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ > > It will fail on any target which doesn't support .loc > directives. > I'd say better would be to scan the -fdump-rtl-final > for pr53948.c:8 regex. Or perhaps /* { dg-options "-O0 -g -dA" } */ /* { dg-final { scan-assembler ".loc 1 8 0|# line 8" } } */ Jakub
On 02/08/2013 10:55 AM, Jakub Jelinek wrote: > On Fri, Feb 08, 2013 at 09:54:19AM -0700, Jeff Law wrote: >> PR debug/53948 >> * emit-rtl.c (reg_is_parm_p): New function. >> * regs.h (reg_is_parm_p): New prototype. >> * ira-conflicts.c (ira_build_conflicts): Allow parameters in >> callee-clobbered registers. > > This looks good to me. > >> * gcc.dg/debug/dwarf2/pr53948.c: New test. > > But the testcase is problematic. > >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c >> @@ -0,0 +1,10 @@ >> +/* Test that we emit a .line directive for the line >> + with local variable initializations. */ >> +/* { dg-options "-O0 -g" } */ >> +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ > > It will fail on any target which doesn't support .loc > directives. Do we have any dwarf targets that don't support .loc? While the bug isn't dwarf specific, I figured dwarf is used enough that just testing it on dwarf targets would be sufficient coverage. Thus the test is in the dwarf specific part of the testsuite. jeff
On 02/08/2013 10:55 AM, Jakub Jelinek wrote: > On Fri, Feb 08, 2013 at 09:54:19AM -0700, Jeff Law wrote: >> PR debug/53948 >> * emit-rtl.c (reg_is_parm_p): New function. >> * regs.h (reg_is_parm_p): New prototype. >> * ira-conflicts.c (ira_build_conflicts): Allow parameters in >> callee-clobbered registers. > > This looks good to me. > >> * gcc.dg/debug/dwarf2/pr53948.c: New test. > > But the testcase is problematic. > >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c >> @@ -0,0 +1,10 @@ >> +/* Test that we emit a .line directive for the line >> + with local variable initializations. */ >> +/* { dg-options "-O0 -g" } */ >> +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ > > It will fail on any target which doesn't support .loc > directives. > I'd say better would be to scan the -fdump-rtl-final > for pr53948.c:8 regex. How about this: /* Test that we have line information for the line with local variable initializations. */ /* { dg-options "-O0 -g -fdump-rtl-final" } */ /* { dg-final { scan-rtl-dump "pr53948.c:7" "final" } } */ int f (register int a, register int b) { register int x = b, y = a; return x + y; } Jeff
> Do we have any dwarf targets that don't support .loc?
Solaris targets with the Solaris assembler, I think.
On 02/09/2013 06:49 AM, Eric Botcazou wrote: >> Do we have any dwarf targets that don't support .loc? > > Solaris targets with the Solaris assembler, I think. Thanks. I found out that ia64 only conditionally uses .loc as well. Regardless, I used Jakub's regexp, so we should be good for targets with and without .loc support. jeff
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index f997e5d..2c70fb1 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -919,6 +919,18 @@ gen_reg_rtx (enum machine_mode mode) return val; } +/* Return TRUE if REG is a PARM_DECL, FALSE otherwise. */ + +bool +reg_is_parm_p (rtx reg) +{ + tree decl; + + gcc_assert (REG_P (reg)); + decl = REG_EXPR (reg); + return (decl && TREE_CODE (decl) == PARM_DECL); +} + /* Update NEW with the same attributes as REG, but with OFFSET added to the REG_OFFSET. */ diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index 711db0f..710986b 100644 --- a/gcc/ira-conflicts.c +++ b/gcc/ira-conflicts.c @@ -895,8 +895,12 @@ ira_build_conflicts (void) if ((! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0) /* For debugging purposes don't put user defined variables in - callee-clobbered registers. */ - || (optimize == 0 && REG_USERVAR_P (allocno_reg))) + callee-clobbered registers. However, do allow parameters + in callee-clobbered registers to improve debugging. This + is a bit of a fragile hack. */ + || (optimize == 0 + && REG_USERVAR_P (allocno_reg) + && ! reg_is_parm_p (allocno_reg))) { IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), call_used_reg_set); diff --git a/gcc/regs.h b/gcc/regs.h index 0532d08..090d6b6 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -89,6 +89,8 @@ REG_N_SETS (int regno) #define SET_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets = V) #define INC_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets += V) +/* Given a REG, return TRUE if the reg is a PARM_DECL, FALSE otherwise. */ +extern bool reg_is_parm_p (rtx); /* Functions defined in regstat.c. */ extern void regstat_init_n_sets_and_refs (void); diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c new file mode 100644 index 0000000..8bc8ed4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c @@ -0,0 +1,10 @@ +/* Test that we emit a .line directive for the line + with local variable initializations. */ +/* { dg-options "-O0 -g" } */ +/* { dg-final { scan-assembler ".loc 1 8 0" } } */ + + +int f (register int a, register int b) { + register int x = b, y = a; + return x + y; } +