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
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
00153
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
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
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
00275 return 0;
00276 }
00277
00278
00279
00280
00281
00282
00283
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 };
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 };
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 }
00357
00358
00359
00360
00361
00362
00363
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
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,
00405 Adjust_Field_Offset(idx, field_id));
00406 field_id++;
00407 } while (!FLD_last_field(fiter) && ++fiter != last);
00408
00409
00410
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
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
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522 return off;
00523 }
00524
00525
00526
00527 void Verify_Upc_Metadata() {
00528 Is_True( shared_ptr_idx
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
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
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
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
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,
00694 char *hmem_name, UINT hmem_size)
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
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
00754
00755
00756 }
00757
00758
00759
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
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
00863
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
00915
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
00931
00932
00933 return (idx1 == idx2) || (Get_Type_Inner_Size(idx1) == Get_Type_Inner_Size(idx2)) ;
00934
00935 }
00936
00937
00938