Go to the documentation of this file.00001
00021 #include "ManagerInsNoPtrInterAliasMap.hpp"
00022 #include <Utils/Util.hpp>
00023
00024
00025 namespace OA {
00026 namespace Alias {
00027
00028 static bool debug = false;
00029
00032 ManagerInsNoPtrInterAliasMap::ManagerInsNoPtrInterAliasMap(
00033 OA_ptr<AliasIRInterface> _ir)
00034 : DataFlow::CallGraphDFProblemNew(DataFlow::CallGraphDFProblemNew::TopDown),
00035 mIR(_ir)
00036 {
00037 OA_DEBUG_CTRL_MACRO("DEBUG_ManagerInsNoPtrInterAliasMap:ALL", debug);
00038 }
00039
00040 OA_ptr<Alias::InterAliasMap>
00041 ManagerInsNoPtrInterAliasMap::performAnalysis(
00042 OA_ptr<CallGraph::Interface> callGraph,
00043 OA_ptr<DataFlow::ParamBindings> paramBind)
00044 {
00045
00046 mParamBind = paramBind;
00047
00048
00049 OA_ptr<ManagerAliasMapBasic> manAM; manAM = new ManagerAliasMapBasic(mIR);
00050 mInterAliasMap = new InterAliasMap(manAM);
00051
00052
00053 DataFlow::CallGraphDFProblemNew::solve(callGraph);
00054
00055 return mInterAliasMap;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00071 OA_ptr<DataFlow::DataFlowSet> ManagerInsNoPtrInterAliasMap::initializeTop()
00072 {
00073 OA_ptr<SymAliasSets> retval;
00074 retval = new SymAliasSets;
00075 return retval;
00076 }
00077
00080 OA_ptr<DataFlow::DataFlowSet>
00081 ManagerInsNoPtrInterAliasMap::initializeBottom()
00082 {
00083 assert(0);
00084
00085
00086
00087
00088
00089
00090
00091 OA_ptr<SymAliasSets> retval;
00092 return retval;
00093 }
00094
00096 OA_ptr<DataFlow::DataFlowSet>
00097 ManagerInsNoPtrInterAliasMap::initializeNode(ProcHandle proc)
00098 {
00099 OA_ptr<ManagerSymAliasSetsTop> man;
00100 man = new ManagerSymAliasSetsTop(mIR);
00101
00102 OA_ptr<SymAliasSets> retval = man->performAnalysis(proc);
00103 return retval;
00104 }
00105
00108 OA_ptr<DataFlow::DataFlowSet>
00109 ManagerInsNoPtrInterAliasMap::initializeEdge(ExprHandle call,
00110 ProcHandle caller,
00111 ProcHandle callee)
00112 {
00113
00114 OA_ptr<ManagerSymAliasSetsTop> man;
00115 man = new ManagerSymAliasSetsTop(mIR);
00116
00117 OA_ptr<SymAliasSets> retval = man->performAnalysis(caller);
00118 return retval;
00119 }
00120
00124 OA_ptr<DataFlow::DataFlowSet>
00125 ManagerInsNoPtrInterAliasMap::initializeEdge(ExprHandle call,
00126 ProcHandle caller,
00127 SymHandle callee)
00128 {
00129
00130 OA_ptr<ManagerSymAliasSetsTop> man;
00131 man = new ManagerSymAliasSetsTop(mIR);
00132
00133 OA_ptr<SymAliasSets> retval = man->performAnalysis(caller);
00134 return retval;
00135 }
00136
00137
00138
00139
00140
00143 OA_ptr<DataFlow::DataFlowSet>
00144 ManagerInsNoPtrInterAliasMap::meet(OA_ptr<DataFlow::DataFlowSet> set1,
00145 OA_ptr<DataFlow::DataFlowSet> set2)
00146 {
00147 if (debug) {
00148 std::cout << "ManagerInsNoPtrInterAliasMap::meet" << std::endl;
00149 }
00150 OA_ptr<SymAliasSets> remapSet1 = set1.convert<SymAliasSets>();
00151 OA_ptr<SymAliasSets> remapSet2 = set2.convert<SymAliasSets>();
00152 if (debug) {
00153 std::cout << "\tremapSet1 = ";
00154
00155 remapSet1->dump(std::cout);
00156 std::cout << "\tremapSet2 = ";
00157
00158 remapSet2->dump(std::cout);
00159 }
00160 OA_ptr<SymAliasSets> retval = remapSet1->meet(*remapSet2);
00161 if (debug) {
00162 std::cout << "\tretval = ";
00163 retval->dump(std::cout);
00164 }
00165 return retval;
00166 }
00167
00169 OA_ptr<DataFlow::DataFlowSet>
00170 ManagerInsNoPtrInterAliasMap::atCallGraphNode(
00171 OA_ptr<DataFlow::DataFlowSet> inSet,
00172 OA::ProcHandle proc)
00173 {
00174 if (debug) {
00175 std::cout << "In ManagerInsNoPtrInterAliasMap::atCallGraphNode"
00176 << std::endl;
00177 }
00178
00179
00180 OA_ptr<SymAliasSets> symSets = inSet.convert<SymAliasSets>();
00181
00183
00184 OA_ptr<AliasMap> seedAliasMap;
00185 seedAliasMap = new AliasMap(proc);
00186
00187
00188 OA_ptr<SymHandleIterator> symIter = mParamBind->getFormalIterator(proc);
00189 for ( ; symIter->isValid(); (*symIter)++ ) {
00190 SymHandle formal = symIter->current();
00191 if (debug) {
00192 std::cout << "\tformal = " << mIR->toString(formal) << std::endl;
00193 }
00194
00195
00196 if (mParamBind->isRefParam(formal)) {
00197
00198 OA_ptr<Location> formalLoc = mIR->getLocation(proc,formal);
00199 if (debug) {
00200 std::cout << "\tformalLoc = ";
00201 formalLoc->dump(std::cout,mIR);
00202 std::cout << std::endl;
00203 std::cout << "\tSymAliasSets = ";
00204
00205 symSets->dump(std::cout);
00206 }
00207
00208
00209 OA_ptr<SymHandleIterator> aliasIter
00210 = symSets->getSymIterator(formal);
00211 for ( ; aliasIter->isValid(); (*aliasIter)++ ) {
00212 SymHandle otherSym = aliasIter->current();
00213 if (debug) {
00214 std::cout << "\t\tother = " << mIR->toString(otherSym);
00215 std::cout << ", hval = " << otherSym.hval()
00216 << std::endl;
00217 }
00218
00219 OA_ptr<Location> otherLoc = mIR->getLocation(proc,otherSym);
00220
00221 seedAliasMap->aliasLocs(formalLoc,otherLoc);
00222 }
00223 }
00224 }
00225
00228 OA_ptr<ManagerAliasMapBasic> aliasMan;
00229 aliasMan = new ManagerAliasMapBasic(mIR);
00230 assert(0);
00231
00232 OA_ptr<AliasMap> alias;
00233 mInterAliasMap->mapProcToAliasMap(proc,alias);
00234
00235
00236 return inSet;
00237 }
00238
00240 OA_ptr<DataFlow::DataFlowSet>
00241 ManagerInsNoPtrInterAliasMap::atCallGraphEdge(
00242 OA_ptr<DataFlow::DataFlowSet> inSet,
00243 OA::ExprHandle call, ProcHandle caller, ProcHandle callee)
00244 {
00245 if (debug) {
00246 std::cout << "atCallGraphEdge::inSet = ";
00247 inSet->dump(std::cout);
00248 }
00249
00250 return inSet;
00251 }
00252
00255 OA_ptr<DataFlow::DataFlowSet>
00256 ManagerInsNoPtrInterAliasMap::nodeToEdge(ProcHandle proc,
00257 OA_ptr<DataFlow::DataFlowSet> procDFSet, ExprHandle call)
00258 {
00259 if (debug) {
00260 std::cout << "In ManagerInsNoPtrInterAliasMap::nodeToEdge" << std::endl;
00261 }
00262
00263
00264 OA_ptr<SymAliasSets> retval;
00265 retval = new SymAliasSets;
00266
00267
00268 OA_ptr<Alias::Interface> alias = mInterAliasMap->getAliasResults(proc);
00269
00270
00271 OA_ptr<MemRefHandleIterator> actIter1 = mParamBind->getActualIterator(call);
00272 OA_ptr<MemRefHandleIterator> actIter2 = mParamBind->getActualIterator(call);
00273 for ( ; actIter1->isValid(); (*actIter1)++ ) {
00274 MemRefHandle act1 = actIter1->current();
00275 SymHandle formal1 = mParamBind->getCalleeFormal(call, act1);
00276 if (debug) {
00277 std::cout << "\tact1 = " << mIR->toString(act1) << std::endl;
00278 std::cout << "\tformal1 = " << mIR->toString(formal1) << std::endl;
00279 }
00280
00281 for ( ; actIter2->isValid(); (*actIter2)++ ) {
00282 MemRefHandle act2 = actIter2->current();
00283 SymHandle formal2 = mParamBind->getCalleeFormal(call, act2);
00284 if (debug) {
00285 std::cout << "\tact2 = " << mIR->toString(act2) << std::endl;
00286 std::cout << "\tformal2 = " << mIR->toString(formal2) << std::endl;
00287 }
00288
00289
00290
00291
00292
00293 if ( mParamBind->isRefParam(formal1) && mParamBind->isRefParam(formal2)
00294 && alias->alias(act1,act2) != NOALIAS )
00295 {
00296 if (debug) { std::cout << "\tact1 and act2 alias" << std::endl; }
00297 retval->mergeSyms(formal1, formal2);
00298 }
00299 }
00300
00301
00302
00303 if (mParamBind->isRefParam(formal1)) {
00304 OA_ptr<LocIterator> locIter = alias->getMayLocs(act1);
00305 for ( ; locIter->isValid(); (*locIter)++ ) {
00306 OA_ptr<Location> loc = locIter->current();
00307 if (!loc->isLocal() && loc->isaNamed() ) {
00308 OA_ptr<NamedLoc> nloc = loc.convert<NamedLoc>();
00309 retval->mergeSyms(formal1, nloc->getSymHandle());
00310 }
00311 }
00312 }
00313
00314 }
00315
00316 return retval;
00317
00318 }
00319
00322 OA_ptr<DataFlow::DataFlowSet>
00323 ManagerInsNoPtrInterAliasMap::edgeToNode(ExprHandle call,
00324 OA_ptr<DataFlow::DataFlowSet> callDFSet, ProcHandle proc)
00325 {
00326 if (debug) {
00327 std::cout << "edgeToNode::callDFSet = ";
00328 callDFSet->dump(std::cout);
00329 }
00330 return callDFSet;
00331 }
00332
00333
00334
00335 }
00336 }