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 #ifdef USE_PCH
00037 #include "be_com_pch.h"
00038 #endif
00039 #pragma hdrstop
00040 #include "be_symtab.h"
00041 #include "pu_info.h"
00042 #include "cxx_memory.h"
00043
00044 BE_SCOPE *Be_scope_tab;
00045
00046 BE_SYMBOL_TABLE Be_symbol_table;
00047
00048 BE_PREG_TAB Be_preg_tab;
00049
00050 static SYMTAB_IDX next_level = 0;
00051
00052 static MEM_POOL Be_symtab_pool;
00053
00054 void
00055 BE_symtab_initialize_be_scopes(void)
00056 {
00057 MEM_POOL_Initialize(&Be_symtab_pool, "back end symbol table", FALSE);
00058 MEM_POOL_Push(&Be_symtab_pool);
00059 }
00060
00061 void
00062 BE_symtab_free_be_scopes(void)
00063 {
00064 MEM_POOL_Pop(&Be_symtab_pool);
00065 MEM_POOL_Delete(&Be_symtab_pool);
00066 }
00067
00068 void
00069 BE_symtab_alloc_scope_level(const SYMTAB_IDX level)
00070 {
00071 while (level >= next_level) {
00072 BE_SCOPE *temp = CXX_NEW_ARRAY(BE_SCOPE, 1 + next_level * 2,
00073 &Be_symtab_pool);
00074 SYMTAB_IDX i;
00075 for (i = 0; i < next_level; i++) {
00076 temp[i] = Be_scope_tab[i];
00077 }
00078 next_level = 1 + next_level * 2;
00079 for (; i < next_level; i++) {
00080 temp[i].be_st_tab = NULL;
00081 }
00082 CXX_DELETE_ARRAY(Be_scope_tab, &Be_symtab_pool);
00083 Be_scope_tab = temp;
00084 }
00085 SYMTAB_IDX i = level;
00086 while (Be_scope_tab[i].be_st_tab == NULL && i > 0) {
00087 Be_scope_tab[i].be_st_tab = CXX_NEW(BE_ST_TAB, &Be_symtab_pool);
00088 --i;
00089 }
00090 }
00091
00092
00093 BOOL
00094 ST_is_const_initialized (const ST* st)
00095 {
00096
00097 if ( ST_class(st) != CLASS_VAR )
00098 return FALSE;
00099
00100
00101 if (!ST_is_const_var(st))
00102 return FALSE;
00103
00104
00105 if (BE_ST_unknown_const(st))
00106 return FALSE;
00107
00108 #ifdef TARG_NVISA
00109
00110 if (ST_sclass(st) == SCLASS_EXTERN)
00111 return FALSE;
00112
00113 if (ST_in_shared_mem(st))
00114
00115 return FALSE;
00116 if (ST_in_constant_mem(st)) {
00117
00118
00119
00120 if (ST_is_initialized(st) && strncmp(ST_name(st),"__cuda",6) == 0)
00121 return TRUE;
00122 else
00123 return FALSE;
00124 }
00125 #endif
00126
00127
00128
00129
00130
00131 TY_IDX ty = ST_type(st);
00132
00133
00134
00135
00136 if (TY_is_volatile(ty)) {
00137 return FALSE;
00138 }
00139
00140 return TRUE;
00141 }
00142
00143
00144
00145 struct match_inito_by_st {
00146 private:
00147 const ST_IDX st_idx;
00148
00149 public:
00150 match_inito_by_st(const ST *const st) : st_idx(ST_st_idx(st)) { }
00151 match_inito_by_st(const ST_IDX esstee_idx) : st_idx(esstee_idx) { }
00152
00153 BOOL operator()(INITO_IDX, const INITO *inito) const
00154 { return INITO_st_idx(*inito) == st_idx; }
00155 };
00156
00157
00158
00159
00160
00161
00162
00163
00164 BOOL
00165 ST_is_const_initialized_scalar(const ST *st, INT64 offset, TCON &tcon_copy)
00166 {
00167
00168 if (BE_ST_unknown_const(st) != 0) {
00169 Is_True (FALSE, ("Asking for value of unknown const"));
00170 return FALSE;
00171 }
00172
00173 if (!ST_is_const_initialized(st))
00174 return FALSE;
00175
00176 TY_IDX ty = ST_type(st);
00177 TYPE_ID mtype = TY_mtype(ty);
00178
00179 #ifdef TARG_X8664 // bug 10673
00180 switch (mtype) {
00181 case MTYPE_M8I1:
00182 mtype = MTYPE_I1;
00183 break;
00184 case MTYPE_M8I2:
00185 mtype = MTYPE_I2;
00186 break;
00187 case MTYPE_M8I4:
00188 mtype = MTYPE_I4;
00189 break;
00190 default:
00191 break;
00192 }
00193 #endif
00194
00195
00196 if (Is_Simple_Type(ty)) {
00197 if (offset != 0) {
00198 return FALSE;
00199 }
00200 }
00201
00202 else if (TY_kind(ty) == KIND_ARRAY) {
00203
00204 if (!Is_Simple_Type(TY_etype(ty))) {
00205 return FALSE;
00206 }
00207
00208 mtype = TY_mtype(TY_etype(ty));
00209 }
00210 else {
00211 return FALSE;
00212 }
00213
00214
00215
00216
00217 const ST *base;
00218 for (base = st;
00219 (!ST_is_initialized(base) && ST_base_idx(base) != ST_st_idx(base));
00220 base = ST_base(base));
00221
00222 BOOL initialized = ST_is_initialized(base);
00223
00224
00225
00226
00227 if (!initialized || ST_init_value_zero(st)) {
00228 if (MTYPE_is_integral(mtype)) {
00229 tcon_copy = Host_To_Targ(mtype, 0L);
00230 }
00231 else {
00232 tcon_copy = Host_To_Targ_Float(mtype, 0.0);
00233 }
00234 return TRUE;
00235 }
00236
00237
00238
00239 INITO_IDX inito_idx = For_all_until(Inito_Table,
00240 ST_IDX_level(ST_st_idx(st)),
00241 match_inito_by_st(st));
00242
00243
00244 if (inito_idx == (INITO_IDX) 0)
00245 return FALSE;
00246
00247
00248 INITV_IDX inv;
00249 if (Is_Simple_Type(ty)) {
00250 inv = INITO_val(inito_idx);
00251 }
00252 else {
00253 INITV_IDX binv = INITO_val(inito_idx);
00254 INT inv_offset = 0;
00255 INT increment = TY_size(TY_etype(ty));
00256 mtype = TY_mtype(TY_etype(ty));
00257 if (INITV_kind(binv) == INITVKIND_BLOCK) {
00258 FOREACH_INITV (INITV_blk(binv), inv) {
00259 if (inv_offset == offset) {
00260 break;
00261 }
00262 inv_offset += increment;
00263 }
00264 FmtAssert(inv_offset == offset, ("did not find array element"));
00265 }
00266 else return FALSE;
00267 }
00268
00269 switch (INITV_kind(inv)) {
00270 case INITVKIND_ZERO:
00271 tcon_copy = Host_To_Targ(mtype, 0L);
00272 return TRUE;
00273 case INITVKIND_ONE:
00274 tcon_copy = Host_To_Targ(mtype, 1L);
00275 return TRUE;
00276 case INITVKIND_VAL:
00277 tcon_copy = Tcon_Table[INITV_tc(Initv_Table[inv])];
00278 return TRUE;
00279 }
00280 return FALSE;
00281 }
00282
00283
00284 extern INITV_IDX
00285 ST_has_initv(const ST *st)
00286 {
00287 if (!ST_is_initialized (st))
00288 return (INITV_IDX) 0;
00289
00290 TY_IDX ty = ST_type(st);
00291
00292
00293
00294 INITO_IDX inito_idx;
00295 inito_idx = For_all_until(Inito_Table, ST_IDX_level(ST_st_idx(st)),
00296 match_inito_by_st(st));
00297
00298 if (inito_idx == (INITO_IDX) 0) {
00299 return (INITV_IDX) 0;
00300 }
00301 else {
00302 return INITO_val(inito_idx);
00303 }
00304 }
00305
00306
00307
00308
00309
00310 extern INITV_IDX
00311 ST_is_const_and_has_initv(const ST *st)
00312 {
00313
00314 if (BE_ST_unknown_const(st) != 0) {
00315 Is_True (FALSE, ("Asking for value/initv of unknown const"));
00316 return (INITV_IDX) 0;
00317 }
00318
00319 if (!ST_is_const_initialized(st))
00320 return (INITV_IDX) 0;
00321
00322 return ST_has_initv(st);
00323 }
00324
00325
00326 #ifdef TARG_NVISA
00327
00328
00329
00330 WN*
00331 Find_Lda (WN *tree)
00332 {
00333 if (tree == NULL)
00334 return NULL;
00335
00336 WN *lda;
00337 switch (WN_operator(tree)) {
00338 case OPR_LDA:
00339 return tree;
00340 case OPR_LDID:
00341 if (WN_class(tree) == CLASS_PREG) {
00342
00343 lda = Preg_Lda(WN_offset(tree));
00344 if (lda) return lda;
00345 return Find_Lda (Preg_Home(WN_offset(tree)));
00346 }
00347 else if (ST_sclass(WN_st(tree)) == SCLASS_FORMAL
00348 && ST_in_shared_mem(WN_st(tree)))
00349 {
00350 TY_IDX ty = WN_ty(tree);
00351 if (TY_kind(ty) == KIND_STRUCT) {
00352 UINT cur_field_id = 0;
00353 FLD_HANDLE fld = FLD_get_to_field (
00354 ty, WN_field_id(tree), cur_field_id);
00355 if ( ! fld.Is_Null())
00356 ty = FLD_type(fld);
00357 }
00358 if (TY_kind(ty) == KIND_POINTER) {
00359
00360
00361 return tree;
00362 }
00363 }
00364 else if (ST_sclass(WN_st(tree)) == SCLASS_FSTATIC
00365 && ST_in_constant_mem(WN_st(tree)))
00366 {
00367 TY_IDX ty = WN_ty(tree);
00368 if (TY_kind(ty) == KIND_STRUCT) {
00369 UINT cur_field_id = 0;
00370 FLD_HANDLE fld = FLD_get_to_field (
00371 ty, WN_field_id(tree), cur_field_id);
00372 if ( ! fld.Is_Null())
00373 ty = FLD_type(fld);
00374 }
00375 if (TY_kind(ty) == KIND_POINTER) {
00376
00377
00378 return tree;
00379 }
00380 }
00381 return NULL;
00382 case OPR_ADD:
00383 case OPR_SUB:
00384 lda = Find_Lda (WN_kid0(tree));
00385 if (lda) return lda;
00386 lda = Find_Lda (WN_kid1(tree));
00387 if (lda) return lda;
00388 return NULL;
00389 case OPR_SELECT:
00390 lda = Find_Lda (WN_kid1(tree));
00391 if (lda) return lda;
00392 lda = Find_Lda (WN_kid2(tree));
00393 if (lda) return lda;
00394 return NULL;
00395 default:
00396 return NULL;
00397 }
00398 }
00399 #endif