From: Richard Biener Date: Thu, 14 Feb 2013 12:24:12 +0000 (+0000) Subject: re PR lto/50494 (gcc.dg/vect/vect-reduc-2char.c fails spuriously on ppc with -flto) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=03143140ad8c1b5b59f9c4ffe50ca77adac3012d;p=gcc.git re PR lto/50494 (gcc.dg/vect/vect-reduc-2char.c fails spuriously on ppc with -flto) 2013-02-14 Richard Biener PR lto/50494 * varasm.c (output_constant_def_1): Get the decl representing the constant as argument. (output_constant_def): Wrap output_constant_def_1. (make_decl_rtl): Use output_constant_def_1 with the decl representing the constant. (build_constant_desc): Optionally re-use a decl already representing the constant. (tree_output_constant_def): Adjust. From-SVN: r196050 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25e4f0fe9a9..a1c7d46ace1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2013-02-14 Richard Biener + + PR lto/50494 + * varasm.c (output_constant_def_1): Get the decl representing + the constant as argument. + (output_constant_def): Wrap output_constant_def_1. + (make_decl_rtl): Use output_constant_def_1 with the decl + representing the constant. + (build_constant_desc): Optionally re-use a decl already + representing the constant. + (tree_output_constant_def): Adjust. + 2013-02-14 Dodji Seketeli Fix an asan crash diff --git a/gcc/varasm.c b/gcc/varasm.c index 66481031022..98a29ff407f 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -126,6 +126,7 @@ static void asm_output_aligned_bss (FILE *, tree, const char *, #endif /* BSS_SECTION_ASM_OP */ static void mark_weak (tree); static void output_constant_pool (const char *, tree); +static rtx output_constant_def_1 (tree, tree, int); /* Well-known sections, each one associated with some sort of *_ASM_OP. */ section *text_section; @@ -1186,7 +1187,8 @@ make_decl_rtl (tree decl) pre-computed RTL or recompute it in LTO mode. */ if (TREE_CODE (decl) == VAR_DECL && DECL_IN_CONSTANT_POOL (decl)) { - SET_DECL_RTL (decl, output_constant_def (DECL_INITIAL (decl), 1)); + SET_DECL_RTL (decl, output_constant_def_1 (DECL_INITIAL (decl), + decl, 1)); return; } @@ -3073,16 +3075,16 @@ get_constant_size (tree exp) Make a constant descriptor to enter EXP in the hash table. Assign the label number and construct RTL to refer to the constant's location in memory. + If DECL is non-NULL use it as VAR_DECL associated with the constant. Caller is responsible for updating the hash table. */ static struct constant_descriptor_tree * -build_constant_desc (tree exp) +build_constant_desc (tree exp, tree decl) { struct constant_descriptor_tree *desc; rtx symbol, rtl; char label[256]; int labelno; - tree decl; desc = ggc_alloc_constant_descriptor_tree (); desc->value = copy_constant (exp); @@ -3096,28 +3098,32 @@ build_constant_desc (tree exp) ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno); /* Construct the VAR_DECL associated with the constant. */ - decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label), - TREE_TYPE (exp)); - DECL_ARTIFICIAL (decl) = 1; - DECL_IGNORED_P (decl) = 1; - TREE_READONLY (decl) = 1; - TREE_STATIC (decl) = 1; - TREE_ADDRESSABLE (decl) = 1; - /* We don't set the RTL yet as this would cause varpool to assume that the - variable is referenced. Moreover, it would just be dropped in LTO mode. - Instead we set the flag that will be recognized in make_decl_rtl. */ - DECL_IN_CONSTANT_POOL (decl) = 1; - DECL_INITIAL (decl) = desc->value; - /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most - architectures so use DATA_ALIGNMENT as well, except for strings. */ - if (TREE_CODE (exp) == STRING_CST) - { + if (decl == NULL_TREE) + { + decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label), + TREE_TYPE (exp)); + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; + TREE_READONLY (decl) = 1; + TREE_STATIC (decl) = 1; + TREE_ADDRESSABLE (decl) = 1; + /* We don't set the RTL yet as this would cause varpool to assume that + the variable is referenced. Moreover, it would just be dropped in + LTO mode. Instead we set the flag that will be recognized in + make_decl_rtl. */ + DECL_IN_CONSTANT_POOL (decl) = 1; + DECL_INITIAL (decl) = desc->value; + /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most + architectures so use DATA_ALIGNMENT as well, except for strings. */ + if (TREE_CODE (exp) == STRING_CST) + { #ifdef CONSTANT_ALIGNMENT - DECL_ALIGN (decl) = CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl)); + DECL_ALIGN (decl) = CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl)); #endif + } + else + align_variable (decl, 0); } - else - align_variable (decl, 0); /* Now construct the SYMBOL_REF and the MEM. */ if (use_object_blocks_p ()) @@ -3154,7 +3160,7 @@ build_constant_desc (tree exp) } /* Return an rtx representing a reference to constant data in memory - for the constant expression EXP. + for the constant expression EXP with the associated DECL. If assembler code for such a constant has already been output, return an rtx to refer to it. @@ -3166,8 +3172,8 @@ build_constant_desc (tree exp) `const_desc_table' records which constants already have label strings. */ -rtx -output_constant_def (tree exp, int defer) +static rtx +output_constant_def_1 (tree exp, tree decl, int defer) { struct constant_descriptor_tree *desc; struct constant_descriptor_tree key; @@ -3182,7 +3188,7 @@ output_constant_def (tree exp, int defer) desc = (struct constant_descriptor_tree *) *loc; if (desc == 0) { - desc = build_constant_desc (exp); + desc = build_constant_desc (exp, decl); desc->hash = key.hash; *loc = desc; } @@ -3191,6 +3197,15 @@ output_constant_def (tree exp, int defer) return desc->rtl; } +/* Like output_constant_def but create a new decl representing the + constant if necessary. */ + +rtx +output_constant_def (tree exp, int defer) +{ + return output_constant_def_1 (exp, NULL_TREE, defer); +} + /* Subroutine of output_constant_def: Decide whether or not we need to output the constant DESC now, and if so, do it. */ static void @@ -3327,7 +3342,7 @@ tree_output_constant_def (tree exp) desc = (struct constant_descriptor_tree *) *loc; if (desc == 0) { - desc = build_constant_desc (exp); + desc = build_constant_desc (exp, NULL_TREE); desc->hash = key.hash; *loc = desc; }