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 #ifndef BE_MEMOP_ANNOT_included
00030 #define BE_MEMOP_ANNOT_included
00031
00032 #include "opt_alias_rule.h"
00033
00034
00035 class MEMOP_ANNOT_ITEM;
00036 class MEMOP_ANNOT;
00037 class WN_MEMOP_ANNOT_MGR;
00038 class WOPT_MEMOP_ANNOT_MGR;
00039 class PT_MEM_ANNOT;
00040
00042
00043
00044
00045
00047
00048 typedef enum {
00049 MEM_ANNOT_INVALID = 0,
00050 MEM_ANNOT_MALLOC_ID = 1,
00051 MEM_ANNOT_LMV_ALIAS_GROUP = 2 ,
00052
00053 MEM_ANNOT_LAST_KIND =2,
00054 } MEM_ANNOT_KIND;
00055
00056
00057
00058 #define INVALID_ITEM_VALUE (0)
00059
00060 class MEMOP_ANNOT_ITEM {
00061 friend class MEMOP_ANNOT;
00062 private:
00063 MEM_ANNOT_KIND _kind;
00064 union { UINT64 u64; UINT32 u32; void* ptr; } _v;
00065
00066 void Set_kind (MEM_ANNOT_KIND kind) { _kind = kind; };
00067
00068 public:
00069
00070 void Init (void) { _kind = MEM_ANNOT_INVALID; }
00071
00072 MEM_ANNOT_KIND Kind(void) const { return _kind; }
00073
00074 UINT64 Malloc_id (void) const
00075 { return _kind == MEM_ANNOT_MALLOC_ID ? _v.u64 : INVALID_ITEM_VALUE; }
00076 void Set_malloc_id (UINT64 id) { _kind = MEM_ANNOT_MALLOC_ID; _v.u64 = id; }
00077
00078 LMV_ALIAS_GROUP LMV_alias_group (void) const {
00079 return _kind == MEM_ANNOT_LMV_ALIAS_GROUP ?
00080 _v.u32 : INVALID_ITEM_VALUE;
00081 }
00082 void Set_LMV_alias_group (LMV_ALIAS_GROUP g)
00083 { _kind = MEM_ANNOT_LMV_ALIAS_GROUP; _v.u32 = g; }
00084
00085
00086 BOOL Is_invalid (void) const {
00087 switch (_kind) {
00088 case MEM_ANNOT_MALLOC_ID : return Malloc_id () == INVALID_ITEM_VALUE;
00089 case MEM_ANNOT_LMV_ALIAS_GROUP:
00090 return LMV_alias_group() == INVALID_ITEM_VALUE;
00091 default: return TRUE;
00092 }
00093 }
00094
00095 BOOL operator == (const MEMOP_ANNOT_ITEM& that) const;
00096 BOOL operator != (const MEMOP_ANNOT_ITEM& that) const
00097 { return !operator==(that); }
00098
00099 void Print (FILE* f) const;
00100 };
00101
00102 typedef mempool_allocator<MEMOP_ANNOT_ITEM> MEMOP_ANNOT_ITEM_ALLOC;
00103 typedef std::vector<MEMOP_ANNOT_ITEM, MEMOP_ANNOT_ITEM_ALLOC> MEMOP_ANNOT_ITEM_VECT;
00104 typedef MEMOP_ANNOT_ITEM_VECT::iterator MEMOP_ANNOT_ITEM_ITER;
00105 typedef MEMOP_ANNOT_ITEM_VECT::const_iterator MEMOP_ANNOT_ITEM_CITER;
00106
00107
00108 class MEMOP_ANNOT {
00109
00110 friend class MEMOP_ANNOT_MGR;
00111 friend class WN_MEMOP_ANNOT_MGR;
00112 friend class WOPT_MEMOP_ANNOT_MGR;
00113
00114 private:
00115 MEMOP_ANNOT_ITEM_VECT _vect;
00116 MEM_ANNOT_KIND _kinds;
00117 INT _id;
00118
00119 void Clear_kinds (void) { _kinds = (MEM_ANNOT_KIND)0; }
00120 void Add_kind (MEM_ANNOT_KIND k) { _kinds = MEM_ANNOT_KIND(UINT(_kinds) | UINT(k)); }
00121 void Remove_kind (MEM_ANNOT_KIND k) { _kinds = MEM_ANNOT_KIND(UINT(_kinds) & ~UINT(k));}
00122
00123
00124 void Recycle (INT new_id)
00125 { _vect.clear () ; Clear_kinds (); _id = new_id; }
00126
00127
00128
00129
00130 MEMOP_ANNOT (MEM_POOL* mp, INT id) : _vect(mp), _id(id)
00131 { Clear_kinds (); }
00132
00133 public:
00134 INT Id (void) const { return _id; }
00135 MEMOP_ANNOT_ITEM_VECT& All_items (void) { return _vect; }
00136
00137 void operator = (const MEMOP_ANNOT& that) {
00138
00139 _vect = that._vect; _kinds = that._kinds;
00140 }
00141
00142 BOOL Lookup (MEM_ANNOT_KIND kind, MEMOP_ANNOT_ITEM& res) const;
00143 void Replace_or_add (const MEMOP_ANNOT_ITEM& annot);
00144 void Remove (MEM_ANNOT_KIND kind);
00145 void Remove_all (void) { _vect.clear (); Clear_kinds(); }
00146
00147
00148
00149
00150
00151 void Meet (const MEMOP_ANNOT* that);
00152 void Meet (const MEMOP_ANNOT_ITEM* that);
00153
00154
00155 void Union (const MEMOP_ANNOT* that);
00156
00157 INT Item_count (void) const { return _vect.size (); }
00158
00159 MEMOP_ANNOT_ITEM& operator[] (INT idx) {
00160 Is_True (idx >= 0 && idx < _vect.size(), ("index is out of range"));
00161 return _vect[idx];
00162 }
00163
00164 void Print (FILE*) const;
00165 };
00166
00167 typedef mempool_allocator<MEMOP_ANNOT*> MOA_ALLOC;
00168 typedef std::vector<MEMOP_ANNOT*, MOA_ALLOC> MEMOP_ANNOT_VECT;
00169 typedef MEMOP_ANNOT_VECT::iterator MOA_VECT_ITER;
00170 typedef MEMOP_ANNOT_VECT::const_iterator MOA_VECT_CITER;
00171
00172 class MEMOP_ANNOT_MGR {
00173 protected:
00174 static MEMOP_ANNOT_MGR* active_mgr;
00175
00176 WN_MAP _wn_map;
00177
00178 INT _last_id;
00179
00180 MEMOP_ANNOT_VECT _all_annot;
00181 MEMOP_ANNOT_VECT _recycled_annot;
00182
00183 MEM_POOL* _mp;
00184
00185 public:
00186 INT Annot_last_id (void) const { return _last_id; }
00187 MEM_POOL* Mem_pool (void) const { return _mp; }
00188
00189 MEMOP_ANNOT* Get_annot (INT id) {
00190 return (id > 0 && id <= _last_id) ? _all_annot[id] : NULL;
00191 }
00192
00193 MEMOP_ANNOT* Alloc_annot (void);
00194
00195 virtual MEMOP_ANNOT* Alloc_annot_v (void) { Alloc_annot (); }
00196
00197 BOOL Alloc_by_this_class (MEMOP_ANNOT* a) {
00198 return a->Id() > 0 && a->Id() <= _last_id && _all_annot[a->Id()] == a;
00199 }
00200
00201 void Init (void);
00202 void Invalidate (void) { Init(); }
00203
00204 void Set_active_mgr (void) { active_mgr = this; }
00205 void Reset_active_mgr (void) { active_mgr = NULL; }
00206 static MEMOP_ANNOT_MGR* Active_mgr (void) { return active_mgr; }
00207
00208 MEMOP_ANNOT_MGR (MEM_POOL* mp);
00209 ~MEMOP_ANNOT_MGR (void) { if (this == active_mgr) active_mgr = NULL; }
00210 };
00211
00213
00214
00215
00217
00218 class WN_MEMOP_ANNOT_MGR:public MEMOP_ANNOT_MGR {
00219 private:
00220 WN_MAP _wn_map;
00221 static WN_MEMOP_ANNOT_MGR* _unique_instance;
00222
00223 public:
00224 static WN_MEMOP_ANNOT_MGR* WN_mem_annot_mgr (void)
00225 { return _unique_instance; }
00226
00227 MEMOP_ANNOT* Get_annot (WN* wn) const
00228 { return (MEMOP_ANNOT*)WN_MAP_Get (_wn_map, wn); }
00229
00230 void Set_annot (WN* wn, MEMOP_ANNOT* annot) {
00231 Is_True (Alloc_by_this_class (annot),
00232 ("annotation is not allocated by this class"));
00233 WN_MAP_Set (_wn_map, wn, (void*)annot);
00234 }
00235
00236
00237 void Copy_annot (WN* orig, WN* lowed) {
00238 MEMOP_ANNOT* p = Get_annot (orig);
00239 if (p) WN_MAP_Set (_wn_map, lowed, (void*)p);
00240 }
00241
00242
00243
00244
00245
00246 void Import_annot (WN* wn, MEMOP_ANNOT* annot)
00247 { MEMOP_ANNOT* t = Alloc_annot (); *t = *annot; Set_annot (wn,t); }
00248
00249 void Init (void);
00250 void Invalidate (void) { Init(); }
00251
00252 WN_MEMOP_ANNOT_MGR (MEM_POOL* mp);
00253 ~WN_MEMOP_ANNOT_MGR (void);
00254
00255 void Print (FILE* f) const;
00256 };
00257
00259
00260
00261
00263
00264 class WN_MEMOP_ANNOT_MGR_Constructor {
00265 private:
00266 MEM_POOL* _mp;
00267 public:
00268 WN_MEMOP_ANNOT_MGR_Constructor (void) {
00269 _mp = MEM_pu_nz_pool_ptr;
00270 WN_MEMOP_ANNOT_MGR* p = CXX_NEW (WN_MEMOP_ANNOT_MGR(_mp), _mp);
00271 p->Init();
00272 }
00273
00274 ~WN_MEMOP_ANNOT_MGR_Constructor (void) {
00275 WN_MEMOP_ANNOT_MGR* p = WN_MEMOP_ANNOT_MGR::WN_mem_annot_mgr ();
00276 if (p) CXX_DELETE (p, _mp);
00277 }
00278 };
00279
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00293
00294 class PT_MEM_ANNOT {
00295 private:
00296 enum PT_MEM_ANNOT_SELECTOR {
00297 USE_INLINE_ITEM = 1,
00298 USE_ANNOT_PTR = 2,
00299 };
00300 PT_MEM_ANNOT_SELECTOR _flags;
00301 union {
00302 MEMOP_ANNOT_ITEM _inlined_annot;
00303 MEMOP_ANNOT* _annot_ptr;
00304 };
00305
00306 public:
00307 PT_MEM_ANNOT (void) { _flags = (PT_MEM_ANNOT_SELECTOR)0; }
00308 BOOL Has_annotation (void) const { return _flags != 0; }
00309 INT Annot_count (void) {
00310 if (!_flags) return 0;
00311 if (_flags == USE_INLINE_ITEM && !_inlined_annot.Is_invalid()) return 1;
00312 if (_flags == USE_ANNOT_PTR) return _annot_ptr->Item_count();
00313 return 0;
00314 }
00315 void Init (void) { _flags = (PT_MEM_ANNOT_SELECTOR)0 ; _annot_ptr = NULL; }
00316 void Invalidate (void) { Init(); }
00317
00318 BOOL Item_is_inlined (void) const { return _flags == USE_INLINE_ITEM; }
00319 const MEMOP_ANNOT_ITEM& Get_inlined_item (void) const
00320 { return _inlined_annot; }
00321 MEMOP_ANNOT* Get_annots_ptr (void) const { return _annot_ptr; }
00322
00323 void Replace_or_add_annot (const MEMOP_ANNOT_ITEM& item);
00324 void Replace_or_add_annots (MEMOP_ANNOT* annots);
00325 void Set_annots (MEMOP_ANNOT* annots)
00326 {_flags = USE_ANNOT_PTR; _annot_ptr = annots; }
00327 void Remove_annot (MEM_ANNOT_KIND kind);
00328 void Remove_all_annot (void) { Init (); }
00329
00330 BOOL Lookup (MEM_ANNOT_KIND kind, MEMOP_ANNOT_ITEM& t) const;
00331
00332 UINT64 Malloc_id (void) const {
00333 if (!_flags) return INVALID_ITEM_VALUE;
00334 MEMOP_ANNOT_ITEM t;
00335 return Lookup (MEM_ANNOT_MALLOC_ID, t) ? t.Malloc_id() : 0;
00336 }
00337
00338 LMV_ALIAS_GROUP LMV_alias_group (void) const {
00339 if (!_flags) return INVALID_ITEM_VALUE;
00340 MEMOP_ANNOT_ITEM t;
00341 return Lookup (MEM_ANNOT_LMV_ALIAS_GROUP, t) ? t.LMV_alias_group () : 0;
00342 }
00343
00344 void Set_malloc_id (UINT64 id);
00345 void Set_LMV_alias_group (LMV_ALIAS_GROUP grp_id);
00346
00347 void Meet (const PT_MEM_ANNOT& that);
00348
00349 void Print (FILE* f, BOOL verbose) const;
00350 };
00351
00352 #endif