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

Reply via email to