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
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 #ifndef opt_alias_class_INCLUDED
00094 #define opt_alias_class_INCLUDED "opt_alias_class.h"
00095
00096 #include "cxx_memory.h"
00097 #include "cxx_template.h"
00098 #include "errors.h"
00099 #include "tracing.h"
00100 #include "opt_defs.h"
00101 #include "opt_union_find.h"
00102 #include "opt_wn.h"
00103 #include "id_map.h"
00104 #ifndef opt_points_to_INCLUDED
00105 #include "opt_points_to.h"
00106 #endif
00107
00108 extern "C" {
00109 #include "bitset.h"
00110 }
00111
00112 #ifdef KEY
00113 using idmap::ID_MAP;
00114 #endif
00115
00116 class IP_ALIAS_CLASS_REP;
00117 class IP_ALIAS_CLASSIFICATION;
00118 extern IP_ALIAS_CLASSIFICATION *Ip_alias_class;
00119
00120 class IP_ALIAS_CLASS_MEMBER : public U_F_ELEMENT<IP_ALIAS_CLASS_MEMBER> {
00121
00122
00123
00124 private:
00125 typedef enum {
00126 ACM_NONE,
00127 ACM_BASE,
00128 ACM_WN
00129 } ACM_KIND;
00130
00131 ACM_KIND _kind;
00132 union {
00133 IDTYPE _base_id;
00134
00135 };
00136
00137 void Set_kind(ACM_KIND kind) { _kind = kind; }
00138
00139 public:
00140 IP_ALIAS_CLASS_MEMBER(IDTYPE base_id) :
00141 _kind(ACM_BASE), _base_id(base_id)
00142 { }
00143
00144
00145 IP_ALIAS_CLASS_MEMBER(const WN *wn) :
00146 _kind(ACM_WN)
00147 { }
00148
00149 IP_ALIAS_CLASS_MEMBER(IDTYPE base_id, IP_ALIAS_CLASS_REP *acr) :
00150 _kind(ACM_BASE), _base_id(base_id)
00151 { Put_in_set((U_F_REP<IP_ALIAS_CLASS_MEMBER> *) acr); }
00152
00153 IP_ALIAS_CLASS_MEMBER(void) :
00154 _kind(ACM_NONE), _base_id(0)
00155 { }
00156
00157 IDTYPE Base_id(void) const
00158 {
00159 Is_True(_kind == ACM_BASE,
00160 ("IP_ALIAS_CLASS_MEMBER::Base_id: ACM must be BASE kind"));
00161 return _base_id;
00162 }
00163
00164 void Set_base_id(IDTYPE base_id)
00165 {
00166 Is_True(_kind == ACM_NONE,
00167 ("IP_ALIAS_CLASS_MEMBER::Set_base_id: ACM kind must not be set"));
00168 Set_kind(ACM_BASE);
00169 _base_id = base_id;
00170 }
00171
00172 #if DELETE_ME
00173 const WN *Wn(void) const
00174 {
00175 Is_True(_kind == ACM_WN,
00176 ("IP_ALIAS_CLASS_MEMBER::Wn: ACM must be WN kind"));
00177 return _wn;
00178 }
00179
00180 void Set_wn(WN *wn)
00181 {
00182 Is_True(_kind == ACM_NONE,
00183 ("IP_ALIAS_CLASS_MEMBER::Set_wn: ACM kind must not be set"));
00184 Set_kind(ACM_WN);
00185 _wn = wn;
00186 }
00187 #endif
00188
00189 void Print(FILE *) const;
00190
00191
00192
00193
00194
00195
00196
00197 IP_ALIAS_CLASS_REP *Alias_class(void)
00198 { return (IP_ALIAS_CLASS_REP *) Find(); }
00199 };
00200
00201 struct IP_AC_VALUE_TYPE_REP {
00202 IP_ALIAS_CLASS_MEMBER *_data_member, *_code_member;
00203
00204 IP_AC_VALUE_TYPE_REP(IP_ALIAS_CLASS_MEMBER *data_member,
00205 IP_ALIAS_CLASS_MEMBER *code_member) :
00206 _data_member(data_member), _code_member(code_member)
00207 { }
00208
00209 IP_AC_VALUE_TYPE_REP(void) :
00210 _data_member(NULL), _code_member(NULL)
00211 { }
00212
00213 void Init(IP_ALIAS_CLASS_MEMBER *data_member,
00214 IP_ALIAS_CLASS_MEMBER *code_member)
00215 {
00216 _data_member = data_member;
00217 _code_member = code_member;
00218 }
00219
00220 IP_ALIAS_CLASS_MEMBER *const &Data_member(void) const { return _data_member; }
00221 IP_ALIAS_CLASS_MEMBER *const &Code_member(void) const { return _code_member; }
00222
00223 IP_ALIAS_CLASS_MEMBER *&Data_member(void) { return _data_member; }
00224 IP_ALIAS_CLASS_MEMBER *&Code_member(void) { return _code_member; }
00225 };
00226
00227
00228
00229 struct IP_AC_REF_TYPE_REP {
00230 IP_AC_VALUE_TYPE_REP _value;
00231
00232 IP_AC_REF_TYPE_REP(IP_ALIAS_CLASS_MEMBER *data_member,
00233 IP_ALIAS_CLASS_MEMBER *code_member) :
00234 _value(data_member, code_member)
00235 { }
00236
00237 IP_ALIAS_CLASS_MEMBER *const &Data_member(void) const
00238 { return _value.Data_member(); }
00239
00240 IP_ALIAS_CLASS_MEMBER *const &Code_member(void) const
00241 { return _value.Code_member(); }
00242
00243 IP_ALIAS_CLASS_MEMBER *&Data_member(void)
00244 { return _value.Data_member(); }
00245
00246 IP_ALIAS_CLASS_MEMBER *&Code_member(void)
00247 { return _value.Code_member(); }
00248 };
00249
00250 struct IP_AC_LAMBDA_TYPE_REP {
00251 private:
00252
00253
00254
00255
00256
00257 IP_ALIAS_CLASS_MEMBER *returns;
00258
00259 public:
00260 BOOL frees_memory;
00261 BOOL returns_new_memory;
00262 BOOL arity_established;
00263
00264
00265
00266 vector<IP_ALIAS_CLASS_MEMBER *,
00267 mempool_allocator<IP_ALIAS_CLASS_MEMBER *> > fixed_args;
00268 IP_ALIAS_CLASS_MEMBER *remaining_args;
00269
00270 IP_AC_LAMBDA_TYPE_REP(MEM_POOL *pool) :
00271 arity_established(FALSE), returns_new_memory(FALSE), frees_memory(FALSE),
00272 fixed_args(pool), returns(NULL), remaining_args(NULL)
00273 { }
00274
00275 void Set_arities(UINT, UINT, const IP_ALIAS_CLASSIFICATION *);
00276
00277 IP_ALIAS_CLASS_MEMBER *Argument_member(UINT i) const
00278 {
00279 Is_True(arity_established,
00280 ("IP_AC_LAMBDA_TYPE_REP: arity must be established"));
00281 IP_ALIAS_CLASS_MEMBER *arg_class_representative;
00282 if (i < fixed_args.size()) {
00283 arg_class_representative = fixed_args[i];
00284 }
00285 else {
00286 arg_class_representative = remaining_args;
00287 }
00288 return arg_class_representative;
00289 }
00290
00291 IP_ALIAS_CLASS_MEMBER *&Returns(void)
00292 {
00293 Is_True(!returns_new_memory,
00294 ("IP_AC_LAMBDA_TYPE_REP: should not use static "
00295 "returns class for memory allocator"));
00296 return returns;
00297 }
00298
00299 IP_ALIAS_CLASS_MEMBER *const &Returns(void) const
00300 {
00301 Is_True(!returns_new_memory,
00302 ("IP_AC_LAMBDA_TYPE_REP: should not use static "
00303 "returns class for memory allocator"));
00304 return returns;
00305 }
00306
00307 #ifdef KEY
00308 IP_ALIAS_CLASS_MEMBER *Return_class_member(void) const
00309 {
00310 if (returns_new_memory)
00311 return Memory_allocator_return_class_member (Ip_alias_class);
00312 else
00313 return returns;
00314 }
00315 #endif
00316
00317 IP_ALIAS_CLASS_MEMBER
00318 *Memory_allocator_return_class_member(IP_ALIAS_CLASSIFICATION *ac) const;
00319
00320
00321 IP_ALIAS_CLASS_REP *Return_class(UINT i = 0) const
00322 {
00323 Is_True(arity_established,
00324 ("IP_AC_LAMBDA_TYPE_REP: arity must be established"));
00325 Is_True(!returns_new_memory,
00326 ("IP_AC_LAMBDA_TYPE_REP: wrong member for memory allocator"));
00327 return returns->Alias_class();
00328 }
00329
00330 void Union_func_args(IP_AC_LAMBDA_TYPE_REP &, MEM_POOL *, BOOL);
00331 };
00332
00333 typedef enum {
00334 IP_ACR_BOTTOM_TYPE,
00335 IP_ACR_VALUE_TYPE,
00336 IP_ACR_REF_TYPE,
00337 IP_ACR_LAMBDA_TYPE
00338 } IP_ACR_TYPE_SORT;
00339
00340 class IP_ACR_SLIST;
00341
00342
00343 class IP_ALIAS_CLASS_REP : public U_F_REP<IP_ALIAS_CLASS_MEMBER> {
00344 friend class IP_ALIAS_CLASSIFICATION;
00345 friend class IP_ACR_SLIST;
00346 #if Is_True_On
00347 friend void print_table(void);
00348 #endif
00349
00350 struct IP_AC_TYPE_INFO {
00351 IP_ACR_TYPE_SORT _sort;
00352
00353
00354 IP_AC_LAMBDA_TYPE_REP *_signature;
00355 IP_AC_REF_TYPE_REP _ref;
00356
00357 IP_AC_TYPE_INFO(void) :
00358 _sort(IP_ACR_BOTTOM_TYPE), _signature(NULL), _ref(NULL, NULL)
00359 { }
00360 };
00361
00362 public:
00363 typedef IP_ALIAS_CLASS_MEMBER *PENDING_SET_ITEM;
00364 typedef slist<PENDING_SET_ITEM,
00365 mempool_allocator<PENDING_SET_ITEM> > PENDING_SET;
00366
00367 private:
00368 static IDTYPE _last_id_used;
00369 static IP_ACR_SLIST _free_list;
00370 static UINT32 _recycled_acr_nodes;
00371
00372 union {
00373 IDTYPE _id;
00374 IP_ALIAS_CLASS_REP *_next_free;
00375 };
00376
00377 PENDING_SET _pending;
00378
00379 IP_AC_TYPE_INFO _type_info;
00380
00381 public:
00382 IP_ALIAS_CLASS_REP(MEM_POOL *pool) :
00383 _id(++_last_id_used),
00384 _pending(pool)
00385 { }
00386
00387 ~IP_ALIAS_CLASS_REP(void)
00388 {
00389 if (Sort() == IP_ACR_LAMBDA_TYPE) {
00390
00391 }
00392 }
00393
00394 void Free_acr(void);
00395
00396 IDTYPE Id(void) const { return _id; }
00397
00398 const IP_AC_REF_TYPE_REP &Ref(void) const
00399 {
00400 Is_True(_type_info._sort == IP_ACR_REF_TYPE,
00401 ("Illegal REF access"));
00402 return _type_info._ref;
00403 }
00404
00405 IP_AC_REF_TYPE_REP &Ref(void)
00406 {
00407 Is_True(_type_info._sort == IP_ACR_REF_TYPE,
00408 ("Illegal REF access"));
00409 return _type_info._ref;
00410 }
00411
00412 const IP_AC_LAMBDA_TYPE_REP &Signature(void) const
00413 {
00414 Is_True(_type_info._sort == IP_ACR_LAMBDA_TYPE,
00415 ("Illegal LAMBDA access"));
00416 return *_type_info._signature;
00417 }
00418
00419 IP_AC_LAMBDA_TYPE_REP &Signature(void)
00420 {
00421 Is_True(_type_info._sort == IP_ACR_LAMBDA_TYPE,
00422 ("Illegal LAMBDA access"));
00423 return *_type_info._signature;
00424 }
00425
00426 IP_ACR_TYPE_SORT Sort(void) const
00427 {
00428 Is_True((_type_info._sort != IP_ACR_BOTTOM_TYPE) ||
00429 ((_type_info._ref.Data_member() == NULL) &&
00430 (_type_info._ref.Code_member() == NULL) &&
00431 (_type_info._signature == NULL)),
00432 ("BOTTOM-typed ACR must not have ref or signature fields"));
00433 Is_True((_type_info._sort != IP_ACR_REF_TYPE) ||
00434 ((Ref().Data_member() != NULL) &&
00435 (Ref().Code_member() != NULL) &&
00436 (_type_info._signature == NULL)),
00437 ("REF-typed ACR must have ref fields set up and no signature"));
00438 Is_True((_type_info._sort != IP_ACR_LAMBDA_TYPE) ||
00439 ((_type_info._ref.Data_member() == NULL) &&
00440 (_type_info._ref.Code_member() == NULL) &&
00441 (_type_info._signature != NULL)),
00442 ("LAMBDA-typed ACR must have signature set up and no "
00443 "ref fields"));
00444 return _type_info._sort;
00445 }
00446
00447 #if 0
00448 BOOL In_pending(IP_ALIAS_CLASS_REP *);
00449 #endif
00450 void Add_pending(IP_ALIAS_CLASS_REP *, BOOL);
00451 void Merge_pending(IP_ALIAS_CLASS_REP &, BOOL);
00452 void Process_pending(IP_ALIAS_CLASS_MEMBER *,
00453 MEM_POOL *, BOOL);
00454 PENDING_SET &Pending(void) { return _pending; }
00455
00456 void Join(IP_ALIAS_CLASS_REP &, MEM_POOL *, BOOL);
00457
00458 IP_ALIAS_CLASS_REP *Data_class_pointed_to(void) const
00459 {
00460 Is_True(Sort() == IP_ACR_REF_TYPE,
00461 ("IP_ALIAS_CLASS_REP::Data_class_pointed_to: must be "
00462 "REF type"));
00463 return Ref().Data_member()->Alias_class();
00464 }
00465
00466 IP_ALIAS_CLASS_REP *Func_class_pointed_to(void) const
00467 {
00468 Is_True(Sort() == IP_ACR_REF_TYPE,
00469 ("IP_ALIAS_CLASS_REP::Func_class_pointed_to: must be "
00470 "REF type"));
00471 return Ref().Code_member()->Alias_class();
00472 }
00473
00474 void Settype(const IP_AC_REF_TYPE_REP &, MEM_POOL *, BOOL);
00475
00476
00477 void Print(FILE *,
00478 IP_ALIAS_CLASS_REP *global_class = NULL) const;
00479 };
00480
00481 struct IP_ACR_SLIST {
00482 IP_ALIAS_CLASS_REP *head;
00483
00484 public:
00485 void push_front(IP_ALIAS_CLASS_REP *acr)
00486 {
00487 acr->_next_free = head;
00488 head = acr;
00489 }
00490
00491 IP_ALIAS_CLASS_REP *front(void) const { return head; }
00492
00493 IP_ALIAS_CLASS_REP *pop_front(void)
00494 {
00495 IP_ALIAS_CLASS_REP *retval = head;
00496 head = head->_next_free;
00497 return retval;
00498 }
00499 };
00500
00501 struct AC_ST_IDENTIFIER {
00502 ST_IDX pu_st_idx;
00503
00504 ST_IDX base_st_idx;
00505
00506 void Set_pu_st_idx(ST_IDX pu)
00507 {
00508 Is_True(ST_IDX_level(pu) == GLOBAL_SYMTAB ||
00509 pu == (ST_IDX) 0,
00510 ("IP_ALIAS_CLASSIFICATION: PU must be global symbol"));
00511 pu_st_idx = pu;
00512 }
00513
00514 void Set_base_st_idx(ST_IDX base) { base_st_idx = base; }
00515 };
00516
00517 struct AC_PREG_IDENTIFIER {
00518 ST_IDX pu_st_idx;
00519
00520 mINT32 preg_num;
00521
00522 void Set_pu_st_idx(ST_IDX pu)
00523 {
00524 Is_True(ST_IDX_level(pu) == GLOBAL_SYMTAB,
00525 ("IP_ALIAS_CLASSIFICATION: PU must be global symbol"));
00526 pu_st_idx = pu;
00527 }
00528
00529 void Set_preg_num(INT64 preg)
00530 {
00531 preg_num = (mINT32) preg;
00532 Is_True((INT64) preg_num == preg,
00533 ("preg number overflows 32 bits"));
00534 }
00535 };
00536
00537 static bool operator==(AC_ST_IDENTIFIER x, AC_ST_IDENTIFIER y)
00538 {
00539 return (x.pu_st_idx == y.pu_st_idx &&
00540 x.base_st_idx == y.base_st_idx);
00541 }
00542
00543 static bool operator==(AC_PREG_IDENTIFIER x, AC_PREG_IDENTIFIER y)
00544 {
00545 return (x.pu_st_idx == y.pu_st_idx &&
00546 x.preg_num == y.preg_num);
00547 }
00548
00549 class IP_BASE_ID_MAP_ENTRY;
00550
00551 class IP_ALIAS_CLASSIFICATION {
00552 friend class IP_ALIAS_CLASS_REP;
00553 friend class IP_AC_LAMBDA_TYPE_REP;
00554 friend class MERGE_NEST_REF_CLASSES;
00555 friend class CLASSIFY_INITIALIZED_DATA;
00556
00557 private:
00558 ID_MAP<IDTYPE, AC_ST_IDENTIFIER> _st_id_to_base_id_map;
00559
00560
00561
00562
00563
00564
00565 DYN_ARRAY<IP_BASE_ID_MAP_ENTRY *> _base_id_map;
00566
00567 ID_MAP<IDTYPE, AC_PREG_IDENTIFIER> _preg_id_to_base_id_map;
00568
00569 WN_MAP _memop_classification_map;
00570 WN_MAP _indir_classification_map;
00571 BOOL _memops_classified;
00572 BOOL _maps_initialized;
00573 MEM_POOL *_pool;
00574 BOOL _mem_pool_valid;
00575 IP_ALIAS_CLASS_MEMBER *_member_of_global_data_class;
00576 IP_ALIAS_CLASS_MEMBER *_member_of_global_func_class;
00577 IP_ALIAS_CLASS_MEMBER *_member_of_misused_code_class;
00578 IP_ALIAS_CLASS_MEMBER *_member_of_const_addr_class;
00579
00580 BOOL _tracing;
00581 const BOOL _verbose;
00582
00583
00584 IP_ALIAS_CLASS_REP *Class_of_base_id(IDTYPE) const;
00585
00586 BOOL Can_be_referred_to_by_code(ST_IDX);
00587 void Merge_initial_value_classes(IDTYPE,
00588 INITV_IDX);
00589 void Classify_inito(const INITO *);
00590 WN *Classify_wn_and_kids(WN *);
00591
00592 IP_ALIAS_CLASS_MEMBER *Classify_lhs_of_store(WN *);
00593
00594 void Classify_deref_of_expr(IP_ALIAS_CLASS_MEMBER *,
00595 WN *, BOOL);
00596
00597 IP_ALIAS_CLASS_MEMBER *Incorporate_call_and_parm_flags( IP_ALIAS_CLASS_MEMBER *,
00598 const WN *);
00599
00600 void Handle_function_definition(WN *);
00601 WN *Handle_assignment(WN *);
00602 WN *Handle_return_val(WN *);
00603 WN *Handle_call(WN *);
00604
00605 BOOL Callee_saves_no_parms(const WN *);
00606 BOOL Callee_returns_new_memory(const WN *);
00607 BOOL Callee_returns_new_memory(const ST *);
00608 BOOL Callee_frees_memory(const WN *);
00609 BOOL Callee_frees_memory(const ST *);
00610 BOOL Stmt_stores_return_value_from_callee(const WN *);
00611 BOOL Stmt_stores_return_value_to_caller(const WN *);
00612 BOOL Uses_no_return_value(const WN *);
00613
00614 WN_MAP Indir_classification_map(void) const
00615 { return _indir_classification_map; }
00616
00617 void Finalize_ac_map(WN *);
00618 void Finalize_ac_map_wn(WN *);
00619
00620 IP_ALIAS_CLASS_REP *New_alias_class(IP_ACR_TYPE_SORT,
00621 IP_ALIAS_CLASS_MEMBER &) const;
00622
00623 IP_ALIAS_CLASS_MEMBER *New_alias_class_member(void) const;
00624 #if DELETE_ME
00625 IP_ALIAS_CLASS_MEMBER *New_alias_class_member(IDTYPE) const;
00626 #endif // DELETE_ME
00627 IP_ALIAS_CLASS_MEMBER *New_alias_class_member(const WN *) const;
00628
00629 void Find_declared_base_and_offset(ST_IDX, ST_IDX &, INT64 &);
00630
00631 IDTYPE New_base_id(ST_IDX, ST_IDX);
00632 IDTYPE ST_base_id(ST_IDX, ST_IDX);
00633 IDTYPE Base_id(const ST *, INT64);
00634 IDTYPE WN_base_id(const WN *);
00635 ID_MAP<IDTYPE, AC_PREG_IDENTIFIER> &Preg_id_to_base_id_map(void)
00636 { return _preg_id_to_base_id_map; }
00637
00638 MEM_POOL *Pool(void) const { return _pool; }
00639
00640 void Conditional_join(IP_ALIAS_CLASS_REP *,
00641 IP_ALIAS_CLASS_REP *);
00642
00643 IP_ALIAS_CLASS_REP *Global_data_class(void) const
00644 { return _member_of_global_data_class->Alias_class(); }
00645
00646 IP_ALIAS_CLASS_REP *Global_func_class(void) const
00647 { return _member_of_global_func_class->Alias_class(); }
00648
00649 IP_ALIAS_CLASS_REP *Const_addr_class(void) const
00650 { return _member_of_const_addr_class->Alias_class(); }
00651
00652 IP_ALIAS_CLASS_REP *Class_of_code_misused_as_data(void) const
00653 { return _member_of_misused_code_class->Alias_class(); }
00654
00655 IDTYPE Alias_class(IDTYPE) const;
00656
00657 BOOL Tracing(void) const { return _tracing; }
00658
00659 WN_MAP Memop_classification_map(void) const
00660 { return _memop_classification_map; }
00661
00662 public:
00663 IP_ALIAS_CLASSIFICATION(MEM_POOL *pool) :
00664 _pool(pool), _base_id_map(pool), _verbose(TRUE),
00665 _memop_classification_map(WN_MAP_ALIAS_CLASS),
00666 _indir_classification_map(WN_MAP_AC_INTERNAL),
00667 _preg_id_to_base_id_map(128, (IDTYPE) 0, pool,
00668 Get_Trace(TP_GLOBOPT, ALIAS_DUMP_FLAG)),
00669 _st_id_to_base_id_map(256, (IDTYPE) 0, pool,
00670 Get_Trace(TP_GLOBOPT, ALIAS_DUMP_FLAG)),
00671 _memops_classified(FALSE), _maps_initialized(FALSE),
00672 _mem_pool_valid(TRUE)
00673 {
00674
00675
00676
00677 {
00678 AC_ST_IDENTIFIER dummy;
00679 FmtAssert(sizeof(dummy) ==
00680 (sizeof(dummy.pu_st_idx) +
00681 sizeof(dummy.base_st_idx)),
00682 ("AC_ST_IDENTIFIER must not have padding"));
00683 }
00684 {
00685 AC_PREG_IDENTIFIER dummy;
00686 FmtAssert(sizeof(dummy) ==
00687 (sizeof(dummy.pu_st_idx) +
00688 sizeof(dummy.preg_num)),
00689 ("AC_PREG_IDENTIFIER must not have padding"));
00690 }
00691
00692 MEM_POOL_Push(_pool);
00693 if (Get_Trace(TP_GLOBOPT, ALIAS_DUMP_FLAG)) {
00694 _tracing = TRUE;
00695 }
00696 else {
00697 _tracing = FALSE;
00698 }
00699 IP_ALIAS_CLASS_REP::_last_id_used = PESSIMISTIC_AC_ID;
00700 IP_ALIAS_CLASS_REP::_free_list.head = NULL;
00701 IP_ALIAS_CLASS_REP::_recycled_acr_nodes = 0;
00702
00703
00704 _member_of_global_data_class = New_alias_class_member();
00705 IP_ALIAS_CLASS_REP *dummy_acr =
00706 New_alias_class(IP_ACR_REF_TYPE,
00707 *_member_of_global_data_class);
00708 dummy_acr->Data_class_pointed_to()->Join(*dummy_acr, pool, _tracing);
00709
00710
00711 _member_of_const_addr_class = New_alias_class_member();
00712 dummy_acr =
00713 New_alias_class(IP_ACR_REF_TYPE, *_member_of_const_addr_class);
00714 dummy_acr->Data_class_pointed_to()->Join(*Global_data_class(),
00715 pool, _tracing);
00716
00717
00718 _member_of_global_func_class = New_alias_class_member();
00719 dummy_acr = New_alias_class(IP_ACR_LAMBDA_TYPE,
00720 *_member_of_global_func_class);
00721 dummy_acr->Signature().remaining_args = _member_of_global_data_class;
00722 dummy_acr->Signature().Returns() = _member_of_global_data_class;
00723 dummy_acr->Signature().arity_established = TRUE;
00724 _member_of_global_data_class->Alias_class()->
00725 Func_class_pointed_to()->Join(*dummy_acr, pool, _tracing);
00726
00727 _member_of_misused_code_class = New_alias_class_member();
00728 (void) New_alias_class(IP_ACR_REF_TYPE,
00729 *_member_of_misused_code_class);
00730
00731
00732 _base_id_map.Initidx(0);
00733 }
00734
00735 void Init_maps(void);
00736
00737 void Release_resources(void);
00738
00739 void Classify_initialized_data(INITO_TAB *);
00740
00741 void Classify_memops(WN *);
00742
00743 void Finalize_memops(WN *);
00744
00745 IDTYPE Alias_class(const WN *) const;
00746
00747 void Print(FILE *) const;
00748 };
00749
00750 inline IP_ALIAS_CLASS_MEMBER *
00751 IP_AC_LAMBDA_TYPE_REP::Memory_allocator_return_class_member(IP_ALIAS_CLASSIFICATION *ac) const
00752 {
00753 Is_True(returns_new_memory,
00754 ("IP_AC_LAMBDA_TYPE_REP: must be memory allocator"));
00755 IP_ALIAS_CLASS_REP *return_value_class =
00756 ac->New_alias_class(IP_ACR_REF_TYPE, *ac->New_alias_class_member());
00757 IP_ALIAS_CLASS_REP *return_deref_class =
00758 ac->New_alias_class(IP_ACR_REF_TYPE, *ac->New_alias_class_member());
00759 return_value_class->Data_class_pointed_to()->Join(*return_deref_class,
00760 ac->Pool(),
00761 ac->Tracing());
00762 return return_value_class->Representative();
00763 }
00764
00765 extern vector<char *> Ip_alias_class_files;
00766 #endif