summaryrefslogtreecommitdiffstats
path: root/lib/CompilerDriver
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CompilerDriver')
-rw-r--r--lib/CompilerDriver/Action.cpp29
-rw-r--r--lib/CompilerDriver/BuiltinOptions.cpp2
-rw-r--r--lib/CompilerDriver/Main.cpp22
-rw-r--r--lib/CompilerDriver/Tool.cpp5
4 files changed, 48 insertions, 10 deletions
diff --git a/lib/CompilerDriver/Action.cpp b/lib/CompilerDriver/Action.cpp
index 5fd63ee..7bcd30a 100644
--- a/lib/CompilerDriver/Action.cpp
+++ b/lib/CompilerDriver/Action.cpp
@@ -13,9 +13,13 @@
#include "llvm/CompilerDriver/Action.h"
#include "llvm/CompilerDriver/BuiltinOptions.h"
+
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Program.h"
+#include "llvm/System/TimeValue.h"
+
#include <stdexcept>
+#include <string>
using namespace llvm;
using namespace llvmc;
@@ -60,14 +64,31 @@ namespace {
}
}
+namespace llvmc {
+ void AppendToGlobalTimeLog(const std::string& cmd, double time);
+}
+
int llvmc::Action::Execute() const {
if (DryRun || VerboseMode) {
errs() << Command_ << " ";
std::for_each(Args_.begin(), Args_.end(), print_string);
errs() << '\n';
}
- if (DryRun)
- return 0;
- else
- return ExecuteProgram(Command_, Args_);
+ if (!DryRun) {
+ if (Time) {
+ sys::TimeValue now = sys::TimeValue::now();
+ int ret = ExecuteProgram(Command_, Args_);
+ sys::TimeValue now2 = sys::TimeValue::now();
+ now2 -= now;
+ double elapsed = now2.seconds() + now2.microseconds() / 1000000.0;
+ AppendToGlobalTimeLog(Command_, elapsed);
+
+ return ret;
+ }
+ else {
+ return ExecuteProgram(Command_, Args_);
+ }
+ }
+
+ return 0;
}
diff --git a/lib/CompilerDriver/BuiltinOptions.cpp b/lib/CompilerDriver/BuiltinOptions.cpp
index d90c50d..d1ac8c9 100644
--- a/lib/CompilerDriver/BuiltinOptions.cpp
+++ b/lib/CompilerDriver/BuiltinOptions.cpp
@@ -30,8 +30,10 @@ cl::opt<std::string> TempDirname("temp-dir", cl::desc("Temp dir name"),
cl::list<std::string> Languages("x",
cl::desc("Specify the language of the following input files"),
cl::ZeroOrMore);
+
cl::opt<bool> DryRun("dry-run",
cl::desc("Only pretend to run commands"));
+cl::opt<bool> Time("time", cl::desc("Time individual commands"));
cl::opt<bool> VerboseMode("v",
cl::desc("Enable verbose mode"));
diff --git a/lib/CompilerDriver/Main.cpp b/lib/CompilerDriver/Main.cpp
index c581809..3a3487a 100644
--- a/lib/CompilerDriver/Main.cpp
+++ b/lib/CompilerDriver/Main.cpp
@@ -19,6 +19,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Path.h"
+#include <sstream>
#include <stdexcept>
#include <string>
@@ -28,6 +29,8 @@ using namespace llvmc;
namespace {
+ std::stringstream* GlobalTimeLog;
+
sys::Path getTempDir() {
sys::Path tempDir;
@@ -81,6 +84,11 @@ namespace {
namespace llvmc {
+// Used to implement -time option. External linkage is intentional.
+void AppendToGlobalTimeLog(const std::string& cmd, double time) {
+ *GlobalTimeLog << "# " << cmd << ' ' << time << '\n';
+}
+
// Sometimes plugins want to condition on the value in argv[0].
const char* ProgramName;
@@ -122,7 +130,19 @@ int Main(int argc, char** argv) {
throw std::runtime_error("no input files");
}
- return BuildTargets(graph, langMap);
+ if (Time) {
+ GlobalTimeLog = new std::stringstream;
+ GlobalTimeLog->precision(2);
+ }
+
+ int ret = BuildTargets(graph, langMap);
+
+ if (Time) {
+ llvm::errs() << GlobalTimeLog->str();
+ delete GlobalTimeLog;
+ }
+
+ return ret;
}
catch(llvmc::error_code& ec) {
return ec.code();
diff --git a/lib/CompilerDriver/Tool.cpp b/lib/CompilerDriver/Tool.cpp
index 5a32fd3..9f4ab49 100644
--- a/lib/CompilerDriver/Tool.cpp
+++ b/lib/CompilerDriver/Tool.cpp
@@ -20,11 +20,6 @@
using namespace llvm;
using namespace llvmc;
-// SplitString is used by derived Tool classes.
-typedef void (*SplitStringFunPtr)(const std::string&,
- std::vector<std::string>&, const char*);
-SplitStringFunPtr ForceLinkageSplitString = &llvm::SplitString;
-
namespace {
sys::Path MakeTempFile(const sys::Path& TempDir, const std::string& BaseName,
const std::string& Suffix) {
OpenPOWER on IntegriCloud