aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-07-08 13:39:17 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-07-08 13:39:17 -0400
commit34bec556064f1adec8668f12cda40040c9873fef (patch)
tree4bdf9760b14ac8c0062d311b24cf3e16f4011dd6 /gcc/cp
parent3e4f84847dbc75ef3337d1e3e5dc2b9fe1495035 (diff)
downloadgcc-34bec556064f1adec8668f12cda40040c9873fef.zip
gcc-34bec556064f1adec8668f12cda40040c9873fef.tar.gz
gcc-34bec556064f1adec8668f12cda40040c9873fef.tar.bz2
re PR c++/45603 (crash in "build_addr_func")
PR c++/45603 * decl.c (expand_static_init): Don't get confused by user declaration of __cxa_guard_acquire. From-SVN: r176054
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl.c41
2 files changed, 25 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 092e5c0..41157a1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2011-07-08 Jason Merrill <jason@redhat.com>
+ PR c++/45603
+ * decl.c (expand_static_init): Don't get confused by user
+ declaration of __cxa_guard_acquire.
+
* typeck.c (cp_apply_type_quals_to_decl): Don't check
COMPLETE_TYPE_P either.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e36739b..266d049 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6646,7 +6646,6 @@ expand_static_init (tree decl, tree init)
tree if_stmt = NULL_TREE, inner_if_stmt = NULL_TREE;
tree then_clause = NULL_TREE, inner_then_clause = NULL_TREE;
tree guard, guard_addr;
- tree acquire_fn, release_fn, abort_fn;
tree flag, begin;
/* Emit code to perform this initialization but once. This code
@@ -6696,29 +6695,31 @@ expand_static_init (tree decl, tree init)
if (flag_threadsafe_statics)
{
+ tree vfntype = NULL_TREE;
+ tree acquire_name, release_name, abort_name;
+ tree acquire_fn, release_fn, abort_fn;
guard_addr = build_address (guard);
- acquire_fn = get_identifier ("__cxa_guard_acquire");
- release_fn = get_identifier ("__cxa_guard_release");
- abort_fn = get_identifier ("__cxa_guard_abort");
- if (!get_global_value_if_present (acquire_fn, &acquire_fn))
- {
- tree vfntype = build_function_type_list (void_type_node,
- TREE_TYPE (guard_addr),
- NULL_TREE);
- acquire_fn = push_library_fn
- (acquire_fn, build_function_type_list (integer_type_node,
+ acquire_name = get_identifier ("__cxa_guard_acquire");
+ release_name = get_identifier ("__cxa_guard_release");
+ abort_name = get_identifier ("__cxa_guard_abort");
+ acquire_fn = identifier_global_value (acquire_name);
+ release_fn = identifier_global_value (release_name);
+ abort_fn = identifier_global_value (abort_name);
+ if (!acquire_fn)
+ acquire_fn = push_library_fn
+ (acquire_name, build_function_type_list (integer_type_node,
TREE_TYPE (guard_addr),
NULL_TREE),
- NULL_TREE);
- release_fn = push_library_fn (release_fn, vfntype, NULL_TREE);
- abort_fn = push_library_fn (abort_fn, vfntype, NULL_TREE);
- }
- else
- {
- release_fn = identifier_global_value (release_fn);
- abort_fn = identifier_global_value (abort_fn);
- }
+ NULL_TREE);
+ if (!release_fn || !abort_fn)
+ vfntype = build_function_type_list (void_type_node,
+ TREE_TYPE (guard_addr),
+ NULL_TREE);
+ if (!release_fn)
+ release_fn = push_library_fn (release_name, vfntype, NULL_TREE);
+ if (!abort_fn)
+ abort_fn = push_library_fn (abort_name, vfntype, NULL_TREE);
inner_if_stmt = begin_if_stmt ();
finish_if_stmt_cond (build_call_n (acquire_fn, 1, guard_addr),