blob: 66bff3e5ecca0f047fb6f66c253e47c926558c6f [file] [log] [blame]
Daniel Dunbarcea0c702010-02-25 04:37:45 +00001//===--- CodeGenAction.cpp - LLVM Code Generation Frontend Action ---------===//
Daniel Dunbarc13935e2008-10-21 23:49:24 +00002//
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
Daniel Dunbarcea0c702010-02-25 04:37:45 +000010#include "clang/Frontend/CodeGenAction.h"
Chris Lattner5bbb3c82009-03-29 16:50:03 +000011#include "clang/AST/ASTConsumer.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000012#include "clang/AST/ASTContext.h"
Chris Lattner5bbb3c82009-03-29 16:50:03 +000013#include "clang/AST/DeclGroup.h"
14#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/TargetOptions.h"
16#include "clang/CodeGen/CodeGenOptions.h"
17#include "clang/CodeGen/ModuleBuilder.h"
Daniel Dunbarcea0c702010-02-25 04:37:45 +000018#include "clang/Frontend/ASTConsumers.h"
19#include "clang/Frontend/CompilerInstance.h"
Daniel Dunbaracadc552009-12-03 09:12:54 +000020#include "clang/Frontend/FrontendDiagnostic.h"
Chris Lattner6d672132010-04-06 17:52:14 +000021#include "llvm/LLVMContext.h"
Daniel Dunbarc13935e2008-10-21 23:49:24 +000022#include "llvm/Module.h"
Daniel Dunbarc13935e2008-10-21 23:49:24 +000023#include "llvm/PassManager.h"
24#include "llvm/ADT/OwningPtr.h"
25#include "llvm/Assembly/PrintModulePass.h"
Daniel Dunbar71880e72008-10-23 05:50:47 +000026#include "llvm/Analysis/CallGraph.h"
27#include "llvm/Analysis/Verifier.h"
Daniel Dunbarc13935e2008-10-21 23:49:24 +000028#include "llvm/Bitcode/ReaderWriter.h"
29#include "llvm/CodeGen/RegAllocRegistry.h"
30#include "llvm/CodeGen/SchedulerRegistry.h"
Chris Lattner15681772009-07-14 20:39:15 +000031#include "llvm/Support/FormattedStream.h"
Daniel Dunbar0c48b642009-06-03 18:01:18 +000032#include "llvm/Support/StandardPasses.h"
Chris Lattner263d64c2009-02-18 01:37:30 +000033#include "llvm/Support/Timer.h"
Daniel Dunbard97b07e2009-02-17 19:47:34 +000034#include "llvm/Target/SubtargetFeature.h"
Daniel Dunbarc13935e2008-10-21 23:49:24 +000035#include "llvm/Target/TargetData.h"
36#include "llvm/Target/TargetMachine.h"
Daniel Dunbarefa39f72009-12-12 23:01:36 +000037#include "llvm/Target/TargetOptions.h"
Daniel Dunbaree71c252009-07-15 20:25:38 +000038#include "llvm/Target/TargetRegistry.h"
Daniel Dunbarc13935e2008-10-21 23:49:24 +000039using namespace clang;
40using namespace llvm;
41
42namespace {
Daniel Dunbarcea0c702010-02-25 04:37:45 +000043 enum BackendAction {
44 Backend_EmitAssembly, ///< Emit native assembly files
45 Backend_EmitBC, ///< Emit LLVM bitcode files
46 Backend_EmitLL, ///< Emit human-readable LLVM assembly
47 Backend_EmitNothing, ///< Don't emit anything (benchmarking mode)
48 Backend_EmitObj ///< Emit native object files
49 };
50
Benjamin Kramer16634c22009-11-28 10:07:24 +000051 class BackendConsumer : public ASTConsumer {
Daniel Dunbar20c13162009-12-04 08:17:40 +000052 Diagnostic &Diags;
Daniel Dunbarc13935e2008-10-21 23:49:24 +000053 BackendAction Action;
Daniel Dunbarde182242009-11-30 08:39:32 +000054 const CodeGenOptions &CodeGenOpts;
55 const LangOptions &LangOpts;
56 const TargetOptions &TargetOpts;
Eli Friedman94cf21e2009-05-18 22:20:00 +000057 llvm::raw_ostream *AsmOutStream;
Chris Lattner15681772009-07-14 20:39:15 +000058 llvm::formatted_raw_ostream FormattedOutStream;
Chris Lattnereae6cb62009-03-05 08:00:35 +000059 ASTContext *Context;
Daniel Dunbarb3a36cf2008-10-29 08:50:02 +000060
Chris Lattner263d64c2009-02-18 01:37:30 +000061 Timer LLVMIRGeneration;
62 Timer CodeGenerationTime;
Mike Stump11289f42009-09-09 15:08:12 +000063
Daniel Dunbarc13935e2008-10-21 23:49:24 +000064 llvm::OwningPtr<CodeGenerator> Gen;
Mike Stump11289f42009-09-09 15:08:12 +000065
Daniel Dunbar400a6932010-02-25 04:37:50 +000066 llvm::OwningPtr<llvm::Module> TheModule;
Daniel Dunbarc13935e2008-10-21 23:49:24 +000067 llvm::TargetData *TheTargetData;
Daniel Dunbarc13935e2008-10-21 23:49:24 +000068
69 mutable FunctionPassManager *CodeGenPasses;
70 mutable PassManager *PerModulePasses;
71 mutable FunctionPassManager *PerFunctionPasses;
72
73 FunctionPassManager *getCodeGenPasses() const;
74 PassManager *getPerModulePasses() const;
75 FunctionPassManager *getPerFunctionPasses() const;
76
77 void CreatePasses();
78
Daniel Dunbar20c13162009-12-04 08:17:40 +000079 /// AddEmitPasses - Add passes necessary to emit assembly or LLVM IR.
Daniel Dunbarc13935e2008-10-21 23:49:24 +000080 ///
Daniel Dunbaracadc552009-12-03 09:12:54 +000081 /// \return True on success.
82 bool AddEmitPasses();
Daniel Dunbarc13935e2008-10-21 23:49:24 +000083
84 void EmitAssembly();
Mike Stump11289f42009-09-09 15:08:12 +000085
86 public:
Daniel Dunbaracadc552009-12-03 09:12:54 +000087 BackendConsumer(BackendAction action, Diagnostic &_Diags,
Chandler Carruthbc55fe22009-11-12 17:24:48 +000088 const LangOptions &langopts, const CodeGenOptions &compopts,
Daniel Dunbar8e705052009-11-30 08:39:52 +000089 const TargetOptions &targetopts, bool TimePasses,
90 const std::string &infile, llvm::raw_ostream *OS,
Chris Lattner6d672132010-04-06 17:52:14 +000091 LLVMContext &C) :
Daniel Dunbaracadc552009-12-03 09:12:54 +000092 Diags(_Diags),
Mike Stump11289f42009-09-09 15:08:12 +000093 Action(action),
Chandler Carruthbc55fe22009-11-12 17:24:48 +000094 CodeGenOpts(compopts),
Daniel Dunbarde182242009-11-30 08:39:32 +000095 LangOpts(langopts),
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000096 TargetOpts(targetopts),
Chris Lattner15681772009-07-14 20:39:15 +000097 AsmOutStream(OS),
Chris Lattner263d64c2009-02-18 01:37:30 +000098 LLVMIRGeneration("LLVM IR Generation Time"),
99 CodeGenerationTime("Code Generation Time"),
John McCall731be662010-03-04 04:29:44 +0000100 Gen(CreateLLVMCodeGen(Diags, infile, compopts, C)),
101 TheTargetData(0),
Chris Lattnerdeffa132009-02-18 01:23:44 +0000102 CodeGenPasses(0), PerModulePasses(0), PerFunctionPasses(0) {
Mike Stump11289f42009-09-09 15:08:12 +0000103
Chris Lattner15681772009-07-14 20:39:15 +0000104 if (AsmOutStream)
105 FormattedOutStream.setStream(*AsmOutStream,
106 formatted_raw_ostream::PRESERVE_STREAM);
Mike Stump11289f42009-09-09 15:08:12 +0000107
Daniel Dunbar8e705052009-11-30 08:39:52 +0000108 llvm::TimePassesIsEnabled = TimePasses;
Chris Lattnerdeffa132009-02-18 01:23:44 +0000109 }
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000110
111 ~BackendConsumer() {
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000112 delete TheTargetData;
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000113 delete CodeGenPasses;
114 delete PerModulePasses;
115 delete PerFunctionPasses;
116 }
117
Daniel Dunbar400a6932010-02-25 04:37:50 +0000118 llvm::Module *takeModule() { return TheModule.take(); }
119
Chris Lattner5cf49fe2009-03-28 02:18:25 +0000120 virtual void Initialize(ASTContext &Ctx) {
121 Context = &Ctx;
Mike Stump11289f42009-09-09 15:08:12 +0000122
Daniel Dunbar8e705052009-11-30 08:39:52 +0000123 if (llvm::TimePassesIsEnabled)
Chris Lattner263d64c2009-02-18 01:37:30 +0000124 LLVMIRGeneration.startTimer();
Mike Stump11289f42009-09-09 15:08:12 +0000125
Chris Lattner5cf49fe2009-03-28 02:18:25 +0000126 Gen->Initialize(Ctx);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000127
Daniel Dunbar400a6932010-02-25 04:37:50 +0000128 TheModule.reset(Gen->GetModule());
Chris Lattner5cf49fe2009-03-28 02:18:25 +0000129 TheTargetData = new llvm::TargetData(Ctx.Target.getTargetDescription());
Mike Stump11289f42009-09-09 15:08:12 +0000130
Daniel Dunbar8e705052009-11-30 08:39:52 +0000131 if (llvm::TimePassesIsEnabled)
Chris Lattner263d64c2009-02-18 01:37:30 +0000132 LLVMIRGeneration.stopTimer();
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000133 }
Mike Stump11289f42009-09-09 15:08:12 +0000134
Chris Lattner5bbb3c82009-03-29 16:50:03 +0000135 virtual void HandleTopLevelDecl(DeclGroupRef D) {
136 PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(),
Chris Lattnereae6cb62009-03-05 08:00:35 +0000137 Context->getSourceManager(),
138 "LLVM IR generation of declaration");
Mike Stump11289f42009-09-09 15:08:12 +0000139
Daniel Dunbar8e705052009-11-30 08:39:52 +0000140 if (llvm::TimePassesIsEnabled)
Chris Lattner263d64c2009-02-18 01:37:30 +0000141 LLVMIRGeneration.startTimer();
Chris Lattner5bbb3c82009-03-29 16:50:03 +0000142
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000143 Gen->HandleTopLevelDecl(D);
Chris Lattner263d64c2009-02-18 01:37:30 +0000144
Daniel Dunbar8e705052009-11-30 08:39:52 +0000145 if (llvm::TimePassesIsEnabled)
Chris Lattner263d64c2009-02-18 01:37:30 +0000146 LLVMIRGeneration.stopTimer();
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000147 }
Mike Stump11289f42009-09-09 15:08:12 +0000148
Chris Lattnercf169832009-03-28 04:11:33 +0000149 virtual void HandleTranslationUnit(ASTContext &C) {
Chris Lattnereae6cb62009-03-05 08:00:35 +0000150 {
Chris Lattnere46de752009-03-06 06:46:31 +0000151 PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
Daniel Dunbar8e705052009-11-30 08:39:52 +0000152 if (llvm::TimePassesIsEnabled)
Chris Lattnereae6cb62009-03-05 08:00:35 +0000153 LLVMIRGeneration.startTimer();
Chris Lattner263d64c2009-02-18 01:37:30 +0000154
Chris Lattnercf169832009-03-28 04:11:33 +0000155 Gen->HandleTranslationUnit(C);
Daniel Dunbara94d8732008-11-11 06:35:39 +0000156
Daniel Dunbar8e705052009-11-30 08:39:52 +0000157 if (llvm::TimePassesIsEnabled)
Chris Lattnereae6cb62009-03-05 08:00:35 +0000158 LLVMIRGeneration.stopTimer();
159 }
Chris Lattner263d64c2009-02-18 01:37:30 +0000160
Chris Lattnereae6cb62009-03-05 08:00:35 +0000161 // EmitAssembly times and registers crash info itself.
Chris Lattner263d64c2009-02-18 01:37:30 +0000162 EmitAssembly();
Mike Stump11289f42009-09-09 15:08:12 +0000163
Daniel Dunbara94d8732008-11-11 06:35:39 +0000164 // Force a flush here in case we never get released.
165 if (AsmOutStream)
Chris Lattner15681772009-07-14 20:39:15 +0000166 FormattedOutStream.flush();
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000167 }
Mike Stump11289f42009-09-09 15:08:12 +0000168
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000169 virtual void HandleTagDeclDefinition(TagDecl *D) {
Chris Lattnereae6cb62009-03-05 08:00:35 +0000170 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
171 Context->getSourceManager(),
172 "LLVM IR generation of declaration");
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000173 Gen->HandleTagDeclDefinition(D);
174 }
Douglas Gregorbeecd582009-04-21 17:11:58 +0000175
176 virtual void CompleteTentativeDefinition(VarDecl *D) {
177 Gen->CompleteTentativeDefinition(D);
178 }
Mike Stump11289f42009-09-09 15:08:12 +0000179 };
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000180}
181
182FunctionPassManager *BackendConsumer::getCodeGenPasses() const {
183 if (!CodeGenPasses) {
Daniel Dunbar400a6932010-02-25 04:37:50 +0000184 CodeGenPasses = new FunctionPassManager(&*TheModule);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000185 CodeGenPasses->add(new TargetData(*TheTargetData));
186 }
187
188 return CodeGenPasses;
189}
190
191PassManager *BackendConsumer::getPerModulePasses() const {
192 if (!PerModulePasses) {
193 PerModulePasses = new PassManager();
194 PerModulePasses->add(new TargetData(*TheTargetData));
195 }
196
197 return PerModulePasses;
198}
199
200FunctionPassManager *BackendConsumer::getPerFunctionPasses() const {
201 if (!PerFunctionPasses) {
Daniel Dunbar400a6932010-02-25 04:37:50 +0000202 PerFunctionPasses = new FunctionPassManager(&*TheModule);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000203 PerFunctionPasses->add(new TargetData(*TheTargetData));
204 }
205
206 return PerFunctionPasses;
207}
208
Daniel Dunbaracadc552009-12-03 09:12:54 +0000209bool BackendConsumer::AddEmitPasses() {
Daniel Dunbar26d5f052009-02-26 22:39:37 +0000210 if (Action == Backend_EmitNothing)
211 return true;
212
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000213 if (Action == Backend_EmitBC) {
Dan Gohman0b3cfab2009-09-26 15:06:14 +0000214 getPerModulePasses()->add(createBitcodeWriterPass(FormattedOutStream));
Chris Lattner6d672132010-04-06 17:52:14 +0000215 return true;
216 }
217
218 if (Action == Backend_EmitLL) {
Dan Gohman0b3cfab2009-09-26 15:06:14 +0000219 getPerModulePasses()->add(createPrintModulePass(&FormattedOutStream));
Chris Lattner6d672132010-04-06 17:52:14 +0000220 return true;
221 }
222
223 bool Fast = CodeGenOpts.OptimizationLevel == 0;
224
225 // Create the TargetMachine for generating code.
226 std::string Error;
227 std::string Triple = TheModule->getTargetTriple();
228 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
229 if (!TheTarget) {
230 Diags.Report(diag::err_fe_unable_to_create_target) << Error;
231 return false;
232 }
233
234 // FIXME: Expose these capabilities via actual APIs!!!! Aside from just
235 // being gross, this is also totally broken if we ever care about
236 // concurrency.
237 llvm::NoFramePointerElim = CodeGenOpts.DisableFPElim;
238 if (CodeGenOpts.FloatABI == "soft")
239 llvm::FloatABIType = llvm::FloatABI::Soft;
240 else if (CodeGenOpts.FloatABI == "hard")
241 llvm::FloatABIType = llvm::FloatABI::Hard;
242 else {
243 assert(CodeGenOpts.FloatABI.empty() && "Invalid float abi!");
244 llvm::FloatABIType = llvm::FloatABI::Default;
245 }
246 NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
247 llvm::UseSoftFloat = CodeGenOpts.SoftFloat;
248 UnwindTablesMandatory = CodeGenOpts.UnwindTables;
249
250 TargetMachine::setAsmVerbosityDefault(CodeGenOpts.AsmVerbose);
251
252 // FIXME: Parse this earlier.
253 if (CodeGenOpts.RelocationModel == "static") {
254 TargetMachine::setRelocationModel(llvm::Reloc::Static);
255 } else if (CodeGenOpts.RelocationModel == "pic") {
256 TargetMachine::setRelocationModel(llvm::Reloc::PIC_);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000257 } else {
Chris Lattner6d672132010-04-06 17:52:14 +0000258 assert(CodeGenOpts.RelocationModel == "dynamic-no-pic" &&
259 "Invalid PIC model!");
260 TargetMachine::setRelocationModel(llvm::Reloc::DynamicNoPIC);
261 }
262 // FIXME: Parse this earlier.
263 if (CodeGenOpts.CodeModel == "small") {
264 TargetMachine::setCodeModel(llvm::CodeModel::Small);
265 } else if (CodeGenOpts.CodeModel == "kernel") {
266 TargetMachine::setCodeModel(llvm::CodeModel::Kernel);
267 } else if (CodeGenOpts.CodeModel == "medium") {
268 TargetMachine::setCodeModel(llvm::CodeModel::Medium);
269 } else if (CodeGenOpts.CodeModel == "large") {
270 TargetMachine::setCodeModel(llvm::CodeModel::Large);
271 } else {
272 assert(CodeGenOpts.CodeModel.empty() && "Invalid code model!");
273 TargetMachine::setCodeModel(llvm::CodeModel::Default);
274 }
Daniel Dunbar6a962b12008-10-23 05:59:43 +0000275
Chris Lattner6d672132010-04-06 17:52:14 +0000276 std::vector<const char *> BackendArgs;
277 BackendArgs.push_back("clang"); // Fake program name.
278 if (!CodeGenOpts.DebugPass.empty()) {
279 BackendArgs.push_back("-debug-pass");
280 BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
281 }
282 if (!CodeGenOpts.LimitFloatPrecision.empty()) {
283 BackendArgs.push_back("-limit-float-precision");
284 BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
285 }
286 if (llvm::TimePassesIsEnabled)
287 BackendArgs.push_back("-time-passes");
288 BackendArgs.push_back(0);
289 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
290 (char**) &BackendArgs[0]);
John McCall731be662010-03-04 04:29:44 +0000291
Chris Lattner6d672132010-04-06 17:52:14 +0000292 std::string FeaturesStr;
293 if (TargetOpts.CPU.size() || TargetOpts.Features.size()) {
294 SubtargetFeatures Features;
295 Features.setCPU(TargetOpts.CPU);
296 for (std::vector<std::string>::const_iterator
297 it = TargetOpts.Features.begin(),
298 ie = TargetOpts.Features.end(); it != ie; ++it)
299 Features.AddFeature(*it);
300 FeaturesStr = Features.getString();
301 }
302 TargetMachine *TM = TheTarget->createTargetMachine(Triple, FeaturesStr);
Daniel Dunbarefa39f72009-12-12 23:01:36 +0000303
Chris Lattner6d672132010-04-06 17:52:14 +0000304 // Set register scheduler & allocation policy.
305 RegisterScheduler::setDefault(createDefaultScheduler);
306 RegisterRegAlloc::setDefault(Fast ? createLocalRegisterAllocator :
307 createLinearScanRegisterAllocator);
John McCall731be662010-03-04 04:29:44 +0000308
Chris Lattner6d672132010-04-06 17:52:14 +0000309 // From llvm-gcc:
310 // If there are passes we have to run on the entire module, we do codegen
311 // as a separate "pass" after that happens.
312 // FIXME: This is disabled right now until bugs can be worked out. Reenable
313 // this for fast -O0 compiles!
314 FunctionPassManager *PM = getCodeGenPasses();
315 CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
John McCall731be662010-03-04 04:29:44 +0000316
Chris Lattner6d672132010-04-06 17:52:14 +0000317 switch (CodeGenOpts.OptimizationLevel) {
318 default: break;
319 case 0: OptLevel = CodeGenOpt::None; break;
320 case 3: OptLevel = CodeGenOpt::Aggressive; break;
321 }
Daniel Dunbara1b02a22009-11-29 07:18:39 +0000322
Chris Lattner6d672132010-04-06 17:52:14 +0000323 // Request that addPassesToEmitFile run the Verifier after running
324 // passes which modify the IR.
Dan Gohman357421e2010-02-28 00:55:40 +0000325#ifndef NDEBUG
Chris Lattner6d672132010-04-06 17:52:14 +0000326 bool DisableVerify = false;
Dan Gohman357421e2010-02-28 00:55:40 +0000327#else
Chris Lattner6d672132010-04-06 17:52:14 +0000328 bool DisableVerify = true;
Dan Gohman357421e2010-02-28 00:55:40 +0000329#endif
330
Chris Lattner6d672132010-04-06 17:52:14 +0000331 // Normal mode, emit a .s or .o file by running the code generator. Note,
332 // this also adds codegenerator level optimization passes.
333 TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
334 if (Action == Backend_EmitObj)
335 CGFT = TargetMachine::CGFT_ObjectFile;
336 if (TM->addPassesToEmitFile(*PM, FormattedOutStream, CGFT, OptLevel,
337 DisableVerify)) {
338 Diags.Report(diag::err_fe_unable_to_interface_with_target);
339 return false;
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000340 }
341
342 return true;
343}
344
345void BackendConsumer::CreatePasses() {
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000346 unsigned OptLevel = CodeGenOpts.OptimizationLevel;
347 CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining;
Daniel Dunbarbe50f5a2009-11-10 17:50:53 +0000348
349 // Handle disabling of LLVM optimization, where we want to preserve the
350 // internal module before any optimization.
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000351 if (CodeGenOpts.DisableLLVMOpts) {
Daniel Dunbarbe50f5a2009-11-10 17:50:53 +0000352 OptLevel = 0;
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000353 Inlining = CodeGenOpts.NoInlining;
Daniel Dunbarbe50f5a2009-11-10 17:50:53 +0000354 }
355
Daniel Dunbar71880e72008-10-23 05:50:47 +0000356 // In -O0 if checking is disabled, we don't even have per-function passes.
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000357 if (CodeGenOpts.VerifyModule)
Daniel Dunbar71880e72008-10-23 05:50:47 +0000358 getPerFunctionPasses()->add(createVerifierPass());
359
Daniel Dunbar0c48b642009-06-03 18:01:18 +0000360 // Assume that standard function passes aren't run for -O0.
Daniel Dunbarbe50f5a2009-11-10 17:50:53 +0000361 if (OptLevel > 0)
362 llvm::createStandardFunctionPasses(getPerFunctionPasses(), OptLevel);
Daniel Dunbar0c48b642009-06-03 18:01:18 +0000363
364 llvm::Pass *InliningPass = 0;
Daniel Dunbarbe50f5a2009-11-10 17:50:53 +0000365 switch (Inlining) {
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000366 case CodeGenOptions::NoInlining: break;
367 case CodeGenOptions::NormalInlining: {
Daniel Dunbare07f1522009-12-08 23:15:55 +0000368 // Set the inline threshold following llvm-gcc.
369 //
370 // FIXME: Derive these constants in a principled fashion.
Daniel Dunbar4e908322010-02-05 07:32:37 +0000371 unsigned Threshold = 225;
Daniel Dunbare07f1522009-12-08 23:15:55 +0000372 if (CodeGenOpts.OptimizeSize)
Daniel Dunbar4e908322010-02-05 07:32:37 +0000373 Threshold = 75;
Daniel Dunbare07f1522009-12-08 23:15:55 +0000374 else if (OptLevel > 2)
Daniel Dunbar4e908322010-02-05 07:32:37 +0000375 Threshold = 275;
Eli Friedman7433a242009-06-11 20:33:41 +0000376 InliningPass = createFunctionInliningPass(Threshold);
Daniel Dunbar0c48b642009-06-03 18:01:18 +0000377 break;
Eli Friedman7433a242009-06-11 20:33:41 +0000378 }
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000379 case CodeGenOptions::OnlyAlwaysInlining:
Daniel Dunbar0c48b642009-06-03 18:01:18 +0000380 InliningPass = createAlwaysInlinerPass(); // Respect always_inline
381 break;
Daniel Dunbar71880e72008-10-23 05:50:47 +0000382 }
383
384 // For now we always create per module passes.
385 PassManager *PM = getPerModulePasses();
Chandler Carruthbc55fe22009-11-12 17:24:48 +0000386 llvm::createStandardModulePasses(PM, OptLevel, CodeGenOpts.OptimizeSize,
387 CodeGenOpts.UnitAtATime,
388 CodeGenOpts.UnrollLoops,
Daniel Dunbarde182242009-11-30 08:39:32 +0000389 /*SimplifyLibCalls=*/!LangOpts.NoBuiltin,
Daniel Dunbar0c48b642009-06-03 18:01:18 +0000390 /*HaveExceptions=*/true,
391 InliningPass);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000392}
393
394/// EmitAssembly - Handle interaction with LLVM backend to generate
Mike Stump11289f42009-09-09 15:08:12 +0000395/// actual machine code.
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000396void BackendConsumer::EmitAssembly() {
397 // Silently ignore if we weren't initialized for some reason.
398 if (!TheModule || !TheTargetData)
399 return;
Mike Stump11289f42009-09-09 15:08:12 +0000400
Daniel Dunbar8e705052009-11-30 08:39:52 +0000401 TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : 0);
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000402
Daniel Dunbar9b87dcb2008-10-27 20:40:41 +0000403 // Make sure IR generation is happy with the module. This is
404 // released by the module provider.
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000405 Module *M = Gen->ReleaseModule();
406 if (!M) {
Daniel Dunbar9b87dcb2008-10-27 20:40:41 +0000407 // The module has been released by IR gen on failures, do not
408 // double free.
Daniel Dunbar400a6932010-02-25 04:37:50 +0000409 TheModule.take();
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000410 return;
411 }
412
Daniel Dunbar400a6932010-02-25 04:37:50 +0000413 assert(TheModule.get() == M &&
414 "Unexpected module change during IR generation");
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000415
416 CreatePasses();
Daniel Dunbaracadc552009-12-03 09:12:54 +0000417 if (!AddEmitPasses())
418 return;
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000419
420 // Run passes. For now we do all passes at once, but eventually we
421 // would like to have the option of streaming code generation.
422
423 if (PerFunctionPasses) {
Chris Lattnere46de752009-03-06 06:46:31 +0000424 PrettyStackTraceString CrashInfo("Per-function optimization");
Mike Stump11289f42009-09-09 15:08:12 +0000425
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000426 PerFunctionPasses->doInitialization();
427 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
428 if (!I->isDeclaration())
429 PerFunctionPasses->run(*I);
430 PerFunctionPasses->doFinalization();
431 }
Mike Stump11289f42009-09-09 15:08:12 +0000432
Chris Lattnereae6cb62009-03-05 08:00:35 +0000433 if (PerModulePasses) {
Chris Lattnere46de752009-03-06 06:46:31 +0000434 PrettyStackTraceString CrashInfo("Per-module optimization passes");
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000435 PerModulePasses->run(*M);
Chris Lattnereae6cb62009-03-05 08:00:35 +0000436 }
Mike Stump11289f42009-09-09 15:08:12 +0000437
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000438 if (CodeGenPasses) {
Chris Lattnere46de752009-03-06 06:46:31 +0000439 PrettyStackTraceString CrashInfo("Code generation");
Chris Lattner6d672132010-04-06 17:52:14 +0000440
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000441 CodeGenPasses->doInitialization();
442 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
443 if (!I->isDeclaration())
444 CodeGenPasses->run(*I);
445 CodeGenPasses->doFinalization();
446 }
447}
448
Chris Lattner6d672132010-04-06 17:52:14 +0000449
Daniel Dunbarcea0c702010-02-25 04:37:45 +0000450//
451
452CodeGenAction::CodeGenAction(unsigned _Act) : Act(_Act) {}
453
Daniel Dunbare8ecf9a2010-02-25 20:37:44 +0000454CodeGenAction::~CodeGenAction() {}
455
Daniel Dunbar400a6932010-02-25 04:37:50 +0000456void CodeGenAction::EndSourceFileAction() {
457 // If the consumer creation failed, do nothing.
458 if (!getCompilerInstance().hasASTConsumer())
459 return;
460
461 // Steal the module from the consumer.
462 BackendConsumer *Consumer = static_cast<BackendConsumer*>(
463 &getCompilerInstance().getASTConsumer());
464
465 TheModule.reset(Consumer->takeModule());
466}
467
468llvm::Module *CodeGenAction::takeModule() {
469 return TheModule.take();
470}
471
Daniel Dunbarcea0c702010-02-25 04:37:45 +0000472ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
473 llvm::StringRef InFile) {
474 BackendAction BA = static_cast<BackendAction>(Act);
475 llvm::OwningPtr<llvm::raw_ostream> OS;
476 switch (BA) {
477 case Backend_EmitAssembly:
478 OS.reset(CI.createDefaultOutputFile(false, InFile, "s"));
479 break;
480 case Backend_EmitLL:
481 OS.reset(CI.createDefaultOutputFile(false, InFile, "ll"));
482 break;
483 case Backend_EmitBC:
484 OS.reset(CI.createDefaultOutputFile(true, InFile, "bc"));
485 break;
486 case Backend_EmitNothing:
487 break;
488 case Backend_EmitObj:
489 OS.reset(CI.createDefaultOutputFile(true, InFile, "o"));
490 break;
491 }
492 if (BA != Backend_EmitNothing && !OS)
493 return 0;
494
John McCall731be662010-03-04 04:29:44 +0000495 return new BackendConsumer(BA, CI.getDiagnostics(), CI.getLangOpts(),
496 CI.getCodeGenOpts(), CI.getTargetOpts(),
497 CI.getFrontendOpts().ShowTimers, InFile, OS.take(),
Daniel Dunbarcea0c702010-02-25 04:37:45 +0000498 CI.getLLVMContext());
Daniel Dunbarc13935e2008-10-21 23:49:24 +0000499}
Daniel Dunbarcea0c702010-02-25 04:37:45 +0000500
501EmitAssemblyAction::EmitAssemblyAction()
502 : CodeGenAction(Backend_EmitAssembly) {}
503
504EmitBCAction::EmitBCAction() : CodeGenAction(Backend_EmitBC) {}
505
506EmitLLVMAction::EmitLLVMAction() : CodeGenAction(Backend_EmitLL) {}
507
508EmitLLVMOnlyAction::EmitLLVMOnlyAction() : CodeGenAction(Backend_EmitNothing) {}
509
510EmitObjAction::EmitObjAction() : CodeGenAction(Backend_EmitObj) {}