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