From 5fd893d507445801b27c0ebb36b4b802b4df86af Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 30 Apr 2001 22:20:03 +0000 Subject: [PATCH] decl2.c (start_static_initialization_or_destruction): Correct logic to handle the -fno-use-cxa-atexit case. * decl2.c (start_static_initialization_or_destruction): Correct logic to handle the -fno-use-cxa-atexit case. From-SVN: r41697 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl2.c | 17 ++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b3e4d39e8dc..57d2a4a446b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +Mon Apr 30 16:14:10 2001 Mark P Mitchell + + * decl2.c (start_static_initialization_or_destruction): Correct + logic to handle the -fno-use-cxa-atexit case. + 2001-04-30 Mark Mitchell * optimize.c (update_cloned_parm): New function. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 9bbfe3db2bb..8cfc9da4d2c 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -3206,10 +3206,13 @@ start_static_initialization_or_destruction (decl, initp) my_friendly_assert (initp, 20000629); guard_cond = get_guard_cond (guard); } - /* Under the old ABI, e do initializations only if the GUARD is - zero, i.e., if we are the first to initialize the variable. - We do destructions only if the GUARD is one, i.e., if we are - the last to destroy the variable. */ + /* If we don't have __cxa_atexit, then we will be running + destructors from .fini sections, or their equivalents. So, + we need to know how many times we've tried to initialize this + object. We do initializations only if the GUARD is zero, + i.e., if we are the first to initialize the variable. We do + destructions only if the GUARD is one, i.e., if we are the + last to destroy the variable. */ else if (initp) guard_cond = cp_build_binary_op (EQ_EXPR, @@ -3230,9 +3233,9 @@ start_static_initialization_or_destruction (decl, initp) finish_if_stmt_cond (cond, guard_if_stmt); - /* Under the new ABI, we have not already set the GUARD, so we must - do so now. */ - if (guard && initp) + /* If we're using __cxa_atexit, we have not already set the GUARD, + so we must do so now. */ + if (guard && initp && flag_use_cxa_atexit) finish_expr_stmt (set_guard (guard)); return guard_if_stmt;