[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