diff options
author | Andi Kleen <ak@linux.intel.com> | 2011-06-09 06:20:05 +0000 |
---|---|---|
committer | Andi Kleen <ak@gcc.gnu.org> | 2011-06-09 06:20:05 +0000 |
commit | 1460ec5c3d5a247e704245ac996750c749991fdd (patch) | |
tree | 0e9b031c60a7dac8443153238fabcfc776f16ecf | |
parent | df17530a852fae6aab5ce41d806a78808013fc1f (diff) | |
download | gcc-1460ec5c3d5a247e704245ac996750c749991fdd.zip gcc-1460ec5c3d5a247e704245ac996750c749991fdd.tar.gz gcc-1460ec5c3d5a247e704245ac996750c749991fdd.tar.bz2 |
Print location for conflicting global regs.
gcc/
2011-06-08 Andi Kleen <ak@linux.intel.com>
* reginfo.c (global_regs_decl): Add.
(globalize_reg): Add decl parameter. Compute location.
Pass location to warnings and add inform. Store decl
in global_regs_decl.
* rtl.h (globalize_reg): Update prototype.
* varasm.c (make_decl_rtl): Pass decl to globalize_reg().
From-SVN: r174834
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/reginfo.c | 18 | ||||
-rw-r--r-- | gcc/rtl.h | 2 | ||||
-rw-r--r-- | gcc/varasm.c | 2 |
4 files changed, 25 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 821771a..fb53fdc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-06-08 Andi Kleen <ak@linux.intel.com> + + * reginfo.c (global_regs_decl): Add. + (globalize_reg): Add decl parameter. Compute location. + Pass location to warnings and add inform. Store decl + in global_regs_decl. + * rtl.h (globalize_reg): Update prototype. + * varasm.c (make_decl_rtl): Pass decl to globalize_reg(). + 2011-06-09 Mingjie Xing <mingjie.xing@gmail.com> * treestruct.def (TS_TYPE_DECL): Fix the printable name typo. diff --git a/gcc/reginfo.c b/gcc/reginfo.c index a283a90..1da4cb8 100644 --- a/gcc/reginfo.c +++ b/gcc/reginfo.c @@ -87,6 +87,9 @@ static const char initial_call_really_used_regs[] = CALL_REALLY_USED_REGISTERS; and are also considered fixed. */ char global_regs[FIRST_PSEUDO_REGISTER]; +/* Declaration for the global register. */ +static tree GTY(()) global_regs_decl[FIRST_PSEUDO_REGISTER]; + /* Same information as REGS_INVALIDATED_BY_CALL but in regset form to be used in dataflow more conveniently. */ regset regs_invalidated_by_call_regset; @@ -825,8 +828,10 @@ fix_register (const char *name, int fixed, int call_used) /* Mark register number I as global. */ void -globalize_reg (int i) +globalize_reg (tree decl, int i) { + location_t loc = DECL_SOURCE_LOCATION (decl); + #ifdef STACK_REGS if (IN_RANGE (i, FIRST_STACK_REG, LAST_STACK_REG)) { @@ -836,18 +841,23 @@ globalize_reg (int i) #endif if (fixed_regs[i] == 0 && no_global_reg_vars) - error ("global register variable follows a function definition"); + error_at (loc, "global register variable follows a function definition"); if (global_regs[i]) { - warning (0, "register used for two global register variables"); + warning_at (loc, 0, + "register of %qD used for multiple global register variables", + decl); + inform (DECL_SOURCE_LOCATION (global_regs_decl[i]), + "conflicts with %qD", global_regs_decl[i]); return; } if (call_used_regs[i] && ! fixed_regs[i]) - warning (0, "call-clobbered register used for global register variable"); + warning_at (loc, 0, "call-clobbered register used for global register variable"); global_regs[i] = 1; + global_regs_decl[i] = decl; /* If we're globalizing the frame pointer, we need to set the appropriate regs_invalidated_by_call bit, even if it's already @@ -2451,7 +2451,7 @@ extern void mark_elimination (int, int); /* In reginfo.c */ extern int reg_classes_intersect_p (reg_class_t, reg_class_t); extern int reg_class_subset_p (reg_class_t, reg_class_t); -extern void globalize_reg (int); +extern void globalize_reg (tree, int); extern void init_reg_modes_target (void); extern void init_regs (void); extern void reinit_regs (void); diff --git a/gcc/varasm.c b/gcc/varasm.c index f46c21b..3311c86 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1237,7 +1237,7 @@ make_decl_rtl (tree decl) #endif nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)]; while (nregs > 0) - globalize_reg (reg_number + --nregs); + globalize_reg (decl, reg_number + --nregs); } /* As a register variable, it has no section. */ |