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
00094
00095 #ifndef call_info_INCLUDED
00096 #define call_info_INCLUDED
00097
00098 #include <sys/types.h>
00099 #if defined(BUILD_OS_DARWIN)
00100 #include <darwin_elf.h>
00101 #else
00102 #include <elf.h>
00103 #endif
00104 #ifndef _ara_loop_info_INCLUDED
00105 #include "ara_loop.h"
00106 #endif
00107 #ifndef access_vector_INCLUDED
00108 #include "access_vector.h"
00109 #endif
00110 #ifndef ipl_summary_INCLUDED
00111 #include "ipl_summary.h"
00112 #endif
00113
00114 class ARA_LOOP_INFO;
00115
00116 class CALL_INFO
00117 {
00118 BOOL _is_evaluated;
00119 BOOL _needs_evaluation;
00120 BOOL _has_ipa_summaries;
00121 WN* _wn_call;
00122 MEM_POOL* _pool;
00123 ARA_LOOP_INFO* _ara_call;
00124 ARA_LOOP_INFO* _ara_call_save;
00125 DYN_ARRAY<SUMMARY_VALUE>* _value;
00126 DYN_ARRAY<SUMMARY_EXPR>* _expr;
00127
00128
00129 public:
00130
00131 CALL_INFO(MEM_POOL *pool) {
00132 _needs_evaluation = TRUE;
00133 _is_evaluated = FALSE;
00134 _pool = pool;
00135 _ara_call = NULL;
00136 _ara_call_save = NULL;
00137 _wn_call = NULL;
00138 _value = NULL;
00139 _expr = NULL;
00140 }
00141
00142 CALL_INFO(ARA_LOOP_INFO* ara_call, WN* wn_call, BOOL has_ipa_summaries,
00143 MEM_POOL *pool) {
00144 _needs_evaluation = TRUE;
00145 _is_evaluated = FALSE;
00146 _has_ipa_summaries = has_ipa_summaries;
00147 _pool = pool;
00148 _ara_call = ara_call;
00149 _ara_call_save = NULL;
00150 _wn_call = wn_call;
00151 _value = NULL;
00152 _expr = NULL;
00153 }
00154
00155 CALL_INFO(CALL_INFO *ci);
00156 MEM_POOL *Pool() { return _pool; };
00157 void Print(FILE *fp);
00158 void Tlog_Print();
00159
00160
00161 void Set_Call_Ara_Info(ARA_LOOP_INFO *a){ _ara_call = a;}
00162 ARA_LOOP_INFO * Call_Ara_Info(void) const { return _ara_call; }
00163 void Evaluate();
00164 void Unevaluate();
00165 BOOL Has_Formal_Parameter();
00166 void Reset_Needs_Evaluation() {_needs_evaluation = FALSE;}
00167 void Set_Needs_Evaluation() {_needs_evaluation = TRUE;}
00168 BOOL Has_IPA_Summaries() {return _has_ipa_summaries;}
00169
00170
00171 void Set_Value(DYN_ARRAY<SUMMARY_VALUE>* sv) {_value = sv;}
00172 DYN_ARRAY<SUMMARY_VALUE>* Value() const {return _value;}
00173 void Set_Expr(DYN_ARRAY<SUMMARY_EXPR>* sx) {_expr = sx;}
00174 DYN_ARRAY<SUMMARY_EXPR>* Expr() const {return _expr;}
00175
00176 };
00177
00178 extern void Call_Info_Walk(WN* root);
00179
00180 inline void Set_Call_Info(WN* wn, CALL_INFO* cli)
00181 {
00182 Is_True(wn && WN_operator(wn) == OPR_CALL,
00183 ("Set_Call_Info bug"));
00184 WN_MAP_Set(LNO_Info_Map, wn, cli);
00185 }
00186
00187 inline BOOL Has_Call_Info(WN* wn) {
00188 return ((CALL_INFO*)WN_MAP_Get(LNO_Info_Map, wn)!=NULL);
00189 }
00190
00191 inline BOOL Has_Execution_Cost(WN* wn) {
00192 CALL_INFO* call_info = (CALL_INFO*) WN_MAP_Get(LNO_Info_Map, wn);
00193 if (call_info != NULL)
00194 return call_info->Value() != NULL || call_info->Expr();
00195 return FALSE;
00196 }
00197
00198 inline CALL_INFO* Get_Call_Info(WN* wn)
00199 {
00200 Is_True(wn && WN_operator(wn) == OPR_CALL,
00201 ("Get_Call_Info bug"));
00202 Is_True(Has_Call_Info(wn), ("Missing CALL_INFO"));
00203
00204 return (CALL_INFO*)WN_MAP_Get(LNO_Info_Map, wn);
00205 }
00206
00207 extern void Process_Call(WN* wn);
00208
00209 #endif