<div dir="ltr">Do we need updates to <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__clang.llvm.org_docs_DriverInternals.html&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=3ngqH3mRzox53QPHYhKBQZOsGTdMVPEa3fhthaT2cAw&e=">http://clang.llvm.org/docs/DriverInternals.html</a> ?<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 2, 2015 at 3:52 PM, Justin Bogner <span dir="ltr"><<a href="mailto:mail@justinbogner.com" target="_blank">mail@justinbogner.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bogner<br>
Date: Thu Jul  2 17:52:08 2015<br>
New Revision: 241310<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241310-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=u5Y6Wu2cYRQbsiYtiqMnI8A1Mj5AbwOgK4zKCmk-nTo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241310&view=rev</a><br>
Log:<br>
Driver: Remove the Job class. NFC<br>
<br>
We had a strange relationship here where we made a list of Jobs<br>
inherit from a single Job, but there weren't actually any places where<br>
this arbitrary nesting was used or needed.<br>
<br>
Simplify all of this by removing Job entirely and updating all of the<br>
users to either work with a JobList or a single Command.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Driver/Compilation.h<br>
    cfe/trunk/include/clang/Driver/Driver.h<br>
    cfe/trunk/include/clang/Driver/Job.h<br>
    cfe/trunk/lib/Driver/Compilation.cpp<br>
    cfe/trunk/lib/Driver/Driver.cpp<br>
    cfe/trunk/lib/Driver/Job.cpp<br>
    cfe/trunk/lib/Tooling/CompilationDatabase.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Compilation.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_Compilation.h-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=C1H6mz4mZArtKZ4X6yhgVcNFKSJZNONRFTLqthfvyO4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Compilation.h?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Compilation.h (original)<br>
+++ cfe/trunk/include/clang/Driver/Compilation.h Thu Jul  2 17:52:08 2015<br>
@@ -169,8 +169,9 @@ public:<br>
   ///<br>
   /// \param FailingCommands - For non-zero results, this will be a vector of<br>
   /// failing commands and their associated result code.<br>
-  void ExecuteJob(const Job &J,<br>
-     SmallVectorImpl< std::pair<int, const Command *> > &FailingCommands) const;<br>
+  void ExecuteJobs(<br>
+      const JobList &Jobs,<br>
+      SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) const;<br>
<br>
   /// initCompilationForDiagnostics - Remove stale state and suppress output<br>
   /// so compilation can be reexecuted to generate additional diagnostic<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Driver.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_Driver.h-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=ow3_C-_s0ryoeecStkPKMhqk4yjOmST-XfFmodJGqcU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Driver.h (original)<br>
+++ cfe/trunk/include/clang/Driver/Driver.h Thu Jul  2 17:52:08 2015<br>
@@ -42,7 +42,7 @@ namespace driver {<br>
   class Command;<br>
   class Compilation;<br>
   class InputInfo;<br>
-  class Job;<br>
+  class JobList;<br>
   class JobAction;<br>
   class SanitizerArgs;<br>
   class ToolChain;<br>
@@ -195,7 +195,7 @@ private:<br>
                            llvm::opt::Arg **FinalPhaseArg = nullptr) const;<br>
<br>
   // Before executing jobs, sets up response files for commands that need them.<br>
-  void setUpResponseFiles(Compilation &C, Job &J);<br>
+  void setUpResponseFiles(Compilation &C, Command &Cmd);<br>
<br>
   void generatePrefixedToolNames(const char *Tool, const ToolChain &TC,<br>
                                  SmallVectorImpl<std::string> &Names) const;<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Job.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_Job.h-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=9mK2nnjR9KkBVO679KUxSVUGCOIEc9kDdgm5zAL4ZqI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Job.h?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Job.h (original)<br>
+++ cfe/trunk/include/clang/Driver/Job.h Thu Jul  2 17:52:08 2015<br>
@@ -37,37 +37,9 @@ struct CrashReportInfo {<br>
       : Filename(Filename), VFSPath(VFSPath) {}<br>
 };<br>
<br>
-class Job {<br>
-public:<br>
-  enum JobClass {<br>
-    CommandClass,<br>
-    FallbackCommandClass,<br>
-    JobListClass<br>
-  };<br>
-<br>
-private:<br>
-  JobClass Kind;<br>
-<br>
-protected:<br>
-  Job(JobClass Kind) : Kind(Kind) {}<br>
-public:<br>
-  virtual ~Job();<br>
-<br>
-  JobClass getKind() const { return Kind; }<br>
-<br>
-  /// Print - Print this Job in -### format.<br>
-  ///<br>
-  /// \param OS - The stream to print on.<br>
-  /// \param Terminator - A string to print at the end of the line.<br>
-  /// \param Quote - Should separate arguments be quoted.<br>
-  /// \param CrashInfo - Details for inclusion in a crash report.<br>
-  virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,<br>
-                     CrashReportInfo *CrashInfo = nullptr) const = 0;<br>
-};<br>
-<br>
 /// Command - An executable path/name and argument vector to<br>
 /// execute.<br>
-class Command : public Job {<br>
+class Command {<br>
   /// Source - The action which caused the creation of this job.<br>
   const Action &Source;<br>
<br>
@@ -108,9 +80,10 @@ class Command : public Job {<br>
 public:<br>
   Command(const Action &Source, const Tool &Creator, const char *Executable,<br>
           const llvm::opt::ArgStringList &Arguments);<br>
+  virtual ~Command() {}<br>
<br>
-  void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,<br>
-             CrashReportInfo *CrashInfo = nullptr) const override;<br>
+  virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,<br>
+                     CrashReportInfo *CrashInfo = nullptr) const;<br>
<br>
   virtual int Execute(const StringRef **Redirects, std::string *ErrMsg,<br>
                       bool *ExecutionFailed) const;<br>
@@ -133,11 +106,6 @@ public:<br>
   const char *getExecutable() const { return Executable; }<br>
<br>
   const llvm::opt::ArgStringList &getArguments() const { return Arguments; }<br>
-<br>
-  static bool classof(const Job *J) {<br>
-    return J->getKind() == CommandClass ||<br>
-           J->getKind() == FallbackCommandClass;<br>
-  }<br>
 };<br>
<br>
 /// Like Command, but with a fallback which is executed in case<br>
@@ -154,18 +122,14 @@ public:<br>
   int Execute(const StringRef **Redirects, std::string *ErrMsg,<br>
               bool *ExecutionFailed) const override;<br>
<br>
-  static bool classof(const Job *J) {<br>
-    return J->getKind() == FallbackCommandClass;<br>
-  }<br>
-<br>
 private:<br>
   std::unique_ptr<Command> Fallback;<br>
 };<br>
<br>
 /// JobList - A sequence of jobs to perform.<br>
-class JobList : public Job {<br>
+class JobList {<br>
 public:<br>
-  typedef SmallVector<std::unique_ptr<Job>, 4> list_type;<br>
+  typedef SmallVector<std::unique_ptr<Command>, 4> list_type;<br>
   typedef list_type::size_type size_type;<br>
   typedef llvm::pointee_iterator<list_type::iterator> iterator;<br>
   typedef llvm::pointee_iterator<list_type::const_iterator> const_iterator;<br>
@@ -174,14 +138,11 @@ private:<br>
   list_type Jobs;<br>
<br>
 public:<br>
-  JobList();<br>
-  ~JobList() override {}<br>
-<br>
   void Print(llvm::raw_ostream &OS, const char *Terminator,<br>
-             bool Quote, CrashReportInfo *CrashInfo = nullptr) const override;<br>
+             bool Quote, CrashReportInfo *CrashInfo = nullptr) const;<br>
<br>
   /// Add a job to the list (taking ownership).<br>
-  void addJob(std::unique_ptr<Job> J) { Jobs.push_back(std::move(J)); }<br>
+  void addJob(std::unique_ptr<Command> J) { Jobs.push_back(std::move(J)); }<br>
<br>
   /// Clear the job list.<br>
   void clear();<br>
@@ -193,10 +154,6 @@ public:<br>
   const_iterator begin() const { return Jobs.begin(); }<br>
   iterator end() { return Jobs.end(); }<br>
   const_iterator end() const { return Jobs.end(); }<br>
-<br>
-  static bool classof(const Job *J) {<br>
-    return J->getKind() == JobListClass;<br>
-  }<br>
 };<br>
<br>
 } // end namespace driver<br>
<br>
Modified: cfe/trunk/lib/Driver/Compilation.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Driver_Compilation.cpp-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=Bkpg7qFevkVAra5FoTJQyEChGNkHGlLGb0ls74Drt3A&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Compilation.cpp?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Compilation.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Compilation.cpp Thu Jul  2 17:52:08 2015<br>
@@ -192,18 +192,14 @@ static bool InputsOk(const Command &C,<br>
   return !ActionFailed(&C.getSource(), FailingCommands);<br>
 }<br>
<br>
-void Compilation::ExecuteJob(const Job &J,<br>
-                             FailingCommandList &FailingCommands) const {<br>
-  if (const Command *C = dyn_cast<Command>(&J)) {<br>
-    if (!InputsOk(*C, FailingCommands))<br>
-      return;<br>
+void Compilation::ExecuteJobs(const JobList &Jobs,<br>
+                              FailingCommandList &FailingCommands) const {<br>
+  for (const auto &Job : Jobs) {<br>
+    if (!InputsOk(Job, FailingCommands))<br>
+      continue;<br>
     const Command *FailingCommand = nullptr;<br>
-    if (int Res = ExecuteCommand(*C, FailingCommand))<br>
+    if (int Res = ExecuteCommand(Job, FailingCommand))<br>
       FailingCommands.push_back(std::make_pair(Res, FailingCommand));<br>
-  } else {<br>
-    const JobList *Jobs = cast<JobList>(&J);<br>
-    for (const auto &Job : *Jobs)<br>
-      ExecuteJob(Job, FailingCommands);<br>
   }<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/Driver.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Driver_Driver.cpp-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=cTPsQRfocylz6igynFv2de2-cjYqgnoKzIyz2K7Z1Rg&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Driver.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Driver.cpp Thu Jul  2 17:52:08 2015<br>
@@ -500,7 +500,7 @@ void Driver::generateCompilationDiagnost<br>
<br>
   // Generate preprocessed output.<br>
   SmallVector<std::pair<int, const Command *>, 4> FailingCommands;<br>
-  C.ExecuteJob(C.getJobs(), FailingCommands);<br>
+  C.ExecuteJobs(C.getJobs(), FailingCommands);<br>
<br>
   // If any of the preprocessing commands failed, clean up and exit.<br>
   if (!FailingCommands.empty()) {<br>
@@ -560,26 +560,16 @@ void Driver::generateCompilationDiagnost<br>
       << "\n\n********************";<br>
 }<br>
<br>
-void Driver::setUpResponseFiles(Compilation &C, Job &J) {<br>
-  if (JobList *Jobs = dyn_cast<JobList>(&J)) {<br>
-    for (auto &Job : *Jobs)<br>
-      setUpResponseFiles(C, Job);<br>
-    return;<br>
-  }<br>
-<br>
-  Command *CurCommand = dyn_cast<Command>(&J);<br>
-  if (!CurCommand)<br>
-    return;<br>
-<br>
+void Driver::setUpResponseFiles(Compilation &C, Command &Cmd) {<br>
   // Since argumentsFitWithinSystemLimits() may underestimate system's capacity<br>
   // if the tool does not support response files, there is a chance/ that things<br>
   // will just work without a response file, so we silently just skip it.<br>
-  if (CurCommand->getCreator().getResponseFilesSupport() == Tool::RF_None ||<br>
-      llvm::sys::argumentsFitWithinSystemLimits(CurCommand->getArguments()))<br>
+  if (Cmd.getCreator().getResponseFilesSupport() == Tool::RF_None ||<br>
+      llvm::sys::argumentsFitWithinSystemLimits(Cmd.getArguments()))<br>
     return;<br>
<br>
   std::string TmpName = GetTemporaryPath("response", "txt");<br>
-  CurCommand->setResponseFile(<br>
+  Cmd.setResponseFile(<br>
       C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str())));<br>
 }<br>
<br>
@@ -597,9 +587,10 @@ int Driver::ExecuteCompilation(<br>
     return 1;<br>
<br>
   // Set up response file names for each command, if necessary<br>
-  setUpResponseFiles(C, C.getJobs());<br>
+  for (auto &Job : C.getJobs())<br>
+    setUpResponseFiles(C, Job);<br>
<br>
-  C.ExecuteJob(C.getJobs(), FailingCommands);<br>
+  C.ExecuteJobs(C.getJobs(), FailingCommands);<br>
<br>
   // Remove temp files.<br>
   C.CleanupFileList(C.getTempFiles());<br>
<br>
Modified: cfe/trunk/lib/Driver/Job.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Driver_Job.cpp-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=z-VVMz31Y8DVfuM-s5M3jqRwkeXG-dFz7-v-cN-wvTM&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Job.cpp?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Job.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Job.cpp Thu Jul  2 17:52:08 2015<br>
@@ -25,12 +25,10 @@ using llvm::raw_ostream;<br>
 using llvm::StringRef;<br>
 using llvm::ArrayRef;<br>
<br>
-Job::~Job() {}<br>
-<br>
 Command::Command(const Action &Source, const Tool &Creator,<br>
                  const char *Executable, const ArgStringList &Arguments)<br>
-    : Job(CommandClass), Source(Source), Creator(Creator),<br>
-      Executable(Executable), Arguments(Arguments), ResponseFile(nullptr) {}<br>
+    : Source(Source), Creator(Creator), Executable(Executable),<br>
+      Arguments(Arguments), ResponseFile(nullptr) {}<br>
<br>
 static int skipArgs(const char *Flag, bool HaveCrashVFS) {<br>
   // These flags are all of the form -Flag <Arg> and are treated as two<br>
@@ -293,8 +291,6 @@ int FallbackCommand::Execute(const Strin<br>
   return SecondaryStatus;<br>
 }<br>
<br>
-JobList::JobList() : Job(JobListClass) {}<br>
-<br>
 void JobList::Print(raw_ostream &OS, const char *Terminator, bool Quote,<br>
                     CrashReportInfo *CrashInfo) const {<br>
   for (const auto &Job : *this)<br>
<br>
Modified: cfe/trunk/lib/Tooling/CompilationDatabase.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Tooling_CompilationDatabase.cpp-3Frev-3D241310-26r1-3D241309-26r2-3D241310-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=DOPsJ9u-9YuguN5HW0V0HNoBwrbbDqZStSm2dgtkuzU&s=bbK-GVYGniqkfzkT9vbemrSrPkFjlB2ZvvYHSjSkbc8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CompilationDatabase.cpp?rev=241310&r1=241309&r2=241310&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Tooling/CompilationDatabase.cpp (original)<br>
+++ cfe/trunk/lib/Tooling/CompilationDatabase.cpp Thu Jul  2 17:52:08 2015<br>
@@ -250,14 +250,11 @@ static bool stripPositionalArgs(std::vec<br>
<br>
   CompileJobAnalyzer CompileAnalyzer;<br>
<br>
-  for (const auto &Job : Jobs) {<br>
-    if (Job.getKind() == driver::Job::CommandClass) {<br>
-      const driver::Command &Cmd = cast<driver::Command>(Job);<br>
-      // Collect only for Assemble jobs. If we do all jobs we get duplicates<br>
-      // since Link jobs point to Assemble jobs as inputs.<br>
-      if (Cmd.getSource().getKind() == driver::Action::AssembleJobClass)<br>
-        CompileAnalyzer.run(&Cmd.getSource());<br>
-    }<br>
+  for (const auto &Cmd : Jobs) {<br>
+    // Collect only for Assemble jobs. If we do all jobs we get duplicates<br>
+    // since Link jobs point to Assemble jobs as inputs.<br>
+    if (Cmd.getSource().getKind() == driver::Action::AssembleJobClass)<br>
+      CompileAnalyzer.run(&Cmd.getSource());<br>
   }<br>
<br>
   if (CompileAnalyzer.Inputs.empty()) {<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>