From cd8e4c44dd068956e9181381be3ee2d49a0fac52 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar <daniel@zuster.org> Date: Mon, 30 Mar 2009 06:36:42 +0000 Subject: [PATCH] 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 --- include/clang/Driver/ToolChain.h | 4 ++++ include/clang/Driver/Types.def | 1 + lib/Driver/Driver.cpp | 21 +++++++++++-------- lib/Driver/Tools.cpp | 34 +++++++++++++++++-------------- test/Frontend/dependency-gen.c | 6 ++++-- tools/clang-cc/DependencyFile.cpp | 14 ++++++++----- 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 761b4990cb..f7d32ffee0 100644 --- a/include/clang/Driver/ToolChain.h +++ b/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/include/clang/Driver/Types.def b/include/clang/Driver/Types.def index 1902d44bfb..8d24e5013f 100644 --- a/include/clang/Driver/Types.def +++ b/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/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index a5d63e6068..3f1a72d20c 100644 --- a/lib/Driver/Driver.cpp +++ b/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/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("-"); diff --git a/test/Frontend/dependency-gen.c b/test/Frontend/dependency-gen.c index a9ee63708c..c0b7904425 100644 --- a/test/Frontend/dependency-gen.c +++ b/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/tools/clang-cc/DependencyFile.cpp b/tools/clang-cc/DependencyFile.cpp index 518f167305..2cfd4645d1 100644 --- a/tools/clang-cc/DependencyFile.cpp +++ b/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 = -- 2.40.0