blob: 2f6d4b29b65ba00c2d7b1d7c41f2d0d4cd4100d5 [file] [log] [blame]
Daniel Dunbar8eb2b012010-08-12 02:53:12 +00001//===--- ExecuteCompilerInvocation.cpp ------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file holds ExecuteCompilerInvocation(). It is split into its own file to
11// minimize the impact of pulling in essentially everything else in Clang.
12//
13//===----------------------------------------------------------------------===//
14
Peter Collingbourne1b7255d2010-08-24 00:31:22 +000015#include "clang/FrontendTool/Utils.h"
Chandler Carruthf7f81882011-06-16 16:17:05 +000016#include "clang/ARCMigrate/ARCMTActions.h"
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000017#include "clang/CodeGen/CodeGenAction.h"
James Molloybfd7a522012-05-01 14:57:16 +000018#include "clang/Driver/Options.h"
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000019#include "clang/Frontend/CompilerInstance.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000020#include "clang/Frontend/CompilerInvocation.h"
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000021#include "clang/Frontend/FrontendActions.h"
22#include "clang/Frontend/FrontendDiagnostic.h"
23#include "clang/Frontend/FrontendPluginRegistry.h"
Ted Kremenek305c6132012-09-01 05:09:24 +000024#include "clang/Rewrite/Frontend/FrontendActions.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000025#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000026#include "llvm/Option/OptTable.h"
27#include "llvm/Option/Option.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000028#include "llvm/Support/DynamicLibrary.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000029#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000030using namespace clang;
Reid Klecknerb1e25a12013-06-14 17:17:23 +000031using namespace llvm::opt;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000032
33static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
34 using namespace clang::frontend;
Roman Divackyfc2929f2012-12-13 16:09:42 +000035 StringRef Action("unknown");
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000036
37 switch (CI.getFrontendOpts().ProgramAction) {
Alexander Kornienko171af642012-07-31 09:37:40 +000038 case ASTDeclList: return new ASTDeclListAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000039 case ASTDump: return new ASTDumpAction();
John McCallf3514242010-11-24 11:21:45 +000040 case ASTDumpXML: return new ASTDumpXMLAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000041 case ASTPrint: return new ASTPrintAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000042 case ASTView: return new ASTViewAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000043 case DumpRawTokens: return new DumpRawTokensAction();
44 case DumpTokens: return new DumpTokensAction();
45 case EmitAssembly: return new EmitAssemblyAction();
46 case EmitBC: return new EmitBCAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000047#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000048 case EmitHTML: return new HTMLPrintAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000049#else
50 case EmitHTML: Action = "EmitHTML"; break;
51#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000052 case EmitLLVM: return new EmitLLVMAction();
53 case EmitLLVMOnly: return new EmitLLVMOnlyAction();
54 case EmitCodeGenOnly: return new EmitCodeGenOnlyAction();
55 case EmitObj: return new EmitObjAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000056#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000057 case FixIt: return new FixItAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000058#else
59 case FixIt: Action = "FixIt"; break;
60#endif
Douglas Gregor66490142011-11-29 22:42:06 +000061 case GenerateModule: return new GenerateModuleAction;
62 case GeneratePCH: return new GeneratePCHAction;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000063 case GeneratePTH: return new GeneratePTHAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000064 case InitOnly: return new InitOnlyAction();
65 case ParseSyntaxOnly: return new SyntaxOnlyAction();
Douglas Gregorc544ba02013-03-27 16:47:18 +000066 case ModuleFileInfo: return new DumpModuleInfoAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000067
68 case PluginAction: {
69 for (FrontendPluginRegistry::iterator it =
70 FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
71 it != ie; ++it) {
72 if (it->getName() == CI.getFrontendOpts().ActionName) {
Dylan Noblesmith6f42b622012-02-05 02:12:40 +000073 OwningPtr<PluginASTAction> P(it->instantiate());
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000074 if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
75 return 0;
76 return P.take();
77 }
78 }
79
80 CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name)
81 << CI.getFrontendOpts().ActionName;
82 return 0;
83 }
84
85 case PrintDeclContext: return new DeclContextPrintAction();
86 case PrintPreamble: return new PrintPreambleAction();
David Blaikief1492f92012-06-14 17:36:09 +000087 case PrintPreprocessedInput: {
Roman Divackyfc2929f2012-12-13 16:09:42 +000088 if (CI.getPreprocessorOutputOpts().RewriteIncludes) {
89#ifdef CLANG_ENABLE_REWRITER
David Blaikief1492f92012-06-14 17:36:09 +000090 return new RewriteIncludesAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000091#else
92 Action = "RewriteIncludesAction";
93 break;
94#endif
95 }
David Blaikief1492f92012-06-14 17:36:09 +000096 return new PrintPreprocessedAction();
97 }
98
Roman Divackyfc2929f2012-12-13 16:09:42 +000099#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000100 case RewriteMacros: return new RewriteMacrosAction();
101 case RewriteObjC: return new RewriteObjCAction();
102 case RewriteTest: return new RewriteTestAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +0000103#else
104 case RewriteMacros: Action = "RewriteMacros"; break;
105 case RewriteObjC: Action = "RewriteObjC"; break;
106 case RewriteTest: Action = "RewriteTest"; break;
107#endif
108#ifdef CLANG_ENABLE_ARCMT
Ted Kremenek30660a82012-03-06 20:06:33 +0000109 case MigrateSource: return new arcmt::MigrateSourceAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +0000110#else
111 case MigrateSource: Action = "MigrateSource"; break;
112#endif
113#ifdef CLANG_ENABLE_STATIC_ANALYZER
114 case RunAnalysis: return new ento::AnalysisAction();
115#else
116 case RunAnalysis: Action = "RunAnalysis"; break;
117#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000118 case RunPreprocessorOnly: return new PreprocessOnlyAction();
119 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000120
121#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \
122 || !defined(CLANG_ENABLE_REWRITER)
123 CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action;
124 return 0;
125#else
David Blaikie561d3ab2012-01-17 02:30:50 +0000126 llvm_unreachable("Invalid program action!");
Roman Divackyfc2929f2012-12-13 16:09:42 +0000127#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000128}
129
130static FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
131 // Create the underlying action.
132 FrontendAction *Act = CreateFrontendBaseAction(CI);
133 if (!Act)
134 return 0;
135
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000136 const FrontendOptions &FEOpts = CI.getFrontendOpts();
137
Roman Divackyfc2929f2012-12-13 16:09:42 +0000138#ifdef CLANG_ENABLE_REWRITER
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000139 if (FEOpts.FixAndRecompile) {
Argyrios Kyrtzidis61d679a2012-01-26 02:40:48 +0000140 Act = new FixItRecompile(Act);
141 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000142#endif
Argyrios Kyrtzidis61d679a2012-01-26 02:40:48 +0000143
Roman Divackyfc2929f2012-12-13 16:09:42 +0000144#ifdef CLANG_ENABLE_ARCMT
Chandler Carruthf7f81882011-06-16 16:17:05 +0000145 // Potentially wrap the base FE action in an ARC Migrate Tool action.
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000146 switch (FEOpts.ARCMTAction) {
Chandler Carruthf7f81882011-06-16 16:17:05 +0000147 case FrontendOptions::ARCMT_None:
148 break;
149 case FrontendOptions::ARCMT_Check:
150 Act = new arcmt::CheckAction(Act);
151 break;
152 case FrontendOptions::ARCMT_Modify:
Argyrios Kyrtzidis69325d52011-07-09 20:00:58 +0000153 Act = new arcmt::ModifyAction(Act);
154 break;
155 case FrontendOptions::ARCMT_Migrate:
Argyrios Kyrtzidis7ee20492011-07-19 17:20:03 +0000156 Act = new arcmt::MigrateAction(Act,
Ted Kremenek30660a82012-03-06 20:06:33 +0000157 FEOpts.MTMigrateDir,
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000158 FEOpts.ARCMTMigrateReportOut,
159 FEOpts.ARCMTMigrateEmitARCErrors);
Chandler Carruthf7f81882011-06-16 16:17:05 +0000160 break;
Chandler Carruthf7f81882011-06-16 16:17:05 +0000161 }
162
Ted Kremenek30660a82012-03-06 20:06:33 +0000163 if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
164 Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir,
Fariborz Jahaniand4129992013-07-09 16:59:14 +0000165 FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Literals,
166 FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Subscripting,
167 FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Property);
Ted Kremenek30660a82012-03-06 20:06:33 +0000168 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000169#endif
Ted Kremenek30660a82012-03-06 20:06:33 +0000170
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000171 // If there are any AST files to merge, create a frontend action
172 // adaptor to perform the merge.
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000173 if (!FEOpts.ASTMergeFiles.empty())
Argyrios Kyrtzidise8398062012-02-04 03:26:16 +0000174 Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles);
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000175
176 return Act;
177}
178
179bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
180 // Honor -help.
181 if (Clang->getFrontendOpts().ShowHelp) {
Reid Klecknerb1e25a12013-06-14 17:17:23 +0000182 OwningPtr<OptTable> Opts(driver::createDriverOptTable());
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000183 Opts->PrintHelp(llvm::outs(), "clang -cc1",
Richard Smithf1eaab12012-11-09 22:36:44 +0000184 "LLVM 'Clang' Compiler: http://clang.llvm.org",
Reid Klecknerb1e25a12013-06-14 17:17:23 +0000185 /*Include=*/ driver::options::CC1Option, /*Exclude=*/ 0);
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000186 return true;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000187 }
188
189 // Honor -version.
190 //
191 // FIXME: Use a better -version message?
192 if (Clang->getFrontendOpts().ShowVersion) {
193 llvm::cl::PrintVersionMessage();
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000194 return true;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000195 }
196
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000197 // Load any requested plugins.
198 for (unsigned i = 0,
199 e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
200 const std::string &Path = Clang->getFrontendOpts().Plugins[i];
201 std::string Error;
202 if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
203 Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
204 << Path << Error;
205 }
206
Tobias Grosser6e0afc82011-10-10 01:23:06 +0000207 // Honor -mllvm.
208 //
209 // FIXME: Remove this, one day.
210 // This should happen AFTER plugins have been loaded!
211 if (!Clang->getFrontendOpts().LLVMArgs.empty()) {
212 unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size();
213 const char **Args = new const char*[NumArgs + 2];
214 Args[0] = "clang (LLVM option parsing)";
215 for (unsigned i = 0; i != NumArgs; ++i)
216 Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str();
217 Args[NumArgs + 1] = 0;
David Blaikie6bd17d22012-02-07 19:36:38 +0000218 llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args);
Tobias Grosser6e0afc82011-10-10 01:23:06 +0000219 }
220
Roman Divackyfc2929f2012-12-13 16:09:42 +0000221#ifdef CLANG_ENABLE_STATIC_ANALYZER
Jordy Rose08b86532011-08-16 21:24:21 +0000222 // Honor -analyzer-checker-help.
223 // This should happen AFTER plugins have been loaded!
Ted Kremenek45796b12012-08-31 04:36:05 +0000224 if (Clang->getAnalyzerOpts()->ShowCheckerHelp) {
Jordy Rose08b86532011-08-16 21:24:21 +0000225 ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000226 return true;
Jordy Rose08b86532011-08-16 21:24:21 +0000227 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000228#endif
Jordy Rose08b86532011-08-16 21:24:21 +0000229
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000230 // If there were errors in processing arguments, don't do anything else.
Sean Silva8da06bb2013-01-06 07:49:41 +0000231 if (Clang->getDiagnostics().hasErrorOccurred())
232 return false;
233 // Create and execute the frontend action.
234 OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang));
235 if (!Act)
236 return false;
237 bool Success = Clang->ExecuteAction(*Act);
238 if (Clang->getFrontendOpts().DisableFree)
239 Act.take();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000240 return Success;
241}