forked from OSchip/llvm-project
Driver: Determine which compilation stages to run.
llvm-svn: 66844
This commit is contained in:
parent
a19c662a83
commit
bfeec7443f
|
@ -24,3 +24,7 @@ DIAG(err_drv_invalid_opt_with_multiple_archs, ERROR,
|
||||||
"option '%0' cannot be used with multiple -arch options")
|
"option '%0' cannot be used with multiple -arch options")
|
||||||
DIAG(err_drv_invalid_output_with_multiple_archs, ERROR,
|
DIAG(err_drv_invalid_output_with_multiple_archs, ERROR,
|
||||||
"cannot use '%0' output with multiple -arch options")
|
"cannot use '%0' output with multiple -arch options")
|
||||||
|
DIAG(err_drv_no_input_files, ERROR,
|
||||||
|
"no input files")
|
||||||
|
DIAG(err_drv_use_of_Z_option, ERROR,
|
||||||
|
"unsupported use of internal gcc -Z option '%0'")
|
||||||
|
|
|
@ -29,6 +29,25 @@ namespace driver {
|
||||||
/// Driver - Encapsulate logic for constructing compilation processes
|
/// Driver - Encapsulate logic for constructing compilation processes
|
||||||
/// from a set of gcc-driver-like command line arguments.
|
/// from a set of gcc-driver-like command line arguments.
|
||||||
class Driver {
|
class Driver {
|
||||||
|
/// PhaseOrder - Ordered values for successive stages in the
|
||||||
|
/// compilation process which interact with user options.
|
||||||
|
enum PhaseOrder {
|
||||||
|
/// Nothing.
|
||||||
|
NoPhaseOrder = 0,
|
||||||
|
|
||||||
|
/// Only run the preprocessor.
|
||||||
|
PreprocessPhaseOrder,
|
||||||
|
|
||||||
|
/// Only run the preprocessor and compiler.
|
||||||
|
CompilePhaseOrder,
|
||||||
|
|
||||||
|
/// Only run the preprocessor, compiler, and assembler.
|
||||||
|
AssemblePhaseOrder,
|
||||||
|
|
||||||
|
/// Run everything.
|
||||||
|
PostAssemblePhaseOrder
|
||||||
|
};
|
||||||
|
|
||||||
OptTable *Opts;
|
OptTable *Opts;
|
||||||
|
|
||||||
Diagnostic &Diags;
|
Diagnostic &Diags;
|
||||||
|
|
|
@ -111,7 +111,7 @@ OPTION("--bootclasspath=", _bootclasspath_EQ, Joined, INVALID, fbootclasspath_EQ
|
||||||
OPTION("--bootclasspath", _bootclasspath, Separate, INVALID, fbootclasspath_EQ, "J", 0)
|
OPTION("--bootclasspath", _bootclasspath, Separate, INVALID, fbootclasspath_EQ, "J", 0)
|
||||||
OPTION("--classpath=", _classpath_EQ, Joined, INVALID, fclasspath_EQ, "", 0)
|
OPTION("--classpath=", _classpath_EQ, Joined, INVALID, fclasspath_EQ, "", 0)
|
||||||
OPTION("--classpath", _classpath, Separate, INVALID, fclasspath_EQ, "J", 0)
|
OPTION("--classpath", _classpath, Separate, INVALID, fclasspath_EQ, "J", 0)
|
||||||
OPTION("--combine", _combine, Flag, INVALID, combine, "", 0)
|
OPTION("--combine", _combine, Flag, INVALID, combine, "u", 0)
|
||||||
OPTION("--comments-in-macros", _comments_in_macros, Flag, INVALID, CC, "", 0)
|
OPTION("--comments-in-macros", _comments_in_macros, Flag, INVALID, CC, "", 0)
|
||||||
OPTION("--comments", _comments, Flag, INVALID, C, "", 0)
|
OPTION("--comments", _comments, Flag, INVALID, C, "", 0)
|
||||||
OPTION("--compile", _compile, Flag, INVALID, c, "", 0)
|
OPTION("--compile", _compile, Flag, INVALID, c, "", 0)
|
||||||
|
|
|
@ -245,6 +245,8 @@ void Driver::BuildActions(ArgList &Args, ActionList &Actions) {
|
||||||
types::ID InputType = types::TY_INVALID;
|
types::ID InputType = types::TY_INVALID;
|
||||||
Arg *InputTypeArg = 0;
|
Arg *InputTypeArg = 0;
|
||||||
|
|
||||||
|
// Start by constructing the list of inputs and their types.
|
||||||
|
|
||||||
llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs;
|
llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs;
|
||||||
for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
|
for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
|
||||||
it != ie; ++it) {
|
it != ie; ++it) {
|
||||||
|
@ -323,6 +325,46 @@ void Driver::BuildActions(ArgList &Args, ActionList &Actions) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Inputs.empty()) {
|
||||||
|
Diag(clang::diag::err_drv_no_input_files);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine which compilation mode we are in. We look for options
|
||||||
|
// which affect the phase, starting with the earliest phases, and
|
||||||
|
// record which option we used to determine the final phase.
|
||||||
|
Arg *FinalPhaseOpt = 0;
|
||||||
|
PhaseOrder FinalPhase;
|
||||||
|
|
||||||
|
// -{E,M,MM} only run the preprocessor.
|
||||||
|
if ((FinalPhaseOpt = Args.getLastArg(options::OPT_E)) ||
|
||||||
|
(FinalPhaseOpt = Args.getLastArg(options::OPT_M)) ||
|
||||||
|
(FinalPhaseOpt = Args.getLastArg(options::OPT_MM))) {
|
||||||
|
FinalPhase = PreprocessPhaseOrder;
|
||||||
|
|
||||||
|
// -{-analyze,fsyntax-only,S} only run up to the compiler.
|
||||||
|
} else if ((FinalPhaseOpt = Args.getLastArg(options::OPT__analyze)) ||
|
||||||
|
(FinalPhaseOpt = Args.getLastArg(options::OPT_fsyntax_only)) ||
|
||||||
|
(FinalPhaseOpt = Args.getLastArg(options::OPT_S))) {
|
||||||
|
FinalPhase = CompilePhaseOrder;
|
||||||
|
|
||||||
|
// -c only runs up to the assembler.
|
||||||
|
} else if ((FinalPhaseOpt = Args.getLastArg(options::OPT_c))) {
|
||||||
|
FinalPhase = AssemblePhaseOrder;
|
||||||
|
|
||||||
|
// Otherwise do everything.
|
||||||
|
} else
|
||||||
|
FinalPhase = PostAssemblePhaseOrder;
|
||||||
|
|
||||||
|
if (FinalPhaseOpt)
|
||||||
|
FinalPhaseOpt->claim();
|
||||||
|
|
||||||
|
// Reject -Z* at the top level, these options should never have been
|
||||||
|
// exposed by gcc.
|
||||||
|
if (Arg *A = Args.getLastArg(options::OPT_Z))
|
||||||
|
Diag(clang::diag::err_drv_use_of_Z_option) << A->getValue(Args);
|
||||||
|
|
||||||
|
// FIXME: This is just debugging code.
|
||||||
for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
|
||||||
llvm::errs() << "input " << i << ": "
|
llvm::errs() << "input " << i << ": "
|
||||||
<< Inputs[i].second->getValue(Args) << "\n";
|
<< Inputs[i].second->getValue(Args) << "\n";
|
||||||
|
|
Loading…
Reference in New Issue