Hi Christopher, Thanks for your checkin of this patch.
The checkin comments do not contain the name of the gatekeeper who reviewed this change. Please provide that. Also add a comment about the origin of this change, since you made the checkin but the author is shown as "Steven Clarke". - Suneel On Sat, Sep 24, 2011 at 2:30 AM, <s...@open64.net> wrote: > Author: codestr0m > Date: 2011-09-24 05:30:58 -0400 (Sat, 24 Sep 2011) > New Revision: 3745 > > Modified: > trunk/osprey/wgen/wgen_stmt.cxx > Log: > Bug 828 - Output faiulre in g++ regression suite in SVN3663 , Author: > Stephen Clarke <stephen.cla...@st.com> > > Modified: trunk/osprey/wgen/wgen_stmt.cxx > =================================================================== > --- trunk/osprey/wgen/wgen_stmt.cxx 2011-09-23 14:12:51 UTC (rev 3744) > +++ trunk/osprey/wgen/wgen_stmt.cxx 2011-09-24 09:30:58 UTC (rev 3745) > @@ -324,36 +324,61 @@ > } > > // May be emit cleanup in I-th entry of stack depending on the statement > -// in the entry. FROM_HANDLER determines which stack to use. This function > +// in the entry. Called when we are emitting a handler. This function > // is called when the decision whether to emit a cleanup and how to emit it > // depends on the type of statement. > // Wgen TODO: This function probably needs to be called from a few other > // places also, they will be added as the need arises. > static inline void > -Maybe_Emit_Cleanup(INT i, BOOL from_handler) > +Maybe_Emit_Handler_Cleanup(INT i) > { > - if (!from_handler) > - { > - gs_t stmt = scope_cleanup_stack [i].stmt; > + HANDLER_INFO hi = handler_stack.top(); > + gs_t stmt = (*hi.scope) [i].stmt; > + > + if (gs_tree_code(stmt) == GS_CLEANUP_STMT && > + !(*hi.scope) [i].cleanup_eh_only) > + WGEN_One_Stmt_Cleanup (gs_cleanup_expr(stmt)); > + else if (gs_tree_code(stmt) == GS_TRY_FINALLY_EXPR) > + WGEN_One_Stmt_Cleanup (gs_tree_operand(stmt, 1)); > +} > + > +static INT32 > +Maybe_Emit_Cleanups (gs_t sentinel) > +{ > + // Emit all the cleanups required at a transfer of control out of > + // the current scope, e.g. a goto or return. Note, after this function, > + // we continue in the same scope, so we should not actually pop the > + // cleanups, but for correct processing we must temporarily pop them as we > + // emit them. > + // Therefore, pop them to a temporary stack, then restore them again > + // afterwards. > + INT32 result; > + std::stack<SCOPE_CLEANUP_INFO> saved_cleanups; > + > + while (scope_cleanup_i >= 0 && > + scope_cleanup_stack[scope_cleanup_i].stmt != sentinel) { > + SCOPE_CLEANUP_INFO scope_cleanup = scope_cleanup_stack [scope_cleanup_i]; > + --scope_cleanup_i; > + saved_cleanups.push(scope_cleanup); > + gs_t stmt = scope_cleanup.stmt; > if (gs_tree_code(stmt) == GS_CLEANUP_STMT && > - !scope_cleanup_stack[i].cleanup_eh_only) > + !scope_cleanup.cleanup_eh_only) > WGEN_One_Stmt_Cleanup (gs_cleanup_expr(stmt)); > else if (gs_tree_code(stmt) == GS_TRY_FINALLY_EXPR) > WGEN_One_Stmt_Cleanup (gs_tree_operand(stmt, 1)); > } > - else > - { > - HANDLER_INFO hi = handler_stack.top(); > - gs_t stmt = (*hi.scope) [i].stmt; > > - if (gs_tree_code(stmt) == GS_CLEANUP_STMT && > - !(*hi.scope) [i].cleanup_eh_only) > - WGEN_One_Stmt_Cleanup (gs_cleanup_expr(stmt)); > - else if (gs_tree_code(stmt) == GS_TRY_FINALLY_EXPR) > - WGEN_One_Stmt_Cleanup (gs_tree_operand(stmt, 1)); > + result = scope_cleanup_i; > + > + while (! saved_cleanups.empty ()) { > + scope_cleanup_stack[++scope_cleanup_i] = saved_cleanups.top (); > + saved_cleanups.pop (); > } > + > + return result; > } > > + > static void > Emit_Cleanup(gs_t cleanup) > { > @@ -2133,16 +2158,7 @@ > if (*li != *ci) break; > if (ci!=Current_scope_nest.rend()) > { > - int scope_cleanup_i_save = scope_cleanup_i; > - i = scope_cleanup_i; > - Is_True(i != -1, ("WGEN_Expand_Goto: scope_cleanup_stack empty")); > - while ((i >= 0) && (scope_cleanup_stack [i].stmt != *ci)) > - { > - scope_cleanup_i --; > - Maybe_Emit_Cleanup (i, FALSE); > - --i; > - } > - scope_cleanup_i = scope_cleanup_i_save; > + i = Maybe_Emit_Cleanups (*ci); > if (i == -1) > { > #ifdef FE_GNU_4_2_0 > @@ -2167,7 +2183,7 @@ > Is_True(i != -1, ("WGEN_Expand_Goto: scope_cleanup_stack empty inside > handler")); > while ((i >= 0) && ((*hi.scope) [i].stmt != *ci)) > { > - Maybe_Emit_Cleanup (i, TRUE); > + Maybe_Emit_Handler_Cleanup (i); > --i; > } > } > @@ -2293,26 +2309,14 @@ > } > #endif > > - int i = scope_cleanup_i; > - int scope_cleanup_i_save = scope_cleanup_i; > - while (i != -1) { > + Maybe_Emit_Cleanups (NULL); > #ifdef KEY > - scope_cleanup_i--; > - Maybe_Emit_Cleanup (i, FALSE); > -#else > - if (gs_tree_code(scope_cleanup_stack [i].stmt) == GS_CLEANUP_STMT) > - WGEN_One_Stmt_Cleanup (gs_cleanup_expr(scope_cleanup_stack > [i].stmt)); > -#endif > - --i; > - } > -#ifdef KEY > - scope_cleanup_i = scope_cleanup_i_save; > if (emit_exceptions && processing_handler) { > HANDLER_INFO hi = handler_stack.top(); > FmtAssert (hi.scope, ("NULL scope")); > int j = hi.scope->size()-1; > while (j != -1) { > - Maybe_Emit_Cleanup (j, TRUE); > + Maybe_Emit_Handler_Cleanup (j); > --j; > } > } > @@ -2402,26 +2406,14 @@ > } > #endif > > - int i = scope_cleanup_i; > - int scope_cleanup_i_save = scope_cleanup_i; > - while (i != -1) { > + Maybe_Emit_Cleanups (NULL); > #ifdef KEY > - scope_cleanup_i--; > - Maybe_Emit_Cleanup (i, FALSE); > -#else > - if (gs_tree_code(scope_cleanup_stack [i].stmt) == GS_CLEANUP_STMT) > - WGEN_One_Stmt_Cleanup (gs_cleanup_expr(scope_cleanup_stack > [i].stmt)); > -#endif > - --i; > - } > -#ifdef KEY > - scope_cleanup_i = scope_cleanup_i_save; > if (emit_exceptions && processing_handler) { > HANDLER_INFO hi = handler_stack.top(); > FmtAssert (hi.scope, ("NULL scope")); > int j = hi.scope->size()-1; > while (j != -1) { > - Maybe_Emit_Cleanup (j, TRUE); > + Maybe_Emit_Handler_Cleanup (j); > --j; > } > } > > > ------------------------------------------------------------------------------ > All of the data generated in your IT infrastructure is seriously valuable. > Why? It contains a definitive record of application performance, security > threats, fraudulent activity, and more. Splunk takes this data and makes > sense of it. IT sense. And common sense. > http://p.sf.net/sfu/splunk-d2dcopy2 > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > ------------------------------------------------------------------------------ All of the data generated in your IT infrastructure is seriously valuable. Why? It contains a definitive record of application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-d2dcopy2 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel