[llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp
Devang Patel
dpatel at apple.com
Mon Jan 29 15:10:54 PST 2007
Changes in directory llvm/lib/VMCore:
PassManager.cpp updated: 1.130 -> 1.131
---
Log message:
- Undo previous check-in (i.e. Do not export TimingInfo class through
PassManagers.h).
- Add StopPassTimer() and StartPassTimer() to expose TimingInfo to
CallGraphPassManager
- Use these two APIs in CalLgraphPassManager to measure timings.
---
Diffs of the changes: (+65 -5)
PassManager.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 65 insertions(+), 5 deletions(-)
Index: llvm/lib/VMCore/PassManager.cpp
diff -u llvm/lib/VMCore/PassManager.cpp:1.130 llvm/lib/VMCore/PassManager.cpp:1.131
--- llvm/lib/VMCore/PassManager.cpp:1.130 Mon Jan 29 14:06:26 2007
+++ llvm/lib/VMCore/PassManager.cpp Mon Jan 29 17:10:37 2007
@@ -14,6 +14,7 @@
#include "llvm/PassManagers.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Timer.h"
#include "llvm/Module.h"
#include "llvm/ModuleProvider.h"
#include "llvm/Support/Streams.h"
@@ -258,13 +259,60 @@
};
-static TimingInfo *TheTimeInfo;
+} // End of llvm namespace
-TimingInfo *getTheTimeInfo() {
- return TheTimeInfo;
-}
+namespace {
-} // End of llvm namespace
+//===----------------------------------------------------------------------===//
+// TimingInfo Class - This class is used to calculate information about the
+// amount of time each pass takes to execute. This only happens when
+// -time-passes is enabled on the command line.
+//
+
+class VISIBILITY_HIDDEN TimingInfo {
+ std::map<Pass*, Timer> TimingData;
+ TimerGroup TG;
+
+public:
+ // Use 'create' member to get this.
+ TimingInfo() : TG("... Pass execution timing report ...") {}
+
+ // TimingDtor - Print out information about timing information
+ ~TimingInfo() {
+ // Delete all of the timers...
+ TimingData.clear();
+ // TimerGroup is deleted next, printing the report.
+ }
+
+ // createTheTimeInfo - This method either initializes the TheTimeInfo pointer
+ // to a non null value (if the -time-passes option is enabled) or it leaves it
+ // null. It may be called multiple times.
+ static void createTheTimeInfo();
+
+ void passStarted(Pass *P) {
+
+ if (dynamic_cast<PMDataManager *>(P))
+ return;
+
+ std::map<Pass*, Timer>::iterator I = TimingData.find(P);
+ if (I == TimingData.end())
+ I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first;
+ I->second.startTimer();
+ }
+ void passEnded(Pass *P) {
+
+ if (dynamic_cast<PMDataManager *>(P))
+ return;
+
+ std::map<Pass*, Timer>::iterator I = TimingData.find(P);
+ assert (I != TimingData.end() && "passStarted/passEnded not nested right!");
+ I->second.stopTimer();
+ }
+};
+
+static TimingInfo *TheTimeInfo;
+
+} // End of anon namespace
//===----------------------------------------------------------------------===//
// PMTopLevelManager implementation
@@ -1084,6 +1132,18 @@
TheTimeInfo = &*TTI;
}
+/// If TimingInfo is enabled then start pass timer.
+void StartPassTimer(Pass *P) {
+ if (TheTimeInfo)
+ TheTimeInfo->passStarted(P);
+}
+
+/// If TimingInfo is enabled then stop pass timer.
+void StopPassTimer(Pass *P) {
+ if (TheTimeInfo)
+ TheTimeInfo->passEnded(P);
+}
+
//===----------------------------------------------------------------------===//
// PMStack implementation
//
More information about the llvm-commits
mailing list