aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-08-26 18:06:31 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2014-08-26 18:06:31 +0100
commitc218f6e89d7bee930ad705642cf069262432990a (patch)
tree2f34eb8a53683a3f2846042c1e5dfe9d0d5c16ed /gcc/cfgexpand.c
parent43f4a446c24f8a950442c0d432788704a0531bf3 (diff)
downloadgcc-c218f6e89d7bee930ad705642cf069262432990a.zip
gcc-c218f6e89d7bee930ad705642cf069262432990a.tar.gz
gcc-c218f6e89d7bee930ad705642cf069262432990a.tar.bz2
Fix ARM ICE for register var asm ("pc") (PR target/60606).
PR target/60606 PR target/61330 * varasm.c (make_decl_rtl): Clear DECL_ASSEMBLER_NAME and DECL_HARD_REGISTER and return for invalid register specifications. * cfgexpand.c (expand_one_var): If expand_one_hard_reg_var clears DECL_HARD_REGISTER, call expand_one_error_var. * config/arm/arm.c (arm_hard_regno_mode_ok): Do not allow CC_REGNUM with non-MODE_CC modes. (arm_regno_class): Return NO_REGS for PC_REGNUM. testsuite: * gcc.dg/torture/pr60606-1.c, gcc.target/arm/pr60606-2.c, gcc.target/arm/pr60606-3.c, gcc.target/arm/pr60606-4.c: New tests. From-SVN: r214526
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 6c2b693..34e57b9 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -1307,7 +1307,12 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
{
if (really_expand)
- expand_one_hard_reg_var (var);
+ {
+ expand_one_hard_reg_var (var);
+ if (!DECL_HARD_REGISTER (var))
+ /* Invalid register specification. */
+ expand_one_error_var (var);
+ }
}
else if (use_register_for_decl (var))
{