This new patch is much better. Thank you very much.

2011/9/21 Stephen Clarke <stephen.cla...@st.com>

> Yes, you are correct.
> Sorry for the mistake,
> Steve.
>
> Wu Yongchong wrote:
> > in the file wgen-diffs-2.txt line 62 and line 71
> > -         Maybe_Emit_Cleanup (j, TRUE);
> > +         Maybe_Handler_Emit_Cleanup (j);
> >
> > you replay Maybe_Emit_Cleanup with Maybe_Handler_Emit_Cleanup. Should
> > it be Maybe_Emit_Handler_cleanup ?
> >
> >
> > On Fri, Sep 9, 2011 at 6:08 PM, Stephen Clarke <stephen.cla...@st.com>
> wrote:
> >> We have also made a fix for this problem in ST.  The idea of the fix is
> >> exactly the same, but some implementation details are different.  I
> >> reported it to Wu Yongchong, who suggested I submit it for general
> >> review and approval.
> >>
> >> Apologies: I am reporting a patch which I have only validated in the
> context
> >> of ST's sources, which have quite some modifications compared to the
> >> open64.net sources.
> >>
> >> Basic fix (wgen-diffs-1.txt):  We added a new function
> >> Maybe_Emit_Cleanups(), which does the work of maintaining the
> >> scope_cleanup_stack and emitting the cleanup.  This function avoids
> >> duplicate code in WGEN_Expand_Goto and WGEN_Expand_Return.  Also we used
> an
> >> STL stack to save the scope info information, rather than defining a new
> >> type.
> >>
> >> We made another change at the same time (wgen-diffs-2.txt): since the
> only
> >> remaining calls to Maybe_Emit_Cleanup() are made when generating
> handlers,
> >> the from_handler parameter is no longer required, so we
> >> removed it and renamed the function.
> >>
> >> Regards,
> >> Steve.
> >>
> >> Wu Yongchong wrote:
> >>> Hi, all
> >>> Can a gatekeeper help review this patch
> >>>
> >>> It is fix of open64.net bug 828.
> >>>
> >>> The change of version 3360 is introduced to resolve the issue about
> >>> cleanup code of GOTO to outer block and RETURN statements. It
> >>> manipulate the scope-cleanup-stack, so that cleanup code of each
> >>> cleanup would only contain cleanups not finished yet.
> >>>
> >>> The issue of this patch is that the cleanup code generation process
> >>> may push and pop some items on the scope-clean-up stack, so that the
> >>> elements beyond the top of stack would be destroyed. To avoid this
> >>> issue, the new change save and restore these elements on the stack.
> >>>
> >>>
> >>>
> >>
> >> --- wgen_stmt.cxx.orig  2011-09-07 16:36:30.378726000 +0100
> >> +++ wgen_stmt.cxx.1     2011-09-07 16:53:56.868216000 +0100
> >> @@ -354,6 +354,43 @@
> >>   }
> >>  }
> >>
> >> +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.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 +2170,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
> >> @@ -2293,20 +2321,8 @@
> >>     }
> >>  #endif
> >>
> >> -    int i = scope_cleanup_i;
> >> -    int scope_cleanup_i_save = scope_cleanup_i;
> >> -    while (i != -1) {
> >> -#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;
> >> -    }
> >> +    Maybe_Emit_Cleanups (NULL);
> >>  #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"));
> >> @@ -2402,20 +2418,8 @@
> >>     }
> >>  #endif
> >>
> >> -    int i = scope_cleanup_i;
> >> -    int scope_cleanup_i_save = scope_cleanup_i;
> >> -    while (i != -1) {
> >> -#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;
> >> -    }
> >> +    Maybe_Emit_Cleanups (NULL);
> >>  #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"));
> >>
> >> --- wgen_stmt.cxx.1     2011-09-07 16:53:56.868216000 +0100
> >> +++ wgen_stmt.cxx.2     2011-09-07 17:04:36.141813000 +0100
> >> @@ -324,34 +324,22 @@
> >>  }
> >>
> >>  // 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;
> >> -    if (gs_tree_code(stmt) == GS_CLEANUP_STMT &&
> >> -        !scope_cleanup_stack[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));
> >> -  }
> >> -  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));
> >> -  }
> >> +  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
> >> @@ -2195,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;
> >>     }
> >>   }
> >> @@ -2328,7 +2316,7 @@
> >>        FmtAssert (hi.scope, ("NULL scope"));
> >>        int j = hi.scope->size()-1;
> >>        while (j != -1) {
> >> -           Maybe_Emit_Cleanup (j, TRUE);
> >> +           Maybe_Handler_Emit_Cleanup (j);
> >>            --j;
> >>        }
> >>     }
> >> @@ -2425,7 +2413,7 @@
> >>        FmtAssert (hi.scope, ("NULL scope"));
> >>        int j = hi.scope->size()-1;
> >>        while (j != -1) {
> >> -           Maybe_Emit_Cleanup (j, TRUE);
> >> +           Maybe_Handler_Emit_Cleanup (j);
> >>            --j;
> >>        }
> >>     }
> >>
> >>
> >
> >
> >
>
>
>
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense.
> http://p.sf.net/sfu/splunk-d2dcopy1
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>



-- 
Regards,
Lai Jian-Xin
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to