ManagerReachDefsOverwriteXAIF.cpp

Go to the documentation of this file.
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 }