00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include <values.h>
00054 #include "defs.h"
00055 #include "errors.h"
00056 extern "C" {
00057 #include "gnu_config.h"
00058 }
00059 #ifdef KEY // get HW_WIDE_INT for flags.h
00060 #include "gnu/hwint.h"
00061 #endif
00062 extern "C" {
00063 #include "gnu/flags.h"
00064 #include "gnu/system.h"
00065 #include "gnu/tree.h"
00066 #include "cp-tree.h"
00067 }
00068 #undef TARGET_PENTIUM // hack around macro definition in gnu
00069 #include "symtab.h"
00070 #include "strtab.h"
00071 #include "wn.h"
00072 #include "wfe_expr.h"
00073 #include "wfe_decl.h"
00074 #include "wfe_misc.h"
00075 #include "wfe_dst.h"
00076 #include "ir_reader.h"
00077 #include "tree_symtab.h"
00078 #ifdef KEY
00079 #include "wfe_stmt.h"
00080 #include <map>
00081 #endif
00082 #include "tree_cmp.h"
00083
00084 #include <ext/hash_map>
00085 using __gnu_cxx::hash_map;
00086 typedef struct {
00087 size_t operator()(void* p) const { return reinterpret_cast<size_t>(p); }
00088 } void_ptr_hash;
00089
00090 extern INT pstatic_as_global;
00091
00092 extern FILE *tree_dump_file;
00093 extern void Push_Deferred_Function(tree);
00094
00095 #ifdef KEY
00096 extern void WFE_add_pragma_to_enclosing_regions (WN_PRAGMA_ID, ST *);
00097
00098
00099 std::multimap<tree, tree> duplicate_of;
00100 void
00101 add_duplicates (tree newdecl, tree olddecl)
00102 {
00103 duplicate_of.insert (pair<tree, tree>(newdecl, olddecl));
00104 duplicate_of.insert (pair<tree, tree>(olddecl, newdecl));
00105 }
00106
00107
00108 void
00109 erase_duplicates (tree decl)
00110 {
00111 int i, j;
00112 int count = duplicate_of.count (decl);
00113
00114 for (i=0; i<count; i++) {
00115 std::multimap<tree, tree>::iterator iter = duplicate_of.find(decl);
00116 tree t = (*iter).second;
00117
00118
00119 int count2 = duplicate_of.count(t);
00120 for (j=0; j<count2; j++) {
00121 std::multimap<tree, tree>::iterator iter2 = duplicate_of.find(t);
00122 tree t2 = (*iter2).second;
00123 if (t2 == decl) {
00124 duplicate_of.erase (iter2);
00125 }
00126 }
00127
00128
00129 duplicate_of.erase (iter);
00130 }
00131 }
00132
00133 static ST*
00134 get_duplicate_st (tree decl)
00135 {
00136 int count = duplicate_of.count (decl);
00137
00138 for (int i=0; i<count; ++i) {
00139 std::multimap<tree, tree>::iterator iter = duplicate_of.find(decl);
00140 tree t = (*iter).second;
00141
00142
00143 if (TREE_CODE(t) == FUNCTION_DECL &&
00144 DECL_NAME(t) == DECL_NAME(decl) &&
00145 DECL_ASSEMBLER_NAME_SET_P(t) == DECL_ASSEMBLER_NAME_SET_P(decl) &&
00146 (!DECL_ASSEMBLER_NAME_SET_P(t) ||
00147 DECL_ASSEMBLER_NAME(t) == DECL_ASSEMBLER_NAME(decl))) {
00148
00149 ST *st = DECL_ST(t);
00150 if (st != NULL)
00151 return st;
00152 }
00153 duplicate_of.erase (iter);
00154 }
00155 return NULL;
00156 }
00157 #endif
00158
00159 static char*
00160 Get_Name (tree node)
00161 {
00162 static UINT anon_num = 0;
00163 static char buf[64];
00164
00165 if (node == NULL) {
00166 ++anon_num;
00167 sprintf(buf, ".anonymous.%d", anon_num);
00168 return buf;
00169 }
00170 else if (TREE_CODE (node) == IDENTIFIER_NODE)
00171 return ((char *) IDENTIFIER_POINTER (node));
00172 else if (TREE_CODE (node) == TYPE_DECL)
00173
00174 return ((char *) IDENTIFIER_POINTER (DECL_NAME (node)));
00175 else
00176 FmtAssert(FALSE, ("Get_Name unexpected tree"));
00177 return NULL;
00178 }
00179 #ifdef TARG_SL
00180
00181
00182 TYPE_ID
00183 Get_Mtype_For_Integer_Type(tree type_tree, INT64 tsize)
00184 {
00185 TYPE_ID mtype;
00186 switch(tsize) {
00187 case 1:
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 mtype = MTYPE_I1;
00214 break;
00215 case 2:
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 mtype = MTYPE_I2;
00228 break;
00229 case 4:
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 mtype = MTYPE_I4;
00242 break;
00243 case 8:
00244 #if 0
00245 error("Don't support 8 bytes types now");
00246 #else
00247 DevWarn("8 byte types being used");
00248 mtype = MTYPE_I8;
00249 #endif
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 break;
00262 }
00263 return mtype;
00264 }
00265 #endif
00266
00267 static void
00268 dump_field(tree field)
00269 {
00270 printf("%s: ", Get_Name(DECL_NAME(field)));
00271 printf("%d\n", DECL_FIELD_ID(field));
00272 }
00273
00274
00275 tree
00276 next_real_or_virtual_field (tree type_tree, tree field)
00277 {
00278 static bool real_field = true;
00279 #ifdef KEY
00280 static tree prev_field = NULL_TREE;
00281
00282
00283
00284
00285 if (field != prev_field)
00286 real_field = true;
00287
00288 if (field == TYPE_VFIELD(type_tree))
00289 real_field = false;
00290
00291 if (TREE_CHAIN(field))
00292 return (prev_field = TREE_CHAIN(field));
00293
00294 if (real_field && TYPE_VFIELD(type_tree)) {
00295 real_field = false;
00296 return (prev_field = TYPE_VFIELD(type_tree));
00297 }
00298
00299 real_field = true;
00300 return (prev_field = NULL_TREE);
00301
00302 #else
00303
00304 if (field == TYPE_VFIELD(type_tree))
00305 real_field = false;
00306
00307 if (TREE_CHAIN(field))
00308 return TREE_CHAIN(field);
00309
00310 if (real_field && TYPE_VFIELD(type_tree)) {
00311 real_field = false;
00312 return TYPE_VFIELD(type_tree);
00313 }
00314
00315 real_field = true;
00316 return NULL_TREE;
00317 #endif // KEY
00318 }
00319
00320 static void
00321 Do_Base_Types (tree type_tree)
00322 {
00323 tree binfo = TYPE_BINFO(type_tree);
00324 tree basetypes = binfo ? BINFO_BASETYPES(binfo) : 0;
00325 INT32 i;
00326 if (basetypes)
00327 for (i = 0; i < TREE_VEC_LENGTH(basetypes); ++i)
00328 (void) Get_TY (BINFO_TYPE(TREE_VEC_ELT(basetypes, i)));
00329 }
00330
00331 size_t
00332 Roundup (size_t offset, int alignment)
00333 {
00334 return (offset % alignment) ? offset + alignment - offset % alignment
00335 : offset;
00336 }
00337
00338 size_t
00339 Type_Size_Without_Vbases (tree type_tree)
00340 {
00341 tree field;
00342 tree last_field_decl = 0;
00343
00344 for (field = TYPE_FIELDS(type_tree);
00345 field;
00346 field = next_real_or_virtual_field (type_tree, field)) {
00347 if (TREE_CODE(field) == FIELD_DECL)
00348 last_field_decl = field;
00349 }
00350
00351 if (last_field_decl == 0)
00352 return 0;
00353
00354 return
00355 Get_Integer_Value (DECL_FIELD_OFFSET(last_field_decl)) +
00356 Get_Integer_Value (DECL_FIELD_BIT_OFFSET(last_field_decl)) / BITSPERBYTE +
00357 Get_Integer_Value (DECL_SIZE(last_field_decl)) / BITSPERBYTE;
00358 }
00359
00360 bool
00361 is_empty_base_class (tree type_tree)
00362 {
00363 tree field = TYPE_FIELDS(type_tree);
00364 return TREE_CODE(field) == TYPE_DECL && TREE_CHAIN(field) == 0;
00365 }
00366
00367
00368 extern TY_IDX
00369 Create_TY_For_Tree (tree type_tree, TY_IDX idx)
00370 {
00371
00372 if(TREE_CODE(type_tree) == ERROR_MARK)
00373 return idx;
00374
00375 TY_IDX orig_idx = idx;
00376 if(TREE_CODE_CLASS(TREE_CODE(type_tree)) != 't') {
00377 DevWarn("Bad tree class passed to Create_TY_For_Tree %c",
00378 TREE_CODE_CLASS(TREE_CODE(type_tree)));
00379 return idx;
00380 }
00381
00382 #ifdef KEY
00383 UINT align = TYPE_ALIGN(type_tree) / BITSPERBYTE;
00384 #endif
00385
00386 if (TYPE_NAME(type_tree) &&
00387 idx == 0 &&
00388 (TREE_CODE(type_tree) == RECORD_TYPE ||
00389 TREE_CODE(type_tree) == UNION_TYPE) &&
00390 TREE_CODE(TYPE_NAME(type_tree)) == TYPE_DECL &&
00391 TYPE_MAIN_VARIANT(type_tree) != type_tree) {
00392 idx = Get_TY (TYPE_MAIN_VARIANT(type_tree));
00393 if (TYPE_READONLY(type_tree))
00394 Set_TY_is_const (idx);
00395 if (TYPE_VOLATILE(type_tree))
00396 Set_TY_is_volatile (idx);
00397 #ifdef KEY
00398 if (TYPE_RESTRICT(type_tree))
00399 Set_TY_is_restrict (idx);
00400 Set_TY_align (idx, align);
00401 #endif
00402 TYPE_TY_IDX(type_tree) = idx;
00403 if(Debug_Level >= 2) {
00404 DST_INFO_IDX dst = Create_DST_type_For_Tree(type_tree,
00405 idx,orig_idx);
00406 TYPE_DST_IDX(type_tree) = dst;
00407 }
00408 TYPE_FIELD_IDS_USED(type_tree) =
00409 TYPE_FIELD_IDS_USED(TYPE_MAIN_VARIANT(type_tree));
00410 return idx;
00411 }
00412
00413 TYPE_ID mtype;
00414 INT64 tsize;
00415 BOOL variable_size = FALSE;
00416 tree type_size = TYPE_SIZE(type_tree);
00417 #ifndef KEY
00418 UINT align = TYPE_ALIGN(type_tree) / BITSPERBYTE;
00419 #endif
00420 if (type_size == NULL) {
00421
00422
00423 FmtAssert(TREE_CODE(type_tree) == ARRAY_TYPE
00424 || TREE_CODE(type_tree) == ENUMERAL_TYPE
00425 || TREE_CODE(type_tree) == UNION_TYPE
00426 || TREE_CODE(type_tree) == RECORD_TYPE
00427 || TREE_CODE(type_tree) == LANG_TYPE
00428 || TREE_CODE(type_tree) == VOID_TYPE,
00429 ("Create_TY_For_Tree: type_size NULL for non ARRAY/RECORD/VOID, type is %d",
00430 (int) TREE_CODE(type_tree)));
00431 tsize = 0;
00432 }
00433 else {
00434 if (TREE_CODE(type_size) != INTEGER_CST) {
00435 if (TREE_CODE(type_tree) == ARRAY_TYPE)
00436 DevWarn ("Encountered VLA at line %d", lineno);
00437 else
00438 Fail_FmtAssertion ("VLA at line %d not currently implemented", lineno);
00439 variable_size = TRUE;
00440 tsize = 0;
00441 }
00442 else
00443 #ifdef KEY // bug 3045
00444 tsize = (Get_Integer_Value(type_size) + BITSPERBYTE - 1)
00445 / BITSPERBYTE;
00446 #else
00447 tsize = Get_Integer_Value(type_size) / BITSPERBYTE;
00448 #endif
00449 }
00450 switch (TREE_CODE(type_tree)) {
00451 case VOID_TYPE:
00452 case LANG_TYPE:
00453 idx = MTYPE_To_TY (MTYPE_V);
00454 break;
00455 case BOOLEAN_TYPE:
00456 case INTEGER_TYPE:
00457 switch (tsize) {
00458 case 1:
00459 #ifdef TARG_SL
00460 mtype = Get_Mtype_For_Integer_Type(type_tree, tsize);
00461 #else
00462 mtype = MTYPE_I1;
00463 #endif
00464 break;
00465 case 2:
00466 #ifdef TARG_SL
00467 mtype = Get_Mtype_For_Integer_Type(type_tree, tsize);
00468 #else
00469 mtype = MTYPE_I2;
00470 #endif
00471 break;
00472
00473 case 4:
00474 #ifdef TARG_SL
00475 mtype = Get_Mtype_For_Integer_Type(type_tree, tsize);
00476 #else
00477 mtype = MTYPE_I4;
00478 #endif
00479 break;
00480
00481 case 8:
00482 #ifdef TARG_SL
00483 mtype = Get_Mtype_For_Integer_Type(type_tree, tsize);
00484 #else
00485 mtype = MTYPE_I8;
00486 #endif
00487 break;
00488
00489 #if !defined(TARG_X8664) && !defined(TARG_MIPS) && !defined(TARG_IA64) || defined(TARG_SL)
00490 #ifdef _LP64
00491 case 16: mtype = MTYPE_I8; break;
00492 #endif
00493 #else
00494
00495
00496
00497
00498 case 16: mtype = MTYPE_I8; break;
00499 #endif
00500 default: FmtAssert(FALSE,
00501 ("Get_TY unexpected size %d", tsize));
00502 }
00503 if (TREE_UNSIGNED(type_tree)) {
00504 mtype = MTYPE_complement(mtype);
00505 }
00506 #ifdef KEY
00507 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (type_tree)))
00508 {
00509
00510
00511 TY &ty = New_TY (idx);
00512 TY_Init (ty, tsize, KIND_SCALAR, mtype,
00513 Save_Str(Get_Name(TYPE_NAME(type_tree))) );
00514 Set_TY_no_ansi_alias (ty);
00515 } else
00516 #endif
00517 idx = MTYPE_To_TY (mtype);
00518 #ifdef TARG_X8664
00519
00520
00521
00522 if( TARGET_64BIT )
00523 #endif // TARG_X8664
00524 Set_TY_align (idx, align);
00525 break;
00526 case CHAR_TYPE:
00527 mtype = (TREE_UNSIGNED(type_tree) ? MTYPE_U1 : MTYPE_I1);
00528 idx = MTYPE_To_TY (mtype);
00529 break;
00530 case ENUMERAL_TYPE:
00531 mtype = (TREE_UNSIGNED(type_tree) ? MTYPE_U4 : MTYPE_I4);
00532 #ifdef KEY
00533
00534 if( tsize == 8 ){
00535 mtype = (TREE_UNSIGNED(type_tree) ? MTYPE_U8 : MTYPE_I8);
00536 }
00537 #endif
00538 idx = MTYPE_To_TY (mtype);
00539 break;
00540 case REAL_TYPE:
00541 switch (tsize) {
00542 case 4: mtype = MTYPE_F4; break;
00543 case 8: mtype = MTYPE_F8; break;
00544 #if defined(TARG_IA64)
00545 case 12:
00546 case 16: mtype = MTYPE_F10; break;
00547 #elif defined(TARG_MIPS) || defined(TARG_IA32) || defined(TARG_X8664)
00548 case 12:
00549 case 16: mtype = MTYPE_FQ; break;
00550 #else
00551 case 16: mtype = MTYPE_F16; break;
00552 #endif
00553 default: FmtAssert(FALSE, ("Get_TY unexpected size"));
00554 }
00555 idx = MTYPE_To_TY (mtype);
00556 break;
00557 case COMPLEX_TYPE:
00558 switch (tsize) {
00559 case 8: mtype = MTYPE_C4; break;
00560 case 16: mtype = MTYPE_C8; break;
00561 #if defined(TARG_IA32) || defined(TARG_X8664)
00562 case 24: mtype = MTYPE_CQ; break;
00563 #endif
00564 #if defined(TARG_IA64)
00565 case 32: mtype = MTYPE_C10; break;
00566 #else
00567 case 32: mtype = MTYPE_CQ; break;
00568 #endif
00569 default: FmtAssert(FALSE, ("Get_TY unexpected size"));
00570 }
00571 idx = MTYPE_To_TY (mtype);
00572 break;
00573 case POINTER_TYPE:
00574 if (TYPE_PTRMEM_P(type_tree)) {
00575
00576 idx = Be_Type_Tbl(Pointer_Size == 8 ? MTYPE_I8 : MTYPE_I4);
00577 break;
00578 }
00579
00580 case REFERENCE_TYPE:
00581 idx = Make_Pointer_Type (Get_TY (TREE_TYPE(type_tree)));
00582 Set_TY_align (idx, align);
00583 break;
00584 case ARRAY_TYPE:
00585 {
00586 TY &ty = New_TY (idx);
00587 TY_Init (ty, tsize, KIND_ARRAY, MTYPE_M,
00588 Save_Str(Get_Name(TYPE_NAME(type_tree))) );
00589 Set_TY_etype (ty, Get_TY (TREE_TYPE(type_tree)));
00590 Set_TY_align (idx, TY_align(TY_etype(ty)));
00591 if (TYPE_ANONYMOUS_P(type_tree) || TYPE_NAME(type_tree) == NULL)
00592 Set_TY_anonymous(ty);
00593
00594
00595 ARB_HANDLE arb = New_ARB ();
00596 ARB_Init (arb, 0, 0, 0);
00597 Set_TY_arb (ty, arb);
00598 Set_ARB_first_dimen (arb);
00599 Set_ARB_last_dimen (arb);
00600 Set_ARB_dimension (arb, 1);
00601 if (TYPE_SIZE(TREE_TYPE(type_tree)) == 0)
00602 break;
00603 if (TREE_CODE(TYPE_SIZE(TREE_TYPE(type_tree))) == INTEGER_CST) {
00604 Set_ARB_const_stride (arb);
00605 Set_ARB_stride_val (arb,
00606 Get_Integer_Value (TYPE_SIZE(TREE_TYPE(type_tree)))
00607 / BITSPERBYTE);
00608 }
00609 else {
00610 WN *swn;
00611 swn = WFE_Expand_Expr (TYPE_SIZE(TREE_TYPE(type_tree)));
00612 if (WN_opcode (swn) == OPC_U4I4CVT ||
00613 WN_opcode (swn) == OPC_U8I8CVT) {
00614 swn = WN_kid0 (swn);
00615 }
00616 #ifdef KEY
00617
00618
00619
00620
00621 if (WN_operator (swn) != OPR_LDID) {
00622 TY_IDX ty_idx =
00623 Get_TY (TREE_TYPE (type_size));
00624 TYPE_ID mtype = TY_mtype (ty_idx);
00625 ST *st;
00626 st = Gen_Temp_Symbol (ty_idx, "__save_expr");
00627 WFE_add_pragma_to_enclosing_regions (WN_PRAGMA_LOCAL, st);
00628 WFE_Set_ST_Addr_Saved (swn);
00629 swn = WN_Stid (mtype, 0, st, ty_idx, swn);
00630 WFE_Stmt_Append (swn, Get_Srcpos());
00631 swn = WN_Ldid (mtype, 0, st, ty_idx);
00632 }
00633 #endif
00634 FmtAssert (WN_operator (swn) == OPR_LDID,
00635 ("stride operator for VLA not LDID"));
00636 ST *st = WN_st (swn);
00637 TY_IDX ty_idx = ST_type (st);
00638 WN *wn = WN_CreateXpragma (WN_PRAGMA_COPYIN_BOUND,
00639 (ST_IDX) NULL, 1);
00640 WN_kid0 (wn) = WN_Ldid (TY_mtype (ty_idx), 0, st, ty_idx);
00641 WFE_Stmt_Append (wn, Get_Srcpos());
00642 Clear_ARB_const_stride (arb);
00643 Set_ARB_stride_var (arb, (ST_IDX) ST_st_idx (st));
00644 }
00645 Set_ARB_const_lbnd (arb);
00646 Set_ARB_lbnd_val (arb, 0);
00647 if (type_size) {
00648 #ifdef KEY
00649
00650 if (!TYPE_MAX_VALUE (TYPE_DOMAIN (type_tree))) {
00651 Set_ARB_const_ubnd (arb);
00652 Set_ARB_ubnd_val (arb, 0xffffffff);
00653 } else
00654 #endif
00655 if (TREE_CODE(TYPE_MAX_VALUE (TYPE_DOMAIN (type_tree))) ==
00656 INTEGER_CST) {
00657 Set_ARB_const_ubnd (arb);
00658 Set_ARB_ubnd_val (arb, Get_Integer_Value (
00659 TYPE_MAX_VALUE (TYPE_DOMAIN (type_tree)) ));
00660 }
00661 else {
00662 WN *uwn = WFE_Expand_Expr (TYPE_MAX_VALUE (TYPE_DOMAIN (type_tree)) );
00663 if (WN_opcode (uwn) == OPC_U4I4CVT ||
00664 WN_opcode (uwn) == OPC_U8I8CVT) {
00665 uwn = WN_kid0 (uwn);
00666 }
00667 ST *st;
00668 TY_IDX ty_idx;
00669 WN *wn;
00670 if (WN_operator (uwn) != OPR_LDID) {
00671 ty_idx = Get_TY (TREE_TYPE (TYPE_MAX_VALUE (TYPE_DOMAIN (type_tree)) ) );
00672 st = Gen_Temp_Symbol (ty_idx, "__vla_bound");
00673 #ifdef KEY
00674 WFE_add_pragma_to_enclosing_regions (WN_PRAGMA_LOCAL, st);
00675 #endif
00676 wn = WN_Stid (TY_mtype (ty_idx), 0, st, ty_idx, uwn);
00677 WFE_Stmt_Append (wn, Get_Srcpos());
00678 }
00679 else {
00680 st = WN_st (uwn);
00681 ty_idx = ST_type (st);
00682 }
00683 wn = WN_CreateXpragma (WN_PRAGMA_COPYIN_BOUND, (ST_IDX) NULL, 1);
00684 WN_kid0 (wn) = WN_Ldid (TY_mtype (ty_idx), 0, st, ty_idx);
00685 WFE_Stmt_Append (wn, Get_Srcpos());
00686 Clear_ARB_const_ubnd (arb);
00687 Set_ARB_ubnd_var (arb, ST_st_idx (st));
00688 }
00689 }
00690 else {
00691 Clear_ARB_const_ubnd (arb);
00692 Set_ARB_ubnd_val (arb, 0);
00693 }
00694 if (variable_size) {
00695 WN *swn, *wn;
00696 swn = WFE_Expand_Expr (type_size);
00697 if (TY_size(TY_etype(ty))) {
00698 if (WN_opcode (swn) == OPC_U4I4CVT ||
00699 WN_opcode (swn) == OPC_U8I8CVT) {
00700 swn = WN_kid0 (swn);
00701 }
00702 #ifdef KEY
00703
00704
00705
00706
00707 if (WN_operator (swn) != OPR_LDID) {
00708 TY_IDX ty_idx =
00709 Get_TY (TREE_TYPE (type_size));
00710 TYPE_ID mtype = TY_mtype (ty_idx);
00711 ST *st;
00712 st = Gen_Temp_Symbol (ty_idx, "__save_expr");
00713 WFE_add_pragma_to_enclosing_regions (WN_PRAGMA_LOCAL, st);
00714 WFE_Set_ST_Addr_Saved (swn);
00715 swn = WN_Stid (mtype, 0, st, ty_idx, swn);
00716 WFE_Stmt_Append (swn, Get_Srcpos());
00717 swn = WN_Ldid (mtype, 0, st, ty_idx);
00718 }
00719 #endif
00720 FmtAssert (WN_operator (swn) == OPR_LDID,
00721 ("size operator for VLA not LDID"));
00722 ST *st = WN_st (swn);
00723 TY_IDX ty_idx = ST_type (st);
00724 TYPE_ID mtype = TY_mtype (ty_idx);
00725 swn = WN_Div (mtype, swn, WN_Intconst (mtype, BITSPERBYTE));
00726 wn = WN_Stid (mtype, 0, st, ty_idx, swn);
00727 WFE_Stmt_Append (wn, Get_Srcpos());
00728 }
00729 }
00730 }
00731 break;
00732 case RECORD_TYPE:
00733 case UNION_TYPE:
00734 {
00735
00736 TY &ty = (idx == TY_IDX_ZERO) ? New_TY(idx) : Ty_Table[idx];
00737 #ifdef KEY
00738
00739
00740 if (Debug_Level >= 2)
00741 defer_DST_type(type_tree, idx, orig_idx);
00742
00743
00744
00745 if (tsize != 0 &&
00746
00747
00748 TYPE_LANG_SPECIFIC(type_tree) &&
00749
00750 CLASSTYPE_AS_BASE(type_tree) &&
00751 CLASSTYPE_SIZE(type_tree) &&
00752 is_empty_class(type_tree))
00753 tsize = 0;
00754 #endif // KEY
00755
00756
00757
00758
00759
00760
00761 if (TYPE_MAIN_VARIANT(type_tree) != type_tree)
00762 TY_Init(ty, tsize, KIND_STRUCT, MTYPE_M,
00763 Save_Str(Get_Name(TYPE_NAME(TYPE_MAIN_VARIANT(type_tree)))));
00764 else
00765 TY_Init (ty, tsize, KIND_STRUCT, MTYPE_M,
00766 Save_Str(Get_Name(TYPE_NAME(type_tree))) );
00767 if (TYPE_ANONYMOUS_P(type_tree) || TYPE_NAME(type_tree) == NULL)
00768 Set_TY_anonymous(ty);
00769 if (TREE_CODE(type_tree) == UNION_TYPE) {
00770 Set_TY_is_union(idx);
00771 }
00772
00773 #ifdef KEY
00774 if (aggregate_value_p(type_tree)) {
00775 Set_TY_return_in_mem(idx);
00776 }
00777 #endif
00778 if (align == 0) align = 1;
00779 Set_TY_align (idx, align);
00780
00781 TYPE_TY_IDX(type_tree) = idx;
00782 Do_Base_Types (type_tree);
00783
00784
00785
00786 for (tree field = TYPE_FIELDS (type_tree);
00787 field;
00788 field = next_real_or_virtual_field(type_tree, field))
00789 if (TREE_CODE(field) == TYPE_DECL ||
00790 TREE_CODE(field) == FIELD_DECL) {
00791 tree field_type = TREE_TYPE(field);
00792 if ((TREE_CODE(field_type) == RECORD_TYPE ||
00793 TREE_CODE(field_type) == UNION_TYPE) &&
00794 field_type != type_tree) {
00795 #ifdef KEY
00796
00797
00798
00799
00800 if (TREE_CODE(field) == TYPE_DECL)
00801 defer_decl(field_type);
00802 else
00803 #endif
00804 Get_TY(field_type);
00805 }
00806 }
00807 #ifdef KEY // Defer expansion of static vars until all the fields in
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825 else if (TREE_CODE(field) == VAR_DECL)
00826 defer_decl(field);
00827 #else
00828 else if (TREE_CODE(field) == VAR_DECL)
00829 WFE_Expand_Decl(field);
00830 #endif
00831 else if (TREE_CODE(field) == TEMPLATE_DECL)
00832 WFE_Expand_Decl(field);
00833
00834
00835 Set_TY_fld (ty, FLD_HANDLE());
00836 FLD_IDX first_field_idx = Fld_Table.Size ();
00837 tree field;
00838 tree method = TYPE_METHODS(type_tree);
00839 FLD_HANDLE fld;
00840 INT32 next_field_id = 1;
00841 hash_map <tree, tree, void_ptr_hash> anonymous_base;
00842
00843
00844
00845
00846 INT32 offset = 0;
00847 INT32 anonymous_fields = 0;
00848 #ifndef KEY // g++'s class.c already laid out the base types. Bug 11622.
00849 if (TYPE_BINFO(type_tree) &&
00850 BINFO_BASETYPES(TYPE_BINFO(type_tree))) {
00851 tree basetypes = BINFO_BASETYPES(TYPE_BINFO(type_tree));
00852 INT32 i;
00853 for (i = 0; i < TREE_VEC_LENGTH(basetypes); ++i) {
00854 tree binfo = TREE_VEC_ELT(basetypes, i);
00855 tree basetype = BINFO_TYPE(binfo);
00856 offset = Roundup (offset,
00857 TYPE_ALIGN(basetype) / BITSPERBYTE);
00858 if (!is_empty_base_class(basetype) ||
00859 !TREE_VIA_VIRTUAL(binfo)) {
00860 ++next_field_id;
00861 ++anonymous_fields;
00862 next_field_id += TYPE_FIELD_IDS_USED(basetype);
00863 fld = New_FLD();
00864 FLD_Init (fld, Save_Str(Get_Name(0)),
00865 Get_TY(basetype), offset);
00866 offset += Type_Size_Without_Vbases (basetype);
00867
00868
00869
00870
00871 Set_FLD_is_anonymous(fld);
00872 Set_FLD_is_base_class(fld);
00873 anonymous_base.insert(CLASSTYPE_AS_BASE(basetype));
00874 #ifdef KEY
00875
00876
00877
00878
00879
00880 if (offset > tsize)
00881 {
00882 tsize = offset;
00883 Set_TY_size (ty, tsize);
00884 }
00885 #endif // KEY
00886 }
00887 }
00888 }
00889 #endif
00890
00891
00892 if (TYPE_BINFO(type_tree) && BINFO_BASETYPES(TYPE_BINFO(type_tree))) {
00893 tree basetypes = BINFO_BASETYPES(TYPE_BINFO(type_tree));
00894 INT32 i;
00895 for (i = 0; i < TREE_VEC_LENGTH(basetypes); ++i) {
00896 tree basetype = BINFO_TYPE(TREE_VEC_ELT(basetypes, i));
00897 anonymous_base[CLASSTYPE_AS_BASE(basetype)] = basetype;
00898 }
00899 }
00900
00901 for (field = TYPE_FIELDS(type_tree);
00902 field;
00903 field = next_real_or_virtual_field(type_tree, field) )
00904 {
00905 if (TREE_CODE(field) == TYPE_DECL) {
00906 continue;
00907 }
00908 if (TREE_CODE(field) == CONST_DECL) {
00909
00910
00911 static BOOL once_is_enough=FALSE;
00912 if (!once_is_enough) {
00913 DevWarn ("got CONST_DECL in field list");
00914 once_is_enough=TRUE;
00915 }
00916 continue;
00917 }
00918 if (TREE_CODE(field) == VAR_DECL) {
00919 continue;
00920 }
00921 if (TREE_CODE(field) == TEMPLATE_DECL) {
00922 continue;
00923 }
00924 DECL_FIELD_ID(field) = next_field_id;
00925 next_field_id +=
00926 TYPE_FIELD_IDS_USED(TREE_TYPE(field)) + 1;
00927 fld = New_FLD ();
00928 FLD_Init (fld, Save_Str(Get_Name(DECL_NAME(field))),
00929 0,
00930 Get_Integer_Value(DECL_FIELD_OFFSET(field)) +
00931 Get_Integer_Value(DECL_FIELD_BIT_OFFSET(field))
00932 / BITSPERBYTE);
00933 if (DECL_NAME(field) == NULL)
00934 Set_FLD_is_anonymous(fld);
00935 if (anonymous_base.find(TREE_TYPE(field)) != anonymous_base.end()) {
00936 Set_FLD_is_base_class(fld);
00937
00938 tree base_class = anonymous_base[TREE_TYPE(field)];
00939 Set_FLD_type(fld, Get_TY(base_class));
00940 }
00941 }
00942
00943 TYPE_FIELD_IDS_USED(type_tree) = next_field_id - 1;
00944 FLD_IDX last_field_idx = Fld_Table.Size () - 1;
00945 if (last_field_idx >= first_field_idx) {
00946 Set_TY_fld (ty, FLD_HANDLE (first_field_idx));
00947 Set_FLD_last_field (FLD_HANDLE (last_field_idx));
00948 }
00949
00950
00951
00952 fld = TY_fld(ty);
00953 while (anonymous_fields--)
00954 fld = FLD_next(fld);
00955
00956 for (field = TYPE_FIELDS(type_tree);
00957
00958
00959 field && fld.Entry();
00960 field = next_real_or_virtual_field(type_tree, field))
00961 {
00962 #ifdef KEY
00963 const int FLD_BIT_FIELD_SIZE = 64;
00964 #endif
00965 if (TREE_CODE(field) == TYPE_DECL)
00966 continue;
00967 if (TREE_CODE(field) == CONST_DECL)
00968 continue;
00969 if (TREE_CODE(field) == VAR_DECL)
00970 continue;
00971 if (TREE_CODE(field) == TEMPLATE_DECL)
00972 continue;
00973 #ifdef KEY
00974
00975
00976
00977
00978 if (TREE_CODE(TREE_TYPE(field)) == POINTER_TYPE) {
00979
00980
00981 TY_IDX p_idx =
00982 Make_Pointer_Type(MTYPE_To_TY(MTYPE_U8),
00983 FALSE);
00984 Set_FLD_type(fld, p_idx);
00985 defer_field(field, fld);
00986 fld = FLD_next(fld);
00987 continue;
00988 }
00989 #endif
00990 if (anonymous_base.find(TREE_TYPE(field)) == anonymous_base.end()) {
00991 TY_IDX fty_idx = Get_TY(TREE_TYPE(field));
00992
00993 if ((TY_align (fty_idx) > align) || (TY_is_packed (fty_idx)))
00994 Set_TY_is_packed (ty);
00995 Set_FLD_type(fld, fty_idx);
00996 }
00997
00998 if ( ! DECL_BIT_FIELD(field)
00999 && Get_Integer_Value(DECL_SIZE(field)) > 0
01000 #ifdef KEY
01001
01002
01003 && Get_Integer_Value(DECL_SIZE(field)) <=
01004 FLD_BIT_FIELD_SIZE
01005
01006 && TY_size(Get_TY(TREE_TYPE(field))) != 0
01007 #endif
01008 && Get_Integer_Value(DECL_SIZE(field))
01009 != (TY_size(Get_TY(TREE_TYPE(field)))
01010 * BITSPERBYTE) )
01011 {
01012 #ifdef KEY
01013 FmtAssert( Get_Integer_Value(DECL_SIZE(field)) <=
01014 FLD_BIT_FIELD_SIZE,
01015 ("field size too big") );
01016 #endif
01017
01018
01019
01020
01021
01022 DevWarn("field size %lld doesn't match type size %lld",
01023 Get_Integer_Value(DECL_SIZE(field)),
01024 TY_size(Get_TY(TREE_TYPE(field)))
01025 * BITSPERBYTE );
01026 DECL_BIT_FIELD(field) = 1;
01027 }
01028 if (DECL_BIT_FIELD(field)) {
01029 Set_FLD_is_bit_field (fld);
01030
01031 Set_FLD_bofst (fld,
01032 Get_Integer_Value(
01033 DECL_FIELD_BIT_OFFSET(field))
01034 % BITSPERBYTE);
01035 Set_FLD_bsize (fld, Get_Integer_Value(
01036 DECL_SIZE(field)));
01037 }
01038 fld = FLD_next(fld);
01039 }
01040
01041 #ifndef KEY // Don't expand methods by going through TYPE_METHODS,
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061 if (!Enable_WFE_DFE) {
01062 if (cp_type_quals(type_tree) == TYPE_UNQUALIFIED) {
01063 while (method != NULL_TREE) {
01064 WFE_Expand_Decl (method);
01065 method = TREE_CHAIN(method);
01066 }
01067 }
01068 }
01069 #endif // KEY
01070 }
01071 break;
01072 case METHOD_TYPE:
01073
01074 case FUNCTION_TYPE:
01075 {
01076 tree arg;
01077 INT32 num_args;
01078 TY &ty = New_TY (idx);
01079 TY_Init (ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, 0);
01080 Set_TY_align (idx, 1);
01081 TY_IDX ret_ty_idx;
01082 TY_IDX arg_ty_idx;
01083 TYLIST tylist_idx;
01084
01085
01086
01087
01088
01089 ret_ty_idx = Get_TY(TREE_TYPE(type_tree));
01090 for (arg = TYPE_ARG_TYPES(type_tree);
01091 arg;
01092 arg = TREE_CHAIN(arg))
01093 arg_ty_idx = Get_TY(TREE_VALUE(arg));
01094
01095
01096
01097 if (!WFE_Keep_Zero_Length_Structs &&
01098 TY_mtype (ret_ty_idx) == MTYPE_M &&
01099 TY_size (ret_ty_idx) == 0) {
01100
01101 DevWarn ("function returning zero length struct at line %d", lineno);
01102 ret_ty_idx = Be_Type_Tbl (MTYPE_V);
01103 }
01104
01105 #ifdef KEY
01106
01107
01108 if (TY_return_in_mem(ret_ty_idx)) {
01109 ret_ty_idx = Be_Type_Tbl (MTYPE_V);
01110 Set_TY_return_to_param(idx);
01111 }
01112 #endif
01113 Set_TYLIST_type (New_TYLIST (tylist_idx), ret_ty_idx);
01114 Set_TY_tylist (ty, tylist_idx);
01115 for (num_args = 0, arg = TYPE_ARG_TYPES(type_tree);
01116 arg;
01117 num_args++, arg = TREE_CHAIN(arg))
01118 {
01119 arg_ty_idx = Get_TY(TREE_VALUE(arg));
01120 if (!WFE_Keep_Zero_Length_Structs &&
01121 TY_mtype (arg_ty_idx) == MTYPE_M &&
01122 TY_size (arg_ty_idx) == 0) {
01123
01124 DevWarn ("zero length struct encountered in function prototype at line %d", lineno);
01125 }
01126 else
01127 Set_TYLIST_type (New_TYLIST (tylist_idx), arg_ty_idx);
01128 }
01129 if (num_args)
01130 {
01131 Set_TY_has_prototype(idx);
01132 if (arg_ty_idx != Be_Type_Tbl(MTYPE_V))
01133 {
01134 Set_TYLIST_type (New_TYLIST (tylist_idx), 0);
01135 Set_TY_is_varargs(idx);
01136 }
01137 else
01138 Set_TYLIST_type (Tylist_Table [tylist_idx], 0);
01139 }
01140 else
01141 Set_TYLIST_type (New_TYLIST (tylist_idx), 0);
01142 }
01143 break;
01144 #ifdef TARG_X8664
01145
01146 case VECTOR_TYPE:
01147 {
01148 switch (GET_MODE_SIZE (TYPE_MODE (type_tree)))
01149 {
01150 case 8:
01151 switch (GET_MODE_UNIT_SIZE (TYPE_MODE (type_tree)))
01152 {
01153 case 1:
01154 idx = MTYPE_To_TY (MTYPE_M8I1);
01155 break;
01156 case 2:
01157 idx = MTYPE_To_TY (MTYPE_M8I2);
01158 break;
01159 case 4:
01160 if (TREE_CODE (TREE_TYPE (type_tree)) == INTEGER_TYPE) idx = MTYPE_To_TY (MTYPE_V8I4);
01161 else
01162 idx = MTYPE_To_TY (MTYPE_M8F4);
01163 break;
01164 default: Fail_FmtAssertion ("Get_TY: NYI");
01165 }
01166 break;
01167 case 16:
01168 switch (GET_MODE_UNIT_SIZE (TYPE_MODE (type_tree)))
01169 {
01170 case 1:
01171 idx = MTYPE_To_TY (MTYPE_V16I1);
01172 break;
01173 case 2:
01174 idx = MTYPE_To_TY (MTYPE_V16I2);
01175 break;
01176 case 4:
01177 if (TREE_CODE (TREE_TYPE (type_tree)) == INTEGER_TYPE) idx = MTYPE_To_TY (MTYPE_V16I4);
01178 else
01179 idx = MTYPE_To_TY (MTYPE_V16F4);
01180 break;
01181 case 8:
01182 if (TREE_CODE (TREE_TYPE (type_tree)) == INTEGER_TYPE) idx = MTYPE_To_TY (MTYPE_V16I8);
01183 else
01184 idx = MTYPE_To_TY (MTYPE_V16F8);
01185 break;
01186 default: Fail_FmtAssertion ("Get_TY: NYI");
01187 }
01188 break;
01189 default:
01190 Fail_FmtAssertion ("Get_TY: Unexpected vector type");
01191 }
01192 }
01193 break;
01194 #endif // TARG_X8664
01195 default:
01196 FmtAssert(FALSE, ("Get_TY unexpected tree_type"));
01197 }
01198 if (TYPE_READONLY(type_tree))
01199 Set_TY_is_const (idx);
01200 if (TYPE_VOLATILE(type_tree))
01201 Set_TY_is_volatile (idx);
01202 #ifdef KEY
01203 if (TYPE_RESTRICT(type_tree))
01204 Set_TY_is_restrict (idx);
01205 #endif
01206 TYPE_TY_IDX(type_tree) = idx;
01207 if(Debug_Level >= 2) {
01208 #ifdef KEY
01209
01210
01211
01212 if (TREE_CODE(type_tree) != RECORD_TYPE &&
01213 TREE_CODE(type_tree) != UNION_TYPE) {
01214
01215
01216
01217
01218 defer_DST_type(type_tree, idx, orig_idx);
01219 }
01220 #else
01221 DST_INFO_IDX dst =
01222 Create_DST_type_For_Tree(type_tree,
01223 idx,orig_idx);
01224 TYPE_DST_IDX(type_tree) = dst;
01225 #endif
01226 }
01227
01228 return idx;
01229 }
01230
01231 ST*
01232 Create_ST_For_Tree (tree decl_node)
01233 {
01234 TY_IDX ty_idx;
01235 ST* st;
01236 char *name;
01237 char tempname[32];
01238 ST_SCLASS sclass;
01239 ST_EXPORT eclass;
01240 SYMTAB_IDX level;
01241 static INT anon_count = 0;
01242 #ifdef KEY
01243 BOOL anon_st = FALSE;
01244 #endif
01245
01246 if(TREE_CODE(decl_node) == ERROR_MARK) {
01247 Fail_FmtAssertion ("Unable to handle ERROR_MARK. internal error");
01248 }
01249
01250 #ifdef KEY
01251
01252
01253
01254 if (TREE_CODE (decl_node) == FUNCTION_DECL) {
01255 st = get_duplicate_st (decl_node);
01256 if (st) {
01257 set_DECL_ST(decl_node, st);
01258 return st;
01259 }
01260 }
01261 #endif
01262
01263 #ifdef KEY
01264
01265
01266 if (TREE_CODE(decl_node) == VAR_DECL &&
01267 DECL_ASMREG(decl_node) != 0) {
01268 FmtAssert (DECL_NAME (decl_node),
01269 ("Create_ST_For_Tree: DECL_NAME null"));
01270 name = (char *) IDENTIFIER_POINTER (DECL_NAME (decl_node));
01271 } else
01272 #endif
01273 if (DECL_NAME (decl_node) && DECL_ASSEMBLER_NAME (decl_node))
01274 name = (char *) IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl_node));
01275 else {
01276 sprintf(tempname, "anon%d", ++anon_count);
01277 name = tempname;
01278 #ifdef KEY
01279 anon_st = TRUE;
01280 #endif
01281 }
01282
01283 #ifdef KEY
01284 BOOL guard_var = FALSE;
01285
01286 if (strncmp("_ZGV", name, 4) == 0) {
01287 guard_var = TRUE;
01288 }
01289 #endif
01290
01291 switch (TREE_CODE(decl_node)) {
01292
01293 case FUNCTION_DECL:
01294 {
01295 if (Enable_WFE_DFE) {
01296 tree body = DECL_SAVED_TREE(decl_node);
01297 if (DECL_THUNK_P(decl_node) &&
01298 TREE_CODE(CP_DECL_CONTEXT(decl_node)) != NAMESPACE_DECL)
01299 Push_Deferred_Function (decl_node);
01300
01301
01302
01303
01304
01305 else
01306 if (body != NULL_TREE && !DECL_EXTERNAL(decl_node) &&
01307 (DECL_TEMPLATE_INFO(decl_node) == NULL ||
01308 DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(decl_node) ||
01309 DECL_TEMPLATE_INSTANTIATED(decl_node) ||
01310 DECL_TEMPLATE_SPECIALIZATION(decl_node))) {
01311 Push_Deferred_Function (decl_node);
01312 }
01313 }
01314
01315 TY_IDX func_ty_idx = Get_TY(TREE_TYPE(decl_node));
01316
01317 sclass = SCLASS_EXTERN;
01318 eclass = TREE_PUBLIC(decl_node) || DECL_WEAK(decl_node) ?
01319 EXPORT_PREEMPTIBLE :
01320 EXPORT_LOCAL;
01321 level = GLOBAL_SYMTAB+1;
01322
01323 PU_IDX pu_idx;
01324 PU& pu = New_PU (pu_idx);
01325
01326 PU_Init (pu, func_ty_idx, level);
01327
01328 st = New_ST (GLOBAL_SYMTAB);
01329
01330 #ifdef KEY // Fix bug # 34, 3356
01331 char *p = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl_node));
01332 if (*p == '*')
01333 p++;
01334 ST_Init (st, Save_Str(p),
01335 CLASS_FUNC, sclass, eclass, TY_IDX (pu_idx));
01336
01337
01338 if (DECL_CONSTRUCTOR_P(decl_node) && !DECL_COPY_CONSTRUCTOR_P(decl_node))
01339 Set_PU_is_constructor(pu);
01340
01341 if (DECL_PURE_VIRTUAL_P(decl_node) || strncmp(p, "__cxa_pure_virtual", 18) == 0)
01342 Set_ST_is_pure_vfunc(st);
01343
01344 p = IDENTIFIER_POINTER (DECL_NAME (decl_node));
01345 if (!strncmp(p,"operator",8))
01346 Set_PU_is_operator(pu);
01347 #else
01348 ST_Init (st,
01349 Save_Str ( IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl_node))),
01350 CLASS_FUNC, sclass, eclass, TY_IDX (pu_idx));
01351 #endif
01352 if (TREE_CODE(TREE_TYPE(decl_node)) == METHOD_TYPE) {
01353 Set_ST_is_method_func(st);
01354 TY_IDX base = Get_TY(TYPE_METHOD_BASETYPE(TREE_TYPE(decl_node)));
01355 Set_PU_base_class(pu, base);
01356 }
01357
01358 if (DECL_THUNK_P(decl_node) &&
01359 TREE_CODE(CP_DECL_CONTEXT(decl_node)) != NAMESPACE_DECL)
01360 Set_ST_is_weak_symbol(st);
01361 }
01362 break;
01363
01364 case PARM_DECL:
01365 case VAR_DECL:
01366 #ifdef KEY
01367 case RESULT_DECL:
01368 #endif
01369 {
01370 if (TREE_CODE(decl_node) == PARM_DECL) {
01371 sclass = SCLASS_FORMAL;
01372 eclass = EXPORT_LOCAL;
01373 level = CURRENT_SYMTAB;
01374 }
01375 else {
01376 if (DECL_CONTEXT (decl_node) == 0 ||
01377 TREE_CODE (DECL_CONTEXT (decl_node)) == NAMESPACE_DECL ||
01378 TREE_CODE (DECL_CONTEXT (decl_node)) == RECORD_TYPE ) {
01379 if (TREE_PUBLIC (decl_node)) {
01380 #ifdef KEY
01381
01382 if (DECL_EXTERNAL(decl_node) ||
01383 (DECL_LANG_SPECIFIC(decl_node) &&
01384 DECL_REALLY_EXTERN(decl_node)))
01385 #else
01386 if (DECL_EXTERNAL(decl_node))
01387 #endif
01388 sclass = SCLASS_EXTERN;
01389 else
01390 if (DECL_INITIAL(decl_node))
01391 sclass = SCLASS_UGLOBAL;
01392 else if (TREE_STATIC(decl_node)) {
01393 #ifdef KEY
01394
01395 if (flag_no_common || !DECL_COMMON (decl_node))
01396 #else
01397 if (flag_no_common)
01398 #endif
01399 sclass = SCLASS_UGLOBAL;
01400 else
01401 sclass = SCLASS_COMMON;
01402 }
01403 else
01404 sclass = SCLASS_EXTERN;
01405 #ifdef TARG_IA64
01406
01407 if (!flag_pic) {
01408 if (Use_Call_Shared_Link && Gp_Rel_Aggresive_Opt &&
01409 sclass != SCLASS_EXTERN && sclass != SCLASS_COMMON)
01410 eclass = EXPORT_PROTECTED;
01411 else
01412 eclass = EXPORT_PREEMPTIBLE;
01413 }
01414 else {
01415 eclass = EXPORT_PREEMPTIBLE;
01416 }
01417 }
01418 #else
01419 eclass = EXPORT_PREEMPTIBLE;
01420 }
01421 #endif
01422 else {
01423 sclass = SCLASS_FSTATIC;
01424 eclass = EXPORT_LOCAL;
01425 }
01426 level = GLOBAL_SYMTAB;
01427 }
01428 else {
01429 if (DECL_EXTERNAL(decl_node) || DECL_WEAK (decl_node)) {
01430 sclass = SCLASS_EXTERN;
01431 level = GLOBAL_SYMTAB;
01432 eclass = EXPORT_PREEMPTIBLE;
01433 }
01434 #ifdef KEY
01435
01436 else if (!flag_no_common && TREE_STATIC (decl_node) &&
01437 DECL_COMMON (decl_node) &&
01438 TREE_PUBLIC (decl_node)) {
01439 sclass = SCLASS_COMMON;
01440 level = GLOBAL_SYMTAB;
01441 eclass = EXPORT_PREEMPTIBLE;
01442 }
01443 #endif
01444 else {
01445 if (TREE_STATIC (decl_node)) {
01446 sclass = SCLASS_PSTATIC;
01447 if (pstatic_as_global)
01448 level = GLOBAL_SYMTAB;
01449 else
01450 level = CURRENT_SYMTAB;
01451 }
01452 else {
01453 sclass = SCLASS_AUTO;
01454 level = DECL_SYMTAB_IDX(decl_node) ?
01455 DECL_SYMTAB_IDX(decl_node) : CURRENT_SYMTAB;
01456 }
01457 eclass = EXPORT_LOCAL;
01458 }
01459 }
01460 }
01461 #ifdef KEY
01462
01463
01464
01465
01466
01467 if (guard_var) {
01468 level = GLOBAL_SYMTAB;
01469 sclass = SCLASS_UGLOBAL;
01470 eclass = EXPORT_PREEMPTIBLE;
01471 }
01472
01473
01474
01475
01476
01477 ty_idx = Get_TY (TREE_TYPE(decl_node));
01478 st = DECL_ST(decl_node);
01479 if (st)
01480 return st;
01481 st = New_ST (level);
01482 #else
01483 st = New_ST (level);
01484 ty_idx = Get_TY (TREE_TYPE(decl_node));
01485 #endif
01486 if (TY_kind (ty_idx) == KIND_ARRAY &&
01487 TREE_STATIC (decl_node) &&
01488 DECL_INITIAL (decl_node) == FALSE &&
01489 TY_size (ty_idx) == 0) {
01490 Set_TY_size (ty_idx, TY_size (Get_TY (TREE_TYPE (TREE_TYPE (decl_node)))));
01491 }
01492 #ifndef KEY
01493
01494
01495 if (TY_mtype (ty_idx) == MTYPE_M &&
01496 Aggregate_Alignment > 0 &&
01497 Aggregate_Alignment > TY_align (ty_idx))
01498 Set_TY_align (ty_idx, Aggregate_Alignment);
01499 #endif // !KEY
01500
01501 if (TREE_READONLY(decl_node))
01502 Set_TY_is_const (ty_idx);
01503 if (TREE_THIS_VOLATILE(decl_node))
01504 Set_TY_is_volatile (ty_idx);
01505 #ifdef KEY
01506
01507 if (DECL_USER_ALIGN (decl_node))
01508 Set_TY_align (ty_idx, DECL_ALIGN_UNIT (decl_node));
01509
01510
01511
01512
01513
01514 #endif // KEY
01515 ST_Init (st, Save_Str(name), CLASS_VAR, sclass, eclass, ty_idx);
01516 #ifdef KEY
01517 if (TREE_CODE (decl_node) == VAR_DECL && DECL_THREADPRIVATE (decl_node))
01518 Set_ST_is_thread_private (st);
01519 if (TREE_CODE (decl_node) == VAR_DECL && anon_st)
01520 WFE_add_pragma_to_enclosing_regions (WN_PRAGMA_LOCAL, st);
01521 if (TREE_CODE (decl_node) == VAR_DECL && DECL_THREAD_LOCAL (decl_node))
01522 Set_ST_is_thread_local (st);
01523
01524 if (DECL_SIZE_UNIT (decl_node) &&
01525 TREE_CODE (DECL_SIZE_UNIT (decl_node)) != INTEGER_CST)
01526 {
01527
01528 int idx;
01529 if (!Set_Current_Scope_Has_Alloca (idx))
01530 {
01531 ST * save_st = WFE_Alloca_0 ();
01532 Set_Current_Scope_Alloca_St (save_st, idx);
01533 }
01534 WN * size = WFE_Expand_Expr (DECL_SIZE_UNIT (decl_node));
01535
01536 ST * alloca_st = New_ST (CURRENT_SYMTAB);
01537 ST_Init (alloca_st, Save_Str (name),
01538 CLASS_VAR, SCLASS_AUTO, EXPORT_LOCAL,
01539 Make_Pointer_Type (ty_idx, FALSE));
01540 Set_ST_is_temp_var (alloca_st);
01541 Set_ST_pt_to_unique_mem (alloca_st);
01542 Set_ST_base_idx (st, ST_st_idx (alloca_st));
01543 WN *wn = WN_CreateAlloca (size);
01544 wn = WN_Stid (Pointer_Mtype, 0, alloca_st, ST_type (alloca_st), wn);
01545 WFE_Stmt_Append (wn, Get_Srcpos());
01546 Set_PU_has_alloca (Get_Current_PU());
01547
01548 Add_Current_Scope_Alloca_St (alloca_st, idx);
01549 }
01550 #endif // KEY
01551 if (TREE_CODE(decl_node) == PARM_DECL) {
01552 Set_ST_is_value_parm(st);
01553 }
01554 }
01555 break;
01556
01557 default:
01558 {
01559 Fail_FmtAssertion ("Create_ST_For_Tree: unexpected tree type");
01560 }
01561 break;
01562 }
01563
01564 #ifdef KEY
01565 set_DECL_ST(decl_node, st);
01566 #else
01567 DECL_ST(decl_node) = st;
01568 #endif
01569
01570 #ifdef KEY
01571
01572
01573
01574
01575
01576
01577
01578 if (TREE_CODE (decl_node) == VAR_DECL &&
01579 TYPE_LANG_SPECIFIC (TREE_TYPE (decl_node)) &&
01580 ANON_UNION_TYPE_P (TREE_TYPE (decl_node)))
01581 {
01582 tree members = DECL_ANON_UNION_ELEMS (decl_node);
01583 for (tree t = members; t; t = TREE_CHAIN (t))
01584 {
01585 tree var = TREE_VALUE (t);
01586 FmtAssert (TREE_CODE (var) == VAR_DECL,
01587 ("Unexpected member type in anonymous union"));
01588 set_DECL_ST (var, st);
01589 }
01590 }
01591
01592
01593
01594 if (TREE_CODE(decl_node) == VAR_DECL &&
01595 DECL_ASMREG(decl_node) != 0) {
01596 extern PREG_NUM Map_Reg_To_Preg [];
01597 int reg = DECL_ASMREG(decl_node) - 1;
01598 PREG_NUM preg = Map_Reg_To_Preg [reg];
01599 FmtAssert (preg >= 0,
01600 ("mapping register %d to preg failed\n", reg));
01601 TY_IDX ty_idx = ST_type (st);
01602 Set_TY_is_volatile (ty_idx);
01603 Set_ST_type (st, ty_idx);
01604 Set_ST_assigned_to_dedicated_preg (st);
01605 ST_ATTR_IDX st_attr_idx;
01606 ST_ATTR& st_attr = New_ST_ATTR (CURRENT_SYMTAB, st_attr_idx);
01607 ST_ATTR_Init (st_attr, ST_st_idx (st), ST_ATTR_DEDICATED_REGISTER, preg);
01608 }
01609 #endif
01610
01611 if (TREE_CODE(decl_node) == VAR_DECL &&
01612 DECL_CONTEXT(decl_node) &&
01613 TREE_CODE(DECL_CONTEXT(decl_node)) == RECORD_TYPE)
01614 Get_TY(DECL_CONTEXT(decl_node));
01615
01616 if (Enable_WFE_DFE) {
01617 if (TREE_CODE(decl_node) == VAR_DECL &&
01618 level == GLOBAL_SYMTAB &&
01619 !DECL_EXTERNAL (decl_node) &&
01620 DECL_INITIAL (decl_node)) {
01621 Push_Deferred_Function (decl_node);
01622 }
01623 }
01624
01625 if (DECL_WEAK (decl_node) &&
01626 (!DECL_EXTERNAL (decl_node)
01627 #ifdef KEY
01628
01629
01630
01631 || DECL_ALIAS_TARGET(decl_node))
01632 #endif
01633 ) {
01634 Set_ST_is_weak_symbol (st);
01635 }
01636
01637 #ifdef KEY
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652 if (make_symbols_weak) {
01653 if (eclass != EXPORT_LOCAL &&
01654 eclass != EXPORT_LOCAL_INTERNAL &&
01655
01656
01657 WEAK_WORKAROUND(st) != WEAK_WORKAROUND_dont_make_weak &&
01658
01659 !(TREE_CODE(decl_node) == FUNCTION_DECL &&
01660 DECL_BUILT_IN(decl_node))) {
01661 Set_ST_is_weak_symbol (st);
01662 WEAK_WORKAROUND(st) = WEAK_WORKAROUND_made_weak;
01663 }
01664 }
01665
01666 else if (guard_var) {
01667 Set_ST_is_weak_symbol (st);
01668 Set_ST_init_value_zero (st);
01669 Set_ST_is_initialized (st);
01670 }
01671 #endif
01672
01673 if (DECL_SECTION_NAME (decl_node)) {
01674 if (strncmp(TREE_STRING_POINTER (DECL_SECTION_NAME (decl_node)),
01675 ".gnu.linkonce.",
01676 14) != 0 ) {
01677
01678 DevWarn ("section %s specified for %s",
01679 TREE_STRING_POINTER (DECL_SECTION_NAME (decl_node)),
01680 ST_name (st));
01681 if (TREE_CODE (decl_node) == FUNCTION_DECL)
01682 level = GLOBAL_SYMTAB;
01683 ST_ATTR_IDX st_attr_idx;
01684 ST_ATTR& st_attr = New_ST_ATTR (level, st_attr_idx);
01685 ST_ATTR_Init (st_attr, ST_st_idx (st), ST_ATTR_SECTION_NAME,
01686 Save_Str (TREE_STRING_POINTER (DECL_SECTION_NAME (decl_node))));
01687 Set_ST_has_named_section (st);
01688 }
01689 else {
01690
01691 DevWarn ("Ignore %s specified for %s",
01692 TREE_STRING_POINTER (DECL_SECTION_NAME (decl_node)),
01693 ST_name (st));
01694 }
01695 }
01696
01697
01698
01699
01700
01701
01702 #if defined(TARG_SL)
01703 if(DECL_SL_MODEL_NAME(decl_node)) {
01704 if(TREE_CODE(decl_node) == VAR_DECL &&
01705 TREE_CODE(DECL_SL_MODEL_NAME(decl_node)) == STRING_CST)
01706 {
01707 if(!strcmp(TREE_STRING_POINTER(DECL_SL_MODEL_NAME(decl_node)), "small"))
01708 Set_ST_gprel(st);
01709 else if(!strcmp(TREE_STRING_POINTER(DECL_SL_MODEL_NAME(decl_node)), "large"))
01710 Set_ST_not_gprel(st);
01711 else
01712 Fail_FmtAssertion("incorrect model type for sl data model");
01713 }
01714 }
01715 #endif
01716 if(Debug_Level >= 2) {
01717 #ifdef KEY
01718
01719 if (ST_sclass(st) != SCLASS_EXTERN) {
01720
01721 add_deferred_DST_types();
01722
01723 DST_INFO_IDX dst = Create_DST_decl_For_Tree(decl_node,st);
01724 DECL_DST_IDX(decl_node) = dst;
01725 }
01726 #else
01727 DST_INFO_IDX dst = Create_DST_decl_For_Tree(decl_node,st);
01728 DECL_DST_IDX(decl_node) = dst;
01729 #endif
01730 }
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742 #ifdef TARG_SL
01743 const char* section_name;
01744 int has_assigned_section = 0;
01745 if(DECL_VBUF(decl_node))
01746 {
01747 if(DECL_V1BUF(decl_node) && TREE_CODE(decl_node) != FUNCTION_DECL
01748 && !POINTER_TYPE_P(TREE_TYPE(decl_node)))
01749 {
01750 Set_ST_in_v1buf(st);
01751 Set_ST_gprel(st);
01752 }
01753 else if(DECL_V2BUF(decl_node) && TREE_CODE(decl_node) != FUNCTION_DECL
01754 && !POINTER_TYPE_P(TREE_TYPE(decl_node)))
01755 {
01756 Set_ST_in_v2buf(st);
01757 Set_ST_gprel(st);
01758 TY_IDX st_ty_idx=ST_type(st);
01759 Set_TY_size (st_ty_idx, TY_size(st_ty_idx)*2);
01760 }
01761 else if(DECL_V4BUF(decl_node) && TREE_CODE(decl_node) != FUNCTION_DECL
01762 && !POINTER_TYPE_P(TREE_TYPE(decl_node)))
01763 {
01764 Set_ST_in_v4buf(st);
01765 Set_ST_gprel(st);
01766 TY_IDX st_ty_idx=ST_type(st);
01767 Set_TY_size (st_ty_idx, TY_size(st_ty_idx)*4);
01768 }
01769 }
01770 else if(DECL_SBUF(decl_node) && TREE_CODE(decl_node) != FUNCTION_DECL
01771 && !POINTER_TYPE_P(TREE_TYPE(decl_node))) {
01772 if(TREE_CODE(TREE_TYPE(decl_node)) == ARRAY_TYPE)
01773 {
01774 tree element_type = TREE_TYPE(decl_node);
01775 while(TREE_CODE(element_type) == ARRAY_TYPE)
01776 element_type = TREE_TYPE(element_type);
01777
01778 if(!POINTER_TYPE_P(element_type))
01779 {
01780 Set_ST_in_sbuf(st);
01781 Set_ST_gprel(st);
01782 }
01783 }
01784 else
01785 {
01786 Set_ST_in_sbuf(st);
01787 Set_ST_gprel(st);
01788 }
01789 }
01790 else if(DECL_SDRAM(decl_node) && TREE_CODE(decl_node) != FUNCTION_DECL
01791 && !POINTER_TYPE_P(TREE_TYPE(decl_node))) {
01792 Set_ST_in_sdram(st);
01793 }
01794 #endif // TARG_SL
01795
01796 return st;
01797 }
01798
01799 #ifndef EXTRA_WORD_IN_TREE_NODES
01800
01801 #include <ext/hash_map>
01802
01803 namespace {
01804
01805 using __gnu_cxx::hash_map;
01806
01807 struct ptrhash {
01808 size_t operator()(void* p) const { return reinterpret_cast<size_t>(p); }
01809 };
01810
01811 hash_map<tree, TY_IDX, ptrhash> ty_idx_map;
01812 hash_map<tree, ST*, ptrhash> st_map;
01813 hash_map<tree, SYMTAB_IDX, ptrhash> symtab_idx_map;
01814 hash_map<tree, LABEL_IDX, ptrhash> label_idx_map;
01815 hash_map<tree, ST*, ptrhash> string_st_map;
01816 hash_map<tree, BOOL, ptrhash> bool_map;
01817 hash_map<tree, INT32, ptrhash> field_id_map;
01818 hash_map<tree, INT32, ptrhash> type_field_ids_used_map;
01819 hash_map<tree, INT32, ptrhash> scope_number_map;
01820 hash_map<tree, tree, ptrhash> label_scope_map;
01821 hash_map<tree, DST_INFO_IDX,ptrhash> decl_idx_map;
01822 hash_map<tree, DST_INFO_IDX,ptrhash> decl_field_idx_map;
01823 hash_map<tree, DST_INFO_IDX,ptrhash> decl_specification_idx_map;
01824 hash_map<tree, DST_INFO_IDX,ptrhash> type_idx_map;
01825 hash_map<tree, LABEL_IDX, ptrhash> handler_label_map;
01826 hash_map<tree, DST_INFO_IDX,ptrhash> abstract_root_map;
01827 #ifdef KEY
01828
01829 hash_map<PU*, hash_map<tree, ST*, ptrhash>*, ptrhash> pu_map;
01830
01831 hash_map<tree, BOOL, ptrhash> expanded_decl_map;
01832
01833 hash_map<tree, BOOL, ptrhash> func_PU_uplevel_map;
01834 hash_map<tree, tree, ptrhash> parent_scope_map;
01835
01836
01837
01838
01839 hash_map<ST*, INT32, ptrhash> weak_workaround_map;
01840 #endif
01841 }
01842
01843 TY_IDX& TYPE_TY_IDX(tree t) { return ty_idx_map[t]; }
01844
01845 #ifdef KEY
01846 BOOL& expanded_decl(tree t) {
01847 FmtAssert (DECL_CHECK(t), ("func_expanded: not a decl"));
01848 return expanded_decl_map[t];
01849 }
01850
01851
01852 void
01853 set_DECL_ST(tree t, ST* st) {
01854
01855
01856 tree t_index;
01857 if (TREE_CODE(t) == VAR_DECL &&
01858 (DECL_CONTEXT(t) == 0 ||
01859 TREE_CODE(DECL_CONTEXT(t)) == NAMESPACE_DECL) &&
01860 DECL_NAME (t) && DECL_ASSEMBLER_NAME(t))
01861 t_index = DECL_ASSEMBLER_NAME(t);
01862 else
01863 t_index = t;
01864
01865
01866
01867
01868 if (st == (ST *) 1) {
01869 st_map[t_index] = st;
01870 return;
01871 }
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
01883
01884 if (Current_scope != 0 &&
01885 (TREE_CODE(t) == PARM_DECL ||
01886 (TREE_CODE(t) == VAR_DECL &&
01887 (ST_sclass(st) == SCLASS_AUTO ||
01888 (! pstatic_as_global &&
01889 ST_sclass(st) == SCLASS_PSTATIC))))) {
01890
01891
01892
01893
01894
01895
01896
01897
01898 if (Scope_tab[Current_scope].st != NULL) {
01899
01900 PU *pu = &Get_Current_PU();
01901 hash_map<PU*, hash_map<tree, ST*, ptrhash>*, ptrhash>::iterator it =
01902 pu_map.find(pu);
01903 if (it == pu_map.end()) {
01904
01905 pu_map[pu] = new hash_map<tree, ST*, ptrhash>;
01906 }
01907
01908 (*(pu_map[pu]))[t_index] = st;
01909 }
01910 } else {
01911 #ifdef Is_True_On
01912 if (st_map[t_index]) {
01913
01914 FmtAssert (ST_is_weak_symbol(st_map[t_index]),
01915 ("set_DECL_ST: st_map already set"));
01916 }
01917 #endif
01918
01919 st_map[t_index] = st;
01920 }
01921 }
01922
01923
01924 ST*&
01925 get_DECL_ST(tree t) {
01926 static ST *null_ST = (ST *) NULL;
01927
01928
01929 tree t_index;
01930 if (TREE_CODE(t) == VAR_DECL &&
01931 (DECL_CONTEXT(t) == 0 ||
01932 TREE_CODE(DECL_CONTEXT(t)) == NAMESPACE_DECL) &&
01933 DECL_NAME (t) && DECL_ASSEMBLER_NAME(t))
01934 t_index = DECL_ASSEMBLER_NAME(t);
01935 else
01936 t_index = t;
01937
01938
01939
01940
01941 if (Current_scope == 0)
01942 return st_map[t_index];
01943
01944
01945 if (st_map[t_index]) {
01946 return st_map[t_index];
01947 }
01948
01949
01950
01951
01952
01953 if (Scope_tab[Current_scope].st == NULL)
01954 return null_ST;
01955
01956
01957 PU *pu = &Get_Current_PU();
01958 hash_map<PU*, hash_map<tree, ST*, ptrhash>*, ptrhash>::iterator pu_map_it =
01959 pu_map.find(pu);
01960 if (pu_map_it == pu_map.end())
01961 return null_ST;
01962
01963
01964 hash_map<tree, ST*, ptrhash> *st_map = pu_map[pu];
01965 return (*st_map)[t_index];
01966 }
01967
01968 BOOL&
01969 func_PU_uplevel(tree t) {
01970 FmtAssert (TREE_CODE(t) == FUNCTION_DECL,
01971 ("func_PU_uplevel: not a FUNCTION_DECL tree node"));
01972 return func_PU_uplevel_map[t];
01973 }
01974
01975 INT32& WEAK_WORKAROUND(ST *st) { return weak_workaround_map[st]; }
01976 #else
01977
01978 ST*& DECL_ST(tree t) {
01979 if (TREE_CODE(t) == VAR_DECL &&
01980 (DECL_CONTEXT(t) == 0 ||
01981 TREE_CODE(DECL_CONTEXT(t)) == NAMESPACE_DECL) &&
01982 DECL_NAME (t) && DECL_ASSEMBLER_NAME(t))
01983 return st_map[DECL_ASSEMBLER_NAME(t)];
01984 else
01985 return st_map[t];
01986 }
01987 #endif
01988
01989 SYMTAB_IDX& DECL_SYMTAB_IDX(tree t) { return symtab_idx_map[t]; }
01990 LABEL_IDX& DECL_LABEL_IDX(tree t) { return label_idx_map[t]; }
01991 ST*& TREE_STRING_ST(tree t) { return string_st_map[t]; }
01992 BOOL& DECL_LABEL_DEFINED(tree t) { return bool_map[t]; }
01993 INT32& DECL_FIELD_ID(tree t) { return field_id_map[t]; }
01994 INT32 & TYPE_FIELD_IDS_USED(tree t) { return type_field_ids_used_map[t]; }
01995 INT32 & SCOPE_NUMBER(tree t) { return scope_number_map[t]; }
01996 #ifdef KEY
01997 tree & PARENT_SCOPE(tree t) { return parent_scope_map[t]; }
01998 #endif
01999 tree & LABEL_SCOPE(tree t) { return label_scope_map[t]; }
02000
02001
02002
02003
02004
02005
02006 DST_INFO_IDX & DECL_DST_IDX(tree t)
02007 {
02008 hash_map<tree, DST_INFO_IDX,ptrhash>::iterator it =
02009 decl_idx_map.find(t);
02010 if(it == decl_idx_map.end()) {
02011
02012 DST_INFO_IDX dsti = DST_INVALID_IDX;
02013 decl_idx_map[t] = dsti;
02014 }
02015 return decl_idx_map[t];
02016 }
02017
02018
02019
02020
02021
02022
02023
02024 DST_INFO_IDX & DECL_DST_SPECIFICATION_IDX(tree t)
02025 {
02026 hash_map<tree, DST_INFO_IDX,ptrhash>::iterator it =
02027 decl_specification_idx_map.find(t);
02028 if(it == decl_specification_idx_map.end()) {
02029
02030 DST_INFO_IDX dsti = DST_INVALID_IDX;
02031 decl_specification_idx_map[t] = dsti;
02032 }
02033 return decl_specification_idx_map[t];
02034 }
02035
02036
02037
02038
02039
02040
02041
02042
02043 DST_INFO_IDX & DECL_DST_FIELD_IDX(tree t)
02044 {
02045 hash_map<tree, DST_INFO_IDX,ptrhash>::iterator it =
02046 decl_field_idx_map.find(t);
02047 if(it == decl_idx_map.end()) {
02048
02049 DST_INFO_IDX dsti = DST_INVALID_IDX;
02050 decl_field_idx_map[t] = dsti;
02051 }
02052 return decl_field_idx_map[t];
02053 }
02054
02055
02056
02057 DST_INFO_IDX & TYPE_DST_IDX(tree t)
02058 {
02059 hash_map<tree, DST_INFO_IDX,ptrhash>::iterator it =
02060 type_idx_map.find(t);
02061 if(it == type_idx_map.end()) {
02062
02063 DST_INFO_IDX dsti = DST_INVALID_IDX;
02064 type_idx_map[t] = dsti;
02065 }
02066 return type_idx_map[t];
02067 }
02068
02069
02070
02071 DST_INFO_IDX & DECL_DST_ABSTRACT_ROOT_IDX(tree t)
02072 {
02073 hash_map<tree, DST_INFO_IDX,ptrhash>::iterator it =
02074 abstract_root_map.find(t);
02075 if(it == abstract_root_map.end()) {
02076
02077 DST_INFO_IDX dsti = DST_INVALID_IDX;
02078 abstract_root_map[t] = dsti;
02079 }
02080 return abstract_root_map[t];
02081 }
02082
02083
02084 LABEL_IDX& HANDLER_LABEL(tree t) { return handler_label_map[t]; }
02085
02086
02087 #endif