[cfe-commits] r67158 - in /cfe/trunk: include/clang/Driver/Compilation.h include/clang/Driver/Driver.h lib/Driver/Action.cpp lib/Driver/Compilation.cpp lib/Driver/Driver.cpp lib/Driver/ToolChain.cpp

Daniel Dunbar daniel at zuster.org
Tue Mar 17 19:55:38 PDT 2009


Author: ddunbar
Date: Tue Mar 17 21:55:38 2009
New Revision: 67158

URL: http://llvm.org/viewvc/llvm-project?rev=67158&view=rev
Log:
Driver: Move actions into Compilation, and construct the compilation
earlier.

 - This gives us a simple ownership model, and allows clients access
   to more information should they ever want it.

 - We now free Actions correctly.

Modified:
    cfe/trunk/include/clang/Driver/Compilation.h
    cfe/trunk/include/clang/Driver/Driver.h
    cfe/trunk/lib/Driver/Action.cpp
    cfe/trunk/lib/Driver/Compilation.cpp
    cfe/trunk/lib/Driver/Driver.cpp
    cfe/trunk/lib/Driver/ToolChain.cpp

Modified: cfe/trunk/include/clang/Driver/Compilation.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Compilation.h?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/include/clang/Driver/Compilation.h (original)
+++ cfe/trunk/include/clang/Driver/Compilation.h Tue Mar 17 21:55:38 2009
@@ -30,6 +30,9 @@
   /// The original (untranslated) input argument list.
   ArgList *Args;
 
+  /// The list of actions.
+  ActionList Actions;
+
   /// The root list of jobs.
   JobList Jobs;
 
@@ -46,7 +49,13 @@
   Compilation(ToolChain &DefaultToolChain, ArgList *Args);
   ~Compilation();
 
+  const ToolChain &getDefaultToolChain() const { return DefaultToolChain; }
+
   const ArgList &getArgs() const { return *Args; }
+
+  ActionList &getActions() { return Actions; }
+  const ActionList &getActions() const { return Actions; }
+
   JobList &getJobs() { return Jobs; }
 
   /// getArgsForToolChain - Return the argument list, possibly

Modified: cfe/trunk/include/clang/Driver/Driver.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/include/clang/Driver/Driver.h (original)
+++ cfe/trunk/include/clang/Driver/Driver.h Tue Mar 17 21:55:38 2009
@@ -138,20 +138,24 @@
   ///
   /// \param Args - The input arguments.
   /// \param Actions - The list to store the resulting actions onto.
-  void BuildActions(ArgList &Args, ActionList &Actions) const;
+  void BuildActions(const ArgList &Args, ActionList &Actions) const;
 
   /// BuildUniversalActions - Construct the list of actions to perform
   /// for the given arguments, which may require a universal build.
   ///
   /// \param Args - The input arguments.
   /// \param Actions - The list to store the resulting actions onto.
-  void BuildUniversalActions(ArgList &Args, ActionList &Actions) const;
+  /// \param DefaultArchName - The default arch name (required to know
+  /// what architecture to bind if no -arch options are present).
+
+  void BuildUniversalActions(const ArgList &Args, ActionList &Actions,
+                             const char *DefaultArchName) const;
 
   /// BuildJobs - Bind actions to concrete tools and translate
   /// arguments to form the list of jobs to run.
   ///
   /// \arg C - The compilation that is being built.
-  void BuildJobs(Compilation &C, const ActionList &Actions) const;
+  void BuildJobs(Compilation &C) const;
 
   /// @}
   /// @name Helper Methods
@@ -168,27 +172,25 @@
 
   /// GetFilePath - Lookup \arg Name in the list of file search paths.
   ///
-  /// \arg TC - Use the provided tool chain for additional information
-  /// on directories to search, or the DefaultToolChain if not
-  /// provided.
+  /// \arg TC - The tool chain for additional information on
+  /// directories to search.
   // FIXME: This should be in CompilationInfo.
-  llvm::sys::Path GetFilePath(const char *Name, const ToolChain *TC=0) const;
+  llvm::sys::Path GetFilePath(const char *Name, const ToolChain &TC) const;
 
   /// GetProgramPath - Lookup \arg Name in the list of program search
   /// paths.
   ///
-  /// \arg TC - Use the provided tool chain for additional information
-  /// on directories to search, or the DefaultToolChain if not
-  /// provided.
+  /// \arg TC - The provided tool chain for additional information on
+  /// directories to search.
   // FIXME: This should be in CompilationInfo.
-  llvm::sys::Path GetProgramPath(const char *Name, const ToolChain *TC=0) const;
+  llvm::sys::Path GetProgramPath(const char *Name, const ToolChain &TC) const;
 
   /// HandleImmediateArgs - Handle any arguments which should be
   /// treated before building actions or binding tools.
   ///
   /// \return Whether any compilation should be built for this
   /// invocation.
-  bool HandleImmediateArgs(const ArgList &Args);
+  bool HandleImmediateArgs(const Compilation &C);
 
   /// ConstructAction - Construct the appropriate action to do for
   /// \arg Phase on the \arg Input, taking in to account arguments

Modified: cfe/trunk/lib/Driver/Action.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Action.cpp?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/lib/Driver/Action.cpp (original)
+++ cfe/trunk/lib/Driver/Action.cpp Tue Mar 17 21:55:38 2009
@@ -12,7 +12,11 @@
 #include <cassert>
 using namespace clang::driver;
 
-Action::~Action() {}
+Action::~Action() {
+  // Free the inputs.
+  for (iterator it = begin(), ie = end(); it != ie; ++it)
+    delete *it;  
+}
 
 const char *Action::getClassName(ActionClass AC) {
   switch (AC) {

Modified: cfe/trunk/lib/Driver/Compilation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Compilation.cpp?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/lib/Driver/Compilation.cpp (original)
+++ cfe/trunk/lib/Driver/Compilation.cpp Tue Mar 17 21:55:38 2009
@@ -9,6 +9,7 @@
 
 #include "clang/Driver/Compilation.h"
 
+#include "clang/Driver/Action.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/ToolChain.h"
 
@@ -29,6 +30,11 @@
     if (A != Args)
       delete Args;
   }
+
+  // Free the actions, if built.
+  for (ActionList::iterator it = Actions.begin(), ie = Actions.end(); 
+       it != ie; ++it)
+    delete *it;
 }
 
 const ArgList &Compilation::getArgsForToolChain(const ToolChain *TC) {

Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Tue Mar 17 21:55:38 2009
@@ -166,31 +166,33 @@
   // is part of the compilation (it is arg dependent).
   DefaultToolChain = Host->getToolChain(*Args);
 
+  // The compilation takes ownership of Args.
+  Compilation *C = new Compilation(*DefaultToolChain, Args);
+
   // FIXME: This behavior shouldn't be here.
   if (CCCPrintOptions) {
-    PrintOptions(*Args);
-    return 0;
+    PrintOptions(C->getArgs());
+    return C;
   }
 
-  if (!HandleImmediateArgs(*Args))
-    return 0;
+  if (!HandleImmediateArgs(*C))
+    return C;
 
   // Construct the list of abstract actions to perform for this
-  // compilation.
-  ActionList Actions;
+  // compilation. We avoid passing a Compilation here simply to
+  // enforce the abstraction that pipelining is not host or toolchain
+  // dependent (other than the driver driver test).
   if (Host->useDriverDriver())
-    BuildUniversalActions(*Args, Actions);
+    BuildUniversalActions(C->getArgs(), C->getActions());
   else
-    BuildActions(*Args, Actions);
+    BuildActions(C->getArgs(), C->getActions());
 
   if (CCCPrintActions) {
-    PrintActions(*Args, Actions);
-    return 0;
+    PrintActions(C->getArgs(), C->getActions());
+    return C;
   }
 
-  // The compilation takes ownership of Args.
-  Compilation *C = new Compilation(*DefaultToolChain, Args);
-  BuildJobs(*C, Actions);
+  BuildJobs(*C);
 
   return C;
 }
@@ -220,30 +222,33 @@
   llvm::outs() << "ccc version 1.0" << "\n";
 }
 
-bool Driver::HandleImmediateArgs(const ArgList &Args) {
+bool Driver::HandleImmediateArgs(const Compilation &C) {
   // The order these options are handled in in gcc is all over the
   // place, but we don't expect inconsistencies w.r.t. that to matter
   // in practice.
-  if (Args.hasArg(options::OPT_v) || 
-      Args.hasArg(options::OPT__HASH_HASH_HASH)) {
+  if (C.getArgs().hasArg(options::OPT_v) || 
+      C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
     PrintVersion();
     SuppressMissingInputWarning = true;
   }
 
+  const ToolChain &TC = C.getDefaultToolChain();
   // FIXME: The following handlers should use a callback mechanism, we
   // don't know what the client would like to do.
-  if (Arg *A = Args.getLastArg(options::OPT_print_file_name_EQ)) {
-    llvm::outs() << GetFilePath(A->getValue(Args)).toString() << "\n";
+  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) {
+    llvm::outs() << GetFilePath(A->getValue(C.getArgs()), TC).toString() 
+                 << "\n";
     return false;
   }
 
-  if (Arg *A = Args.getLastArg(options::OPT_print_prog_name_EQ)) {
-    llvm::outs() << GetProgramPath(A->getValue(Args)).toString() << "\n";
+  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) {
+    llvm::outs() << GetProgramPath(A->getValue(C.getArgs()), TC).toString() 
+                 << "\n";
     return false;
   }
 
-  if (Args.hasArg(options::OPT_print_libgcc_file_name)) {
-    llvm::outs() << GetProgramPath("libgcc.a").toString() << "\n";
+  if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) {
+    llvm::outs() << GetProgramPath("libgcc.a", TC).toString() << "\n";
     return false;
   }
 
@@ -292,7 +297,8 @@
     PrintActions1(Args, *it, Ids);
 }
 
-void Driver::BuildUniversalActions(ArgList &Args, ActionList &Actions) const {
+void Driver::BuildUniversalActions(const ArgList &Args, 
+                                   ActionList &Actions) const {
   llvm::PrettyStackTraceString CrashInfo("Building actions for universal build");
   // Collect the list of architectures. Duplicates are allowed, but
   // should only be handled once (in the order seen).
@@ -367,7 +373,7 @@
   }
 }
 
-void Driver::BuildActions(ArgList &Args, ActionList &Actions) const {
+void Driver::BuildActions(const ArgList &Args, ActionList &Actions) const {
   llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
   // Start by constructing the list of inputs and their types.
 
@@ -587,7 +593,7 @@
   return 0;
 }
 
-void Driver::BuildJobs(Compilation &C, const ActionList &Actions) const {
+void Driver::BuildJobs(Compilation &C) const {
   llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
   bool SaveTemps = C.getArgs().hasArg(options::OPT_save_temps);
   bool UsePipes = C.getArgs().hasArg(options::OPT_pipe);
@@ -604,8 +610,8 @@
   // output files.
   if (FinalOutput) {
     unsigned NumOutputs = 0;
-    for (ActionList::const_iterator it = Actions.begin(), ie = Actions.end(); 
-         it != ie; ++it)
+    for (ActionList::const_iterator it = C.getActions().begin(), 
+           ie = C.getActions().end(); it != ie; ++it)
       if ((*it)->getType() != types::TY_Nothing)
         ++NumOutputs;
     
@@ -615,8 +621,8 @@
     }
   }
 
-  for (ActionList::const_iterator it = Actions.begin(), ie = Actions.end(); 
-       it != ie; ++it) {
+  for (ActionList::const_iterator it = C.getActions().begin(), 
+         ie = C.getActions().end(); it != ie; ++it) {
     Action *A = *it;
 
     // If we are linking an image for multiple archs then the linker
@@ -821,18 +827,14 @@
 }
 
 llvm::sys::Path Driver::GetFilePath(const char *Name,
-                                    const ToolChain *TC) const {
+                                    const ToolChain &TC) const {
   // FIXME: Implement.
-  if (!TC) TC = DefaultToolChain;
-
   return llvm::sys::Path(Name);
 }
 
 llvm::sys::Path Driver::GetProgramPath(const char *Name, 
-                                       const ToolChain *TC) const {
+                                       const ToolChain &TC) const {
   // FIXME: Implement.
-  if (!TC) TC = DefaultToolChain;
-
   return llvm::sys::Path(Name);
 }
 

Modified: cfe/trunk/lib/Driver/ToolChain.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=67158&r1=67157&r2=67158&view=diff

==============================================================================
--- cfe/trunk/lib/Driver/ToolChain.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChain.cpp Tue Mar 17 21:55:38 2009
@@ -25,13 +25,13 @@
 
 llvm::sys::Path ToolChain::GetFilePath(const Compilation &C, 
                                        const char *Name) const {
-  return Host.getDriver().GetFilePath(Name, this);
+  return Host.getDriver().GetFilePath(Name, *this);
   
 }
 
 llvm::sys::Path ToolChain::GetProgramPath(const Compilation &C, 
                                           const char *Name) const {
-  return Host.getDriver().GetProgramPath(Name, this);
+  return Host.getDriver().GetProgramPath(Name, *this);
 }
 
 bool ToolChain::ShouldUseClangCompiler(const Compilation &C, 





More information about the cfe-commits mailing list