Go to the documentation of this file.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 #ifndef be_symtab_INCLUDED
00039 #define be_symtab_INCLUDED
00040
00041 #ifndef cmplr_segmented_array_INCLUDED
00042 #include "cmplr_segmented_array.h"
00043 #endif // cmplr_segmented_array_INCLUDED
00044
00045 #ifndef symtab_INCLUDED
00046 #include "symtab.h"
00047 #endif // symtab_INCLUDED
00048
00049 #ifndef wn_INCLUDED
00050 #include "wn.h"
00051 #endif // wn_INCLUDED
00052
00053 #ifndef targ_sim_INCLUDED
00054 #include "targ_sim.h"
00055 #endif
00056
00057 typedef mUINT32 BE_ST_IDX;
00058
00059
00060
00061 const UINT32 BE_ST_ADDR_USED_LOCALLY = 0x00000001;
00062 const UINT32 BE_ST_ADDR_PASSED = 0x00000002;
00063 const UINT32 BE_ST_W2FC_REFERENCED = 0x00000004;
00064 const UINT32 BE_ST_UNKNOWN_CONST = 0x00000008;
00065
00066
00067 const UINT32 BE_ST_PU_HAS_VALID_ADDR_FLAGS = 0x00000010;
00068
00069
00070 const UINT32 BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST = 0x00000020;
00071
00072
00073
00074
00075 class BE_ST {
00076 mUINT32 flags;
00077 void *io_auxst;
00078
00079 public:
00080 BE_ST(void) : flags(0),io_auxst(NULL) { }
00081 BOOL Is_set(UINT32 f) const { return flags & f; }
00082 void Set_flag(UINT32 f) { flags |= f; }
00083 void Clear_flag(UINT32 f) { flags &= ~f; }
00084 void Set_io_auxst(void *v) { io_auxst = v; }
00085 void * Io_auxst(void) { return io_auxst; }
00086 };
00087
00088 typedef RELATED_SEGMENTED_ARRAY<BE_ST> BE_ST_TAB;
00089
00090 struct BE_SCOPE {
00091 BE_ST_TAB *be_st_tab;
00092 };
00093
00094 struct BE_SCOPE_TAB_BE_ST_TAB_ACCESS {
00095 BE_SCOPE_TAB_BE_ST_TAB_ACCESS(void) { }
00096
00097 BE_ST_TAB *operator()(BE_SCOPE **be_scope_tab, SYMTAB_IDX level)
00098 { return (*be_scope_tab)[level].be_st_tab; }
00099 };
00100
00101 extern BE_SCOPE *Be_scope_tab;
00102
00103 typedef TABLE_INDEXED_BY_LEVEL8_AND_INDEX24<BE_ST, ST_IDX, SYMTAB_IDX,
00104 BE_SCOPE *, &Be_scope_tab,
00105 BE_SCOPE_TAB_BE_ST_TAB_ACCESS>
00106 BE_SYMBOL_TABLE;
00107
00108 extern BE_SYMBOL_TABLE Be_symbol_table;
00109
00110 inline BOOL
00111 BE_ST_addr_used_locally(const ST_IDX idx)
00112 {
00113 return Be_symbol_table[idx].Is_set(BE_ST_ADDR_USED_LOCALLY);
00114 }
00115
00116 inline BOOL
00117 BE_ST_addr_used_locally(const BE_ST *const be_st)
00118 {
00119 return be_st->Is_set(BE_ST_ADDR_USED_LOCALLY);
00120 }
00121
00122 inline BOOL
00123 BE_ST_addr_used_locally(const ST *const st)
00124 {
00125 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_ADDR_USED_LOCALLY);
00126 }
00127
00128 inline void
00129 Set_BE_ST_addr_used_locally(const ST_IDX idx)
00130 {
00131 Be_symbol_table[idx].Set_flag(BE_ST_ADDR_USED_LOCALLY);
00132 }
00133
00134 inline void
00135 Set_BE_ST_addr_used_locally(BE_ST *const be_st)
00136 {
00137 be_st->Set_flag(BE_ST_ADDR_USED_LOCALLY);
00138 }
00139
00140 inline void
00141 Set_BE_ST_addr_used_locally(const ST *const st)
00142 {
00143 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_ADDR_USED_LOCALLY);
00144 }
00145
00146 inline void
00147 Clear_BE_ST_addr_used_locally(const ST_IDX idx)
00148 {
00149 Be_symbol_table[idx].Clear_flag(BE_ST_ADDR_USED_LOCALLY);
00150 }
00151
00152 inline void
00153 Clear_BE_ST_addr_used_locally(BE_ST *const be_st)
00154 {
00155 be_st->Clear_flag(BE_ST_ADDR_USED_LOCALLY);
00156 }
00157
00158 inline void
00159 Clear_BE_ST_addr_used_locally(const ST *const st)
00160 {
00161 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_ADDR_USED_LOCALLY);
00162 }
00163
00164 inline void
00165 BE_ST_set_io_auxst(const ST_IDX idx, void *v)
00166 {
00167 Be_symbol_table[idx].Set_io_auxst(v);
00168 }
00169
00170 inline void *
00171 BE_ST_io_auxst(const ST_IDX idx)
00172 {
00173 return Be_symbol_table[idx].Io_auxst();
00174 }
00175
00176
00177 inline BOOL
00178 BE_ST_addr_passed(const ST_IDX idx)
00179 {
00180 return Be_symbol_table[idx].Is_set(BE_ST_ADDR_PASSED);
00181 }
00182
00183 inline BOOL
00184 BE_ST_addr_passed(const BE_ST *const be_st)
00185 {
00186 return be_st->Is_set(BE_ST_ADDR_PASSED);
00187 }
00188
00189 inline BOOL
00190 BE_ST_addr_passed(const ST *const st)
00191 {
00192 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_ADDR_PASSED);
00193 }
00194
00195 inline void
00196 Set_BE_ST_addr_passed(const ST_IDX idx)
00197 {
00198 Be_symbol_table[idx].Set_flag(BE_ST_ADDR_PASSED);
00199 }
00200
00201 inline void
00202 Set_BE_ST_addr_passed(BE_ST *const be_st)
00203 {
00204 be_st->Set_flag(BE_ST_ADDR_PASSED);
00205 }
00206
00207 inline void
00208 Set_BE_ST_addr_passed(const ST *const st)
00209 {
00210 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_ADDR_PASSED);
00211 }
00212
00213 inline void
00214 Clear_BE_ST_addr_passed(const ST_IDX idx)
00215 {
00216 Be_symbol_table[idx].Clear_flag(BE_ST_ADDR_PASSED);
00217 }
00218
00219 inline void
00220 Clear_BE_ST_addr_passed(BE_ST *const be_st)
00221 {
00222 be_st->Clear_flag(BE_ST_ADDR_PASSED);
00223 }
00224
00225 inline void
00226 Clear_BE_ST_addr_passed(const ST *const st)
00227 {
00228 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_ADDR_PASSED);
00229 }
00230
00231
00232 inline BOOL
00233 BE_ST_w2fc_referenced(const ST_IDX idx)
00234 {
00235 return Be_symbol_table[idx].Is_set(BE_ST_W2FC_REFERENCED);
00236 }
00237
00238 inline BOOL
00239 BE_ST_w2fc_referenced(const BE_ST *const be_st)
00240 {
00241 return be_st->Is_set(BE_ST_W2FC_REFERENCED);
00242 }
00243
00244 inline BOOL
00245 BE_ST_w2fc_referenced(const ST *const st)
00246 {
00247 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_W2FC_REFERENCED);
00248 }
00249
00250 inline void
00251 Set_BE_ST_w2fc_referenced(const ST_IDX idx)
00252 {
00253 Be_symbol_table[idx].Set_flag(BE_ST_W2FC_REFERENCED);
00254 }
00255
00256 inline void
00257 Set_BE_ST_w2fc_referenced(BE_ST *const be_st)
00258 {
00259 be_st->Set_flag(BE_ST_W2FC_REFERENCED);
00260 }
00261
00262 inline void
00263 Set_BE_ST_w2fc_referenced(const ST *const st)
00264 {
00265 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_W2FC_REFERENCED);
00266 }
00267
00268 inline void
00269 Clear_BE_ST_w2fc_referenced(BE_ST *const be_st)
00270 {
00271 be_st->Clear_flag(BE_ST_W2FC_REFERENCED);
00272 }
00273
00274 inline void
00275 Clear_BE_ST_w2fc_referenced(const ST *const st)
00276 {
00277 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_W2FC_REFERENCED);
00278 }
00279
00280 inline void
00281 Clear_BE_ST_w2fc_referenced(const ST_IDX idx)
00282 {
00283 Be_symbol_table[idx].Clear_flag(BE_ST_W2FC_REFERENCED);
00284 }
00285
00286
00287 inline BOOL
00288 BE_ST_unknown_const(const ST_IDX idx)
00289 {
00290 return Be_symbol_table[idx].Is_set(BE_ST_UNKNOWN_CONST);
00291 }
00292
00293 inline BOOL
00294 BE_ST_unknown_const(const BE_ST *const be_st)
00295 {
00296 return be_st->Is_set(BE_ST_UNKNOWN_CONST);
00297 }
00298
00299 inline BOOL
00300 BE_ST_unknown_const(const ST *const st)
00301 {
00302 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_UNKNOWN_CONST);
00303 }
00304
00305 inline void
00306 Set_BE_ST_unknown_const(const ST_IDX idx)
00307 {
00308 Be_symbol_table[idx].Set_flag(BE_ST_UNKNOWN_CONST);
00309 }
00310
00311 inline void
00312 Set_BE_ST_unknown_const(BE_ST *const be_st)
00313 {
00314 be_st->Set_flag(BE_ST_UNKNOWN_CONST);
00315 }
00316
00317 inline void
00318 Set_BE_ST_unknown_const(const ST *const st)
00319 {
00320 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_UNKNOWN_CONST);
00321 }
00322
00323 inline void
00324 Clear_BE_ST_unknown_const(BE_ST *const be_st)
00325 {
00326 be_st->Clear_flag(BE_ST_UNKNOWN_CONST);
00327 }
00328
00329 inline void
00330 Clear_BE_ST_unknown_const(const ST *const st)
00331 {
00332 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_UNKNOWN_CONST);
00333 }
00334
00335 inline void
00336 Clear_BE_ST_unknown_const(const ST_IDX idx)
00337 {
00338 Be_symbol_table[idx].Clear_flag(BE_ST_UNKNOWN_CONST);
00339 }
00340
00341
00342 inline BOOL
00343 BE_ST_pu_has_valid_addr_flags(const ST_IDX idx)
00344 {
00345 return Be_symbol_table[idx].Is_set(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00346 }
00347
00348 inline BOOL
00349 BE_ST_pu_has_valid_addr_flags(const BE_ST *const be_st)
00350 {
00351 return be_st->Is_set(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00352 }
00353
00354 inline BOOL
00355 BE_ST_pu_has_valid_addr_flags(const ST *const st)
00356 {
00357 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00358 }
00359
00360 inline void
00361 Set_BE_ST_pu_has_valid_addr_flags(const ST_IDX idx)
00362 {
00363 Be_symbol_table[idx].Set_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00364 }
00365
00366 inline void
00367 Set_BE_ST_pu_has_valid_addr_flags(BE_ST *const be_st)
00368 {
00369 be_st->Set_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00370 }
00371
00372 inline void
00373 Set_BE_ST_pu_has_valid_addr_flags(const ST *const st)
00374 {
00375 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00376 }
00377
00378 inline void
00379 Clear_BE_ST_pu_has_valid_addr_flags(BE_ST *const be_st)
00380 {
00381 be_st->Clear_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00382 }
00383
00384 inline void
00385 Clear_BE_ST_pu_has_valid_addr_flags(const ST *const st)
00386 {
00387 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00388 }
00389
00390 inline void
00391 Clear_BE_ST_pu_has_valid_addr_flags(const ST_IDX idx)
00392 {
00393 Be_symbol_table[idx].Clear_flag(BE_ST_PU_HAS_VALID_ADDR_FLAGS);
00394 }
00395
00396
00397 inline BOOL
00398 BE_ST_pu_needs_addr_flag_adjust(const ST_IDX idx)
00399 {
00400 return Be_symbol_table[idx].Is_set(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00401 }
00402
00403 inline BOOL
00404 BE_ST_pu_needs_addr_flag_adjust(const BE_ST *const be_st)
00405 {
00406 return be_st->Is_set(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00407 }
00408
00409 inline BOOL
00410 BE_ST_pu_needs_addr_flag_adjust(const ST *const st)
00411 {
00412 return Be_symbol_table[ST_st_idx(st)].Is_set(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00413 }
00414
00415 inline void
00416 Set_BE_ST_pu_needs_addr_flag_adjust(const ST_IDX idx)
00417 {
00418 Be_symbol_table[idx].Set_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00419 }
00420
00421 inline void
00422 Set_BE_ST_pu_needs_addr_flag_adjust(BE_ST *const be_st)
00423 {
00424 be_st->Set_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00425 }
00426
00427 inline void
00428 Set_BE_ST_pu_needs_addr_flag_adjust(const ST *const st)
00429 {
00430 Be_symbol_table[ST_st_idx(st)].Set_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00431 }
00432
00433 inline void
00434 Clear_BE_ST_pu_needs_addr_flag_adjust(BE_ST *const be_st)
00435 {
00436 be_st->Clear_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00437 }
00438
00439 inline void
00440 Clear_BE_ST_pu_needs_addr_flag_adjust(const ST *const st)
00441 {
00442 Be_symbol_table[ST_st_idx(st)].Clear_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00443 }
00444
00445 inline void
00446 Clear_BE_ST_pu_needs_addr_flag_adjust(const ST_IDX idx)
00447 {
00448 Be_symbol_table[idx].Clear_flag(BE_ST_PU_NEEDS_ADDR_FLAG_ADJUST);
00449 }
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460 extern BOOL
00461 ST_is_const_initialized(const ST *);
00462
00463
00464
00465
00466 extern BOOL
00467 ST_is_const_initialized_scalar(const ST *, TCON &tcon_copy);
00468
00469
00470
00471 extern INITV_IDX
00472 ST_is_const_and_has_initv(const ST *);
00473
00474
00475
00476 extern INITV_IDX
00477 ST_has_initv(const ST *);
00478
00479
00480
00481
00482 class BE_PU {
00483 private:
00484 mUINT16 last_label;
00485 public:
00486 INT16 Last_label(void) const { return last_label; }
00487 };
00488
00489 class BE_PREG {
00490 private:
00491 WN *home_location;
00492 public:
00493 BE_PREG(void) : home_location(NULL) { }
00494 void Set_home_location(WN *wn) { home_location = wn; }
00495 WN *Home_location(void) const { return home_location; }
00496 };
00497
00498 typedef RELATED_SEGMENTED_ARRAY<BE_PREG> BE_PREG_TAB;
00499
00500 extern BE_PREG_TAB Be_preg_tab;
00501
00502
00503
00504
00505 static inline PREG_NUM
00506 Create_Preg(TYPE_ID mtype, char *name, WN *home)
00507 {
00508 PREG_NUM retval = Create_Preg(mtype, name);
00509 Be_preg_tab[retval - Last_Dedicated_Preg_Offset].Set_home_location(home);
00510 return retval;
00511 }
00512
00513 static inline WN *
00514 Preg_Home(PREG_NUM preg)
00515 {
00516 const UINT idx = preg - Last_Dedicated_Preg_Offset;
00517 return (idx < Be_preg_tab.Size()) ? Be_preg_tab[idx].Home_location() : NULL;
00518 }
00519
00520 extern void BE_symtab_initialize_be_scopes(void);
00521 extern void BE_symtab_free_be_scopes(void);
00522 extern void BE_symtab_alloc_scope_level(const SYMTAB_IDX);
00523
00524
00525 #endif // be_symtab_INCLUDED