ExecuteCompilerInvocation.cpp revision 08b86531ade68727c56918f162816075b87c864a
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" 1643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#include "clang/StaticAnalyzer/Frontend/FrontendActions.h" 17f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMTActions.h" 188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/CodeGen/CodeGenAction.h" 198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Driver/CC1Options.h" 208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Driver/OptTable.h" 218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInvocation.h" 228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h" 238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h" 248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h" 268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Rewrite/FrontendActions.h" 278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h" 298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang; 308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { 328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar using namespace clang::frontend; 338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar switch (CI.getFrontendOpts().ProgramAction) { 358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar default: 368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm_unreachable("Invalid program action!"); 378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 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(); 42e55fd871b0cf3e4ebc708cf46831908d74eab40aSebastian Redl case CreateModule: return 0; 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(); 478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitHTML: return new HTMLPrintAction(); 488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVM: return new EmitLLVMAction(); 498eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitLLVMOnly: return new EmitLLVMOnlyAction(); 508eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); 518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case EmitObj: return new EmitObjAction(); 528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case FixIt: return new FixItAction(); 538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case GeneratePCH: return new GeneratePCHAction(); 548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case GeneratePTH: return new GeneratePTHAction(); 558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case InitOnly: return new InitOnlyAction(); 568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case ParseSyntaxOnly: return new SyntaxOnlyAction(); 578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 588eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PluginAction: { 598eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (FrontendPluginRegistry::iterator it = 608eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end(); 618eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar it != ie; ++it) { 628eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (it->getName() == CI.getFrontendOpts().ActionName) { 638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::OwningPtr<PluginASTAction> P(it->instantiate()); 648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs)) 658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return P.take(); 678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name) 718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar << CI.getFrontendOpts().ActionName; 728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintDeclContext: return new DeclContextPrintAction(); 768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintPreamble: return new PrintPreambleAction(); 778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case PrintPreprocessedInput: return new PrintPreprocessedAction(); 788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteMacros: return new RewriteMacrosAction(); 798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteObjC: return new RewriteObjCAction(); 808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RewriteTest: return new RewriteTestAction(); 819ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek case RunAnalysis: return new ento::AnalysisAction(); 828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar case RunPreprocessorOnly: return new PreprocessOnlyAction(); 838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) { 878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Create the underlying action. 888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar FrontendAction *Act = CreateFrontendBaseAction(CI); 898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Act) 908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 92f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth // Potentially wrap the base FE action in an ARC Migrate Tool action. 93f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth switch (CI.getFrontendOpts().ARCMTAction) { 94f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_None: 95f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 96f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Check: 97f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth Act = new arcmt::CheckAction(Act); 98f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 99f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth case FrontendOptions::ARCMT_Modify: 10069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis Act = new arcmt::ModifyAction(Act); 10169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 10269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case FrontendOptions::ARCMT_Migrate: 1037ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Act = new arcmt::MigrateAction(Act, 1047ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis CI.getFrontendOpts().ARCMTMigrateDir, 1057ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis CI.getFrontendOpts().ARCMTMigrateReportOut, 1067ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis CI.getFrontendOpts().ARCMTMigrateEmitARCErrors); 107f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth break; 108f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth } 109f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 1108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there are any AST files to merge, create a frontend action 1118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // adaptor to perform the merge. 1128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!CI.getFrontendOpts().ASTMergeFiles.empty()) 1138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Act = new ASTMergeAction(Act, &CI.getFrontendOpts().ASTMergeFiles[0], 1148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar CI.getFrontendOpts().ASTMergeFiles.size()); 1158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Act; 1178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 1188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) { 1208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -help. 1218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowHelp) { 1228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1OptTable()); 1238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1", 1248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar "LLVM 'Clang' Compiler: http://clang.llvm.org"); 1258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -version. 1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Use a better -version message? 1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (Clang->getFrontendOpts().ShowVersion) { 1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::cl::PrintVersionMessage(); 1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return 0; 1348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Honor -mllvm. 1378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // 1388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // FIXME: Remove this, one day. 1398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (!Clang->getFrontendOpts().LLVMArgs.empty()) { 1408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size(); 1418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 1428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 1438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 1448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str(); 1458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Args[NumArgs + 1] = 0; 1468eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args)); 1478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1498eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Load any requested plugins. 1508eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar for (unsigned i = 0, 1518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) { 1528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar const std::string &Path = Clang->getFrontendOpts().Plugins[i]; 1538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar std::string Error; 1548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) 1558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) 1568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar << Path << Error; 1578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1588eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 15908b86531ade68727c56918f162816075b87c864aJordy Rose // Honor -analyzer-checker-help. 16008b86531ade68727c56918f162816075b87c864aJordy Rose // This should happen AFTER plugins have been loaded! 16108b86531ade68727c56918f162816075b87c864aJordy Rose if (Clang->getAnalyzerOpts().ShowCheckerHelp) { 16208b86531ade68727c56918f162816075b87c864aJordy Rose ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins); 16308b86531ade68727c56918f162816075b87c864aJordy Rose return 0; 16408b86531ade68727c56918f162816075b87c864aJordy Rose } 16508b86531ade68727c56918f162816075b87c864aJordy Rose 1668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // If there were errors in processing arguments, don't do anything else. 1678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar bool Success = false; 168e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis if (!Clang->getDiagnostics().hasErrorOccurred()) { 1698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Create and execute the frontend action. 1708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar llvm::OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang)); 17172e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek if (Act) { 1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar Success = Clang->ExecuteAction(*Act); 17372e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek if (Clang->getFrontendOpts().DisableFree) 17472e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek Act.take(); 17572e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek } 1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar } 1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar 1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar return Success; 1798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar} 180