[clang-tools-extra] r183142 - Add support for report execution times

Ariel J. Bernal ariel.j.bernal at intel.com
Mon Jun 3 11:44:31 PDT 2013


Author: ajbernal
Date: Mon Jun  3 13:44:31 2013
New Revision: 183142

URL: http://llvm.org/viewvc/llvm-project?rev=183142&view=rev
Log:
Add support for report execution times

-Added command line option -report-times to enable or disable the output. The
same option can be used to specify the output directory.
-Write timing data to a unique file in disk using json format.

Modified:
    clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp

Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=183142&r1=183141&r2=183142&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Mon Jun  3 13:44:31 2013
@@ -24,7 +24,10 @@
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Tooling/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/Process.h"
 #include "llvm/Support/Signals.h"
+#include "llvm/Support/Timer.h"
 
 namespace cl = llvm::cl;
 using namespace clang::tooling;
@@ -50,6 +53,12 @@ static cl::opt<bool>
 SummaryMode("summary", cl::desc("Print transform summary"),
             cl::init(false));
 
+const char NoTiming[] = "no_timing";
+static cl::opt<std::string> TimingDirectoryName(
+    "report-times", cl::desc("Capture performance data and output to specified "
+                             "directory. Default ./migrate_perf"),
+    cl::init(NoTiming), cl::ValueOptional, cl::value_desc("directory name"));
+
 // TODO: Remove cl::Hidden when functionality for acknowledging include/exclude
 // options are implemented in the tool.
 static cl::opt<std::string>
@@ -78,6 +87,60 @@ class EndSyntaxArgumentsAdjuster : publi
   }
 };
 
+struct ExecutionTime {
+  std::string TimerId;
+  float Time;
+  ExecutionTime(const std::string &TimerId, float Time)
+      : TimerId(TimerId), Time(Time) {}
+};
+
+// Save execution times to a json formatted file.
+void reportExecutionTimes(
+    const llvm::StringRef DirectoryName,
+    const std::map<std::string, std::vector<ExecutionTime> > &TimingResults) {
+  // Create directory path if it doesn't exist
+  llvm::sys::Path P(DirectoryName);
+  P.createDirectoryOnDisk(true);
+
+  // Get PID and current time.
+  llvm::sys::self_process *SP = llvm::sys::process::get_self();
+  unsigned Pid = SP->get_id();
+  llvm::TimeRecord T = llvm::TimeRecord::getCurrentTime();
+
+  std::string FileName;
+  llvm::raw_string_ostream SS(FileName);
+  SS << P.str() << "/" << static_cast<int>(T.getWallTime()) << Pid << ".json";
+
+
+  std::string ErrorInfo;
+  llvm::raw_fd_ostream FileStream(SS.str().c_str(), ErrorInfo);
+  FileStream << "{\n";
+  FileStream << "  \"Sources\" : [\n";
+  for (std::map<std::string, std::vector<ExecutionTime> >::const_iterator
+           I = TimingResults.begin(),
+           E = TimingResults.end();
+       I != E; ++I) {
+    FileStream << "    {\n";
+    FileStream << "      \"Source \" : \"" << I->first << "\",\n";
+    FileStream << "      \"Data\" : [\n";
+    for (std::vector<ExecutionTime>::const_iterator IE = I->second.begin(),
+                                                    EE = I->second.end();
+         IE != EE; ++IE) {
+      FileStream << "        {\n";
+      FileStream << "          \"TimerId\" : \"" << (*IE).TimerId << "\",\n";
+      FileStream << "          \"Time\" : " << llvm::format("%6.2f", (*IE).Time)
+                 << "\n";
+
+      FileStream << "        },\n";
+
+    }
+    FileStream << "      ]\n";
+    FileStream << "    },\n";
+  }
+  FileStream << "  ]\n";
+  FileStream << "}";
+}
+
 int main(int argc, const char **argv) {
   llvm::sys::PrintStackTraceOnErrorSignal();
   Transforms TransformManager;
@@ -99,7 +162,12 @@ int main(int argc, const char **argv) {
   // This causes options to be parsed.
   CommonOptionsParser OptionsParser(argc, argv);
 
-  TransformManager.createSelectedTransforms(/*EnableTiming=*/false);
+  // Since ExecutionTimeDirectoryName could be an empty string we compare
+  // against the default value when the command line option is not specified.
+  bool EnableTiming = (TimingDirectoryName != NoTiming);
+  std::map<std::string, std::vector<ExecutionTime> > TimingResults;
+
+  TransformManager.createSelectedTransforms(EnableTiming);
 
   if (TransformManager.begin() == TransformManager.end()) {
     llvm::errs() << "No selected transforms\n";
@@ -167,5 +235,14 @@ int main(int argc, const char **argv) {
     FileStream << I->second;
   }
 
+  // Report execution times.
+  if (EnableTiming && TimingResults.size() > 0) {
+    std::string DirectoryName = TimingDirectoryName;
+    // Use default directory name.
+    if (DirectoryName == "")
+      DirectoryName = "./migrate_perf";
+    reportExecutionTimes(DirectoryName, TimingResults);
+  }
+
   return 0;
 }





More information about the cfe-commits mailing list