diff options
| -rw-r--r-- | llvm/include/llvm/CompilerDriver/BuiltinOptions.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CompilerDriver/Action.cpp | 29 | ||||
| -rw-r--r-- | llvm/lib/CompilerDriver/BuiltinOptions.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/CompilerDriver/Main.cpp | 22 | 
4 files changed, 50 insertions, 6 deletions
diff --git a/llvm/include/llvm/CompilerDriver/BuiltinOptions.h b/llvm/include/llvm/CompilerDriver/BuiltinOptions.h index fe44c30a7ad..0c1bbe2582d 100644 --- a/llvm/include/llvm/CompilerDriver/BuiltinOptions.h +++ b/llvm/include/llvm/CompilerDriver/BuiltinOptions.h @@ -25,10 +25,11 @@ extern llvm::cl::opt<std::string> OutputFilename;  extern llvm::cl::opt<std::string> TempDirname;  extern llvm::cl::list<std::string> Languages;  extern llvm::cl::opt<bool> DryRun; +extern llvm::cl::opt<bool> Time;  extern llvm::cl::opt<bool> VerboseMode;  extern llvm::cl::opt<bool> CheckGraph; -extern llvm::cl::opt<bool> WriteGraph;  extern llvm::cl::opt<bool> ViewGraph; +extern llvm::cl::opt<bool> WriteGraph;  extern llvm::cl::opt<SaveTempsEnum::Values> SaveTemps;  #endif // LLVM_INCLUDE_COMPILER_DRIVER_BUILTIN_OPTIONS_H diff --git a/llvm/lib/CompilerDriver/Action.cpp b/llvm/lib/CompilerDriver/Action.cpp index 5fd63eefc52..7bcd30a8e0e 100644 --- a/llvm/lib/CompilerDriver/Action.cpp +++ b/llvm/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/llvm/lib/CompilerDriver/BuiltinOptions.cpp b/llvm/lib/CompilerDriver/BuiltinOptions.cpp index d90c50d67d9..d1ac8c98322 100644 --- a/llvm/lib/CompilerDriver/BuiltinOptions.cpp +++ b/llvm/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/llvm/lib/CompilerDriver/Main.cpp b/llvm/lib/CompilerDriver/Main.cpp index c581809d04b..3a3487a0a9c 100644 --- a/llvm/lib/CompilerDriver/Main.cpp +++ b/llvm/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();  | 

