blob: d755839c0f775b546c297bfce1848c4562c3d229 [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();
40 case ASTPrint: return new ASTPrintAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000041 case ASTView: return new ASTViewAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000042 case DumpRawTokens: return new DumpRawTokensAction();
43 case DumpTokens: return new DumpTokensAction();
44 case EmitAssembly: return new EmitAssemblyAction();
45 case EmitBC: return new EmitBCAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000046#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000047 case EmitHTML: return new HTMLPrintAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000048#else
49 case EmitHTML: Action = "EmitHTML"; break;
50#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000051 case EmitLLVM: return new EmitLLVMAction();
52 case EmitLLVMOnly: return new EmitLLVMOnlyAction();
53 case EmitCodeGenOnly: return new EmitCodeGenOnlyAction();
54 case EmitObj: return new EmitObjAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000055#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000056 case FixIt: return new FixItAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000057#else
58 case FixIt: Action = "FixIt"; break;
59#endif
Douglas Gregor66490142011-11-29 22:42:06 +000060 case GenerateModule: return new GenerateModuleAction;
61 case GeneratePCH: return new GeneratePCHAction;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000062 case GeneratePTH: return new GeneratePTHAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000063 case InitOnly: return new InitOnlyAction();
64 case ParseSyntaxOnly: return new SyntaxOnlyAction();
Douglas Gregorc544ba02013-03-27 16:47:18 +000065 case ModuleFileInfo: return new DumpModuleInfoAction();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000066
67 case PluginAction: {
68 for (FrontendPluginRegistry::iterator it =
69 FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
70 it != ie; ++it) {
71 if (it->getName() == CI.getFrontendOpts().ActionName) {
Dylan Noblesmith6f42b622012-02-05 02:12:40 +000072 OwningPtr<PluginASTAction> P(it->instantiate());
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000073 if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
74 return 0;
75 return P.take();
76 }
77 }
78
79 CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name)
80 << CI.getFrontendOpts().ActionName;
81 return 0;
82 }
83
84 case PrintDeclContext: return new DeclContextPrintAction();
85 case PrintPreamble: return new PrintPreambleAction();
David Blaikief1492f92012-06-14 17:36:09 +000086 case PrintPreprocessedInput: {
Roman Divackyfc2929f2012-12-13 16:09:42 +000087 if (CI.getPreprocessorOutputOpts().RewriteIncludes) {
88#ifdef CLANG_ENABLE_REWRITER
David Blaikief1492f92012-06-14 17:36:09 +000089 return new RewriteIncludesAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +000090#else
91 Action = "RewriteIncludesAction";
92 break;
93#endif
94 }
David Blaikief1492f92012-06-14 17:36:09 +000095 return new PrintPreprocessedAction();
96 }
97
Roman Divackyfc2929f2012-12-13 16:09:42 +000098#ifdef CLANG_ENABLE_REWRITER
Daniel Dunbar8eb2b012010-08-12 02:53:12 +000099 case RewriteMacros: return new RewriteMacrosAction();
100 case RewriteObjC: return new RewriteObjCAction();
101 case RewriteTest: return new RewriteTestAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +0000102#else
103 case RewriteMacros: Action = "RewriteMacros"; break;
104 case RewriteObjC: Action = "RewriteObjC"; break;
105 case RewriteTest: Action = "RewriteTest"; break;
106#endif
107#ifdef CLANG_ENABLE_ARCMT
Ted Kremenek30660a82012-03-06 20:06:33 +0000108 case MigrateSource: return new arcmt::MigrateSourceAction();
Roman Divackyfc2929f2012-12-13 16:09:42 +0000109#else
110 case MigrateSource: Action = "MigrateSource"; break;
111#endif
112#ifdef CLANG_ENABLE_STATIC_ANALYZER
113 case RunAnalysis: return new ento::AnalysisAction();
114#else
115 case RunAnalysis: Action = "RunAnalysis"; break;
116#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000117 case RunPreprocessorOnly: return new PreprocessOnlyAction();
118 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000119
120#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \
121 || !defined(CLANG_ENABLE_REWRITER)
122 CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action;
123 return 0;
124#else
David Blaikie561d3ab2012-01-17 02:30:50 +0000125 llvm_unreachable("Invalid program action!");
Roman Divackyfc2929f2012-12-13 16:09:42 +0000126#endif
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000127}
128
129static FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
130 // Create the underlying action.
131 FrontendAction *Act = CreateFrontendBaseAction(CI);
132 if (!Act)
133 return 0;
134
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000135 const FrontendOptions &FEOpts = CI.getFrontendOpts();
136
Roman Divackyfc2929f2012-12-13 16:09:42 +0000137#ifdef CLANG_ENABLE_REWRITER
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000138 if (FEOpts.FixAndRecompile) {
Argyrios Kyrtzidis61d679a2012-01-26 02:40:48 +0000139 Act = new FixItRecompile(Act);
140 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000141#endif
Argyrios Kyrtzidis61d679a2012-01-26 02:40:48 +0000142
Roman Divackyfc2929f2012-12-13 16:09:42 +0000143#ifdef CLANG_ENABLE_ARCMT
Argyrios Kyrtzidisf1576c12013-11-13 23:38:17 +0000144 if (CI.getFrontendOpts().ProgramAction != frontend::MigrateSource) {
145 // Potentially wrap the base FE action in an ARC Migrate Tool action.
146 switch (FEOpts.ARCMTAction) {
147 case FrontendOptions::ARCMT_None:
148 break;
149 case FrontendOptions::ARCMT_Check:
150 Act = new arcmt::CheckAction(Act);
151 break;
152 case FrontendOptions::ARCMT_Modify:
153 Act = new arcmt::ModifyAction(Act);
154 break;
155 case FrontendOptions::ARCMT_Migrate:
156 Act = new arcmt::MigrateAction(Act,
157 FEOpts.MTMigrateDir,
158 FEOpts.ARCMTMigrateReportOut,
159 FEOpts.ARCMTMigrateEmitARCErrors);
160 break;
161 }
Chandler Carruthf7f81882011-06-16 16:17:05 +0000162
Argyrios Kyrtzidisf1576c12013-11-13 23:38:17 +0000163 if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
164 Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir,
165 FEOpts.ObjCMTAction);
166 }
Ted Kremenek30660a82012-03-06 20:06:33 +0000167 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000168#endif
Ted Kremenek30660a82012-03-06 20:06:33 +0000169
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000170 // If there are any AST files to merge, create a frontend action
171 // adaptor to perform the merge.
Argyrios Kyrtzidisb3ca2632012-02-04 01:36:04 +0000172 if (!FEOpts.ASTMergeFiles.empty())
Argyrios Kyrtzidise8398062012-02-04 03:26:16 +0000173 Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles);
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000174
175 return Act;
176}
177
178bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
179 // Honor -help.
180 if (Clang->getFrontendOpts().ShowHelp) {
Reid Klecknerb1e25a12013-06-14 17:17:23 +0000181 OwningPtr<OptTable> Opts(driver::createDriverOptTable());
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000182 Opts->PrintHelp(llvm::outs(), "clang -cc1",
Richard Smithf1eaab12012-11-09 22:36:44 +0000183 "LLVM 'Clang' Compiler: http://clang.llvm.org",
Reid Klecknerb1e25a12013-06-14 17:17:23 +0000184 /*Include=*/ driver::options::CC1Option, /*Exclude=*/ 0);
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000185 return true;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000186 }
187
188 // Honor -version.
189 //
190 // FIXME: Use a better -version message?
191 if (Clang->getFrontendOpts().ShowVersion) {
192 llvm::cl::PrintVersionMessage();
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000193 return true;
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000194 }
195
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000196 // Load any requested plugins.
197 for (unsigned i = 0,
198 e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
199 const std::string &Path = Clang->getFrontendOpts().Plugins[i];
200 std::string Error;
201 if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
202 Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
203 << Path << Error;
204 }
205
Tobias Grosser6e0afc82011-10-10 01:23:06 +0000206 // Honor -mllvm.
207 //
208 // FIXME: Remove this, one day.
209 // This should happen AFTER plugins have been loaded!
210 if (!Clang->getFrontendOpts().LLVMArgs.empty()) {
211 unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size();
212 const char **Args = new const char*[NumArgs + 2];
213 Args[0] = "clang (LLVM option parsing)";
214 for (unsigned i = 0; i != NumArgs; ++i)
215 Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str();
216 Args[NumArgs + 1] = 0;
David Blaikie6bd17d22012-02-07 19:36:38 +0000217 llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args);
Tobias Grosser6e0afc82011-10-10 01:23:06 +0000218 }
219
Roman Divackyfc2929f2012-12-13 16:09:42 +0000220#ifdef CLANG_ENABLE_STATIC_ANALYZER
Jordy Rose08b86532011-08-16 21:24:21 +0000221 // Honor -analyzer-checker-help.
222 // This should happen AFTER plugins have been loaded!
Ted Kremenek45796b12012-08-31 04:36:05 +0000223 if (Clang->getAnalyzerOpts()->ShowCheckerHelp) {
Jordy Rose08b86532011-08-16 21:24:21 +0000224 ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
Rafael Espindola201d3fb2013-08-07 12:54:47 +0000225 return true;
Jordy Rose08b86532011-08-16 21:24:21 +0000226 }
Roman Divackyfc2929f2012-12-13 16:09:42 +0000227#endif
Jordy Rose08b86532011-08-16 21:24:21 +0000228
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000229 // If there were errors in processing arguments, don't do anything else.
Sean Silva8da06bb2013-01-06 07:49:41 +0000230 if (Clang->getDiagnostics().hasErrorOccurred())
231 return false;
232 // Create and execute the frontend action.
233 OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang));
234 if (!Act)
235 return false;
236 bool Success = Clang->ExecuteAction(*Act);
237 if (Clang->getFrontendOpts().DisableFree)
238 Act.take();
Daniel Dunbar8eb2b012010-08-12 02:53:12 +0000239 return Success;
240}