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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef opt_alias_mgr_INCLUDED
00050 #define opt_alias_mgr_INCLUDED "opt_alias_mgr.h"
00051 #ifdef _KEEP_RCS_ID
00052 #endif
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef cxx_template_INCLUDED
00076 #include "cxx_template.h"
00077 #endif
00078 #include "opt_alias_interface.h"
00079 #include "opt_points_to.h"
00080 #include "mempool.h"
00081 #include "tracing.h"
00082
00083 class ALIAS_CLASSIFICATION;
00084
00085 class ALIAS_MANAGER {
00086
00087 private:
00088 MEM_POOL _mem_pool;
00089 BOOL _trace;
00090 WN_MAP _map;
00091 WN_MAP _homing_map;
00092 IDTYPE _last_alias_id;
00093 DYN_ARRAY<POINTS_TO*> *_vec;
00094 static const IDTYPE _preg_id = 1;
00095 IDTYPE _no_alias_info_id;
00096 ALIAS_CONTEXT _pu_context;
00097 ALIAS_RULE *_rule;
00098
00099 ALIAS_MANAGER(const ALIAS_MANAGER&);
00100 ALIAS_MANAGER& operator = (const ALIAS_MANAGER&);
00101
00102 DYN_ARRAY<POINTS_TO*> *Vec(void) const { return _vec; }
00103 vector<IDTYPE, mempool_allocator<IDTYPE> > *_invalid_ip_alias_classes;
00104
00105 public:
00106 ALIAS_MANAGER(void);
00107 ~ALIAS_MANAGER(void);
00108
00109 IDTYPE Id(const WN *wn) const;
00110 IDTYPE Preg_id(void) const { return _preg_id; }
00111 IDTYPE No_alias_info_id(void) const { return _no_alias_info_id; }
00112 POINTS_TO *Pt(IDTYPE id) const { return (*_vec)[id]; }
00113 ALIAS_CONTEXT Pu_context(void) const { return _pu_context; }
00114 ALIAS_RULE *Rule(void) const { return _rule; }
00115 WN_MAP Map(void) const { return _map; }
00116 WN_MAP Homing_map(void) const { return _homing_map; }
00117 inline void Set_id(WN *wn, IDTYPE id) const;
00118 inline void Set_pu_context(ALIAS_CONTEXT ct){ _pu_context = ct; }
00119 inline void Set_context(ALIAS_CONTEXT c);
00120 inline IDTYPE New_alias_id(void);
00121 inline POINTS_TO *New_points_to(WN *wn);
00122
00123
00124 IDTYPE Cross_dso_new_alias_id(void);
00125 void Cross_dso_set_id(WN *wn, IDTYPE id) const;
00126
00127
00128 void Gen_alias_id(WN *, POINTS_TO *);
00129 void Gen_alias_id_list(WN *, POINTS_TO_LIST *);
00130 void Gen_black_box_alias(WN *);
00131
00132 void Dup_tree_alias_id( const WN *old_wn, WN *new_wn );
00133 void Print( const WN *wn, FILE *fp = TFile ) const;
00134
00135 void Forget_alias_class_info(void);
00136 void Transfer_alias_class_to_alias_manager(const ALIAS_CLASSIFICATION &,
00137 WN *);
00138
00139
00140 inline BOOL May_refer_to_alloca_mem(const WN *) const;
00141 BOOL Safe_to_speculate(const WN *) const;
00142
00143 void Note_invalid_ip_alias_class(const WN *);
00144 void Erase_ip_alias_class_if_invalid(WN *);
00145
00146
00147 BOOL Homing_load( const WN *load_wn ) const
00148 { return WN_MAP32_Get(Homing_map(),load_wn); }
00149 void Set_homing_load( WN *load_wn, BOOL b ) const
00150 { WN_MAP32_Set(Homing_map(),load_wn,b); }
00151
00152 BOOL Homing_store( const WN *store_wn ) const
00153 { return WN_MAP32_Get(Homing_map(),store_wn); }
00154 void Set_homing_store( WN *store_wn, BOOL b ) const
00155 { WN_MAP32_Set(Homing_map(),store_wn,b); }
00156
00157 ALIAS_RESULT Aliased(WN *wn, const POINTS_TO *pt);
00158 ALIAS_RESULT Aliased(const POINTS_TO *pt, WN *wn);
00159 ALIAS_RESULT Aliased(const POINTS_TO *pt1, const POINTS_TO *pt2);
00160 };
00161
00162 #endif