From: Argyrios Kyrtzidis Date: Mon, 21 May 2012 20:11:54 +0000 (+0000) Subject: [driver] When creating the compiler invocation out of command-line X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6277fb9e0353edffc0d6c8655a65542c08cf6f1;p=clang [driver] When creating the compiler invocation out of command-line arguments, force use of clang frontend for the driver. Fixes rdar://11356765. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index 0538334fc0..459e0d50c7 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -156,6 +156,9 @@ private: /// used where an integrated CPP would). unsigned CCCUseClangCPP : 1; + /// \brief Force use of clang frontend. + unsigned ForcedClangUse : 1; + public: /// Use lazy precompiled headers for PCH support. unsigned CCCUsePCH : 1; @@ -229,6 +232,9 @@ public: InstalledDir = Value; } + bool shouldForceClangUse() const { return ForcedClangUse; } + void setForcedClangUse(bool V = true) { ForcedClangUse = V; } + /// @} /// @name Primary Functionality /// @{ diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 9340ba10e5..9e3ba84d5b 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -59,7 +59,7 @@ Driver::Driver(StringRef ClangExecutable, CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false), CCGenDiagnostics(false), CCCGenericGCCName(""), CheckInputsExist(true), CCCUseClang(true), CCCUseClangCXX(true), CCCUseClangCPP(true), - CCCUsePCH(true), SuppressMissingInputWarning(false) { + ForcedClangUse(false), CCCUsePCH(true), SuppressMissingInputWarning(false) { if (IsProduction) { // In a "production" build, only use clang on architectures we expect to // work. diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index b0e94bff6c..53b78d238b 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -199,21 +199,25 @@ void Generic_ELF::anchor() {} Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA, const ActionList &Inputs) const { - Action::ActionClass Key; + Action::ActionClass Key = JA.getKind(); + bool useClang = false; if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) { + useClang = true; // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI. - if (Inputs.size() == 1 && + if (!getDriver().shouldForceClangUse() && + Inputs.size() == 1 && types::isCXX(Inputs[0]->getType()) && getTriple().isOSDarwin() && getTriple().getArch() == llvm::Triple::x86 && (C.getArgs().getLastArg(options::OPT_fapple_kext) || C.getArgs().getLastArg(options::OPT_mkernel))) - Key = JA.getKind(); - else - Key = Action::AnalyzeJobClass; - } else - Key = JA.getKind(); + useClang = false; + } + + // FIXME: This seems like a hacky way to choose clang frontend. + if (useClang) + Key = Action::AnalyzeJobClass; bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, options::OPT_no_integrated_as, diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 7aa96032ee..d6bdae4aaf 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -17,12 +17,6 @@ #include "clang/AST/DeclVisitor.h" #include "clang/AST/TypeOrdering.h" #include "clang/AST/StmtVisitor.h" -#include "clang/Driver/Compilation.h" -#include "clang/Driver/Driver.h" -#include "clang/Driver/Job.h" -#include "clang/Driver/ArgList.h" -#include "clang/Driver/Options.h" -#include "clang/Driver/Tool.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendActions.h" #include "clang/Frontend/FrontendDiagnostic.h" diff --git a/lib/Frontend/CreateInvocationFromCommandLine.cpp b/lib/Frontend/CreateInvocationFromCommandLine.cpp index b477adebad..0aca86e2c9 100644 --- a/lib/Frontend/CreateInvocationFromCommandLine.cpp +++ b/lib/Frontend/CreateInvocationFromCommandLine.cpp @@ -43,13 +43,17 @@ clang::createInvocationFromCommandLine(ArrayRef ArgList, Args.push_back(""); // FIXME: Remove dummy argument. Args.insert(Args.end(), ArgList.begin(), ArgList.end()); - // FIXME: Find a cleaner way to force the driver into restricted modes. We - // also want to force it to use clang. + // FIXME: Find a cleaner way to force the driver into restricted modes. Args.push_back("-fsyntax-only"); // FIXME: We shouldn't have to pass in the path info. driver::Driver TheDriver("clang", llvm::sys::getDefaultTargetTriple(), "a.out", false, *Diags); + // Force driver to use clang. + // FIXME: This seems like a hack. Maybe the "Clang" tool subclass should be + // available for using it to get the arguments, thus avoiding the overkill + // of using the driver. + TheDriver.setForcedClangUse(); // Don't check that inputs exist, they may have been remapped. TheDriver.setCheckInputsExist(false); diff --git a/test/Index/index-kernel-invocation.cpp b/test/Index/index-kernel-invocation.cpp new file mode 100644 index 0000000000..dba8e6b91a --- /dev/null +++ b/test/Index/index-kernel-invocation.cpp @@ -0,0 +1,4 @@ +// RUN: c-index-test -index-file -arch i386 -mkernel %s | FileCheck %s + +// CHECK: [indexDeclaration]: kind: function | name: foobar +void foobar(void);