diff options
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index cfbb9ca1f2e..8d555487818 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1198,16 +1198,23 @@ make_decl_rtl (tree decl) else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)) { const char *asmspec = name+1; + enum machine_mode mode = DECL_MODE (decl); reg_number = decode_reg_name (asmspec); /* First detect errors in declaring global registers. */ if (reg_number == -1) error ("register name not specified for %q+D", decl); else if (reg_number < 0) error ("invalid register name for %q+D", decl); - else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode) + else if (mode == BLKmode) error ("data type of %q+D isn%'t suitable for a register", decl); - else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl)))) + else if (!in_hard_reg_set_p (accessible_reg_set, mode, reg_number)) + error ("the register specified for %q+D cannot be accessed" + " by the current target", decl); + else if (!in_hard_reg_set_p (operand_reg_set, mode, reg_number)) + error ("the register specified for %q+D is not general enough" + " to be used as a register variable", decl); + else if (!HARD_REGNO_MODE_OK (reg_number, mode)) error ("register specified for %q+D isn%'t suitable for data type", decl); /* Now handle properly declared static register variables. */ @@ -1230,7 +1237,7 @@ make_decl_rtl (tree decl) confused with that register and be eliminated. This usage is somewhat suspect... */ - SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number)); + SET_DECL_RTL (decl, gen_rtx_raw_REG (mode, reg_number)); ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number; REG_USERVAR_P (DECL_RTL (decl)) = 1; @@ -1242,7 +1249,7 @@ make_decl_rtl (tree decl) name = IDENTIFIER_POINTER (DECL_NAME (decl)); ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name); #endif - nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)]; + nregs = hard_regno_nregs[reg_number][mode]; while (nregs > 0) globalize_reg (decl, reg_number + --nregs); } @@ -2109,7 +2116,9 @@ incorporeal_function_p (tree decl) return true; name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - if (is_builtin_name (name)) + /* Atomic or sync builtins which have survived this far will be + resolved externally and therefore are not incorporeal. */ + if (strncmp (name, "__builtin_", 10) == 0) return true; } return false; @@ -5961,7 +5970,7 @@ dump_tm_clone_pairs (VEC(tm_alias_pair,heap) *tm_alias_pairs) if (!switched) { - switch_to_section (get_named_section (NULL, ".tm_clone_table", 3)); + switch_to_section (targetm.asm_out.tm_clone_table_section ()); assemble_align (POINTER_SIZE); switched = true; } @@ -5973,6 +5982,14 @@ dump_tm_clone_pairs (VEC(tm_alias_pair,heap) *tm_alias_pairs) } } +/* Provide a default for the tm_clone_table section. */ + +section * +default_clone_table_section (void) +{ + return get_named_section (NULL, ".tm_clone_table", 3); +} + /* Helper comparison function for qsorting by the DECL_UID stored in alias_pair->emitted_diags. */ |