Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
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