From 34bec556064f1adec8668f12cda40040c9873fef Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 8 Jul 2011 13:39:17 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 +++ gcc/cp/decl.c | 41 ++++++++++++++++--------------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/abi/guard3.C | 14 +++++++++++ 4 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/guard3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 092e5c01043..41157a1de83 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-07-08 Jason Merrill + 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 e36739b38d6..266d0492ed9 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), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b2ba49aea53..21e6d8d84b1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-08 Jason Merrill + + PR c++/45603 + * g++.dg/abi/guard3.C: New. + 2011-07-08 Julian Brown * lib/target-supports.exp diff --git a/gcc/testsuite/g++.dg/abi/guard3.C b/gcc/testsuite/g++.dg/abi/guard3.C new file mode 100644 index 00000000000..fd9d00e2796 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/guard3.C @@ -0,0 +1,14 @@ +// PR c++/45603 + +extern "C" int __cxa_guard_acquire(); + +struct A +{ + ~A(); +}; + +A* f() +{ + static A a; + return &a; +} -- 2.30.2