aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-30 06:36:42 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-30 06:36:42 +0000
commitcd8e4c44dd068956e9181381be3ee2d49a0fac52 (patch)
tree1d81aae56eed44fd80cca8254f5dd50ff0f5533f /lib/Driver/Tools.cpp
parentf1d537f460c529906c73de56d891046b45434fb3 (diff)
Driver: Support -M and -MM.
- Not particularly elegant, but my hand is forced by gcc. Also, tweak -ccc-print-bindings output. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68027 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r--lib/Driver/Tools.cpp34
1 files changed, 19 insertions, 15 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index bd833ead27..3e8ccb3de3 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -43,7 +43,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
assert(JA.getType() == types::TY_Plist && "Invalid output type.");
CmdArgs.push_back("-analyze");
} else if (isa<PreprocessJobAction>(JA)) {
- CmdArgs.push_back("-E");
+ if (Output.getType() == types::TY_Dependencies)
+ CmdArgs.push_back("-Eonly");
+ else
+ CmdArgs.push_back("-E");
} else if (isa<PrecompileJobAction>(JA)) {
// No special option needed, driven by -x.
//
@@ -218,7 +221,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
(A = Args.getLastArg(options::OPT_MMD))) {
// Determine the output location.
const char *DepFile;
- if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
+ if (Output.getType() == types::TY_Dependencies) {
+ if (Output.isPipe())
+ DepFile = "-";
+ else
+ DepFile = Output.getFilename();
+ } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
DepFile = MF->getValue(Args);
} else if (A->getOption().getId() == options::OPT_M ||
A->getOption().getId() == options::OPT_MM) {
@@ -234,8 +242,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
const char *DepTarget;
- // If user provided -o, that is the dependency target.
- if (Arg *A = Args.getLastArg(options::OPT_o)) {
+ // If user provided -o, that is the dependency target, except
+ // when we are only generating a dependency file.
+ Arg *OutputOpt = Args.getLastArg(options::OPT_o);
+ if (OutputOpt && Output.getType() != types::TY_Dependencies) {
DepTarget = A->getValue(Args);
} else {
// Otherwise derive from the base input.
@@ -260,14 +270,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.AddLastArg(CmdArgs, options::OPT_MP);
Args.AddAllArgs(CmdArgs, options::OPT_MT);
- Arg *Unsupported = Args.getLastArg(options::OPT_M);
- if (!Unsupported)
- Unsupported = Args.getLastArg(options::OPT_MM);
- if (!Unsupported)
- Unsupported = Args.getLastArg(options::OPT_MG);
- if (!Unsupported)
- Unsupported = Args.getLastArg(options::OPT_MQ);
- if (Unsupported) {
+ Arg *Unsupported;
+ if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
+ (Unsupported = Args.getLastArg(options::OPT_MQ))) {
const Driver &D = getToolChain().getHost().getDriver();
D.Diag(clang::diag::err_drv_unsupported_opt)
<< Unsupported->getOption().getName();
@@ -371,9 +376,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-arch");
CmdArgs.push_back(getToolChain().getArchName().c_str());
- // FIXME: We should have a separate type for this.
- if (Args.hasArg(options::OPT_M) || Args.hasArg(options::OPT_MM)) {
- CmdArgs.push_back("-M");
+ if (Output.getType() == types::TY_Dependencies) {
+ // Handled with other dependency code.
} else if (Output.isPipe()) {
CmdArgs.push_back("-o");
CmdArgs.push_back("-");