static const int DEBUG_LV = 0;
-#include "BBLiveVar.h"
+#include "llvm/Analysis/LiveVar/BBLiveVar.h"
+#include "llvm/Pass.h"
-class MethodLiveVarInfo {
+class MethodLiveVarInfo : public MethodPass {
// Live var anal is done on this method - set by constructor
- const Method *const Meth;
+ const Method *Meth;
// A map betwn the BasicBlock and BBLiveVar
BBToBBLiveVarMapType BB2BBLVMap;
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
MInstToLiveVarSetMapType MInst2LVSetAI;
- // True if the analyze() method has been called. This is checked when
- // getInSet/OutSet is called to prevent calling those methods before analyze
- bool HasAnalyzed;
-
// --------- private methods -----------------------------------------
void calcLiveVarSetsForBB(const BasicBlock *BB);
- public:
- MethodLiveVarInfo(const Method *Meth);
- ~MethodLiveVarInfo();
+public:
+ static AnalysisID ID; // We are an analysis, we must have an ID
+
+ MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
+ ~MethodLiveVarInfo() { releaseMemory(); }
+
+ // --------- Implement the MethodPass interface ----------------------
+
+ // runOnMethod - Perform analysis, update internal data structures.
+ virtual bool runOnMethod(Method *M);
- // performs a liver var analysis of a single method
- void analyze();
+ // releaseMemory - After LiveVariable analysis has been used, forget!
+ virtual void releaseMemory();
+
+ // getAnalysisUsageInfo - Provide self!
+ virtual void getAnalysisUsageInfo(AnalysisSet &Required,
+ AnalysisSet &Destroyed,
+ AnalysisSet &Provided) {
+ Provided.push_back(ID);
+ }
+
+ // --------- Functions to access analysis results -------------------
// gets OutSet of a BB
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const {
- assert( HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getOutSet();
}
// gets InSet of a BB
inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const {
- assert(HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getInSet();
}
// gets the Live var set AFTER an instruction
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
const BasicBlock *CurBB);
-
};
#endif
static const int DEBUG_LV = 0;
-#include "BBLiveVar.h"
+#include "llvm/Analysis/LiveVar/BBLiveVar.h"
+#include "llvm/Pass.h"
-class MethodLiveVarInfo {
+class MethodLiveVarInfo : public MethodPass {
// Live var anal is done on this method - set by constructor
- const Method *const Meth;
+ const Method *Meth;
// A map betwn the BasicBlock and BBLiveVar
BBToBBLiveVarMapType BB2BBLVMap;
// Machine Instr to LiveVarSet Map for providing LVset AFTER each inst
MInstToLiveVarSetMapType MInst2LVSetAI;
- // True if the analyze() method has been called. This is checked when
- // getInSet/OutSet is called to prevent calling those methods before analyze
- bool HasAnalyzed;
-
// --------- private methods -----------------------------------------
void calcLiveVarSetsForBB(const BasicBlock *BB);
- public:
- MethodLiveVarInfo(const Method *Meth);
- ~MethodLiveVarInfo();
+public:
+ static AnalysisID ID; // We are an analysis, we must have an ID
+
+ MethodLiveVarInfo(AnalysisID id = ID) : Meth(0) { assert(id == ID); }
+ ~MethodLiveVarInfo() { releaseMemory(); }
+
+ // --------- Implement the MethodPass interface ----------------------
+
+ // runOnMethod - Perform analysis, update internal data structures.
+ virtual bool runOnMethod(Method *M);
- // performs a liver var analysis of a single method
- void analyze();
+ // releaseMemory - After LiveVariable analysis has been used, forget!
+ virtual void releaseMemory();
+
+ // getAnalysisUsageInfo - Provide self!
+ virtual void getAnalysisUsageInfo(AnalysisSet &Required,
+ AnalysisSet &Destroyed,
+ AnalysisSet &Provided) {
+ Provided.push_back(ID);
+ }
+
+ // --------- Functions to access analysis results -------------------
// gets OutSet of a BB
inline const LiveVarSet *getOutSetOfBB( const BasicBlock *BB) const {
- assert( HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getOutSet();
}
// gets InSet of a BB
inline const LiveVarSet *getInSetOfBB( const BasicBlock *BB) const {
- assert(HasAnalyzed && "call analyze() before calling this" );
return BB2BBLVMap.find(BB)->second->getInSet();
}
// gets the Live var set AFTER an instruction
const LiveVarSet * getLiveVarSetAfterMInst(const MachineInstr *MInst,
const BasicBlock *CurBB);
-
};
#endif
using std::cout;
using std::endl;
-//************************** Constructor/Destructor ***************************
+AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
-
-MethodLiveVarInfo::MethodLiveVarInfo(const Method *const M) : Meth(M) {
- assert(!M->isExternal() && "Cannot be a prototype declaration");
- HasAnalyzed = false; // still we haven't called analyze()
-}
-
-
-
-MethodLiveVarInfo:: ~MethodLiveVarInfo()
-{
+void MethodLiveVarInfo::releaseMemory() {
// First delete all BBLiveVar objects created in constructBBs(). A new object
// of type BBLiveVa is created for every BasicBlock in the method
//
BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();
- for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) {
- if( (*HMI).first ) // delete all BBLiveVar in BB2BBLVMap
- delete (*HMI).second;
- }
+ for( ; HMI != BB2BBLVMap.end(); ++HMI)
+ delete HMI->second; // delete all BBLiveVar in BB2BBLVMap
+ BB2BBLVMap.clear();
// Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
// and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
// hash map iterator for MInst2LVSetBI
//
- MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
+ MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
- for( ; MI != MInst2LVSetBI.end() ; MI ++ ) {
- if( (*MI).first ) // delete all LiveVarSets in MInst2LVSetBI
- delete (*MI).second;
- }
-}
+ for( ; MI != MInst2LVSetBI.end(); ++MI)
+ delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
-
-// ************************* support functions ********************************
+ MInst2LVSetBI.clear();
+ MInst2LVSetAI.clear();
+}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// performs live var anal for a method
//-----------------------------------------------------------------------------
-void MethodLiveVarInfo::analyze()
-{
- // Don't analyze the same method twice!
- // Later, we need to add change notification here.
-
- if (HasAnalyzed)
- return;
-
+bool MethodLiveVarInfo::runOnMethod(Method *M) {
+ Meth = M;
- if( DEBUG_LV) cout << "Analysing live variables ..." << endl;
+ if( DEBUG_LV) cout << "Analysing live variables ...\n";
// create and initialize all the BBLiveVars of the CFG
constructBBs();
} while (NeedAnotherIteration ); // repeat until we need more iterations
- HasAnalyzed = true; // finished analysing
-
- if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
+ if( DEBUG_LV) cout << "Live Variable Analysis complete!\n";
+ return false;
}
using std::cout;
using std::endl;
-//************************** Constructor/Destructor ***************************
+AnalysisID MethodLiveVarInfo::ID(AnalysisID::create<MethodLiveVarInfo>());
-
-MethodLiveVarInfo::MethodLiveVarInfo(const Method *const M) : Meth(M) {
- assert(!M->isExternal() && "Cannot be a prototype declaration");
- HasAnalyzed = false; // still we haven't called analyze()
-}
-
-
-
-MethodLiveVarInfo:: ~MethodLiveVarInfo()
-{
+void MethodLiveVarInfo::releaseMemory() {
// First delete all BBLiveVar objects created in constructBBs(). A new object
// of type BBLiveVa is created for every BasicBlock in the method
//
BBToBBLiveVarMapType::iterator HMI = BB2BBLVMap.begin();
- for( ; HMI != BB2BBLVMap.end() ; HMI ++ ) {
- if( (*HMI).first ) // delete all BBLiveVar in BB2BBLVMap
- delete (*HMI).second;
- }
+ for( ; HMI != BB2BBLVMap.end(); ++HMI)
+ delete HMI->second; // delete all BBLiveVar in BB2BBLVMap
+ BB2BBLVMap.clear();
// Then delete all objects of type LiveVarSet created in calcLiveVarSetsForBB
// and entered into MInst2LVSetBI and MInst2LVSetAI (these are caches
// hash map iterator for MInst2LVSetBI
//
- MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
+ MInstToLiveVarSetMapType::iterator MI = MInst2LVSetBI.begin();
- for( ; MI != MInst2LVSetBI.end() ; MI ++ ) {
- if( (*MI).first ) // delete all LiveVarSets in MInst2LVSetBI
- delete (*MI).second;
- }
-}
+ for( ; MI != MInst2LVSetBI.end(); ++MI)
+ delete MI->second; // delete all LiveVarSets in MInst2LVSetBI
-
-// ************************* support functions ********************************
+ MInst2LVSetBI.clear();
+ MInst2LVSetAI.clear();
+}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// performs live var anal for a method
//-----------------------------------------------------------------------------
-void MethodLiveVarInfo::analyze()
-{
- // Don't analyze the same method twice!
- // Later, we need to add change notification here.
-
- if (HasAnalyzed)
- return;
-
+bool MethodLiveVarInfo::runOnMethod(Method *M) {
+ Meth = M;
- if( DEBUG_LV) cout << "Analysing live variables ..." << endl;
+ if( DEBUG_LV) cout << "Analysing live variables ...\n";
// create and initialize all the BBLiveVars of the CFG
constructBBs();
} while (NeedAnotherIteration ); // repeat until we need more iterations
- HasAnalyzed = true; // finished analysing
-
- if( DEBUG_LV) cout << "Live Variable Analysis complete!" << endl;
+ if( DEBUG_LV) cout << "Live Variable Analysis complete!\n";
+ return false;
}