summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-18 21:01:03 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-18 21:01:03 +0000
commit807bf718af49820cca054a70a54f2db06d10d9f0 (patch)
tree0f64524f372d342649161f19523537146008f861
parentef758b613a85c63f1343c8ff36036c2656d96e25 (diff)
downloadgcc-807bf718af49820cca054a70a54f2db06d10d9f0.tar.gz
PR target/39179
* tree-ssa-ccp.c (get_symbol_constant_value): Don't assume zero value if DECL_EXTERNAL. * tree-sra.c (sra_walk_gimple_assign): Likewise. * target.h (gcc_target::binds_local_p): Clarify module. * tree.h (TREE_PUBLIC): Clarify module. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144270 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cfns.h4
-rw-r--r--gcc/cp/ptree.c21
-rw-r--r--gcc/target.h2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/const7.C2
-rw-r--r--gcc/testsuite/g++.dg/opt/const6.C14
-rw-r--r--gcc/tree-pretty-print.c6
-rw-r--r--gcc/tree-sra.c1
-rw-r--r--gcc/tree-ssa-ccp.c3
-rw-r--r--gcc/tree.h4
-rw-r--r--gcc/varasm.c10
13 files changed, 69 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ac325e02264..8f44f45a292 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2009-02-18 Jason Merrill <jason@redhat.com>
+
+ PR target/39179
+ * tree-ssa-ccp.c (get_symbol_constant_value): Don't assume zero
+ value if DECL_EXTERNAL.
+ * tree-sra.c (sra_walk_gimple_assign): Likewise.
+ * target.h (gcc_target::binds_local_p): Clarify "module".
+ * tree.h (TREE_PUBLIC): Clarify "module".
+
2009-02-17 Xuepeng Guo <xuepeng.guo@intel.com>
PR target/38891
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d9d6866e3ad..3ca03d37a3a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@
+2009-02-18 Jason Merrill <jason@redhat.com>
+
+ * cfns.h: Tweak pathname for cfns.gperf.
+
2009-02-13 Jason Merrill <jason@redhat.com>
PR c++/39070
diff --git a/gcc/cp/cfns.h b/gcc/cp/cfns.h
index 82cdef76466..e6d43d8acfb 100644
--- a/gcc/cp/cfns.h
+++ b/gcc/cp/cfns.h
@@ -1,5 +1,5 @@
/* ANSI-C code produced by gperf version 3.0.1 */
-/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C ../../gcc/gcc/cp/cfns.gperf */
+/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C ../../gcc/cp/cfns.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
@@ -28,7 +28,7 @@
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif
-#line 1 "../../gcc/gcc/cp/cfns.gperf"
+#line 1 "../../gcc/cp/cfns.gperf"
#ifdef __GNUC__
__inline
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index c91cb15dc74..2452abc4622 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -44,7 +44,23 @@ cxx_print_decl (FILE *file, tree node, int indent)
if (!CODE_CONTAINS_STRUCT (TREE_CODE (node), TS_DECL_COMMON)
|| !DECL_LANG_SPECIFIC (node))
return;
+ if (TREE_CODE (node) == FUNCTION_DECL)
+ {
+ int flags = TFF_DECL_SPECIFIERS|TFF_RETURN_TYPE
+ |TFF_FUNCTION_DEFAULT_ARGUMENTS|TFF_EXCEPTION_SPECIFICATION ;
+ indent_to (file, indent + 3);
+ fprintf (file, " full-name \"%s\"", decl_as_string (node, flags));
+ }
+ else if (TREE_CODE (node) == TEMPLATE_DECL)
+ {
+ indent_to (file, indent + 3);
+ fprintf (file, " full-name \"%s\"",
+ decl_as_string (node, TFF_TEMPLATE_HEADER));
+ }
+
indent_to (file, indent + 3);
+ if (DECL_EXTERNAL (node) && DECL_NOT_REALLY_EXTERN (node))
+ fprintf (file, " not-really-extern");
if (TREE_CODE (node) == FUNCTION_DECL
&& DECL_PENDING_INLINE_INFO (node))
fprintf (file, " pending-inline-info %p",
@@ -81,6 +97,9 @@ cxx_print_type (FILE *file, tree node, int indent)
case RECORD_TYPE:
case UNION_TYPE:
+ indent_to (file, indent + 4);
+ fprintf (file, "full-name \"%s\"",
+ type_as_string (node, TFF_CLASS_KEY_OR_ENUM));
break;
default:
@@ -97,7 +116,7 @@ cxx_print_type (FILE *file, tree node, int indent)
indent_to (file, indent + 3);
if (TYPE_NEEDS_CONSTRUCTING (node))
- fputs ( "needs-constructor", file);
+ fputs ( " needs-constructor", file);
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (node))
fputs (" needs-destructor", file);
if (TYPE_HAS_DEFAULT_CONSTRUCTOR (node))
diff --git a/gcc/target.h b/gcc/target.h
index 21c46adbbe2..10aaf4c171c 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -626,7 +626,7 @@ struct gcc_target
bool (* in_small_data_p) (const_tree);
/* True if EXP names an object for which name resolution must resolve
- to the current module. */
+ to the current executable or shared library. */
bool (* binds_local_p) (const_tree);
/* Modify and return the identifier of a DECL's external name,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 60b17cda832..f052878791f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-02-18 Jason Merrill <jason@redhat.com>
+
+ PR target/39179
+ * g++.dg/opt/const6.C: New test.
+
2009-02-18 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/callabi/callabi.exp: Moved to ...
diff --git a/gcc/testsuite/g++.dg/init/const7.C b/gcc/testsuite/g++.dg/init/const7.C
index 348bd58d690..18d04625db2 100644
--- a/gcc/testsuite/g++.dg/init/const7.C
+++ b/gcc/testsuite/g++.dg/init/const7.C
@@ -9,5 +9,5 @@ short offsets[1] = {
// This ensures that we get a dump whether or not the bug is present.
void fn() { }
-// { dg-final { scan-tree-dump-not "initialization" "gimple" { xfail *-*-* } } }
+// { dg-final { scan-tree-dump-not "initialization" "gimple" } }
// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc/testsuite/g++.dg/opt/const6.C b/gcc/testsuite/g++.dg/opt/const6.C
new file mode 100644
index 00000000000..1a5c79bb173
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/const6.C
@@ -0,0 +1,14 @@
+// PR target/39179
+// Make sure that we don't optimize away the load from K::k.
+// { dg-options "-O2" }
+// { dg-final { scan-assembler _ZN1K1kE } }
+
+struct K {
+ static const unsigned k;
+};
+extern "C" void abort (void);
+int main() {
+ if ( K::k != 1 )
+ abort ();
+ return 1;
+}
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index ff45ecc635d..e01433b142d 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -2585,18 +2585,20 @@ print_call_name (pretty_printer *buffer, const_tree node)
if (TREE_CODE (op0) == NON_LVALUE_EXPR)
op0 = TREE_OPERAND (op0, 0);
+ again:
switch (TREE_CODE (op0))
{
case VAR_DECL:
case PARM_DECL:
+ case FUNCTION_DECL:
dump_function_name (buffer, op0);
break;
case ADDR_EXPR:
case INDIRECT_REF:
case NOP_EXPR:
- dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
- break;
+ op0 = TREE_OPERAND (op0, 0);
+ goto again;
case COND_EXPR:
pp_string (buffer, "(");
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 01c0e121e00..abcca2b93f8 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1008,6 +1008,7 @@ sra_walk_gimple_assign (gimple stmt, gimple_stmt_iterator *gsi,
we'd been passed the constructor directly. Invoke INIT. */
else if (TREE_CODE (rhs) == VAR_DECL
&& TREE_STATIC (rhs)
+ && !DECL_EXTERNAL (rhs)
&& TREE_READONLY (rhs)
&& targetm.binds_local_p (rhs))
fns->init (lhs_elt, DECL_INITIAL (rhs), gsi);
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index ef6890c65c3..46272659b65 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -287,10 +287,11 @@ get_symbol_constant_value (tree sym)
have zero as the initializer if they may not be
overridden at link or run time. */
if (!val
+ && !DECL_EXTERNAL (sym)
&& targetm.binds_local_p (sym)
&& (INTEGRAL_TYPE_P (TREE_TYPE (sym))
|| SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym))))
- return fold_convert (TREE_TYPE (sym), integer_zero_node);
+ return fold_convert (TREE_TYPE (sym), integer_zero_node);
}
return NULL_TREE;
diff --git a/gcc/tree.h b/gcc/tree.h
index b7300fa8b87..29d3782119a 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1195,9 +1195,9 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
(CONSTANT_CLASS_P (EXPR) && TREE_OVERFLOW (EXPR))
/* In a VAR_DECL, FUNCTION_DECL, NAMESPACE_DECL or TYPE_DECL,
- nonzero means name is to be accessible from outside this module.
+ nonzero means name is to be accessible from outside this translation unit.
In an IDENTIFIER_NODE, nonzero means an external declaration
- accessible from outside this module was previously seen
+ accessible from outside this translation unit was previously seen
for this name in an inner scope. */
#define TREE_PUBLIC(NODE) ((NODE)->base.public_flag)
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 7fed3009b84..083cf093f25 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4316,12 +4316,10 @@ initializer_constant_valid_p (tree value, tree endtype)
}
/* Support narrowing pointer differences. */
- if (TREE_CODE (value) == POINTER_PLUS_EXPR)
- {
- ret = narrowing_initializer_constant_valid_p (value, endtype);
- if (ret != NULL_TREE)
- return ret;
- }
+ ret = narrowing_initializer_constant_valid_p (value, endtype);
+ if (ret != NULL_TREE)
+ return ret;
+
break;
case MINUS_EXPR: