Author: rscollar
Date: 2011-02-28 11:46:35 -0500 (Mon, 28 Feb 2011)
New Revision: 3497

Modified:
   trunk/osprey/wgen/wgen_expr.cxx
Log:
Fix for 727.

There have been several changes to routine WGEN_Expand_Expr (wgen_expr.cxx)
having to do with gspin trees below GS_INIT_EXPR  nodes (see the comments in
WGEN_Expand_Expr in the GS_MODIFY_EXPR case and the comments for "Bug 11253"
and bug 15210").  These changes (and others) modify the gspin input tree to
make it easier to translate to WHIRL.  This problem occurs in the case where
the gspin tree is:

Original gspin              Modified to
-------------------------------------------------
GS_INIT_EXPR
  GS_COMPONENT_REF (A)
  GS_TARGET_EXPR
    GS_VAR_DECL             -> GS_COMPONENT_REF (A)
    GS_COND_EXPR
      GS_NE_EXPR
      GS_TARGET_EXPR
        GS_VAR_DECL         -> GS_COMPONENT_REF (A)
        <operand 1>
      GS_TARGET_EXP
        GS_VAR_DECL         -> GS_COMPONENT_REF (A)
         <operand 1>

The problem occurs because, in the context of a GS_COND_EXPR, the GS_TARGET_EXP
operand 1 is not expanded so no symbol table entry is built for the expression
value. This results in the dereference of a NULL symbol table entry pointer.
In the original problem report, operand 1 is a GS_CONSTRUCTOR.  Subsequent
testing revealed that the problem occurs for cases when operand 1 something
other than a GS_CONSTRUCTOR.

This change addresses the problem by expanding operand 1.



Modified: trunk/osprey/wgen/wgen_expr.cxx
===================================================================
--- trunk/osprey/wgen/wgen_expr.cxx     2011-02-28 10:13:47 UTC (rev 3496)
+++ trunk/osprey/wgen/wgen_expr.cxx     2011-02-28 16:46:35 UTC (rev 3497)
@@ -5984,90 +5984,84 @@
                              Get_Srcpos());
            }
          }
-          // OSP_397, if opnd 0 of TARGET_EXPR is an COMPONENT_REF
-          else if (gs_tree_code(t) == GS_AGGR_INIT_EXPR && 
-                   gs_tree_code(opnd0) == GS_COMPONENT_REF) {
-            WN *target_wn = WGEN_Address_Of(opnd0);
-            WN *result_wn = WGEN_Expand_Expr (t, TRUE /* for return_in_mem*/, 
-                                              0, 0, 0, 0, FALSE, FALSE, 
target_wn);
-            /* We ignore the result_wn, for safety, place an assertion here */
-            FmtAssert(result_wn == NULL,
-                      ("result_wn should be NULL for the result is passed as 
param."));
-          } else if (gs_tree_code(t) == GS_COMPONENT_REF &&
-                  gs_tree_code(opnd0) == GS_COMPONENT_REF &&
-                  gs_tree_code(gs_tree_operand(opnd0, 0)) == GS_INDIRECT_REF) {
-              /*
-               * match the following kind of tree 
-               * - TARGET_REF
-               * |-0 COMPONENT_REF
-               *   |- 0 INDIRECT_REF
-               *   |- 1 FIELD
-               * |-1 COMPONENT_REF
-               */
-              // generate rhs first
-                         WN *rhs_wn = WGEN_Expand_Expr (t, TRUE /* for 
return_in_mem*/,
-                                         0, 0, 0, 0, FALSE, FALSE, NULL);
+          else if( gs_tree_code(opnd0) == GS_COMPONENT_REF ) {
+            // OSP_397, if opnd 0 of TARGET_EXPR is an COMPONENT_REF
+            if (gs_tree_code(t) == GS_AGGR_INIT_EXPR ) {
+              WN *target_wn = WGEN_Address_Of(opnd0);
+              WN *result_wn = WGEN_Expand_Expr (t, TRUE /* for return_in_mem*/,
+                                                0, 0, 0, 0, FALSE, FALSE, 
target_wn);
+              /* We ignore the result_wn, for safety, place an assertion here 
*/
+              FmtAssert(result_wn == NULL,
+                        ("result_wn should be NULL for the result is passed as 
param."));
+            } else if (gs_tree_code(t) == GS_COMPONENT_REF &&
+                    gs_tree_code(gs_tree_operand(opnd0, 0)) == 
GS_INDIRECT_REF) {
+                /*
+                 * match the following kind of tree 
+                 * - TARGET_REF
+                 * |-0 COMPONENT_REF
+                 *   |- 0 INDIRECT_REF
+                 *   |- 1 FIELD
+                 * |-1 COMPONENT_REF
+                 */
+                // generate rhs first
+                         WN *rhs_wn = WGEN_Expand_Expr (t, TRUE /* for 
return_in_mem*/,
+                                         0, 0, 0, 0, FALSE, FALSE, NULL);
+  
+                gs_t obj_instance = gs_tree_operand(opnd0, 0);
+                gs_t obj_ptr = gs_tree_operand(obj_instance, 0);
+  
+                gs_t member = gs_tree_operand(opnd0, 1);
+                WN_OFFSET ofst = 0;
+                UINT xtra_BE_ofst = 0;
+  
+                TY_IDX obj_ty_idx = 
Get_TY(gs_tree_type(gs_tree_operand(obj_ptr, 0)));
+  
+                ofst = (BITSPERBYTE * 
gs_get_integer_value(gs_decl_field_offset(member)) +
+                        gs_get_integer_value(gs_decl_field_bit_offset(member)))
+                    / BITSPERBYTE;
+  
+  
+                WN *obj_wn = WGEN_Expand_Expr(obj_ptr, TRUE, 0, 0, 0, 0, 
FALSE, FALSE, NULL);
+  
+                TY_IDX hi_ty_idx;
+                if (gs_tree_code(gs_tree_type(opnd0)) == GS_VOID_TYPE)
+                    hi_ty_idx = MTYPE_To_TY(MTYPE_I4); // dummy; for bug 10176 
Comment #4
+                else hi_ty_idx = Get_TY(gs_tree_type(opnd0));
+  
+                desc_ty_idx = hi_ty_idx;
+                ty_idx = desc_ty_idx;
+  
+                wn = WN_CreateIstore(OPR_ISTORE, MTYPE_V, TY_mtype(hi_ty_idx),
+                        xtra_BE_ofst,
+                        obj_ty_idx,
+                        rhs_wn, obj_wn, DECL_FIELD_ID(member));
+                WGEN_Stmt_Append(wn, Get_Srcpos());
+                break;
+             }
+            // bug 15210
+            // Replace the VAR_DECL with the REF, for this case
+            //
+            else if (gs_tree_code(t) == GS_COND_EXPR &&
+                     gs_tree_code(gs_tree_operand(t,1)) == GS_TARGET_EXPR &&
+                     gs_tree_code(gs_tree_operand(t,2)) == GS_TARGET_EXPR ) {
+               gs_t t1, t2;
 
-              gs_t obj_instance = gs_tree_operand(opnd0, 0);
-              gs_t obj_ptr = gs_tree_operand(obj_instance, 0);
+               t1 = gs_tree_operand(t, 1);
+               t2 = gs_tree_operand(t, 2);
+               gs_set_tree_operand(t1, 0, opnd0);
+               gs_set_tree_operand(t2, 0, opnd0);
+               wn = WGEN_Expand_Expr(t);
 
-              gs_t member = gs_tree_operand(opnd0, 1);
-              WN_OFFSET ofst = 0;
-              UINT xtra_BE_ofst = 0;
-
-              TY_IDX obj_ty_idx = Get_TY(gs_tree_type(gs_tree_operand(obj_ptr, 
0)));
-
-              ofst = (BITSPERBYTE * 
gs_get_integer_value(gs_decl_field_offset(member)) +
-                      gs_get_integer_value(gs_decl_field_bit_offset(member)))
-                  / BITSPERBYTE;
-
-
-              WN *obj_wn = WGEN_Expand_Expr(obj_ptr, TRUE, 0, 0, 0, 0, FALSE, 
FALSE, NULL);
-
-              TY_IDX hi_ty_idx;
-              if (gs_tree_code(gs_tree_type(opnd0)) == GS_VOID_TYPE)
-                  hi_ty_idx = MTYPE_To_TY(MTYPE_I4); // dummy; for bug 10176 
Comment #4
-              else hi_ty_idx = Get_TY(gs_tree_type(opnd0));
-
-              desc_ty_idx = hi_ty_idx;
-              ty_idx = desc_ty_idx;
-
-              wn = WN_CreateIstore(OPR_ISTORE, MTYPE_V, TY_mtype(hi_ty_idx),
-                      xtra_BE_ofst,
-                      obj_ty_idx,
-                      rhs_wn, obj_wn, DECL_FIELD_ID(member));
-              WGEN_Stmt_Append(wn, Get_Srcpos());
+               break;
+            } else {
+              WN *target_wn = WGEN_Address_Of(opnd0);
+              WN *result_wn = WGEN_Expand_Expr (t, TRUE /* for return_in_mem*/,
+                                                0, 0, 0, 0, FALSE, FALSE, 
target_wn);
+              wn = result_wn;
+              WN_set_rtype(wn, MTYPE_V);
               break;
-                 }
-         //15210
-          else if (gs_tree_code(t) == GS_CALL_EXPR &&
-                   gs_tree_code(opnd0) == GS_COMPONENT_REF) {
-            WN *target_wn = WGEN_Address_Of(opnd0);
-            WN *result_wn = WGEN_Expand_Expr (t, TRUE /* for return_in_mem*/,
-                                              0, 0, 0, 0, FALSE, FALSE, 
target_wn);
-            wn = result_wn;
-            WN_set_rtype(wn, MTYPE_V);
-           break;
+            }
           }
-
-           // bug 15210
-           // Replace the VAR_DECL with the REF, for this case
-           //
-           else if (gs_tree_code(t) == GS_COND_EXPR &&
-                    gs_tree_code(opnd0) == GS_COMPONENT_REF &&
-                   gs_tree_code(gs_tree_operand(t,1)) == GS_TARGET_EXPR &&
-                   gs_tree_code(gs_tree_operand(t,2)) == GS_TARGET_EXPR ) {
-             gs_t t1, t2;
- 
-             t1 = gs_tree_operand(t, 1);
-             t2 = gs_tree_operand(t, 2);
-             gs_set_tree_operand(t1, 0, opnd0);
-             gs_set_tree_operand(t2, 0, opnd0);
-             wn = WGEN_Expand_Expr(t);
- 
-             break;
-          }
-
          // If the initializer returns the object in memory, then make sure
          // the type doesn't require a copy constructor, since such types
          // sometimes require one.


------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in 
Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business 
insights. http://p.sf.net/sfu/splunk-dev2dev 
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to