summaryrefslogtreecommitdiffstats
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
commitd67a32252c736d496ed12f173a81303f77b44e1a (patch)
tree997bf810c264956df04e2bd1ccc91b4bdd52ef07
parenta01a5638139e6c4d3622db86e3395a81bf601b00 (diff)
downloadbcm5719-llvm-d67a32252c736d496ed12f173a81303f77b44e1a.tar.gz
bcm5719-llvm-d67a32252c736d496ed12f173a81303f77b44e1a.zip
Driver: Support -M and -MM.
- Not particularly elegant, but my hand is forced by gcc. Also, tweak -ccc-print-bindings output. llvm-svn: 68027
-rw-r--r--clang/include/clang/Driver/ToolChain.h4
-rw-r--r--clang/include/clang/Driver/Types.def1
-rw-r--r--clang/lib/Driver/Driver.cpp21
-rw-r--r--clang/lib/Driver/Tools.cpp34
-rw-r--r--clang/test/Frontend/dependency-gen.c6
-rw-r--r--clang/tools/clang-cc/DependencyFile.cpp14
6 files changed, 49 insertions, 31 deletions
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 761b4990cb2..f7d32ffee03 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -54,6 +54,10 @@ public:
const std::string &getPlatform() const { return Platform; }
const std::string &getOS() const { return OS; }
+ const std::string getTripleString() const {
+ return getArchName() + "-" + getPlatform() + "-" + getOS();
+ }
+
path_list &getFilePaths() { return FilePaths; }
const path_list &getFilePaths() const { return FilePaths; }
diff --git a/clang/include/clang/Driver/Types.def b/clang/include/clang/Driver/Types.def
index 1902d44bfbf..8d24e5013fb 100644
--- a/clang/include/clang/Driver/Types.def
+++ b/clang/include/clang/Driver/Types.def
@@ -74,4 +74,5 @@ TYPE("precompiled-header", PCH, INVALID, "gch", "A")
TYPE("object", Object, INVALID, "o", "")
TYPE("treelang", Treelang, INVALID, 0, "u")
TYPE("image", Image, INVALID, "out", "")
+TYPE("dependencies", Dependencies, INVALID, "d", "")
TYPE("none", Nothing, INVALID, 0, "u")
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index a5d63e60681..3f1a72d20c6 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -245,8 +245,7 @@ void Driver::PrintVersion(const Compilation &C) const {
llvm::errs() << "clang version 1.0 (" << vers << " " << revision << ")" << "\n";
const ToolChain &TC = C.getDefaultToolChain();
- llvm::errs() << "Target: " << TC.getArchName() << '-'
- << TC.getPlatform() << '-' << TC.getOS() << '\n';
+ llvm::errs() << "Target: " << TC.getTripleString() << '\n';
}
bool Driver::HandleImmediateArgs(const Compilation &C) {
@@ -379,9 +378,6 @@ void Driver::BuildUniversalActions(const ArgList &Args,
if (Archs.size() > 1) {
// No recovery needed, the point of this is just to prevent
// overwriting the same files.
- if (const Arg *A = Args.getLastArg(options::OPT_M_Group))
- Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs)
- << A->getAsString(Args);
if (const Arg *A = Args.getLastArg(options::OPT_save_temps))
Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs)
<< A->getAsString(Args);
@@ -618,9 +614,15 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
switch (Phase) {
case phases::Link: assert(0 && "link action invalid here.");
case phases::Preprocess: {
- types::ID OutputTy = types::getPreprocessedType(Input->getType());
- assert(OutputTy != types::TY_INVALID &&
- "Cannot preprocess this input type!");
+ types::ID OutputTy;
+ // -{M, MM} alter the output type.
+ if (Args.hasArg(options::OPT_M) || Args.hasArg(options::OPT_MM)) {
+ OutputTy = types::TY_Dependencies;
+ } else {
+ OutputTy = types::getPreprocessedType(Input->getType());
+ assert(OutputTy != types::TY_INVALID &&
+ "Cannot preprocess this input type!");
+ }
return new PreprocessJobAction(Input, OutputTy);
}
case phases::Precompile:
@@ -848,7 +850,8 @@ void Driver::BuildJobsForAction(Compilation &C,
}
if (CCCPrintBindings) {
- llvm::errs() << "bind - \"" << T.getName() << "\", inputs: [";
+ llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"'
+ << " - \"" << T.getName() << "\", inputs: [";
for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
llvm::errs() << InputInfos[i].getAsString();
if (i + 1 != e)
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index bd833ead27b..3e8ccb3de3d 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/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("-");
diff --git a/clang/test/Frontend/dependency-gen.c b/clang/test/Frontend/dependency-gen.c
index a9ee63708cc..c0b79044251 100644
--- a/clang/test/Frontend/dependency-gen.c
+++ b/clang/test/Frontend/dependency-gen.c
@@ -1,5 +1,7 @@
// rdar://6533411
// RUN: clang -MD -MF %t.d -c -x c -o %t.o /dev/null &&
-
// RUN: grep '.*dependency-gen.c.out.tmp.o:' %t.d
-// RUN: grep '/dev/null' %t.d
+// RUN: grep '/dev/null' %t.d &&
+
+// RUN: clang -M -x c /dev/null -o %t.deps &&
+// RUN: grep 'null.o: /dev/null' %t.deps
diff --git a/clang/tools/clang-cc/DependencyFile.cpp b/clang/tools/clang-cc/DependencyFile.cpp
index 518f1673057..2cfd4645d12 100644
--- a/clang/tools/clang-cc/DependencyFile.cpp
+++ b/clang/tools/clang-cc/DependencyFile.cpp
@@ -91,11 +91,15 @@ bool clang::CreateDependencyFileGen(Preprocessor *PP,
}
std::string ErrMsg;
- llvm::raw_ostream *OS =
- new llvm::raw_fd_ostream(DependencyFile.c_str(), false, ErrStr);
- if (!ErrMsg.empty()) {
- ErrStr = "unable to open dependency file: " + ErrMsg;
- return false;
+ llvm::raw_ostream *OS;
+ if (DependencyFile == "-") {
+ OS = new llvm::raw_stdout_ostream();
+ } else {
+ OS = new llvm::raw_fd_ostream(DependencyFile.c_str(), false, ErrStr);
+ if (!ErrMsg.empty()) {
+ ErrStr = "unable to open dependency file: " + ErrMsg;
+ return false;
+ }
}
DependencyFileCallback *PPDep =
OpenPOWER on IntegriCloud