-// AnalysisUsage Class Implementation
-//
-
-// preservesCFG - This function should be called to by the pass, iff they do
-// not:
-//
-// 1. Add or remove basic blocks from the function
-// 2. Modify terminator instructions in any way.
-//
-// This function annotates the AnalysisUsage info object to say that analyses
-// that only depend on the CFG are preserved by this pass.
-//
-void AnalysisUsage::preservesCFG() {
- // Since this transformation doesn't modify the CFG, it preserves all analyses
- // that only depend on the CFG (like dominators, loop info, etc...)
- //
- Preserved.insert(Preserved.end(),
- CFGOnlyAnalyses.begin(), CFGOnlyAnalyses.end());
-}
-
-
-//===----------------------------------------------------------------------===//
-// PassManager implementation - The PassManager class is a simple Pimpl class
-// that wraps the PassManagerT template.
-//
-PassManager::PassManager() : PM(new PassManagerT<Module>()) {}
-PassManager::~PassManager() { delete PM; }
-void PassManager::add(Pass *P) { PM->add(P); }
-bool PassManager::run(Module &M) { return PM->run(M); }
-
-
-//===----------------------------------------------------------------------===//
-// TimingInfo Class - This class is used to calculate information about the
-// amount of time each pass takes to execute. This only happens with
-// -time-passes is enabled on the command line.
-//
-static cl::opt<bool>
-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.