forked from OSchip/llvm-project
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:
parent
9e2136d930
commit
3ce436d229
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue