From f1da5550286a43a412558671e54e3612de323628 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 1 Oct 2002 19:54:07 +0000 Subject: Factor timer code out of PassManager implementation, into a generic interface exposed by Support/Timer.h. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3993 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Pass.cpp | 130 ---------------------------------------------------- 1 file changed, 130 deletions(-) (limited to 'lib/VMCore/Pass.cpp') diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 85c4dec5fe..0be92e9f55 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -80,84 +80,6 @@ static cl::opt EnableTiming("time-passes", cl::desc("Time each pass, printing elapsed time for each on exit")); -static TimeRecord getTimeRecord() { - static unsigned long PageSize = 0; - - if (PageSize == 0) { -#ifdef _SC_PAGE_SIZE - PageSize = sysconf(_SC_PAGE_SIZE); -#else -#ifdef _SC_PAGESIZE - PageSize = sysconf(_SC_PAGESIZE); -#else - PageSize = getpagesize(); -#endif -#endif - } - - struct rusage RU; - struct timeval T; - gettimeofday(&T, 0); - if (getrusage(RUSAGE_SELF, &RU)) { - perror("getrusage call failed: -time-passes info incorrect!"); - } - - TimeRecord Result; - Result.Elapsed = T.tv_sec + T.tv_usec/1000000.0; - Result.UserTime = RU.ru_utime.tv_sec + RU.ru_utime.tv_usec/1000000.0; - Result.SystemTime = RU.ru_stime.tv_sec + RU.ru_stime.tv_usec/1000000.0; - Result.MaxRSS = RU.ru_maxrss*PageSize; - - return Result; -} - -bool TimeRecord::operator<(const TimeRecord &TR) const { - // Primary sort key is User+System time - if (UserTime+SystemTime < TR.UserTime+TR.SystemTime) - return true; - if (UserTime+SystemTime > TR.UserTime+TR.SystemTime) - return false; - - // Secondary sort key is Wall Time - return Elapsed < TR.Elapsed; -} - -void TimeRecord::passStart(const TimeRecord &T) { - Elapsed -= T.Elapsed; - UserTime -= T.UserTime; - SystemTime -= T.SystemTime; - RSSTemp = T.MaxRSS; -} - -void TimeRecord::passEnd(const TimeRecord &T) { - Elapsed += T.Elapsed; - UserTime += T.UserTime; - SystemTime += T.SystemTime; - RSSTemp = T.MaxRSS - RSSTemp; - MaxRSS = std::max(MaxRSS, RSSTemp); -} - -static void printVal(double Val, double Total) { - if (Total < 1e-7) // Avoid dividing by zero... - fprintf(stderr, " ----- "); - else - fprintf(stderr, " %7.4f (%5.1f%%)", Val, Val*100/Total); -} - -void TimeRecord::print(const char *PassName, const TimeRecord &Total) const { - printVal(UserTime, Total.UserTime); - printVal(SystemTime, Total.SystemTime); - printVal(UserTime+SystemTime, Total.UserTime+Total.SystemTime); - printVal(Elapsed, Total.Elapsed); - - fprintf(stderr, " "); - - if (Total.MaxRSS) - std::cerr << MaxRSS << "\t"; - std::cerr << PassName << "\n"; -} - - // Create method. If Timing is enabled, this creates and returns a new timing // object, otherwise it returns null. // @@ -165,58 +87,6 @@ TimingInfo *TimingInfo::create() { return EnableTiming ? new TimingInfo() : 0; } -void TimingInfo::passStarted(Pass *P) { - TimingData[P].passStart(getTimeRecord()); -} -void TimingInfo::passEnded(Pass *P) { - TimingData[P].passEnd(getTimeRecord()); -} -void TimeRecord::sum(const TimeRecord &TR) { - Elapsed += TR.Elapsed; - UserTime += TR.UserTime; - SystemTime += TR.SystemTime; - MaxRSS += TR.MaxRSS; -} - -// TimingDtor - Print out information about timing information -TimingInfo::~TimingInfo() { - // Iterate over all of the data, converting it into the dual of the data map, - // so that the data is sorted by amount of time taken, instead of pointer. - // - std::vector > Data; - TimeRecord Total; - for (std::map::iterator I = TimingData.begin(), - E = TimingData.end(); I != E; ++I) - // Throw out results for "grouping" pass managers... - if (!dynamic_cast(I->first)) { - Data.push_back(std::make_pair(I->second, I->first)); - Total.sum(I->second); - } - - // Sort the data by time as the primary key, in reverse order... - std::sort(Data.begin(), Data.end(), - std::greater >()); - - // Print out timing header... - std::cerr << std::string(79, '=') << "\n" - << " ... Pass execution timing report ...\n" - << std::string(79, '=') << "\n Total Execution Time: " - << (Total.UserTime+Total.SystemTime) << " seconds (" - << Total.Elapsed << " wall clock)\n\n ---User Time--- " - << "--System Time-- --User+System-- ---Wall Time---"; - - if (Total.MaxRSS) - std::cerr << " ---Mem---"; - std::cerr << " --- Pass Name ---\n"; - - // Loop through all of the timing data, printing it out... - for (unsigned i = 0, e = Data.size(); i != e; ++i) - Data[i].first.print(Data[i].second->getPassName(), Total); - - Total.print("TOTAL", Total); -} - - void PMDebug::PrintArgumentInformation(const Pass *P) { // Print out passes in pass manager... if (const AnalysisResolver *PM = dynamic_cast(P)) { -- cgit v1.2.3