Author: hans Date: Thu Sep 12 13:35:08 2013 New Revision: 190621 URL: http://llvm.org/viewvc/llvm-project?rev=190621&view=rev Log: Move the execution code from Compilation::ExecuteCommand to Command::Execute
I think it makes sense that a Command knows how to execute itself. There's no functionality change but i rewrote the code to avoid the manual memory management of Argv. My motivation for this is that I plan to subclass Command to build fall-back functionality into clang-cl. Differential Revision: http://llvm-reviews.chandlerc.com/D1654 Modified: cfe/trunk/include/clang/Driver/Job.h cfe/trunk/lib/Driver/Compilation.cpp cfe/trunk/lib/Driver/Job.cpp Modified: cfe/trunk/include/clang/Driver/Job.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Job.h?rev=190621&r1=190620&r2=190621&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Job.h (original) +++ cfe/trunk/include/clang/Driver/Job.h Thu Sep 12 13:35:08 2013 @@ -76,14 +76,15 @@ public: virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote, bool CrashReport = false) const; + int Execute(const StringRef **Redirects, std::string *ErrMsg, + bool *ExecutionFailed) const; + /// getSource - Return the Action which caused the creation of this job. const Action &getSource() const { return Source; } /// getCreator - Return the Tool which caused the creation of this job. const Tool &getCreator() const { return Creator; } - const char *getExecutable() const { return Executable; } - const llvm::opt::ArgStringList &getArguments() const { return Arguments; } static bool classof(const Job *J) { Modified: cfe/trunk/lib/Driver/Compilation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Compilation.cpp?rev=190621&r1=190620&r2=190621&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Compilation.cpp (original) +++ cfe/trunk/lib/Driver/Compilation.cpp Thu Sep 12 13:35:08 2013 @@ -16,7 +16,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/FileSystem.h" -#include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" #include <errno.h> #include <sys/stat.h> @@ -129,12 +128,6 @@ bool Compilation::CleanupFileMap(const A int Compilation::ExecuteCommand(const Command &C, const Command *&FailingCommand) const { - std::string Prog(C.getExecutable()); - const char **Argv = new const char*[C.getArguments().size() + 2]; - Argv[0] = C.getExecutable(); - std::copy(C.getArguments().begin(), C.getArguments().end(), Argv+1); - Argv[C.getArguments().size() + 1] = 0; - if ((getDriver().CCPrintOptions || getArgs().hasArg(options::OPT_v)) && !getDriver().CCGenDiagnostics) { raw_ostream *OS = &llvm::errs(); @@ -165,9 +158,7 @@ int Compilation::ExecuteCommand(const Co std::string Error; bool ExecutionFailed; - int Res = llvm::sys::ExecuteAndWait(Prog, Argv, /*env*/ 0, Redirects, - /*secondsToWait*/ 0, /*memoryLimit*/ 0, - &Error, &ExecutionFailed); + int Res = C.Execute(Redirects, &Error, &ExecutionFailed); if (!Error.empty()) { assert(Res && "Error string set with 0 result code!"); getDriver().Diag(clang::diag::err_drv_command_failure) << Error; @@ -176,7 +167,6 @@ int Compilation::ExecuteCommand(const Co if (Res) FailingCommand = &C; - delete[] Argv; return ExecutionFailed ? 1 : Res; } Modified: cfe/trunk/lib/Driver/Job.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Job.cpp?rev=190621&r1=190620&r2=190621&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Job.cpp (original) +++ cfe/trunk/lib/Driver/Job.cpp Thu Sep 12 13:35:08 2013 @@ -11,6 +11,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" #include <cassert> using namespace clang::driver; @@ -112,6 +113,19 @@ void Command::Print(raw_ostream &OS, con OS << Terminator; } +int Command::Execute(const llvm::StringRef **Redirects, std::string *ErrMsg, + bool *ExecutionFailed) const { + SmallVector<const char*, 128> Argv; + Argv.push_back(Executable); + for (size_t i = 0, e = Arguments.size(); i != e; ++i) + Argv.push_back(Arguments[i]); + Argv.push_back(0); + + return llvm::sys::ExecuteAndWait(Executable, Argv.data(), /*env*/ 0, + Redirects, /*secondsToWait*/ 0, + /*memoryLimit*/ 0, ErrMsg, ExecutionFailed); +} + JobList::JobList() : Job(JobListClass) {} JobList::~JobList() { _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
