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" 18bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy#include "clang/Driver/Options.h" 198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CompilerInvocation.h" 218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h" 228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h" 24305c613af6cfc40e519c75d9d2c84c6fa9a841c0Ted Kremenek#include "clang/Rewrite/Frontend/FrontendActions.h" 2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Frontend/FrontendActions.h" 26b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h" 27b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h" 2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h" 2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h" 308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang; 31b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt; 328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { 348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar using namespace clang::frontend; 35fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky StringRef Action("unknown"); 368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar switch (CI.getFrontendOpts().ProgramAction) { 38171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko case ASTDeclList: return new ASTDeclListAction(); 398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTDump: return new ASTDumpAction(); 40f35142413974e9dfe2c5f202084db4bd1c2073e9John McCall case ASTDumpXML: return new ASTDumpXMLAction(); 418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTPrint: return new ASTPrintAction(); 428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ASTView: return new ASTViewAction(); 438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case DumpRawTokens: return new DumpRawTokensAction(); 448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case DumpTokens: return new DumpTokensAction(); 458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitAssembly: return new EmitAssemblyAction(); 468eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitBC: return new EmitBCAction(); 47fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitHTML: return new HTMLPrintAction(); 49fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 50fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case EmitHTML: Action = "EmitHTML"; break; 51fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVM: return new EmitLLVMAction(); 538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVMOnly: return new EmitLLVMOnlyAction(); 548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); 558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitObj: return new EmitObjAction(); 56fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case FixIt: return new FixItAction(); 58fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 59fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case FixIt: Action = "FixIt"; break; 60fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 616649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor case GenerateModule: return new GenerateModuleAction; 626649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor case GeneratePCH: return new GeneratePCHAction; 638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case GeneratePTH: return new GeneratePTHAction(); 648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case InitOnly: return new InitOnlyAction(); 658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ParseSyntaxOnly: return new SyntaxOnlyAction(); 66c544ba09695e300f31355af342258bd57619e737Douglas Gregor case ModuleFileInfo: return new DumpModuleInfoAction(); 678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PluginAction: { 698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (FrontendPluginRegistry::iterator it = 708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end(); 718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar it != ie; ++it) { 728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (it->getName() == CI.getFrontendOpts().ActionName) { 736f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<PluginASTAction> P(it->instantiate()); 748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs)) 758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return P.take(); 778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name) 818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar << CI.getFrontendOpts().ActionName; 828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintDeclContext: return new DeclContextPrintAction(); 868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintPreamble: return new PrintPreambleAction(); 87f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie case PrintPreprocessedInput: { 88fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky if (CI.getPreprocessorOutputOpts().RewriteIncludes) { 89fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 90f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie return new RewriteIncludesAction(); 91fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 92fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky Action = "RewriteIncludesAction"; 93fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky break; 94fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 95fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky } 96f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie return new PrintPreprocessedAction(); 97f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie } 98f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie 99fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 1008eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteMacros: return new RewriteMacrosAction(); 1018eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteObjC: return new RewriteObjCAction(); 1028eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteTest: return new RewriteTestAction(); 103fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 104fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteMacros: Action = "RewriteMacros"; break; 105fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteObjC: Action = "RewriteObjC"; break; 106fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RewriteTest: Action = "RewriteTest"; break; 107fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 108fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT 10930660a898545416f0fea2d717f16f75640001e38Ted Kremenek case MigrateSource: return new arcmt::MigrateSourceAction(); 110fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 111fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case MigrateSource: Action = "MigrateSource"; break; 112fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 113fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER 114fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RunAnalysis: return new ento::AnalysisAction(); 115fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 116fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky case RunAnalysis: Action = "RunAnalysis"; break; 117fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 1188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RunPreprocessorOnly: return new PreprocessOnlyAction(); 1198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 120fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky 121fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \ 122fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky || !defined(CLANG_ENABLE_REWRITER) 123fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action; 124fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky return 0; 125fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else 126561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("Invalid program action!"); 127fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) { 1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Create the underlying action. 1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendAction *Act = CreateFrontendBaseAction(CI); 1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Act) 1348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 136b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis const FrontendOptions &FEOpts = CI.getFrontendOpts(); 137b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis 138fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER 139b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis if (FEOpts.FixAndRecompile) { 14061d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis Act = new FixItRecompile(Act); 14161d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis } 142fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 14361d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis 144fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT 145f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth // Potentially wrap the base FE action in an ARC Migrate Tool action. 146b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis switch (FEOpts.ARCMTAction) { 147f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_None: 148f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 149f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Check: 150f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth Act = new arcmt::CheckAction(Act); 151f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 152f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Modify: 15369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis Act = new arcmt::ModifyAction(Act); 15469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 15569325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case FrontendOptions::ARCMT_Migrate: 1567ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Act = new arcmt::MigrateAction(Act, 15730660a898545416f0fea2d717f16f75640001e38Ted Kremenek FEOpts.MTMigrateDir, 158b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis FEOpts.ARCMTMigrateReportOut, 159b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis FEOpts.ARCMTMigrateEmitARCErrors); 160f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 161f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth } 162f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 16330660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) { 16430660a898545416f0fea2d717f16f75640001e38Ted Kremenek Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir, 165d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Literals, 166d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Subscripting, 167d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Property); 16830660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 169fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 17030660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there are any AST files to merge, create a frontend action 1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // adaptor to perform the merge. 173b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis if (!FEOpts.ASTMergeFiles.empty()) 174e839806cad021306510f72da63217ba57648929eArgyrios Kyrtzidis Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles); 1758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Act; 1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) { 1808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -help. 1818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowHelp) { 182b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner OwningPtr<OptTable> Opts(driver::createDriverOptTable()); 1838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1", 184f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith "LLVM 'Clang' Compiler: http://clang.llvm.org", 185b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner /*Include=*/ driver::options::CC1Option, /*Exclude=*/ 0); 186201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola return true; 1878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -version. 1908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 1918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Use a better -version message? 1928eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowVersion) { 1938eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::cl::PrintVersionMessage(); 194201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola return true; 1958eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1968eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1976e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser // Load any requested plugins. 1986e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser for (unsigned i = 0, 1996e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) { 2006e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser const std::string &Path = Clang->getFrontendOpts().Plugins[i]; 2016e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser std::string Error; 2026e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) 2036e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) 2046e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser << Path << Error; 2056e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser } 2066e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser 2078eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -mllvm. 2088eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 2098eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Remove this, one day. 2106e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser // This should happen AFTER plugins have been loaded! 2118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Clang->getFrontendOpts().LLVMArgs.empty()) { 2128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size(); 2138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 2148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 2158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 2168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str(); 2178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[NumArgs + 1] = 0; 2186bd17d2f2e6e498b0ff01e2e755f044de046d138David Blaikie llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args); 2198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 2208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 221fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER 22208b86531ade68727c56918f162816075b87c864aJordy Rose // Honor -analyzer-checker-help. 22308b86531ade68727c56918f162816075b87c864aJordy Rose // This should happen AFTER plugins have been loaded! 22445796b10d11869e86c6b85e24df165410536b313Ted Kremenek if (Clang->getAnalyzerOpts()->ShowCheckerHelp) { 22508b86531ade68727c56918f162816075b87c864aJordy Rose ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins); 226201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola return true; 22708b86531ade68727c56918f162816075b87c864aJordy Rose } 228fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif 22908b86531ade68727c56918f162816075b87c864aJordy Rose 2308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there were errors in processing arguments, don't do anything else. 2318da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva if (Clang->getDiagnostics().hasErrorOccurred()) 2328da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva return false; 2338da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva // Create and execute the frontend action. 2348da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang)); 2358da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva if (!Act) 2368da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva return false; 2378da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva bool Success = Clang->ExecuteAction(*Act); 2388da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva if (Clang->getFrontendOpts().DisableFree) 2398da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva Act.take(); 2408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Success; 2418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 242