mirror of https://github.com/microsoft/clang.git
[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
This commit is contained in:
parent
b7824d9919
commit
d6277fb9e0
|
@ -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
|
||||
/// @{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -43,13 +43,17 @@ clang::createInvocationFromCommandLine(ArrayRef<const char *> ArgList,
|
|||
Args.push_back("<clang>"); // 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);
|
||||
|
|
|
@ -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);
|
Loading…
Reference in New Issue