ExecuteCompilerInvocation.cpp revision fc2929fdb7cce47daf5b2857a56013fad0257cb6
18eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===--- ExecuteCompilerInvocation.cpp ------------------------------------===// 28eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// 38eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// The LLVM Compiler Infrastructure 48eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// 58eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// This file is distributed under the University of Illinois Open Source 68eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// License. See LICENSE.TXT for details. 78eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// 88eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===----------------------------------------------------------------------===// 98eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// 108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// This file holds ExecuteCompilerInvocation(). It is split into its own file to 118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// minimize the impact of pulling in essentially everything else in Clang. 128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// 138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===----------------------------------------------------------------------===// 148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 151b7255de78c99ef2b8a06bb5261a3c776ac1db36Peter Collingbourne#include "clang/FrontendTool/Utils.h" 16f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMTActions.h" 178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/CodeGen/CodeGenAction.h" 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Driver/OptTable.h" 19f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith#include "clang/Driver/Option.h" 20bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy#include "clang/Driver/Options.h" 218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CompilerInvocation.h" 238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h" 248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h" 26305c613af6cfc40e519c75d9d2c84c6fa9a841c0Ted Kremenek#include "clang/Rewrite/Frontend/FrontendActions.h" 2755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Frontend/FrontendActions.h" 2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h" 2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h" 308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang; 318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { 338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar using namespace clang::frontend; 34fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky StringRef Action("unknown"); 358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar switch (CI.getFrontendOpts().ProgramAction) { 37171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko case ASTDeclList: return new ASTDeclListAction(); 388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTDump: return new ASTDumpAction(); 39f35142413974e9dfe2c5f202084db4bd1c2073e9John McCall case ASTDumpXML: return new ASTDumpXMLAction(); 408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTPrint: return new ASTPrintAction(); 418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTView: return new ASTViewAction(); 428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case DumpRawTokens: return new DumpRawTokensAction(); 438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case DumpTokens: return new DumpTokensAction(); 448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitAssembly: return new EmitAssemblyAction(); 458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitBC: return new EmitBCAction(); 46fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitHTML: return new HTMLPrintAction(); 48fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 49fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case EmitHTML: Action = "EmitHTML"; break; 50fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVM: return new EmitLLVMAction(); 528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVMOnly: return new EmitLLVMOnlyAction(); 538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); 548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitObj: return new EmitObjAction(); 55fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case FixIt: return new FixItAction(); 57fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 58fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case FixIt: Action = "FixIt"; break; 59fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 606649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor case GenerateModule: return new GenerateModuleAction; 616649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor case GeneratePCH: return new GeneratePCHAction; 628eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case GeneratePTH: return new GeneratePTHAction(); 638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case InitOnly: return new InitOnlyAction(); 648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ParseSyntaxOnly: return new SyntaxOnlyAction(); 658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PluginAction: { 678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (FrontendPluginRegistry::iterator it = 688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end(); 698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar it != ie; ++it) { 708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (it->getName() == CI.getFrontendOpts().ActionName) { 716f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<PluginASTAction> P(it->instantiate()); 728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs)) 738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return P.take(); 758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name) 798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar << CI.getFrontendOpts().ActionName; 808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintDeclContext: return new DeclContextPrintAction(); 848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintPreamble: return new PrintPreambleAction(); 85f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie case PrintPreprocessedInput: { 86fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky if (CI.getPreprocessorOutputOpts().RewriteIncludes) { 87fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 88f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie return new RewriteIncludesAction(); 89fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 90fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky Action = "RewriteIncludesAction"; 91fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky break; 92fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 93fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky } 94f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie return new PrintPreprocessedAction(); 95f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie } 96f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie 97fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 988eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteMacros: return new RewriteMacrosAction(); 998eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteObjC: return new RewriteObjCAction(); 1008eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteTest: return new RewriteTestAction(); 101fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 102fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteMacros: Action = "RewriteMacros"; break; 103fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteObjC: Action = "RewriteObjC"; break; 104fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteTest: Action = "RewriteTest"; break; 105fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 106fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT 10730660a898545416f0fea2d717f16f75640001e38Ted Kremenek case MigrateSource: return new arcmt::MigrateSourceAction(); 108fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 109fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case MigrateSource: Action = "MigrateSource"; break; 110fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 111fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER 112fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RunAnalysis: return new ento::AnalysisAction(); 113fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 114fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RunAnalysis: Action = "RunAnalysis"; break; 115fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 1168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RunPreprocessorOnly: return new PreprocessOnlyAction(); 1178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 118fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky 119fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \ 120fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky || !defined(CLANG_ENABLE_REWRITER) 121fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action; 122fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky return 0; 123fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 124561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("Invalid program action!"); 125fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 1268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 1278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) { 1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Create the underlying action. 1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendAction *Act = CreateFrontendBaseAction(CI); 1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Act) 1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 134b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis const FrontendOptions &FEOpts = CI.getFrontendOpts(); 135b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis 136fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 137b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis if (FEOpts.FixAndRecompile) { 13861d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis Act = new FixItRecompile(Act); 13961d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis } 140fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 14161d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis 142fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT 143f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth // Potentially wrap the base FE action in an ARC Migrate Tool action. 144b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis switch (FEOpts.ARCMTAction) { 145f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_None: 146f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 147f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Check: 148f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth Act = new arcmt::CheckAction(Act); 149f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 150f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Modify: 15169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis Act = new arcmt::ModifyAction(Act); 15269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 15369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case FrontendOptions::ARCMT_Migrate: 1547ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Act = new arcmt::MigrateAction(Act, 15530660a898545416f0fea2d717f16f75640001e38Ted Kremenek FEOpts.MTMigrateDir, 156b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis FEOpts.ARCMTMigrateReportOut, 157b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis FEOpts.ARCMTMigrateEmitARCErrors); 158f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 159f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth } 160f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 16130660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) { 16230660a898545416f0fea2d717f16f75640001e38Ted Kremenek Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir, 16330660a898545416f0fea2d717f16f75640001e38Ted Kremenek FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals, 16430660a898545416f0fea2d717f16f75640001e38Ted Kremenek FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting); 16530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 166fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 16730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there are any AST files to merge, create a frontend action 1698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // adaptor to perform the merge. 170b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis if (!FEOpts.ASTMergeFiles.empty()) 171e839806cad021306510f72da63217ba57648929eArgyrios Kyrtzidis Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles); 1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Act; 1748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 1758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) { 1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -help. 1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowHelp) { 179bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy OwningPtr<driver::OptTable> Opts(driver::createDriverOptTable()); 1808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1", 181f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith "LLVM 'Clang' Compiler: http://clang.llvm.org", 182f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith /*Include=*/driver::options::CC1Option, 183f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith /*Exclude=*/0); 1848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -version. 1888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 1898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Use a better -version message? 1908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowVersion) { 1918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::cl::PrintVersionMessage(); 1928eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1938eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1948eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1956e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser // Load any requested plugins. 1966e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser for (unsigned i = 0, 1976e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) { 1986e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser const std::string &Path = Clang->getFrontendOpts().Plugins[i]; 1996e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser std::string Error; 2006e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) 2016e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) 2026e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser << Path << Error; 2036e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser } 2046e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser 2058eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -mllvm. 2068eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 2078eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Remove this, one day. 2086e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser // This should happen AFTER plugins have been loaded! 2098eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Clang->getFrontendOpts().LLVMArgs.empty()) { 2108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size(); 2118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 2128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 2138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 2148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str(); 2158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[NumArgs + 1] = 0; 2166bd17d2f2e6e498b0ff01e2e755f044de046d138David Blaikie llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args); 2178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 2188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 219fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER 22008b86531ade68727c56918f162816075b87c864aJordy Rose // Honor -analyzer-checker-help. 22108b86531ade68727c56918f162816075b87c864aJordy Rose // This should happen AFTER plugins have been loaded! 22245796b10d11869e86c6b85e24df165410536b313Ted Kremenek if (Clang->getAnalyzerOpts()->ShowCheckerHelp) { 22308b86531ade68727c56918f162816075b87c864aJordy Rose ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins); 22408b86531ade68727c56918f162816075b87c864aJordy Rose return 0; 22508b86531ade68727c56918f162816075b87c864aJordy Rose } 226fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 22708b86531ade68727c56918f162816075b87c864aJordy Rose 2288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there were errors in processing arguments, don't do anything else. 2298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar bool Success = false; 230e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis if (!Clang->getDiagnostics().hasErrorOccurred()) { 2318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Create and execute the frontend action. 2326f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang)); 23372e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek if (Act) { 2348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Success = Clang->ExecuteAction(*Act); 23572e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek if (Clang->getFrontendOpts().DisableFree) 23672e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek Act.take(); 23772e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek } 2388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 2398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 2408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Success; 2418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 242