Author: yug
Date: 2012-03-14 04:51:57 -0400 (Wed, 14 Mar 2012)
New Revision: 3882

Modified:
   trunk/osprey/be/cg/cgemit.cxx
   trunk/osprey/be/cg/x8664/cgtarget.cxx
   trunk/osprey/be/cg/x8664/exp_loadstore.cxx
Log:
fix for bug951.

under -m32 -fpic environment, when we do ld_st:

when base_ofst ! = 0, we generate 
  TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst)
instead of 
  tmp_TN :- ld32 GT2(%bx) (sym:base_sym + 0)
  TN :- lea32 tmp_TN base_ofst
this is for consideration of facilitate restoring the register TN
to symbol TN in ASM m constraint. 
And also this reduces a temp TN.

Code Review: Lai Jian-Xin.


Modified: trunk/osprey/be/cg/cgemit.cxx
===================================================================
--- trunk/osprey/be/cg/cgemit.cxx       2012-03-13 08:20:27 UTC (rev 3881)
+++ trunk/osprey/be/cg/cgemit.cxx       2012-03-14 08:51:57 UTC (rev 3882)
@@ -3346,8 +3346,20 @@
 #endif
       if( base_ofst == 0 ){
 #if defined(TARG_X8664)
-       if( Is_Target_32bit() )
-         sprintf( buf, "%s", name );
+        // open64.net bug951. 
+        // Format IA32 GOT symbol in Asm_String.
+       if( Is_Target_32bit() ) {
+          switch (TN_relocs(tn)) {
+          case TN_RELOC_IA32_GOT:
+            sprintf( buf, 
+                     "%s@GOT(%s)", 
+                     name, 
+                     int_reg_names[3][TN_register(Ebx_TN())- REGISTER_MIN]);
+            break;
+          default:
+            sprintf( buf, "%s", name);
+          }
+        }
        else
          sprintf( buf, "%s(%%rip)", name );
 #else
@@ -3355,8 +3367,21 @@
 #endif
       } else
 #if defined(TARG_X8664)
-       if( Is_Target_32bit() )
-         sprintf( buf, "%s+%d", name, (int)base_ofst );
+        // open64.net bug951.
+        // Format IA32 GOTOFF symbol in Asm_String.
+       if( Is_Target_32bit() ) {
+          switch (TN_relocs(tn)) {
+          case TN_RELOC_IA32_GOTOFF:
+            sprintf( buf, 
+                     "%s@GOTOFF+%d(%s)",
+                     name, 
+                     (int)base_ofst,
+                     int_reg_names[3][TN_register(Ebx_TN())- REGISTER_MIN]);
+            break;
+          default:
+            sprintf( buf, "%s+%d", name, (int)base_ofst );
+          }
+        }
        else
          sprintf( buf, "%s+%d(%%rip)", name, (int)base_ofst );
 #else

Modified: trunk/osprey/be/cg/x8664/cgtarget.cxx
===================================================================
--- trunk/osprey/be/cg/x8664/cgtarget.cxx       2012-03-13 08:20:27 UTC (rev 
3881)
+++ trunk/osprey/be/cg/x8664/cgtarget.cxx       2012-03-14 08:51:57 UTC (rev 
3882)
@@ -4020,7 +4020,15 @@
 
   if( WN_operator(load) == OPR_LDA ){
     OP* lda_op = OPS_last( ops );
-    asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, 0 );
+    // open64.net bug951. On finding the symbol TN, don't miss the cases of:
+    //  TN :- ld32 GTN2(%rbx) (sym:base_sym +0)
+    //  TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst)
+    if (Is_Target_32bit() && Gen_PIC_Shared) {
+      asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) :
+        (OP_code(lda_op) == TOP_ldc32) ? OP_opnd( lda_op, 0) : OP_opnd( 
lda_op, 1);
+    } else {
+      asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, 0 );
+    }
     OPS_Remove_Op( ops, lda_op );
 
   } else if( WN_operator(load) == OPR_ADD ){

Modified: trunk/osprey/be/cg/x8664/exp_loadstore.cxx
===================================================================
--- trunk/osprey/be/cg/x8664/exp_loadstore.cxx  2012-03-13 08:20:27 UTC (rev 
3881)
+++ trunk/osprey/be/cg/x8664/exp_loadstore.cxx  2012-03-14 08:51:57 UTC (rev 
3882)
@@ -1267,17 +1267,29 @@
                                STB_section(base_sym) /* bug 10097 */)) ){
          FmtAssert(!ST_is_thread_local(base_sym),
                    ("Exp_Ldst: thread-local storage NYI under PIC"));
-         TN* tmp = base_ofst == 0 ? tn : Build_TN_Like(tn);
-         Build_OP( TOP_ld32, tmp, Ebx_TN(),
-                   Gen_Symbol_TN( base_sym, 0, TN_RELOC_IA32_GOT ),
-                   &newops );
+
+          // open64.net bug951.
+          // when base_ofst ! = 0, we generate 
+          // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst)
+          // instead of 
+          // tmp_TN :- ld32 GT2(%bx) (sym:base_sym + 0)
+          // TN :- lea32 tmp_TN base_ofst
+          // this is for consideration of facilitate restoring the register TN
+          // to symbol TN in ASM m constraint. 
+          // And also this reduces a temp TN.
+
+          if (base_ofst == 0)
+            Build_OP( TOP_ld32, tn, Ebx_TN(),
+                      Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_IA32_GOT ),
+                      &newops );
+          else
+            Build_OP( TOP_lea32, tn, Ebx_TN(),
+                      Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_IA32_GOTOFF 
),
+                      &newops );
          // got address should not alias
          Set_OP_no_alias(OPS_last(&newops));
          PU_References_GOT = TRUE;
 
-         if( base_ofst != 0 ){
-           Build_OP( TOP_lea32, tn, tmp, Gen_Literal_TN(base_ofst, 4), &newops 
);            
-         }
        } else {
          Build_OP( TOP_ldc32, tn,
                    Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_NONE ),


------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to