diff --git a/include/clang/Basic/DiagnosticFrontendKinds.td b/include/clang/Basic/DiagnosticFrontendKinds.td index 84c1345324c4749d3943bf34e39da1b194778dc3..13641c1841d9f0183dd0306d60b94a6af48a9ffc 100644 --- a/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/include/clang/Basic/DiagnosticFrontendKinds.td @@ -60,6 +60,8 @@ def warn_fe_cc_log_diagnostics_failure : Warning< "unable to open CC_LOG_DIAGNOSTICS file: %0 (using stderr)">; def err_fe_no_pch_in_dir : Error< "no suitable precompiled header file found in directory '%0'">; +def err_fe_action_not_available : Error< + "action %0 not compiled in">; def warn_fe_serialized_diag_failure : Warning< "unable to open file %0 for serializing diagnostics (%1)">, diff --git a/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/lib/FrontendTool/ExecuteCompilerInvocation.cpp index aea5b088926518a622e4668b240a174527855250..8cc25924f2b52949ec1a374855cd0b58ee032c56 100644 --- a/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -31,6 +31,7 @@ using namespace clang; static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { using namespace clang::frontend; + StringRef Action("unknown"); switch (CI.getFrontendOpts().ProgramAction) { case ASTDeclList: return new ASTDeclListAction(); @@ -42,12 +43,20 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { case DumpTokens: return new DumpTokensAction(); case EmitAssembly: return new EmitAssemblyAction(); case EmitBC: return new EmitBCAction(); +#ifdef CLANG_ENABLE_REWRITER case EmitHTML: return new HTMLPrintAction(); +#else + case EmitHTML: Action = "EmitHTML"; break; +#endif case EmitLLVM: return new EmitLLVMAction(); case EmitLLVMOnly: return new EmitLLVMOnlyAction(); case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); case EmitObj: return new EmitObjAction(); +#ifdef CLANG_ENABLE_REWRITER case FixIt: return new FixItAction(); +#else + case FixIt: Action = "FixIt"; break; +#endif case GenerateModule: return new GenerateModuleAction; case GeneratePCH: return new GeneratePCHAction; case GeneratePTH: return new GeneratePTHAction(); @@ -74,19 +83,46 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { case PrintDeclContext: return new DeclContextPrintAction(); case PrintPreamble: return new PrintPreambleAction(); case PrintPreprocessedInput: { - if (CI.getPreprocessorOutputOpts().RewriteIncludes) + if (CI.getPreprocessorOutputOpts().RewriteIncludes) { +#ifdef CLANG_ENABLE_REWRITER return new RewriteIncludesAction(); +#else + Action = "RewriteIncludesAction"; + break; +#endif + } return new PrintPreprocessedAction(); } +#ifdef CLANG_ENABLE_REWRITER case RewriteMacros: return new RewriteMacrosAction(); case RewriteObjC: return new RewriteObjCAction(); case RewriteTest: return new RewriteTestAction(); - case RunAnalysis: return new ento::AnalysisAction(); +#else + case RewriteMacros: Action = "RewriteMacros"; break; + case RewriteObjC: Action = "RewriteObjC"; break; + case RewriteTest: Action = "RewriteTest"; break; +#endif +#ifdef CLANG_ENABLE_ARCMT case MigrateSource: return new arcmt::MigrateSourceAction(); +#else + case MigrateSource: Action = "MigrateSource"; break; +#endif +#ifdef CLANG_ENABLE_STATIC_ANALYZER + case RunAnalysis: return new ento::AnalysisAction(); +#else + case RunAnalysis: Action = "RunAnalysis"; break; +#endif case RunPreprocessorOnly: return new PreprocessOnlyAction(); } + +#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \ + || !defined(CLANG_ENABLE_REWRITER) + CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action; + return 0; +#else llvm_unreachable("Invalid program action!"); +#endif } static FrontendAction *CreateFrontendAction(CompilerInstance &CI) { @@ -97,10 +133,13 @@ static FrontendAction *CreateFrontendAction(CompilerInstance &CI) { const FrontendOptions &FEOpts = CI.getFrontendOpts(); +#ifdef CLANG_ENABLE_REWRITER if (FEOpts.FixAndRecompile) { Act = new FixItRecompile(Act); } +#endif +#ifdef CLANG_ENABLE_ARCMT // Potentially wrap the base FE action in an ARC Migrate Tool action. switch (FEOpts.ARCMTAction) { case FrontendOptions::ARCMT_None: @@ -124,6 +163,7 @@ static FrontendAction *CreateFrontendAction(CompilerInstance &CI) { FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals, FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting); } +#endif // If there are any AST files to merge, create a frontend action // adaptor to perform the merge. @@ -176,12 +216,14 @@ bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) { llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args); } +#ifdef CLANG_ENABLE_STATIC_ANALYZER // Honor -analyzer-checker-help. // This should happen AFTER plugins have been loaded! if (Clang->getAnalyzerOpts()->ShowCheckerHelp) { ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins); return 0; } +#endif // If there were errors in processing arguments, don't do anything else. bool Success = false; diff --git a/lib/FrontendTool/Makefile b/lib/FrontendTool/Makefile index c43213ff99d0e88079723ab7c58d1d46d37580a1..9ce4b767fe586df7d58ba271bb3506b49f711f37 100644 --- a/lib/FrontendTool/Makefile +++ b/lib/FrontendTool/Makefile @@ -11,3 +11,18 @@ CLANG_LEVEL := ../.. LIBRARYNAME := clangFrontendTool include $(CLANG_LEVEL)/Makefile +include $(CLANG_LEVEL)/../../Makefile.config + +ifeq ($(ENABLE_CLANG_ARCMT),1) + CXX.Flags += -DCLANG_ENABLE_ARCMT +endif + +ifeq ($(ENABLE_CLANG_REWRITER),1) + CXX.Flags += -DCLANG_ENABLE_REWRITER +endif + +ifeq ($(ENABLE_CLANG_STATIC_ANALYZER),1) + CXX.Flags += -DCLANG_ENABLE_STATIC_ANALYZER +endif + + diff --git a/lib/Makefile b/lib/Makefile index 17db50e8cda206e224fec3d5cdc3c9a4f4afae05..2e32dfec35a4a7c907cdb5e0c7806bb2e922c69d 100755 --- a/lib/Makefile +++ b/lib/Makefile @@ -8,9 +8,19 @@ ##===----------------------------------------------------------------------===## CLANG_LEVEL := .. -PARALLEL_DIRS = Headers Basic Lex Parse AST ASTMatchers Sema CodeGen Analysis \ - StaticAnalyzer Edit Rewrite ARCMigrate Serialization Frontend \ - FrontendTool Tooling Driver Format +# ARCMigrate and Rewrite are always needed because of libclang. +PARALLEL_DIRS = Headers Basic Lex Parse AST Sema CodeGen Analysis Frontend \ + FrontendTool Tooling Driver Format Edit ARCMigrate Rewrite \ + Serialization -include $(CLANG_LEVEL)/Makefile +include $(CLANG_LEVEL)/../../Makefile.config + +ifeq ($(ENABLE_CLANG_REWRITER),1) +PARALLEL_DIRS += ASTMatchers +endif +ifeq ($(ENABLE_CLANG_STATIC_ANALYZER),1) +PARALLEL_DIRS += StaticAnalyzer +endif + +include $(CLANG_LEVEL)/Makefile diff --git a/tools/driver/Makefile b/tools/driver/Makefile index 1ff3c50d6edd868e6303b5f93ad6ac78ec5b3ed1..ee8f135f12b93515f74683c54a0c69d454e558d5 100644 --- a/tools/driver/Makefile +++ b/tools/driver/Makefile @@ -32,12 +32,22 @@ include $(CLANG_LEVEL)/../../Makefile.config LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \ instrumentation ipo linker selectiondag USEDLIBS = clangFrontendTool.a clangFrontend.a clangDriver.a \ - clangSerialization.a clangCodeGen.a clangParse.a clangSema.a \ - clangStaticAnalyzerFrontend.a clangStaticAnalyzerCheckers.a \ - clangStaticAnalyzerCore.a \ - clangAnalysis.a clangARCMigrate.a \ - clangRewriteFrontend.a clangRewriteCore.a \ - clangEdit.a clangAST.a clangLex.a clangBasic.a + clangSerialization.a clangCodeGen.a clangParse.a clangSema.a + +ifeq ($(ENABLE_CLANG_STATIC_ANALYZER),1) +USEDLIBS += clangStaticAnalyzerFrontend.a clangStaticAnalyzerCheckers.a \ + clangStaticAnalyzerCore.a +endif + +ifeq ($(ENABLE_CLANG_ARCMT),1) +USEDLIBS += clangARCMigrate.a +endif + +ifeq ($(ENABLE_CLANG_REWRITER),1) +USEDLIBS += clangRewriteFrontend.a clangRewriteCore.a +endif + +USEDLIBS += clangAnalysis.a clangEdit.a clangAST.a clangBasic.a clangLex.a include $(CLANG_LEVEL)/Makefile diff --git a/unittests/Makefile b/unittests/Makefile index 799bc557fb36b4cc1a93b56d2886caa61b7d4305..e01a6ac463bb6fcba04e9fbe314da910cbe8f2b9 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -14,7 +14,21 @@ ifndef CLANG_LEVEL IS_UNITTEST_LEVEL := 1 CLANG_LEVEL := .. -PARALLEL_DIRS = ASTMatchers Basic AST Frontend Lex Tooling Format +PARALLEL_DIRS = Basic Lex + +include $(CLANG_LEVEL)/../..//Makefile.config + +ifeq ($(ENABLE_CLANG_REWRITER),1) +PARALLEL_DIRS += Format +endif + +ifeq ($(ENABLE_CLANG_REWRITER),1) +PARALLEL_DIRS += ASTMatchers AST Tooling +endif + +ifeq ($(ENABLE_CLANG_STATIC_ANALYZER),1) +PARALLEL_DIRS += Frontend +endif endif # CLANG_LEVEL