Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
upc_symtab_utils.cxx
Go to the documentation of this file.
00001 #include <assert.h>
00002 #include <symtab.h>
00003 #include <symtab_utils.h>
00004 #include <upc_symtab_utils.h>
00005 #include <wintrinsic.h>
00006 #include "wn.h"
00007 
00008 
00009 char *shared_ptr_name = "shared_ptr_struct";
00010 char *hsync_reg_name;
00011 char *hsync_mem_name;
00012 
00013 TY_IDX shared_ptr_idx = 0; 
00014 TY_IDX pshared_ptr_idx = 0;
00015 TY_IDX upc_hsync_reg_ty = 0;
00016 TY_IDX upc_hsync_mem_ty = 0;
00017 
00018 
00019 ST *upc_ptradd_st = 0;
00020 ST *upc_ptrdiff_st = 0;
00021 ST *upc_ptrget_st = 0;
00022 ST *upc_ptrput_st = 0;
00023 ST *upc_threadof_st = 0;
00024 ST *upc_mythread_st = 0;
00025 ST *upc_memget_st = 0;
00026 ST *upc_memput_st = 0;
00027 ST *upc_memcpy_st = 0;
00028 ST *upc_adddisp_st = 0;
00029 ST *upc_getshared_st = 0;
00030 ST *upc_phreset_st = 0;
00031 ST* upc_nulleq_st = 0;
00032 ST* upc_nullneq_st = 0;
00033 ST* upc_ptreqtest_st = 0;
00034 ST* upc_ptrneqtest_st = 0;
00035 ST* upc_forall_control_st = 0;
00036 
00037 TYPE_ID MTYPE_TO_Shared_TY_array[MTYPE_LAST+1];
00038 
00039 
00040 
00041 static char *upc_library_names[] = {
00042   "upc_global_alloc",                "UPCR_GLOBAL_ALLOC",
00043   "upc_all_alloc",                   "UPCR_ALL_ALLOC",
00044   "upc_local_alloc",                 "UPCR_LOCAL_ALLOC",
00045   "upc_free",                        "UPCR_FREE",
00046   "upc_threadof",                    "UPCR_THREADOF_SHARED",
00047   "upc_phaseof",                     "UPCR_PHASEOF_SHARED",
00048   "upc_addrfield",                   "UPCR_ADDRFIELD_SHARED",
00049   "upc_global_lock_alloc",           "UPCR_GLOBAL_LOCK_ALLOC",
00050   "upc_all_lock_alloc",              "UPCR_ALL_LOCK_ALLOC",
00051   "upc_lock",                        "UPCR_LOCK",
00052   "upc_lock_attempt",                "UPCR_LOCK_ATTEMPT",
00053   "upc_unlock",                      "UPCR_UNLOCK",
00054   "upc_memcpy",                      "UPCR_MEMCPY",
00055   "upc_memget",                      "UPCR_MEMGET",
00056   "upc_memput",                      "UPCR_MEMPUT",
00057   "upc_memset",                      "UPCR_MEMSET",
00058   "upc_global_exit",                 "upcr_global_exit"};
00059 
00060 
00061 TY_IDX Get_Field_Type (TY_IDX struct_type, UINT field_id)
00062 {
00063   Is_True (TY_kind (struct_type) == KIND_STRUCT, ("expecting KIND_STRUCT"));
00064   UINT cur_field_id = 0;
00065   FLD_HANDLE fld = FLD_get_to_field (struct_type, field_id, cur_field_id);
00066   Is_True (! fld.Is_Null(), ("Invalid field id %d for type 0x%x",
00067                              field_id, struct_type));
00068   return FLD_type (fld);
00069 }
00070 
00071 bool is_upcr_ptr(TY_IDX ty) {
00072   
00073   return ty == shared_ptr_idx ||
00074     ty == pshared_ptr_idx ||
00075     //WEI: shouldn't need the following two, but for some reason the two above don't seem to be enough
00076     strcmp(TY_name(ty), "shared_ptr_struct") == 0 || 
00077     strcmp(TY_name(ty), "pshared_ptr_struct") == 0;
00078 }
00079   
00080 
00081 
00082 void
00083 Save_Upc_Rts_Calls(char *name,ST *st)
00084 {
00085   if (strcmp(name, "upcr_add_shared") == 0) {
00086     upc_ptradd_st = st;
00087   } else if (strcmp(name, "upcr_sub_shared") == 0) {
00088     upc_ptrdiff_st = st;
00089   } else if(strcmp(name, "upcr_getsp") == 0) {
00090     upc_ptrget_st  = st;
00091   }  else if (strcmp(name, "upcr_putsp") == 0) {
00092     upc_ptrput_st = st;
00093   }  else if (strcmp(name, "upcr_threadof_shared") == 0) {
00094     upc_threadof_st = st;
00095   }  else if (strcmp(name, "upcr_memget") == 0) {
00096     upc_memget_st = st;
00097   }  else if (strcmp(name, "upcr_memput") == 0) {
00098     upc_memput_st = st;
00099   }  else if (strcmp(name, "upcr_memcpy") == 0) {
00100     upc_memcpy_st = st;
00101   } else if (strcmp(name, "upcr_add_disp") == 0) {
00102     upc_adddisp_st = st;
00103   } else if (strcmp(name, "upcr_get_shared") == 0) {
00104     upc_getshared_st = st;
00105   } else if (strcmp(name, "upcr_shared_resetphase") == 0) {
00106     upc_phreset_st = st;
00107   } else  if (strcmp(name, "upcr_isnull_shared") == 0) {
00108     upc_nulleq_st = st;
00109   } else  if (strcmp(name, "upcr_isnotnull_shared") == 0) {
00110     upc_nullneq_st = st;
00111   }else if (strcmp(name, "upcr_isequal_shared_shared") == 0) {
00112     upc_ptreqtest_st = st;
00113   } else  if (strcmp(name, "upcr_isnotequal_shared_shared") == 0) {
00114     upc_ptrneqtest_st = st;
00115   }
00116 }
00117 
00118 void Upc_Translate_Name(char *from, char **to) {
00119 
00120   for(int i = 0; i < sizeof(upc_library_names) / sizeof(char*); i += 2)
00121     if(strcmp(upc_library_names[i], from) == 0) {
00122       *to = upc_library_names[i+1];
00123       return;
00124     }
00125 }
00126 
00127 
00128 
00129 
00130 TY_IDX Get_Inner_Array_Type( TY_IDX idx) {
00131   
00132   Is_True(TY_kind(idx) == KIND_ARRAY,("",""));
00133   TY_IDX eidx = TY_etype(idx);
00134   while (TY_kind(eidx) == KIND_ARRAY)
00135     eidx = TY_etype(eidx);
00136 
00137   return eidx;
00138   
00139 }
00140 
00141 UINT Get_Type_Block_Size (TY_IDX idx) {
00142 
00143   UINT result;
00144   switch(TY_kind(idx)) {
00145   case KIND_STRUCT:
00146   case KIND_SCALAR:
00147   case KIND_VOID:
00148     Is_True(TY_is_shared(idx),("Request for the block_size of a non-shared type",""));
00149     result =  TY_block_size(idx);
00150     break;
00151   case KIND_POINTER: {
00152    //  Ty_Table[idx].Print(stderr);
00153 //     Ty_Table[TY_pointed(idx)].Print(stderr);
00154     if(TY_is_shared(idx))
00155       result =  TY_block_size(idx);
00156     else  if(TY_is_shared(TY_pointed(idx))) {
00157       if(TY_kind(TY_pointed(idx)) == KIND_ARRAY)
00158         result = Get_Type_Block_Size(TY_pointed(idx));
00159       else
00160         result =   TY_block_size(TY_pointed(idx));
00161     }
00162     else 
00163        Is_True(0, ("Request for the block_size of a non-shared type",""));
00164     }
00165     break;
00166 
00167   case KIND_ARRAY:
00168     result =  TY_block_size(Get_Inner_Array_Type(idx));
00169     break;
00170   default:
00171     Is_True(0, ("Request for the block_size of a non-shared type",""));
00172   }
00173   return result;
00174 }
00175 
00176 
00177 UINT64 Get_Type_Inner_Size (TY_IDX idx) {
00178   
00179   switch(TY_kind(idx)) {
00180   case KIND_STRUCT:
00181     return Adjusted_Type_Size(idx);
00182   case KIND_SCALAR:
00183     return TY_size(idx);
00184   case KIND_POINTER:
00185     if (TY_kind(TY_pointed(idx)) == KIND_ARRAY)
00186       return TY_size(TY_etype(TY_pointed(idx)));
00187     else { 
00188       if(TY_kind(TY_pointed(idx)) == KIND_STRUCT)
00189         return Adjusted_Type_Size(TY_pointed(idx));
00190       else 
00191         return TY_size(TY_pointed(idx));
00192     }
00193     break;
00194   case KIND_ARRAY:
00195     if(TY_kind(Get_Inner_Array_Type(idx)) == KIND_STRUCT)
00196       return Adjusted_Type_Size(Get_Inner_Array_Type(idx));
00197     else
00198       return TY_size(Get_Inner_Array_Type(idx));
00199  
00200   default:
00201     Is_True(0,("Unexpected type for shared ptr arithmetic",""));
00202   }
00203   return 0;
00204 }
00205 
00206 
00207 
00208 void Initialize_Upc_Metadata() {
00209   int level, i;
00210   ST *st;
00211 
00212   FOREACH_SYMBOL(GLOBAL_SYMTAB, st, i)
00213     Save_Upc_Rts_Calls( ST_name(st), st);
00214   
00215 }
00216 
00217 UINT Adjusted_Type_Size(TY_IDX idx, unsigned int pshared, unsigned int shared) {
00218   
00219   UINT result = 0;
00220 
00221   switch(TY_kind(idx)) {
00222   case KIND_SCALAR:
00223   case KIND_POINTER:
00224     if(!Type_Is_Shared_Ptr(idx))
00225       return TY_size(idx);
00226     else if (pshared != 0) {
00227       /* called from the front end */
00228       if (TY_is_shared(idx)) {
00229         return TY_is_pshared(idx) ? pshared : shared;
00230       } else {
00231         return TY_is_pshared(TY_pointed(idx)) ? pshared : shared;
00232       }
00233     } else {
00234       return TY_size(TY_To_Sptr_Idx(idx));
00235     }
00236   case KIND_STRUCT: {
00237     // sum_i(Adjusted_type_size(field_i))
00238     if(idx == pshared_ptr_idx || idx == shared_ptr_idx)
00239       return TY_size(idx);
00240 
00241     TY_IDX last_fld_idx = 0;
00242     UINT field_id = 1;
00243     UINT offset = 0;
00244     FLD_ITER  fiter  = Make_fld_iter(TY_fld(idx));
00245     FLD_ITER last = Fld_Table.end ();
00246     FLD_HANDLE fh;
00247     do {
00248       fh = FLD_HANDLE(fiter);
00249       last_fld_idx = FLD_type(fh);
00250       field_id++;
00251     } while (!FLD_last_field(fiter) && ++fiter != last);
00252     
00253     if(field_id) {
00254       offset += Adjust_Field_Offset(idx, field_id-1) + Adjusted_Type_Size(last_fld_idx);
00255       if(offset  % 8 == 0)
00256         return offset;
00257       else 
00258         return offset + (8 - (offset % 8));
00259     }
00260   }
00261     break;
00262   case KIND_ARRAY:
00263     if(Type_Is_Shared_Ptr(TY_etype(idx), TRUE)) 
00264       return (TY_size(idx) / TY_size(TY_etype(idx))) * TY_size(TY_To_Sptr_Idx(TY_etype(idx)));
00265     else
00266       return TY_size(idx); 
00267     
00268     break;
00269   case KIND_VOID:
00270     return 0;
00271   }
00272   
00273   assert(false);
00274   /* NOTREACHED */
00275   return 0;
00276 }
00277 
00278 
00279 
00280 // This function assumes that the field offsets within
00281 // a struct are already adjusted to account for the 
00282 // shared pointers.
00283 // The adjusted type size is offset(last_field) + sizeof(last_field)
00284 void Adjust_Type_Size(TY *ty) {
00285   
00286   if(TY_kind(*ty) == KIND_STRUCT) {
00287     FLD_IDX field = ty->Fld();
00288     TY_IDX last_fld_idx = 0;
00289     UINT field_id = 1;
00290     UINT offset;
00291     FLD_ITER  fiter  = Make_fld_iter(FLD_HANDLE(field));
00292     FLD_ITER last = Fld_Table.end ();
00293     FLD_HANDLE fh;
00294     do {
00295       fh = FLD_HANDLE(fiter);
00296       last_fld_idx = FLD_type(fh);
00297       offset = FLD_ofst(fh);
00298     } while (!FLD_last_field(fiter) && ++fiter != last);
00299     //
00300     if(field) {
00301       offset += Adjusted_Type_Size(last_fld_idx);
00302       if(offset  % 8 == 0)
00303         Set_TY_size(*ty, offset);
00304       else 
00305         Set_TY_size(*ty, offset + (8 - (offset % 8)));
00306     }
00307   }
00308   
00309 }
00310 
00311 template <class T>
00312 struct adjust_type_size_op
00313 {
00314   TY *t;
00315   adjust_type_size_op (TY *it) : t(it) {}
00316   
00317   void operator () (UINT idx, TY *entry) const;
00318 }; // adjust_type_size_op
00319 
00320 
00321 template <class T>
00322 inline void
00323 adjust_type_size_op<T>::operator () (UINT idx, TY *entry) const {
00324   Adjust_Type_Size(entry);
00325 }
00326 
00327 
00328 
00329 
00330 template <class T>
00331 struct change_type_op
00332 {
00333   ST *s;
00334   change_type_op (ST *st) : s(st) {}
00335   
00336   void operator () (UINT idx, ST *entry) const;
00337 }; // change_type_op
00338 
00339 
00340 template <class T>
00341 inline void
00342 change_type_op<T>::operator () (UINT idx, ST *entry) const {
00343   Set_ST_type(entry, TY_To_Sptr_Idx(ST_type(entry)));
00344 }
00345 
00346 
00347 static 
00348 void Change_Type_To_Shared( ST *st) 
00349 {
00350   int i;
00351   TY_IDX st_ty  = ST_class(st) == CLASS_VAR ? ST_type(st) :
00352     ST_class(st) == CLASS_FUNC ? ST_pu_type(st) : ST_type(st);
00353   
00354   if (ST_class(st) == CLASS_VAR && Type_Is_Shared_Ptr(st_ty)) {
00355     Set_ST_type (st, TY_To_Sptr_Idx(st_ty));
00356   } // else if(ST_class(st) == CLASS_VAR && TY_kind(st_ty) == KIND_STRUCT) {
00357 //     UINT field_id = 1;
00358 //     UINT tmp_field_id = 0;
00359 //     FLD_HANDLE fh = FLD_get_to_field(st_ty, field_id, tmp_field_id);
00360 //     while(!FLD_last_field(fh)) {
00361 //       TY_IDX idx = FLD_type(fh);
00362 //       if(Type_Is_Shared_Ptr(idx)) {
00363 //      Set_FLD_type(fh, TY_To_Sptr_Idx(idx));
00364 //       }
00365 //     }
00366 //   }
00367   else if (ST_class(st) == CLASS_FUNC) {
00368     TYLIST_IDX idx = TY_tylist(ST_pu_type(st));
00369     while(Tylist_Table [idx]) {
00370       
00371       TY_IDX tidx = Tylist_Table[idx];
00372       //Ty_Table[tidx].Print(stderr);
00373       if (Type_Is_Shared_Ptr(tidx)) {
00374           Set_TYLIST_type (Tylist_Table [idx++], TY_To_Sptr_Idx(tidx));
00375       }
00376       else idx++;
00377     }
00378     For_all_entries (*Scope_tab[PU_lexical_level(st)].st_tab, change_type_op<ST> (st), 1);
00379    
00380   }
00381 }
00382 
00383 void Upc_Lower_SymbolTable() {
00384   int level, i;
00385   ST *st;
00386   Is_True (shared_ptr_idx, ("Shared ptr type not initialized",""));
00387   FOREACH_SYMBOL(GLOBAL_SYMTAB, st, i)
00388     Change_Type_To_Shared ( st );
00389 
00390   TY_ITER tlast = Ty_tab.end();
00391   TY_ITER titer = Make_ty_iter(MTYPE_To_TY(MTYPE_F8));
00392   FLD_HANDLE fh;
00393   do {
00394     TY idx = *titer;
00395     if(TY_kind(idx) == KIND_STRUCT) {
00396       FLD_IDX field = idx.Fld();
00397       UINT field_id = 1;
00398       FLD_ITER  fiter  = Make_fld_iter(FLD_HANDLE(field));
00399       FLD_ITER last = Fld_Table.end ();
00400       
00401       do {
00402         fh = FLD_HANDLE(fiter);
00403         TY_IDX fidx = FLD_type(fh);
00404         Set_FLD_ofst(fh, // FLD_ofst(fh) +
00405                      Adjust_Field_Offset(idx, field_id));
00406         field_id++;
00407       } while (!FLD_last_field(fiter) && ++fiter != last);
00408 
00409      //  Set_TY_size(idx, FLD_ofst(fh) + TY_size(FLD_type(fh)));
00410     //   idx.Print(stderr);
00411       
00412       field_id = 1;
00413       fiter =  Make_fld_iter(FLD_HANDLE(field));
00414       do {
00415         FLD_HANDLE fh = FLD_HANDLE(fiter);
00416         TY_IDX fidx = FLD_type(fh);
00417         if(Type_Is_Shared_Ptr(fidx)) {
00418           Set_FLD_type(fh, TY_To_Sptr_Idx(fidx));
00419         }
00420         field_id++;
00421       } while (!FLD_last_field(fiter) && ++fiter != last);
00422     }
00423   } while(++titer != tlast);
00424 
00425   
00426   For_all <adjust_type_size_op<TY> > (Ty_Table, adjust_type_size_op <TY>(0) );
00427 }
00428   
00429 
00430 
00431 UINT Adjust_Field_Offset(TY& struct_ty, UINT field_id) {
00432   
00433   UINT off = 0;
00434   UINT cur_id = 0;
00435   UINT aligned = 0;
00436   UINT displacement;
00437   UINT alignment = 1;
00438   TY_IDX fld_ty;
00439   Is_True(TY_kind(struct_ty) == KIND_STRUCT, ("",""));
00440 
00441   if(field_id  == 0|| field_id == 1)
00442     return 0;
00443 
00444   FLD_IDX idx = struct_ty.Fld();
00445   FLD_ITER fiter = Make_fld_iter(FLD_HANDLE(idx));
00446   FLD_HANDLE prev_fld = FLD_HANDLE(fiter++);
00447   FLD_HANDLE fh;
00448   cur_id = 2;  
00449   while(cur_id++ <= field_id) {
00450     fh = FLD_HANDLE(fiter);
00451     fld_ty = FLD_type(fh);
00452     alignment = TY_align(fld_ty);
00453     if(Type_Is_Shared_Ptr(fld_ty))
00454       alignment = TY_align(TY_To_Sptr_Idx(fld_ty));
00455     displacement = off + Adjusted_Type_Size(FLD_type(prev_fld)) ;
00456     if(displacement % alignment == 0) 
00457       off = displacement;
00458     else 
00459       off = displacement + (alignment - displacement % alignment);
00460     prev_fld = fh;
00461     ++fiter;
00462   } ;
00463 
00464   return off;
00465 }
00466 
00467 
00468 
00469 
00470 UINT Adjust_Field_Offset(TY_IDX struct_ty, UINT field_id) {
00471   
00472   UINT off = 0;
00473   UINT tmp_field_id = 0;
00474   TY_IDX fld_ty;
00475   UINT displacement = 0;
00476   UINT alignment;
00477   UINT cur_id;
00478   Is_True(TY_kind(struct_ty) == KIND_STRUCT, ("",""));
00479 
00480   if(field_id == 0 || field_id == 1)
00481     return 0;
00482   
00483   FLD_ITER fiter = Make_fld_iter(TY_fld(struct_ty));
00484   FLD_HANDLE prev_fld = FLD_HANDLE(fiter++);
00485   FLD_HANDLE fh;
00486   cur_id = 2;  
00487   // while(cur_id++ <= field_id)
00488   do  {
00489     fh = FLD_HANDLE(fiter);
00490     fld_ty = FLD_type(fh);
00491     alignment = TY_align(fld_ty);
00492     if(Type_Is_Shared_Ptr(fld_ty))
00493       alignment = TY_align(TY_To_Sptr_Idx(fld_ty));
00494     displacement = off + Adjusted_Type_Size(FLD_type(prev_fld)) ;
00495     if(displacement % alignment == 0) 
00496       off = displacement;
00497     else 
00498       off = displacement + (alignment - displacement % alignment);
00499     prev_fld = fh;
00500     ++fiter;
00501   } while(!FLD_last_field(prev_fld) && cur_id++ < field_id);
00502 
00503 
00504  //  TY_IDX prev_fld_idx = Get_Field_Type(struct_ty, 1);
00505   
00506 //   for(int i = 2; i <= field_id; i++) {
00507 //     fld_ty = Get_Field_Type(struct_ty, i);
00508 //     alignment = TY_align(fld_ty);
00509 //     if(Type_Is_Shared_Ptr(fld_ty))
00510 //       alignment = TY_align(TY_To_Sptr_Idx(fld_ty));
00511 //     displacement = off + Adjusted_Type_Size(prev_fld_idx) ;
00512     
00513 //     if(displacement % alignment == 0) 
00514 //       off = displacement;
00515 //     else 
00516 //       off = displacement + (alignment - displacement % alignment);
00517 //     prev_fld_idx = fld_ty;
00518 //     tmp_field_id = i-1;
00519 //     if(FLD_last_field(FLD_get_to_field (struct_ty, i, tmp_field_id)))
00520 //       break;;
00521 //   } 
00522   return off;
00523 }
00524 
00525 
00526 
00527 void Verify_Upc_Metadata() {
00528   Is_True( shared_ptr_idx //  upc_ptradd_st &&  
00529 //          upc_ptrget_st &&
00530 //          upc_threadof_st &&
00531 //          upc_memcpy_st &&
00532 //          upc_adddisp_st &&
00533 //          upc_getshared_st &&
00534 //          upc_phreset_st &&
00535 //          upc_nulleq_st &&
00536 //          upc_nullneq_st &&
00537 //          upc_ptreqtest_st &&
00538 //          upc_ptrneqtest_st  &&
00539             // upc_ptrput_st &&
00540 //          upc_mythread_st &&
00541 //          upc_memget_st &&
00542 //          upc_memput_st &&
00543             
00544             // upc_ptrdiff_st &&
00545 //          upc_hsync_reg_ty &&
00546 //          upc_hsync_mem_ty
00547             , ("UPC metadata not initialized",""));
00548             
00549 }
00550 
00551 
00552 
00553 static TYPE_ID
00554 Size_To_Mtype (UINT32 size) 
00555 {
00556   
00557   if (size == TY_size(MTYPE_To_TY(MTYPE_I1)))
00558      return MTYPE_I1;
00559   else if (size == TY_size(MTYPE_To_TY(MTYPE_I2)))
00560      return MTYPE_I2;
00561   else if (size == TY_size(MTYPE_To_TY(MTYPE_I4)))
00562      return MTYPE_I4;
00563   else if (size == TY_size(MTYPE_To_TY(MTYPE_I8)))
00564      return MTYPE_I8;
00565   else 
00566     return MTYPE_M;
00567 
00568 }
00569 
00570 
00571 static void 
00572 Fill_Structure_Type (TY &ty, UINT size) {
00573   
00574   TY_IDX bogus_idx = 0;
00575   TY &bogus = New_TY (bogus_idx);
00576   TY_Init (bogus, size, KIND_ARRAY, MTYPE_M, Save_Str("bogus_name"));
00577   Set_TY_etype (bogus, MTYPE_To_TY(MTYPE_I1));
00578   Set_TY_align (bogus_idx, TY_align(TY_etype(bogus)));
00579   ARB_HANDLE arb = New_ARB (); 
00580   ARB_Init (arb, 0, 0, 0);
00581   Set_TY_arb (bogus, arb);
00582   Set_ARB_first_dimen (arb);
00583   Set_ARB_last_dimen (arb);
00584   Set_ARB_dimension (arb, 1);
00585   Set_ARB_const_stride (arb);
00586   Set_ARB_stride_val (arb, size);
00587   Set_ARB_const_lbnd (arb);
00588   Set_ARB_lbnd_val (arb, 0);
00589   Set_ARB_const_ubnd (arb);
00590   Set_ARB_ubnd_val (arb,size-1);
00591   
00592   //Ty_Table[bogus_idx].Print(stderr);
00593   
00594   FLD_HANDLE fld = New_FLD();
00595   FLD_Init(fld, Save_Str("bogus_field_name"), bogus_idx, 0);
00596   Set_TY_fld(ty, fld);
00597   Set_FLD_last_field(fld);
00598   
00599 
00600 }           
00601     
00602 
00603 
00604 
00605 void Create_Special_Shared_Global_Symbols()
00606 {
00607   TY_IDX ty_idx;
00608   TY_KIND ty_kind = KIND_SCALAR;
00609   
00610 
00611 #define LAST_SCALAR_SHARED_TYPE MTYPE_F16
00612 
00613   int j;
00614 
00615   /* Make predefined types for the machine types: */
00616   for (TYPE_ID i = MTYPE_I1; i  <= LAST_SCALAR_SHARED_TYPE; ++i) {
00617     
00618     TY &ty = New_TY (ty_idx);
00619     ty_kind = KIND_SCALAR;
00620     Set_TY_align (ty_idx, TY_align(MTYPE_To_TY(i)));
00621     TY_Init (ty, MTYPE_byte_size (i), ty_kind, i,
00622              Save_Str2(".predef_shared_", MTYPE_name (i)));
00623     MTYPE_To_Shared_TY (i) = ty_idx;
00624     Set_TY_is_shared(ty_idx);
00625   }
00626 }
00627 
00628 class TY_shared {
00629 public:
00630   bool shared;
00631 
00632   TY_shared(bool shared) {
00633     this->shared = shared;
00634   }
00635   
00636   bool operator() (UINT, const TY* ty) const {
00637     if (shared) {
00638       return strcmp(TY_name(*ty),"shared_ptr_struct") == 0; 
00639     } 
00640     return strcmp(TY_name(*ty),"pshared_ptr_struct") == 0;
00641   }
00642 };
00643   
00644 void Find_Upc_Vars () {
00645 
00646   ST* s;
00647   int i;
00648 
00649   FOREACH_SYMBOL(GLOBAL_SYMTAB, s, i) {
00650     if (strcmp(ST_name(*s),"upcr_forall_control") == 0)  {
00651       upc_forall_control_st = s;
00652       break;
00653     }
00654   }
00655   Is_True(upc_forall_control_st != NULL, ("Can't find upcr_forall_control in symbol table", ""));
00656   
00657   shared_ptr_idx = For_all_until(Ty_Table, TY_shared(true));
00658   pshared_ptr_idx = For_all_until(Ty_Table, TY_shared(false));
00659   
00660   Is_True(shared_ptr_idx != 0 && pshared_ptr_idx != 0, ("Can't find shared_ptr_struct in symbol table", ""));
00661 }
00662 
00663 BOOL Use_32_Bit(const char* filename) {
00664 
00665   FILE* config_file = fopen(filename, "r");
00666   char line[MAX_LINE_LEN_UPC];
00667   int size;
00668   char param[MAX_LINE_LEN_UPC];
00669   while (fgets(line, MAX_LINE_LEN_UPC, config_file) != NULL) {
00670     if (sscanf(line, "%s\t%d", param, &size) != 2) {
00671       continue;
00672     }
00673     if (strcmp(param, "ptr_size") == 0 && size == 4) {
00674       printf ("USE 32 BIT!!!!\n");
00675       return TRUE;
00676     }
00677   }
00678   return FALSE;
00679 }
00680 
00681 void Initialize_Upc_Vars () {
00682 
00683   upc_forall_control_st = New_ST(GLOBAL_SYMTAB);
00684   TY_IDX idx = MTYPE_To_TY(MTYPE_I4);
00685   ST_Init(upc_forall_control_st, 
00686           Save_Str("upcr_forall_control"),
00687           CLASS_VAR, SCLASS_COMMON, EXPORT_PREEMPTIBLE, idx);
00688 }
00689 
00690 //sizes are in bytes
00691 void Initialize_Upc_Types (char *sptr_name, UINT sptr_size,
00692                            char *psptr_name, UINT psptr_size,
00693                            char *hreg_name, UINT hreg_size,  // reg_handle_t 
00694                            char *hmem_name, UINT hmem_size)  // mem_handle_t
00695 
00696 {
00697   
00698   TYPE_ID mtype;
00699   TY_KIND ty_kind;
00700   UINT align;
00701   TY &sty = New_TY(shared_ptr_idx); 
00702   TY &psty = New_TY(pshared_ptr_idx); 
00703   TY &rty = New_TY (upc_hsync_reg_ty);
00704   TY &mty = New_TY (upc_hsync_mem_ty);
00705   BOOL _64_bit_target = TY_size(MTYPE_To_TY(Pointer_type)) > 4;
00706 
00707   mtype = Size_To_Mtype(sptr_size);
00708   if(!_64_bit_target && mtype == MTYPE_I8) {
00709     mtype = MTYPE_M;
00710   }
00711   ty_kind = (mtype < MTYPE_M) ? KIND_SCALAR : KIND_STRUCT;
00712   align = (mtype < MTYPE_M) ? TY_align(MTYPE_To_TY(mtype)) : TY_align(Integer_type); 
00713   TY_Init(sty, sptr_size, ty_kind, mtype, Save_Str (sptr_name));
00714   Set_TY_align(shared_ptr_idx, align);
00715   if (mtype == MTYPE_M)
00716     Fill_Structure_Type (sty, sptr_size);
00717   
00718   mtype = Size_To_Mtype(psptr_size);
00719   if(!_64_bit_target && mtype == MTYPE_I8) {
00720     mtype = MTYPE_M;
00721   }
00722   ty_kind = (mtype < MTYPE_M) ? KIND_SCALAR : KIND_STRUCT;
00723   align = (mtype < MTYPE_M) ? TY_align(MTYPE_To_TY(mtype)) : 8// TY_align(Pointer_type)
00724     ; 
00725   TY_Init(psty, psptr_size, ty_kind, mtype, Save_Str (psptr_name));
00726   Set_TY_align(pshared_ptr_idx, align);
00727   if (mtype == MTYPE_M)
00728     Fill_Structure_Type (psty, psptr_size);
00729 
00730   
00731   mtype = Size_To_Mtype(hreg_size);
00732   if(!_64_bit_target && mtype == MTYPE_I8) {
00733     mtype = MTYPE_M;
00734   }
00735   ty_kind = (mtype < MTYPE_M) ? KIND_SCALAR : KIND_STRUCT;
00736   TY_Init(rty, hreg_size, ty_kind, mtype, Save_Str (hreg_name));
00737   align = (mtype < MTYPE_M) ? TY_align(MTYPE_To_TY(mtype)) : TY_align(Integer_type); 
00738   Set_TY_align(upc_hsync_reg_ty, align);
00739   if (mtype == MTYPE_M)
00740     Fill_Structure_Type (rty, hreg_size);
00741   
00742   mtype = Size_To_Mtype(hmem_size);
00743   if(!_64_bit_target && mtype == MTYPE_I8) {
00744     mtype = MTYPE_M;
00745   }
00746   ty_kind = (mtype < MTYPE_M) ? KIND_SCALAR : KIND_STRUCT;
00747   TY_Init(mty, hmem_size, ty_kind, mtype, Save_Str (hmem_name));
00748   align = (mtype < MTYPE_M) ? TY_align(MTYPE_To_TY(mtype)) : TY_align(Integer_type); 
00749   Set_TY_align(upc_hsync_mem_ty, align);
00750   if (mtype == MTYPE_M)
00751     Fill_Structure_Type (mty, hmem_size);
00752 
00753   //Create_Special_Shared_Global_Symbols();
00754   // cout << "\tshared pointer size: " << sptr_size << "\t pshared pointer size: " << psptr_size << endl;
00755 //   cout << "\tregister size: " << hreg_size << "\t memory handle size: " << hmem_size << endl;
00756 }
00757 
00758 //It's illegal to call WN_ty() on a OPR_CONST, so we need this wrapper here 
00759 //(may apply to other nodes too??)
00760 BOOL WN_Type_Is_Shared_Ptr(const WN* wn, BOOL real_ptr) {
00761 
00762   switch (WN_operator(wn)) {
00763   case OPR_CONST:
00764     return false;
00765   default:
00766     return Type_Is_Shared_Ptr(WN_ty(wn), real_ptr);
00767   }
00768 }
00769 
00770 BOOL Type_Is_Shared_Ptr (TY_IDX idx, BOOL real_ptr) {
00771 
00772   return real_ptr ?  
00773     TY_kind(idx) == KIND_POINTER  && TY_is_shared(TY_pointed(idx)) :
00774     
00775     (TY_is_shared(idx) ||
00776      (TY_kind(idx) == KIND_POINTER  && TY_is_shared(TY_pointed(idx))) ||
00777      (TY_kind(idx) == KIND_ARRAY && TY_is_shared(Get_Inner_Array_Type(idx)))) ; 
00778 }
00779 
00780 BOOL TY_is_pshared(TY_IDX idx) {
00781 
00782   //NOTE: TY_is_shared must be true as a precondition of this method
00783   Is_True(TY_is_shared(idx), ("Calling TY_is_pshared with a non-shared type",""));
00784 
00785   switch (TY_kind(idx)) {
00786   case KIND_SCALAR:
00787   case KIND_STRUCT:
00788   case KIND_POINTER:
00789     return TY_mtype(idx) != MTYPE_V &&
00790     TY_block_size(idx) <= 1;
00791   case KIND_ARRAY:
00792     return TY_is_pshared(TY_etype(idx));
00793   }
00794   return false;
00795 }
00796 
00797 
00798 
00799 TY_IDX TY_To_Sptr_Idx (TY_IDX idx) 
00800 {
00801   if (TY_kind(idx) != KIND_VOID && 
00802       Type_Is_Shared_Ptr(idx) && Get_Type_Block_Size(idx) <= 1 && 
00803       !(Type_Is_Shared_Ptr(idx, TRUE) && TY_kind(TY_pointed(idx)) == KIND_VOID))
00804     return pshared_ptr_idx;
00805   else
00806     if (Type_Is_Shared_Ptr(idx))
00807       return shared_ptr_idx;
00808     else 
00809       return idx;
00810 }
00811 
00812 TY_IDX Fix_Intrinsic_Return_Type(INTRINSIC op) 
00813 {
00814   switch(op) {
00815   case INTRN_ADD_PI:
00816   case INTRN_ADD_P1:
00817   case INTRN_S_TO_P:
00818     return pshared_ptr_idx;
00819   case INTRN_SPTRADD:
00820   case INTRN_SPTRDIFF:
00821   case INTRN_S_RESET:
00822   case INTRN_ADD_S:
00823   case INTRN_P_TO_S:
00824     return shared_ptr_idx;
00825   default: 
00826     assert(false);
00827     return 0;
00828   }
00829 }
00830 
00831 
00832 
00833 BOOL Need_StoP_Cvt(TY_IDX src_idx, TY_IDX dest_idx, INTRINSIC *iop)
00834 {
00835   BOOL result = FALSE;
00836   *iop = INTRINSIC_LAST;
00837   UINT src_sz = Get_Type_Inner_Size(src_idx);
00838   UINT src_blk = Get_Type_Block_Size(src_idx);
00839   UINT dest_sz = Get_Type_Inner_Size(dest_idx);
00840   UINT dest_blk = Get_Type_Block_Size(dest_idx);
00841   
00842   if(TY_is_shared(src_idx)) {
00843     switch(TY_kind(src_idx)) {
00844     case KIND_POINTER:
00845       src_blk = Get_Type_Block_Size(TY_pointed(src_idx));
00846       break;
00847     case KIND_ARRAY:
00848       Is_True(0,("",""));
00849     }
00850   }
00851 
00852   if(TY_is_shared(dest_idx)) {
00853     switch(TY_kind(dest_idx)) {
00854     case KIND_POINTER:
00855       dest_blk = Get_Type_Block_Size(TY_pointed(dest_idx));
00856       break;
00857     case KIND_ARRAY:
00858       Is_True(0,("",""));
00859     }
00860   }
00861 
00862  //  Ty_Table[src_idx].Print(stderr);
00863 //   Ty_Table[dest_idx].Print(stderr);
00864   Is_True(((TY_kind(src_idx) == KIND_POINTER || TY_kind(src_idx) == KIND_ARRAY) &&
00865           (TY_kind(dest_idx) == KIND_POINTER || TY_kind(dest_idx) == KIND_ARRAY)) ||
00866           (TY_kind(dest_idx) == KIND_SCALAR && TY_kind(src_idx) == KIND_SCALAR),
00867           ("Incorrect type combination in StoP",""));
00868 
00869   if(TY_kind(dest_idx) == KIND_SCALAR && TY_kind(src_idx) == KIND_SCALAR)
00870     return FALSE;
00871 
00872   if(src_sz == 0) {
00873     if(dest_blk <= 1 && dest_sz) {
00874       *iop = INTRN_S_TO_P;
00875       result = TRUE;
00876     }
00877   } else {
00878     if (src_blk <= 1) {
00879       if(dest_sz == 0 || dest_blk > 1) {
00880         *iop = INTRN_P_TO_S;
00881         result = TRUE;
00882       } 
00883      
00884     } else {
00885       if (src_sz != dest_sz && dest_sz) { 
00886         result = true;
00887         if (dest_blk)
00888           *iop =  INTRN_S_RESET;
00889         else
00890           *iop = INTRN_S_TO_P;
00891       } else if (src_blk != dest_blk && dest_sz) {
00892         if (dest_blk <= 1) {
00893           *iop = INTRN_S_TO_P;
00894         } else {
00895           *iop = INTRN_S_RESET;
00896         }  
00897         result = TRUE;
00898       }   
00899     }
00900   }
00901   
00902   return result;
00903 }
00904 
00905 
00906 
00907 BOOL Types_Are_Equiv(TY_IDX idx1, TY_IDX idx2)
00908 {
00909   
00910 
00911   if (idx1 == idx2)
00912     return TRUE;
00913 
00914   // Ty_Table[idx1].Print(stderr);
00915 //   Ty_Table[idx2].Print(stderr);
00916   
00917 
00918   if(TY_kind(idx1) == KIND_POINTER) 
00919     idx1 = TY_pointed(idx1);
00920   else 
00921     if(TY_kind(idx1) == KIND_ARRAY)
00922       idx1 = Get_Inner_Array_Type(idx1);
00923   
00924   if(TY_kind(idx2) == KIND_POINTER) 
00925     idx2 = TY_pointed(idx2);
00926   else 
00927     if(TY_kind(idx2) == KIND_ARRAY)
00928       idx2 = Get_Inner_Array_Type(idx2);
00929 
00930   // Ty_Table[idx1].Print(stderr);
00931 //   Ty_Table[idx2].Print(stderr);
00932   
00933   return (idx1 == idx2) || (Get_Type_Inner_Size(idx1) == Get_Type_Inner_Size(idx2)) ;
00934   
00935 }
00936 
00937 
00938 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines