aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOllie Wild <aaw@google.com>2007-09-29 03:47:05 +0000
committerOllie Wild <aaw@google.com>2007-09-29 03:47:05 +0000
commit5b0db0e926e48bea12657c95302dcadd8d957654 (patch)
tree117f5e7112f351b5d67c496778a7e3a085dcdc1b /gcc
parent7fe743b55b546675c12d325acea338a52c7c4c9b (diff)
Revert
2007-09-27 Ollie Wild <aaw@google.com> gcc/ * varasm.c (compare_constant): Removed call to lang_hooks.expand_constant. (copy_constants): Removed call to lang_hooks.expand_constant. (compute_reloc_for_constant): Removed call to lang_hooks.expand_constant. (output_addressed_constants): Removed call to lang_hooks.expand_constant. (constructor_static_from_elts_p): Removed call to lang_hooks.expand_constant. (output_constant): Removed calls to lang_hooks.expand_constant. * langhooks.h (struct lang_hooks): Removed field expand_constant. * langhooks-def.h (lhd_return_tree): Removed. (LANG_HOOKS_EXPAND_CONSTANT): Removed. (LANG_HOOKS_INITIALIZER): Removed LANG_HOOKS_EXPAND_CONSTANT. * langhooks.c (lhd_return_tree): Removed. gcc/cp/ * typeck2.c (digest_init): Call cplus_expand_constant after convert_for_initialization. * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed. * expr.c (cplus_expand_constant): Updated function description. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@128881 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog21
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-objcp-common.h2
-rw-r--r--gcc/cp/expr.c3
-rw-r--r--gcc/cp/typeck2.c19
-rw-r--r--gcc/langhooks-def.h3
-rw-r--r--gcc/langhooks.c8
-rw-r--r--gcc/langhooks.h5
-rw-r--r--gcc/varasm.c37
9 files changed, 88 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70ddb711051..ce12f805c0c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,24 @@
+2007-09-28 Ollie Wild <aaw@google.com>
+
+ Revert
+ 2007-09-27 Ollie Wild <aaw@google.com>
+
+ * varasm.c (compare_constant): Removed call to
+ lang_hooks.expand_constant.
+ (copy_constants): Removed call to lang_hooks.expand_constant.
+ (compute_reloc_for_constant): Removed call to
+ lang_hooks.expand_constant.
+ (output_addressed_constants): Removed call to
+ lang_hooks.expand_constant.
+ (constructor_static_from_elts_p): Removed call to
+ lang_hooks.expand_constant.
+ (output_constant): Removed calls to lang_hooks.expand_constant.
+ * langhooks.h (struct lang_hooks): Removed field expand_constant.
+ * langhooks-def.h (lhd_return_tree): Removed.
+ (LANG_HOOKS_EXPAND_CONSTANT): Removed.
+ (LANG_HOOKS_INITIALIZER): Removed LANG_HOOKS_EXPAND_CONSTANT.
+ * langhooks.c (lhd_return_tree): Removed.
+
2007-09-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR target/33347
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 44a4d901aa7..5827a57964e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2007-09-28 Ollie Wild <aaw@google.com>
+
+ Revert
+ 2007-09-27 Ollie Wild <aaw@google.com>
+
+ * typeck2.c (digest_init): Call cplus_expand_constant after
+ convert_for_initialization.
+ * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed.
+ * expr.c (cplus_expand_constant): Updated function description.
+
2007-09-28 Jason Merrill <jason@redhat.com>
PR c++/10179
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 60d78181ad1..7f8138c6e60 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -50,6 +50,8 @@ extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t,
#define LANG_HOOKS_POST_OPTIONS c_common_post_options
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set
+#undef LANG_HOOKS_EXPAND_CONSTANT
+#define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant
#undef LANG_HOOKS_EXPAND_EXPR
#define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr
#undef LANG_HOOKS_EXPAND_DECL
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index b5186462e5e..267b847770e 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -33,7 +33,8 @@ along with GCC; see the file COPYING3. If not see
#include "except.h"
#include "tm_p.h"
-/* Expand C++-specific constants. Currently, this means PTRMEM_CST. */
+/* Hook used by output_constant to expand language-specific
+ constants. */
tree
cplus_expand_constant (tree cst)
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index adbe9de7541..53e22023f27 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -703,23 +703,8 @@ digest_init (tree type, tree init)
/* Handle scalar types (including conversions) and references. */
if (TREE_CODE (type) != COMPLEX_TYPE
&& (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE))
- {
- tree *exp;
-
- init = convert_for_initialization (0, type, init, LOOKUP_NORMAL,
- "initialization", NULL_TREE, 0);
- exp = &init;
-
- /* Skip any conversions since we'll be outputting the underlying
- constant. */
- while (TREE_CODE (*exp) == NOP_EXPR || TREE_CODE (*exp) == CONVERT_EXPR
- || TREE_CODE (*exp) == NON_LVALUE_EXPR)
- exp = &TREE_OPERAND (*exp, 0);
-
- *exp = cplus_expand_constant (*exp);
-
- return init;
- }
+ return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
+ "initialization", NULL_TREE, 0);
/* Come here only for aggregates: records, arrays, unions, complex numbers
and vectors. */
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index e0bfb67a305..6eca2f0497f 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -41,6 +41,7 @@ extern void lhd_do_nothing_i (int);
extern void lhd_do_nothing_f (struct function *);
extern bool lhd_post_options (const char **);
extern alias_set_type lhd_get_alias_set (tree);
+extern tree lhd_return_tree (tree);
extern tree lhd_return_null_tree_v (void);
extern tree lhd_return_null_tree (tree);
extern tree lhd_return_null_const_tree (const_tree);
@@ -92,6 +93,7 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
#define LANG_HOOKS_MISSING_ARGUMENT hook_bool_constcharptr_size_t_false
#define LANG_HOOKS_POST_OPTIONS lhd_post_options
#define LANG_HOOKS_GET_ALIAS_SET lhd_get_alias_set
+#define LANG_HOOKS_EXPAND_CONSTANT lhd_return_tree
#define LANG_HOOKS_EXPAND_EXPR lhd_expand_expr
#define LANG_HOOKS_EXPAND_DECL lhd_expand_decl
#define LANG_HOOKS_FINISH_INCOMPLETE_DECL lhd_do_nothing_t
@@ -248,6 +250,7 @@ extern tree lhd_make_node (enum tree_code);
LANG_HOOKS_PARSE_FILE, \
LANG_HOOKS_CLEAR_BINDING_STACK, \
LANG_HOOKS_GET_ALIAS_SET, \
+ LANG_HOOKS_EXPAND_CONSTANT, \
LANG_HOOKS_EXPAND_EXPR, \
LANG_HOOKS_EXPAND_DECL, \
LANG_HOOKS_FINISH_INCOMPLETE_DECL, \
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 6a9a74dc70c..4682514508d 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -76,6 +76,14 @@ lhd_do_nothing_f (struct function * ARG_UNUSED (f))
{
}
+/* Do nothing (return the tree node passed). */
+
+tree
+lhd_return_tree (tree t)
+{
+ return t;
+}
+
/* Do nothing (return NULL_TREE). */
tree
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 0efb13956d3..8a442753b1f 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -287,6 +287,11 @@ struct lang_hooks
Returns -1 if the language does nothing special for it. */
alias_set_type (*get_alias_set) (tree);
+ /* Called with an expression that is to be processed as a constant.
+ Returns either the same expression or a language-independent
+ constant equivalent to its input. */
+ tree (*expand_constant) (tree);
+
/* Called by expand_expr for language-specific tree codes.
Fourth argument is actually an enum expand_modifier. */
rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index e85824577f6..9dece23fefe 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2985,7 +2985,15 @@ compare_constant (const tree t1, const tree t2)
return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
default:
- return 0;
+ {
+ tree nt1, nt2;
+ nt1 = lang_hooks.expand_constant (t1);
+ nt2 = lang_hooks.expand_constant (t2);
+ if (nt1 != t1 || nt2 != t2)
+ return compare_constant (nt1, nt2);
+ else
+ return 0;
+ }
}
gcc_unreachable ();
@@ -3053,7 +3061,12 @@ copy_constant (tree exp)
}
default:
- gcc_unreachable ();
+ {
+ tree t = lang_hooks.expand_constant (exp);
+
+ gcc_assert (t != exp);
+ return copy_constant (t);
+ }
}
}
@@ -3897,6 +3910,10 @@ compute_reloc_for_constant (tree exp)
int reloc = 0, reloc2;
tree tem;
+ /* Give the front-end a chance to convert VALUE to something that
+ looks more like a constant to the back-end. */
+ exp = lang_hooks.expand_constant (exp);
+
switch (TREE_CODE (exp))
{
case ADDR_EXPR:
@@ -3961,6 +3978,10 @@ output_addressed_constants (tree exp)
{
tree tem;
+ /* Give the front-end a chance to convert VALUE to something that
+ looks more like a constant to the back-end. */
+ exp = lang_hooks.expand_constant (exp);
+
switch (TREE_CODE (exp))
{
case ADDR_EXPR:
@@ -4034,6 +4055,10 @@ constructor_static_from_elts_p (const_tree ctor)
tree
initializer_constant_valid_p (tree value, tree endtype)
{
+ /* Give the front-end a chance to convert VALUE to something that
+ looks more like a constant to the back-end. */
+ value = lang_hooks.expand_constant (value);
+
switch (TREE_CODE (value))
{
case CONSTRUCTOR:
@@ -4292,6 +4317,11 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
enum tree_code code;
unsigned HOST_WIDE_INT thissize;
+ /* Some front-ends use constants other than the standard language-independent
+ varieties, but which may still be output directly. Give the front-end a
+ chance to convert EXP to a language-independent representation. */
+ exp = lang_hooks.expand_constant (exp);
+
if (size == 0 || flag_syntax_only)
return;
@@ -4348,6 +4378,9 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
code = TREE_CODE (TREE_TYPE (exp));
thissize = int_size_in_bytes (TREE_TYPE (exp));
+ /* Give the front end another chance to expand constants. */
+ exp = lang_hooks.expand_constant (exp);
+
/* Allow a constructor with no elements for any data type.
This means to fill the space with zeros. */
if (TREE_CODE (exp) == CONSTRUCTOR