00001 00014 #include "ManagerReachDefsOverwriteXAIF.hpp" 00015 #include "OpenAnalysis/ReachDefs/ReachDefsStandard.hpp" 00016 00017 00018 namespace OA { 00019 namespace XAIF { 00020 00021 static bool debug = false; 00022 00023 00024 ManagerReachDefsOverwriteXAIF::ManagerReachDefsOverwriteXAIF(OA_ptr<XAIFIRInterface> _ir) : mIR(_ir) { 00025 OA_DEBUG_CTRL_MACRO("DEBUG_ManagerReachDefsOverwriteXAIF:ALL", debug); 00026 } 00027 00028 OA_ptr<ReachDefsOverwriteXAIF> ManagerReachDefsOverwriteXAIF::performAnalysis(OA_ptr<CFG::CFGInterface> cfg, 00029 OA_ptr<ReachDefsOverwrite::Interface> reachDefs) { 00030 if (debug) { 00031 std::cout << "In OA::XAIF::ManagerReachDefsOverwriteXAIF::performAnalysis" << std::endl; 00032 } 00033 OA_ptr<ReachDefsOverwriteXAIF> aReachDefsOverwriteXAIF; 00034 aReachDefsOverwriteXAIF = new ReachDefsOverwriteXAIF(); 00035 OA_ptr<DGraph::NodesIteratorInterface> nodeIterPtr; 00036 nodeIterPtr = cfg->getNodesIterator(); 00037 // looping over basic blocks 00038 for ( ;nodeIterPtr->isValid(); ++(*nodeIterPtr) ) { 00039 OA_ptr<DGraph::NodeInterface> dnode = nodeIterPtr->current(); 00040 OA_ptr<CFG::NodeInterface> node = dnode.convert<CFG::NodeInterface>(); 00041 OA_ptr<CFG::NodeStatementsIteratorInterface> stmtIterPtr 00042 = node->getNodeStatementsIterator(); 00043 // looping over statements in basic blocks 00044 for (; stmtIterPtr->isValid(); ++(*stmtIterPtr)) { 00045 OA::StmtHandle stmt = stmtIterPtr->current(); 00046 if (debug) { 00047 std::cout << "checking overwrites of " 00048 << mIR->toString(stmt) << std::endl; 00049 } 00050 StmtSet subSet; 00051 OA_ptr<ReachDefs::Interface::ReachDefsIterator> overwritingStmtIterPtr; 00052 overwritingStmtIterPtr = reachDefs->getOverwritingStmts(stmt); 00053 for (; overwritingStmtIterPtr->isValid(); ++(*overwritingStmtIterPtr)) { 00054 StmtHandle overwritingStmt = overwritingStmtIterPtr->current(); 00055 if (debug) { 00056 std::cout << "overwritingStmt (" << overwritingStmt.hval() << ") = " 00057 << mIR->toString(overwritingStmt) << std::endl; 00058 } 00059 subSet.insert(overwritingStmt); 00060 } 00061 int chainId = aReachDefsOverwriteXAIF->findChain(subSet); 00062 if (chainId == ChainsXAIF::CHAIN_ID_NONE) { 00063 // if it isn't then make a new chain 00064 chainId=getNextChainId(); 00065 // and add the subset of statements into that chain 00066 aReachDefsOverwriteXAIF->addStmtSet(subSet,chainId); 00067 } 00068 // assiciate the stmt with the chainId 00069 aReachDefsOverwriteXAIF->insert(stmt, chainId); 00070 } 00071 } 00072 // insert an empty chain as chain 0 because that is the default chain in XAIF 00073 // don't insert it until the end because while building, we don't want to find 00074 // empty chains at 0, want to find it at 1 00075 StmtSet emptySet; 00076 aReachDefsOverwriteXAIF->addStmtSet(emptySet,0); 00077 return aReachDefsOverwriteXAIF; 00078 } 00079 00080 int ManagerReachDefsOverwriteXAIF::ourCurrentStartId=3; 00081 00082 int ManagerReachDefsOverwriteXAIF::getNextChainId() { 00083 return ourCurrentStartId++; 00084 } 00085 00086 } 00087 }
1.7.1