Driver: Migrate some data into the Compilation; after pipelining

access to most data should go through the current Compilation, not the
Driver (which shouldn't be specialized on variables for a single
compilation).

llvm-svn: 67037
This commit is contained in:
Daniel Dunbar 2009-03-16 06:42:30 +00:00
parent 9e2136d930
commit 3ce436d229
4 changed files with 78 additions and 20 deletions

View File

@ -10,16 +10,44 @@
#ifndef CLANG_DRIVER_COMPILATION_H_
#define CLANG_DRIVER_COMPILATION_H_
#include "clang/Driver/Job.h"
#include "llvm/ADT/DenseMap.h"
namespace clang {
namespace driver {
class ArgList;
class JobList;
class ToolChain;
/// Compilation - A set of tasks to perform for a single driver
/// invocation.
class Compilation {
/// The default tool chain.
ToolChain &DefaultToolChain;
/// The original (untranslated) input argument list.
ArgList *Args;
/// The root list of jobs.
JobList Jobs;
/// TCArgs - Cache of translated arguments for a particular tool
/// chain.
llvm::DenseMap<const ToolChain*, ArgList*> TCArgs;
public:
Compilation();
Compilation(ToolChain &DefaultToolChain, ArgList *Args);
~Compilation();
const ArgList &getArgs() const { return *Args; }
JobList &getJobs() { return Jobs; }
/// getArgsForToolChain - Return the argument list, possibly
/// translated by the tool chain \arg TC (or by the default tool
/// chain, if TC is not specified).
const ArgList &getArgsForToolChain(const ToolChain *TC = 0);
/// Execute - Execute the compilation jobs and return an
/// appropriate exit code.
int Execute() const;

View File

@ -139,7 +139,9 @@ public:
/// BuildJobs - Bind actions to concrete tools and translate
/// arguments to form the list of jobs to run.
Compilation *BuildJobs(const ArgList &Args, const ActionList &Actions) const;
///
/// \arg C - The compilation that is being built.
void BuildJobs(Compilation &C, const ActionList &Actions) const;
/// @}
/// @name Helper Methods

View File

@ -8,12 +8,38 @@
//===----------------------------------------------------------------------===//
#include "clang/Driver/Compilation.h"
#include "clang/Driver/ArgList.h"
#include "clang/Driver/ToolChain.h"
using namespace clang::driver;
Compilation::Compilation() {
Compilation::Compilation(ToolChain &_DefaultToolChain,
ArgList *_Args)
: DefaultToolChain(_DefaultToolChain), Args(_Args) {
}
Compilation::~Compilation() {
Compilation::~Compilation() {
delete Args;
// Free any derived arg lists.
for (llvm::DenseMap<const ToolChain*, ArgList*>::iterator
it = TCArgs.begin(), ie = TCArgs.end(); it != ie; ++it) {
ArgList *A = it->second;
if (A != Args)
delete Args;
}
}
const ArgList &Compilation::getArgsForToolChain(const ToolChain *TC) {
if (!TC)
TC = &DefaultToolChain;
ArgList *&Args = TCArgs[TC];
if (!Args)
Args = TC->TranslateArgs(*Args);
return *Args;
}
int Compilation::Execute() const {

View File

@ -171,19 +171,9 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
return 0;
}
Compilation *C = BuildJobs(*Args, Actions);
// If there were no errors, warn about any unused arguments.
for (ArgList::iterator it = Args->begin(), ie = Args->end(); it != ie; ++it) {
Arg *A = *it;
// FIXME: It would be nice to be able to send the argument to the
// Diagnostic, so that extra values, position, and so on could be
// printed.
if (!A->isClaimed())
Diag(clang::diag::warn_drv_unused_argument)
<< A->getOption().getName();
}
// The compilation takes ownership of Args.
Compilation *C = new Compilation(*DefaultToolChain, Args);
BuildJobs(*C, Actions);
return C;
}
@ -577,9 +567,21 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
return 0;
}
Compilation *Driver::BuildJobs(const ArgList &Args,
const ActionList &Actions) const {
return 0;
void Driver::BuildJobs(Compilation &C,
const ActionList &Actions) const {
// If there were no errors, warn about any unused arguments.
for (ArgList::const_iterator it = C.getArgs().begin(), ie = C.getArgs().end();
it != ie; ++it) {
Arg *A = *it;
// FIXME: It would be nice to be able to send the argument to the
// Diagnostic, so that extra values, position, and so on could be
// printed.
if (!A->isClaimed())
Diag(clang::diag::warn_drv_unused_argument)
<< A->getOption().getName();
}
}
llvm::sys::Path Driver::GetFilePath(const char *Name,