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 #ifndef cxx_ipa_section_annot_INCLUDED
00042 #define cxx_ipa_section_annot_INCLUDED
00043
00044 #ifndef cxx_hash_INCLUDED
00045 #include "cxx_hash.h"
00046 #endif
00047
00048 #ifndef cxx_template_INCLUDED
00049 #include "cxx_template.h"
00050 #endif
00051
00052 #ifndef ipl_summary_INCLUDED
00053 #include "ipl_summary.h"
00054 #endif
00055
00056 #ifndef mempool_INCLUDED
00057 #include "mempool.h"
00058 #endif
00059
00060 #ifndef ipa_section_INCLUDED
00061 #include "ipa_section.h"
00062 #endif
00063
00064 extern BOOL CFG_scalar_kill(IPA_NODE* caller);
00065 extern BOOL CFG_scalar_euse(IPA_NODE* caller);
00066 extern BOOL Merge_Section(IPA_NODE* caller);
00067 extern void Map_callee_region_to_caller(const IPA_NODE* caller,
00068 const IPA_NODE* callee,
00069 const SUMMARY_CALLSITE* callsite,
00070 PROJECTED_REGION* caller_region,
00071 PROJECTED_REGION* callee_region);
00072
00073
00074
00075
00076 class STATE
00077 {
00078 #define STATE_IS_MUST_KILL 1
00079 #define STATE_IS_MAY_KILL 2
00080 #define STATE_IS_EUSE 4
00081 #define STATE_IS_USE 8
00082 #define STATE_IS_MUST_REDUC 16
00083 #define STATE_IS_MAY_REDUC 32
00084 #define STATE_IS_SCALAR 64
00085 #define STATE_IS_REMOVED 128
00086
00087 INT _state;
00088
00089
00090 PROJECTED_REGION* _mod;
00091 PROJECTED_REGION* _ref;
00092 PROJECTED_REGION* _dcl;
00093
00094 public:
00095
00096 STATE() : _state(0), _mod(0), _ref(0), _dcl(0) {}
00097
00098 void Init() { _state = 0; _mod = NULL; _ref = NULL; _dcl = NULL; }
00099
00100 BOOL Is_must_kill() const { return _state & STATE_IS_MUST_KILL;};
00101 void Set_must_kill() { _state = _state | STATE_IS_MUST_KILL;};
00102
00103 BOOL Is_may_kill() const { return _state & STATE_IS_MAY_KILL;};
00104 void Set_may_kill() { _state = _state | STATE_IS_MAY_KILL;};
00105
00106 BOOL Is_euse() const { return _state & STATE_IS_EUSE;};
00107 void Set_euse() { _state = _state | STATE_IS_EUSE;};
00108
00109 BOOL Is_use() const { return _state & STATE_IS_USE;};
00110 void Set_use() { _state = _state | STATE_IS_USE;};
00111
00112 BOOL Is_must_reduc() const { return _state & STATE_IS_MUST_REDUC;};
00113 void Set_must_reduc() { _state = _state | STATE_IS_MUST_REDUC;};
00114
00115 BOOL Is_may_reduc() const { return _state & STATE_IS_MAY_REDUC;};
00116 void Set_may_reduc() { _state = _state | STATE_IS_MAY_REDUC;};
00117
00118 BOOL Is_scalar() const { return _state & STATE_IS_SCALAR;};
00119 void Set_is_scalar() { _state = _state | STATE_IS_SCALAR;};
00120
00121 BOOL Is_removed() const { return _state & STATE_IS_REMOVED;};
00122 void Set_is_removed() { _state = _state | STATE_IS_REMOVED;};
00123
00124 void Set_projected_mod_region(PROJECTED_REGION *r) { _mod = r;};
00125 PROJECTED_REGION* Get_projected_mod_region() { return _mod;};
00126
00127 void Set_projected_ref_region(PROJECTED_REGION *r) {_ref = r;};
00128 PROJECTED_REGION* Get_projected_ref_region() { return _ref;};
00129
00130 void Set_projected_dcl_region(PROJECTED_REGION *r) {_dcl = r;};
00131 PROJECTED_REGION* Get_projected_dcl_region() { return _dcl;};
00132
00133 void Print(FILE* fp = stderr);
00134 };
00135
00136
00137 typedef DYN_ARRAY<STATE> STATE_ARRAY;
00138
00139
00140
00141
00142
00143
00144 class GLOBAL_ARRAY_INFO: public SLIST_NODE {
00145 private:
00146 STATE _state;
00147 ST_IDX _st_idx;
00148
00149 public:
00150 DECLARE_SLIST_NODE_CLASS(GLOBAL_ARRAY_INFO);
00151
00152 GLOBAL_ARRAY_INFO (ST_IDX st_idx) :
00153 _state (STATE()),
00154 _st_idx (st_idx)
00155 {}
00156
00157 void Set_projected_mod_region (PROJECTED_REGION* mod)
00158 {
00159 _state.Set_projected_mod_region(mod);
00160 }
00161 PROJECTED_REGION* Get_projected_mod_region ()
00162 {
00163 return _state.Get_projected_mod_region();
00164 }
00165
00166 void Set_projected_ref_region (PROJECTED_REGION* ref)
00167 {
00168 _state.Set_projected_ref_region(ref);
00169 }
00170 PROJECTED_REGION* Get_projected_ref_region ()
00171 {
00172 return _state.Get_projected_ref_region();
00173 }
00174
00175 void Set_projected_dcl_region (PROJECTED_REGION* dcl)
00176 {
00177 _state.Set_projected_dcl_region(dcl);
00178 }
00179 PROJECTED_REGION* Get_projected_dcl_region ()
00180 {
00181 return _state.Get_projected_dcl_region();
00182 }
00183
00184 void Set_St_Idx (ST_IDX st_idx) { _st_idx = st_idx; }
00185 ST_IDX St_Idx () const { return _st_idx; }
00186
00187 STATE* Get_state () { return &_state; }
00188
00189 void Print (FILE* fp);
00190 };
00191
00192
00193
00194
00195
00196 class GLOBAL_ARRAY_LIST: public SLIST
00197 {
00198 private:
00199 ST_IDX _st_idx;
00200 UINT _is_messy : 1;
00201
00202 public:
00203 DECLARE_SLIST_CLASS(GLOBAL_ARRAY_LIST, GLOBAL_ARRAY_INFO);
00204
00205 GLOBAL_ARRAY_LIST (ST_IDX st_idx) :
00206 _st_idx (st_idx),
00207 _is_messy (FALSE)
00208 {}
00209
00210 void Set_St_Idx (ST_IDX st_idx) { _st_idx = st_idx; }
00211 ST_IDX St_Idx () const { return _st_idx; }
00212
00213
00214
00215 void Set_is_messy () { _is_messy = TRUE; }
00216 void Reset_is_messy () { _is_messy = FALSE; }
00217 BOOL Is_messy () const { return _is_messy; }
00218
00219 char* Get_name() const { return ST_name(_st_idx); }
00220
00221 GLOBAL_ARRAY_INFO* Find_Global_Array_Info(ST_IDX st_idx);
00222
00223 GLOBAL_ARRAY_INFO* Find_Global_Array_Info(const SUMMARY_SYMBOL* s)
00224 {
00225 return Find_Global_Array_Info(s->St_idx());
00226 }
00227
00228 GLOBAL_ARRAY_INFO* Append(ST_IDX st_idx, MEM_POOL* pool)
00229 {
00230 GLOBAL_ARRAY_INFO* array_info = CXX_NEW(GLOBAL_ARRAY_INFO(st_idx), pool);
00231 Append(array_info);
00232 return array_info;
00233 }
00234
00235 GLOBAL_ARRAY_INFO* Add_Global_Array_Info(const SUMMARY_SYMBOL* s,
00236 MEM_POOL* pool)
00237 {
00238 return Append(s->St_idx(), pool);
00239 }
00240
00241 BOOL Merge(const IPA_NODE* caller,
00242 const IPA_NODE* callee,
00243 const SUMMARY_CALLSITE* call,
00244 GLOBAL_ARRAY_LIST* caller_list,
00245 MEM_POOL* caller_annot_pool);
00246
00247 void Print(FILE* fp);
00248 };
00249
00250
00251
00252
00253
00254 typedef HASH_TABLE<ST_IDX, GLOBAL_ARRAY_LIST*> GLOBAL_ARRAY_TABLE;
00255
00256 typedef HASH_TABLE_ITER<ST_IDX, GLOBAL_ARRAY_LIST*> GLOBAL_ARRAY_TABLE_ITER;
00257
00258 class GLOBAL_ARRAY_LIST_ITER: public SLIST_ITER
00259 {
00260 public:
00261 DECLARE_SLIST_ITER_CLASS(GLOBAL_ARRAY_LIST_ITER,GLOBAL_ARRAY_INFO,GLOBAL_ARRAY_LIST);
00262 };
00263
00264
00265
00266
00267 class IPA_NODE_SECTION_INFO
00268 {
00269 private:
00270 CFG_NODE_INFO* _cfg_node;
00271 CFG_NODE_INFO* _cfg_entry_node;
00272 STATE_ARRAY* _formals;
00273 IPA_NODE** _callsite_map;
00274 INT _callsite_count;
00275 MEM_POOL* _mem;
00276 GLOBAL_ARRAY_TABLE* _glob_table;
00277 DYN_ARRAY<SUMMARY_VALUE>* _value;
00278 DYN_ARRAY<SUMMARY_EXPR>* _expr;
00279
00280 public:
00281 IPA_NODE_SECTION_INFO (MEM_POOL* mem_pool) :
00282 _cfg_node(0),
00283 _cfg_entry_node(0),
00284 _formals(0),
00285 _callsite_map(0),
00286 _callsite_count(0),
00287 _mem(mem_pool),
00288 _value(0),
00289 _expr(0),
00290 _glob_table(CXX_NEW(GLOBAL_ARRAY_TABLE(8, mem_pool), mem_pool))
00291 {}
00292
00293 void Set_cfg_node(CFG_NODE_INFO* cfg_node) {_cfg_node = cfg_node; }
00294 CFG_NODE_INFO* Get_cfg_node() const { return _cfg_node; }
00295
00296 void Set_cfg_entry_node(CFG_NODE_INFO* entry) {_cfg_entry_node = entry; }
00297 CFG_NODE_INFO* Get_cfg_entry_node() const { return _cfg_entry_node; }
00298
00299 void Set_callsite_map(IPA_NODE** map) { _callsite_map = map; }
00300 IPA_NODE** Get_callsite_map() { return _callsite_map; }
00301
00302 void Set_callsite_count(INT c) { _callsite_count = c; }
00303 INT Get_callsite_count() const { return _callsite_count; }
00304
00305 void Set_formals(STATE_ARRAY* f) { _formals = f; }
00306 STATE_ARRAY* Get_formals() const { return _formals;};
00307
00308 INT Get_formal_count() const { return (_formals ? _formals->Elements() : 0);}
00309 STATE* Get_formal(INT i) const { return &(*_formals)[i]; };
00310
00311 void Set_formal_mod_region(INT i, PROJECTED_REGION *p)
00312 {
00313 Get_formal(i)->Set_projected_mod_region(p);
00314 }
00315 PROJECTED_REGION* Get_formal_mod_region(INT i) const
00316 {
00317 return (*_formals)[i].Get_projected_mod_region();
00318 }
00319
00320 void Set_formal_ref_region(INT i, PROJECTED_REGION *p)
00321 {
00322 Get_formal(i)->Set_projected_ref_region(p);
00323 }
00324 PROJECTED_REGION* Get_formal_ref_region(INT i) const
00325 {
00326 return (*_formals)[i].Get_projected_ref_region();
00327 }
00328
00329 void Set_formal_dcl_region(INT i, PROJECTED_REGION *p)
00330 {
00331 Get_formal(i)->Set_projected_dcl_region(p);
00332 }
00333 PROJECTED_REGION* Get_formal_dcl_region(INT i) const
00334 {
00335 return (*_formals)[i].Get_projected_dcl_region();
00336 }
00337
00338 MEM_POOL* Mem_Pool() const { return _mem; }
00339
00340 void Set_value(DYN_ARRAY<SUMMARY_VALUE>* sv) { _value = sv; }
00341 DYN_ARRAY<SUMMARY_VALUE>* Get_value() const { return _value; }
00342
00343 void Set_expr(DYN_ARRAY<SUMMARY_EXPR>* sx) { _expr = sx; }
00344 DYN_ARRAY<SUMMARY_EXPR>* Get_expr() const { return _expr; }
00345
00346 GLOBAL_ARRAY_TABLE* Global_Array_Table() const { return _glob_table; }
00347
00348 GLOBAL_ARRAY_LIST* Find_Global_Array_List(const SUMMARY_SYMBOL* s)
00349 {
00350 Is_True(ST_IDX_level(s->St_idx()) == GLOBAL_SYMTAB,
00351 ("Find_Global_Array_List: Symbol is NOT global!\n"));
00352 return _glob_table->Find(ST_base_idx(ST_ptr(s->St_idx())));
00353
00354 }
00355
00356 GLOBAL_ARRAY_LIST* Add_Global_Array_List(const SUMMARY_SYMBOL* s)
00357 {
00358 Is_True(ST_IDX_level(s->St_idx()) == GLOBAL_SYMTAB,
00359 ("Global_Array_List: Symbol is NOT global!\n"));
00360 ST_IDX base_st_idx = ST_base_idx(ST_ptr(s->St_idx()));
00361 GLOBAL_ARRAY_LIST* list = CXX_NEW(GLOBAL_ARRAY_LIST(base_st_idx), _mem);
00362 Global_Array_Table()->Enter(base_st_idx, list);
00363 return list;
00364
00365 }
00366
00367 GLOBAL_ARRAY_INFO* Find_Global_Array_Info(const SUMMARY_SYMBOL* s)
00368 {
00369 Is_True(ST_IDX_level(s->St_idx()) == GLOBAL_SYMTAB,
00370 ("Find_Global_Array_Info: Symbol is NOT global!\n"));
00371 GLOBAL_ARRAY_LIST* list = Find_Global_Array_List(s);
00372 return (list ? list->Find_Global_Array_Info(s->St_idx()) : 0);
00373 }
00374
00375 GLOBAL_ARRAY_INFO* Add_Global_Array_Info(const SUMMARY_SYMBOL* s)
00376 {
00377 Is_True(ST_IDX_level(s->St_idx()) == GLOBAL_SYMTAB,
00378 ("Find_Global_Array_Info: Symbol is NOT global!\n"));
00379 GLOBAL_ARRAY_LIST* list = Find_Global_Array_List(s);
00380 if (!list) {
00381 list = Add_Global_Array_List(s);
00382 }
00383 return list->Add_Global_Array_Info(s, _mem);
00384 }
00385
00386 STATE* Find_Global_Array_Sections(const SUMMARY_SYMBOL* s)
00387 {
00388 Is_True(ST_IDX_level(s->St_idx()) == GLOBAL_SYMTAB,
00389 ("Find_Global_Array_Sections: Symbol is NOT global!\n"));
00390 GLOBAL_ARRAY_INFO* info = Find_Global_Array_Info(s);
00391 return (info ? info->Get_state() : 0);
00392 }
00393
00394 PROJECTED_REGION* Global_Array_Region(const SUMMARY_SYMBOL* s,
00395 BOOL* is_messy,
00396 PROJECTED_REGION* region,
00397 BOOL is_mod);
00398
00399 BOOL Set_Global_Array_List_To_Messy(const SUMMARY_SYMBOL* s);
00400
00401 void Print (FILE* fp);
00402 void Print_Global_Sections (FILE* fp);
00403
00404 INT Get_formal_euse_count();
00405 INT Get_formal_kill_count();
00406 };
00407
00408
00409
00410
00411
00412
00413
00414 class SECTION_FILE_ANNOT
00415 {
00416 private:
00417 IVAR* _iv_base;
00418 IVAR_ARRAY* _iv_grow;
00419 MEM_POOL* _m;
00420
00421 public:
00422 SECTION_FILE_ANNOT (IVAR* ivar, MEM_POOL* m) :
00423 _iv_base (ivar),
00424 _iv_grow (0),
00425 _m (m)
00426 {}
00427
00428 IVAR* Get_ivar () const { return _iv_base; }
00429
00430 IVAR_ARRAY* Get_ivar_array () const { return _iv_grow; }
00431
00432 MEM_POOL* Mem_Pool () const { return _m; }
00433
00434 INT32 Find_ivar (const IPA_NODE* node, const IVAR& ivar);
00435
00436 INT32 Add_ivar (const IPA_NODE* node, const IVAR& ivar);
00437 };
00438
00439 #endif // cxx_ipa_section_annot_INCLUDED
00440
00441