blob: 0c09fd16da3d42e7db984186087a4b6a30ad1095 [file] [log] [blame]
Daniel Dunbar897c6762010-06-07 23:20:08 +00001//===--- BackendUtil.cpp - LLVM Backend Utilities -------------------------===//
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
Daniel Dunbar9b414d32010-06-15 17:48:49 +000010#include "clang/CodeGen/BackendUtil.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000011#include "clang/Basic/Diagnostic.h"
Dan Gohmanb18b8ad2011-07-05 22:02:36 +000012#include "clang/Basic/LangOptions.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000013#include "clang/Basic/TargetOptions.h"
Chandler Carruth06057ce2010-06-15 23:19:56 +000014#include "clang/Frontend/CodeGenOptions.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000015#include "clang/Frontend/FrontendDiagnostic.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070016#include "clang/Frontend/Utils.h"
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080017#include "llvm/ADT/StringExtras.h"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070018#include "llvm/ADT/StringSwitch.h"
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070019#include "llvm/ADT/Triple.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070020#include "llvm/Analysis/TargetLibraryInfo.h"
21#include "llvm/Analysis/TargetTransformInfo.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070022#include "llvm/Bitcode/BitcodeWriterPass.h"
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070023#include "llvm/Bitcode/ReaderWriter.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000024#include "llvm/CodeGen/RegAllocRegistry.h"
25#include "llvm/CodeGen/SchedulerRegistry.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000026#include "llvm/IR/DataLayout.h"
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070027#include "llvm/IR/ModuleSummaryIndex.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070028#include "llvm/IR/IRPrintingPasses.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070029#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000030#include "llvm/IR/Module.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070031#include "llvm/IR/Verifier.h"
Evan Cheng693769c2011-06-29 01:14:32 +000032#include "llvm/MC/SubtargetFeature.h"
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070033#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000034#include "llvm/Support/CommandLine.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000035#include "llvm/Support/PrettyStackTrace.h"
Evan Chenga6b40452011-08-24 18:09:14 +000036#include "llvm/Support/TargetRegistry.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000037#include "llvm/Support/Timer.h"
38#include "llvm/Support/raw_ostream.h"
Daniel Dunbar897c6762010-06-07 23:20:08 +000039#include "llvm/Target/TargetMachine.h"
40#include "llvm/Target/TargetOptions.h"
Stephen Hines176edba2014-12-01 14:53:08 -080041#include "llvm/Target/TargetSubtargetInfo.h"
Rafael Espindolacf565c52011-08-02 21:51:02 +000042#include "llvm/Transforms/IPO.h"
43#include "llvm/Transforms/IPO/PassManagerBuilder.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000044#include "llvm/Transforms/Instrumentation.h"
Michael Gottesman23d5b092013-01-28 01:36:00 +000045#include "llvm/Transforms/ObjCARC.h"
Rafael Espindolacf565c52011-08-02 21:51:02 +000046#include "llvm/Transforms/Scalar.h"
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070047#include "llvm/Transforms/Scalar/GVN.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070048#include "llvm/Transforms/Utils/SymbolRewriter.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070049#include <memory>
Daniel Dunbar897c6762010-06-07 23:20:08 +000050using namespace clang;
51using namespace llvm;
52
53namespace {
54
55class EmitAssemblyHelper {
David Blaikied6471f72011-09-25 23:23:43 +000056 DiagnosticsEngine &Diags;
Daniel Dunbar897c6762010-06-07 23:20:08 +000057 const CodeGenOptions &CodeGenOpts;
Nick Lewycky3aaeccc2011-12-02 22:17:00 +000058 const clang::TargetOptions &TargetOpts;
Dan Gohmanb18b8ad2011-07-05 22:02:36 +000059 const LangOptions &LangOpts;
Daniel Dunbar897c6762010-06-07 23:20:08 +000060 Module *TheModule;
Daniel Dunbar897c6762010-06-07 23:20:08 +000061
62 Timer CodeGenerationTime;
63
Stephen Hines0e2c34f2015-03-23 12:09:02 -070064 mutable legacy::PassManager *CodeGenPasses;
65 mutable legacy::PassManager *PerModulePasses;
66 mutable legacy::FunctionPassManager *PerFunctionPasses;
Daniel Dunbar897c6762010-06-07 23:20:08 +000067
68private:
Stephen Hines0e2c34f2015-03-23 12:09:02 -070069 TargetIRAnalysis getTargetIRAnalysis() const {
70 if (TM)
71 return TM->getTargetIRAnalysis();
72
73 return TargetIRAnalysis();
74 }
75
76 legacy::PassManager *getCodeGenPasses() const {
Daniel Dunbar897c6762010-06-07 23:20:08 +000077 if (!CodeGenPasses) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070078 CodeGenPasses = new legacy::PassManager();
Stephen Hines0e2c34f2015-03-23 12:09:02 -070079 CodeGenPasses->add(
80 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
Daniel Dunbar897c6762010-06-07 23:20:08 +000081 }
82 return CodeGenPasses;
83 }
84
Stephen Hines0e2c34f2015-03-23 12:09:02 -070085 legacy::PassManager *getPerModulePasses() const {
Daniel Dunbar897c6762010-06-07 23:20:08 +000086 if (!PerModulePasses) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070087 PerModulePasses = new legacy::PassManager();
Stephen Hines0e2c34f2015-03-23 12:09:02 -070088 PerModulePasses->add(
89 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
Daniel Dunbar897c6762010-06-07 23:20:08 +000090 }
91 return PerModulePasses;
92 }
93
Stephen Hines0e2c34f2015-03-23 12:09:02 -070094 legacy::FunctionPassManager *getPerFunctionPasses() const {
Daniel Dunbar897c6762010-06-07 23:20:08 +000095 if (!PerFunctionPasses) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -070096 PerFunctionPasses = new legacy::FunctionPassManager(TheModule);
Stephen Hines0e2c34f2015-03-23 12:09:02 -070097 PerFunctionPasses->add(
98 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
Daniel Dunbar897c6762010-06-07 23:20:08 +000099 }
100 return PerFunctionPasses;
101 }
102
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700103 /// Set LLVM command line options passed through -backend-option.
104 void setCommandLineOpts();
105
106 void CreatePasses(ModuleSummaryIndex *ModuleSummary);
Nadav Rotemfa60be02012-10-24 00:53:38 +0000107
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700108 /// Generates the TargetMachine.
Nadav Rotem129369d2012-10-24 03:52:31 +0000109 /// Returns Null if it is unable to create the target machine.
110 /// Some of our clang tests specify triples which are not built
111 /// into clang. This is okay because these tests check the generated
112 /// IR, and they require DataLayout which depends on the triple.
113 /// In this case, we allow this method to fail and not report an error.
114 /// When MustCreateTM is used, we print an error if we are unable to load
115 /// the requested target.
116 TargetMachine *CreateTargetMachine(bool MustCreateTM);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000117
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700118 /// Add passes necessary to emit assembly or LLVM IR.
Daniel Dunbar897c6762010-06-07 23:20:08 +0000119 ///
120 /// \return True on success.
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700121 bool AddEmitPasses(BackendAction Action, raw_pwrite_stream &OS);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000122
123public:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800124 EmitAssemblyHelper(DiagnosticsEngine &_Diags, const CodeGenOptions &CGOpts,
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000125 const clang::TargetOptions &TOpts,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700126 const LangOptions &LOpts, Module *M)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800127 : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), LangOpts(LOpts),
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700128 TheModule(M), CodeGenerationTime("Code Generation Time"),
129 CodeGenPasses(nullptr), PerModulePasses(nullptr),
130 PerFunctionPasses(nullptr) {}
Daniel Dunbar897c6762010-06-07 23:20:08 +0000131
132 ~EmitAssemblyHelper() {
133 delete CodeGenPasses;
134 delete PerModulePasses;
135 delete PerFunctionPasses;
Stephen Hines651f13c2014-04-23 16:59:28 -0700136 if (CodeGenOpts.DisableFree)
Stephen Hines176edba2014-12-01 14:53:08 -0800137 BuryPointer(std::move(TM));
Daniel Dunbar897c6762010-06-07 23:20:08 +0000138 }
139
Stephen Hines651f13c2014-04-23 16:59:28 -0700140 std::unique_ptr<TargetMachine> TM;
141
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700142 void EmitAssembly(BackendAction Action, raw_pwrite_stream *OS);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000143};
144
Alexey Samsonove8c03222012-12-28 09:31:34 +0000145// We need this wrapper to access LangOpts and CGOpts from extension functions
146// that we add to the PassManagerBuilder.
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000147class PassManagerBuilderWrapper : public PassManagerBuilder {
148public:
Alexey Samsonov91ecfa62012-12-03 19:12:58 +0000149 PassManagerBuilderWrapper(const CodeGenOptions &CGOpts,
150 const LangOptions &LangOpts)
151 : PassManagerBuilder(), CGOpts(CGOpts), LangOpts(LangOpts) {}
152 const CodeGenOptions &getCGOpts() const { return CGOpts; }
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000153 const LangOptions &getLangOpts() const { return LangOpts; }
154private:
Alexey Samsonov91ecfa62012-12-03 19:12:58 +0000155 const CodeGenOptions &CGOpts;
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000156 const LangOptions &LangOpts;
157};
158
Daniel Dunbar897c6762010-06-07 23:20:08 +0000159}
160
Dan Gohmana8398ea2012-01-17 20:54:51 +0000161static void addObjCARCAPElimPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
162 if (Builder.OptLevel > 0)
163 PM.add(createObjCARCAPElimPass());
164}
165
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000166static void addObjCARCExpandPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
167 if (Builder.OptLevel > 0)
168 PM.add(createObjCARCExpandPass());
169}
170
171static void addObjCARCOptPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
172 if (Builder.OptLevel > 0)
173 PM.add(createObjCARCOptPass());
174}
175
Stephen Hines651f13c2014-04-23 16:59:28 -0700176static void addAddDiscriminatorsPass(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700177 legacy::PassManagerBase &PM) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700178 PM.add(createAddDiscriminatorsPass());
179}
180
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700181static void addCleanupPassesForSampleProfiler(
182 const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
183 // instcombine is needed before sample profile annotation because it converts
184 // certain function calls to be inlinable. simplifycfg and sroa are needed
185 // before instcombine for necessary preparation. E.g. load store is eliminated
186 // properly so that instcombine will not introduce unecessary liverange.
187 PM.add(createCFGSimplificationPass());
188 PM.add(createSROAPass());
189 PM.add(createInstructionCombiningPass());
190}
191
Nuno Lopesdef18492012-05-22 17:19:45 +0000192static void addBoundsCheckingPass(const PassManagerBuilder &Builder,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700193 legacy::PassManagerBase &PM) {
Joey Gouly85489082012-11-23 10:39:49 +0000194 PM.add(createBoundsCheckingPass());
Nuno Lopesdef18492012-05-22 17:19:45 +0000195}
196
Stephen Hines176edba2014-12-01 14:53:08 -0800197static void addSanitizerCoveragePass(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700198 legacy::PassManagerBase &PM) {
Stephen Hines176edba2014-12-01 14:53:08 -0800199 const PassManagerBuilderWrapper &BuilderWrapper =
200 static_cast<const PassManagerBuilderWrapper&>(Builder);
201 const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700202 SanitizerCoverageOptions Opts;
203 Opts.CoverageType =
204 static_cast<SanitizerCoverageOptions::Type>(CGOpts.SanitizeCoverageType);
205 Opts.IndirectCalls = CGOpts.SanitizeCoverageIndirectCalls;
206 Opts.TraceBB = CGOpts.SanitizeCoverageTraceBB;
207 Opts.TraceCmp = CGOpts.SanitizeCoverageTraceCmp;
208 Opts.Use8bitCounters = CGOpts.SanitizeCoverage8bitCounters;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700209 Opts.TracePC = CGOpts.SanitizeCoverageTracePC;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700210 PM.add(createSanitizerCoverageModulePass(Opts));
Stephen Hines176edba2014-12-01 14:53:08 -0800211}
212
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000213static void addAddressSanitizerPasses(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700214 legacy::PassManagerBase &PM) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800215 const PassManagerBuilderWrapper &BuilderWrapper =
216 static_cast<const PassManagerBuilderWrapper&>(Builder);
217 const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
218 bool Recover = CGOpts.SanitizeRecover.has(SanitizerKind::Address);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700219 bool UseAfterScope = CGOpts.SanitizeAddressUseAfterScope;
220 PM.add(createAddressSanitizerFunctionPass(/*CompileKernel*/ false, Recover,
221 UseAfterScope));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800222 PM.add(createAddressSanitizerModulePass(/*CompileKernel*/false, Recover));
223}
224
225static void addKernelAddressSanitizerPasses(const PassManagerBuilder &Builder,
226 legacy::PassManagerBase &PM) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700227 PM.add(createAddressSanitizerFunctionPass(
228 /*CompileKernel*/ true,
229 /*Recover*/ true, /*UseAfterScope*/ false));
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800230 PM.add(createAddressSanitizerModulePass(/*CompileKernel*/true,
231 /*Recover*/true));
Kostya Serebryany1b4eca62011-11-16 17:34:26 +0000232}
233
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +0000234static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700235 legacy::PassManagerBase &PM) {
Evgeniy Stepanov34ef11b2012-12-24 08:42:34 +0000236 const PassManagerBuilderWrapper &BuilderWrapper =
237 static_cast<const PassManagerBuilderWrapper&>(Builder);
238 const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700239 PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins));
Evgeniy Stepanova8d39042013-01-31 09:53:29 +0000240
241 // MemorySanitizer inserts complex instrumentation that mostly follows
242 // the logic of the original code, but operates on "shadow" values.
243 // It can benefit from re-running some general purpose optimization passes.
244 if (Builder.OptLevel > 0) {
245 PM.add(createEarlyCSEPass());
246 PM.add(createReassociatePass());
247 PM.add(createLICMPass());
248 PM.add(createGVNPass());
249 PM.add(createInstructionCombiningPass());
250 PM.add(createDeadStoreEliminationPass());
251 }
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +0000252}
253
Kostya Serebryany3c931222012-03-01 22:27:08 +0000254static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700255 legacy::PassManagerBase &PM) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700256 PM.add(createThreadSanitizerPass());
Kostya Serebryany3c931222012-03-01 22:27:08 +0000257}
258
Peter Collingbourne2eeed712013-08-07 22:47:34 +0000259static void addDataFlowSanitizerPass(const PassManagerBuilder &Builder,
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700260 legacy::PassManagerBase &PM) {
Peter Collingbourne5d27a512013-08-14 18:54:18 +0000261 const PassManagerBuilderWrapper &BuilderWrapper =
262 static_cast<const PassManagerBuilderWrapper&>(Builder);
Stephen Hines176edba2014-12-01 14:53:08 -0800263 const LangOptions &LangOpts = BuilderWrapper.getLangOpts();
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700264 PM.add(createDataFlowSanitizerPass(LangOpts.SanitizerBlacklistFiles));
Stephen Hines176edba2014-12-01 14:53:08 -0800265}
266
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700267static void addEfficiencySanitizerPass(const PassManagerBuilder &Builder,
268 legacy::PassManagerBase &PM) {
269 const PassManagerBuilderWrapper &BuilderWrapper =
270 static_cast<const PassManagerBuilderWrapper&>(Builder);
271 const LangOptions &LangOpts = BuilderWrapper.getLangOpts();
272 EfficiencySanitizerOptions Opts;
273 if (LangOpts.Sanitize.has(SanitizerKind::EfficiencyCacheFrag))
274 Opts.ToolType = EfficiencySanitizerOptions::ESAN_CacheFrag;
275 else if (LangOpts.Sanitize.has(SanitizerKind::EfficiencyWorkingSet))
276 Opts.ToolType = EfficiencySanitizerOptions::ESAN_WorkingSet;
277 PM.add(createEfficiencySanitizerPass(Opts));
278}
279
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700280static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
281 const CodeGenOptions &CodeGenOpts) {
282 TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
Stephen Hines176edba2014-12-01 14:53:08 -0800283 if (!CodeGenOpts.SimplifyLibCalls)
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700284 TLII->disableAllFunctions();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700285 else {
286 // Disable individual libc/libm calls in TargetLibraryInfo.
287 LibFunc::Func F;
288 for (auto &FuncName : CodeGenOpts.getNoBuiltinFuncs())
289 if (TLII->getLibFunc(FuncName, F))
290 TLII->setUnavailable(F);
291 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700292
293 switch (CodeGenOpts.getVecLib()) {
294 case CodeGenOptions::Accelerate:
295 TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate);
296 break;
297 default:
298 break;
299 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700300 return TLII;
301}
302
303static void addSymbolRewriterPass(const CodeGenOptions &Opts,
304 legacy::PassManager *MPM) {
305 llvm::SymbolRewriter::RewriteDescriptorList DL;
306
307 llvm::SymbolRewriter::RewriteMapParser MapParser;
308 for (const auto &MapFile : Opts.RewriteMapFiles)
309 MapParser.parse(MapFile, &DL);
310
311 MPM->add(createRewriteSymbolsPass(DL));
Peter Collingbourne2eeed712013-08-07 22:47:34 +0000312}
313
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700314void EmitAssemblyHelper::CreatePasses(ModuleSummaryIndex *ModuleSummary) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800315 if (CodeGenOpts.DisableLLVMPasses)
316 return;
317
Daniel Dunbar897c6762010-06-07 23:20:08 +0000318 unsigned OptLevel = CodeGenOpts.OptimizationLevel;
Douglas Gregor4cdad312012-10-23 20:05:01 +0000319 CodeGenOptions::InliningMethod Inlining = CodeGenOpts.getInlining();
Daniel Dunbar897c6762010-06-07 23:20:08 +0000320
321 // Handle disabling of LLVM optimization, where we want to preserve the
322 // internal module before any optimization.
323 if (CodeGenOpts.DisableLLVMOpts) {
324 OptLevel = 0;
325 Inlining = CodeGenOpts.NoInlining;
326 }
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000327
Alexey Samsonov91ecfa62012-12-03 19:12:58 +0000328 PassManagerBuilderWrapper PMBuilder(CodeGenOpts, LangOpts);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800329
330 // Figure out TargetLibraryInfo.
331 Triple TargetTriple(TheModule->getTargetTriple());
332 PMBuilder.LibraryInfo = createTLII(TargetTriple, CodeGenOpts);
333
334 switch (Inlining) {
335 case CodeGenOptions::NoInlining:
336 break;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700337 case CodeGenOptions::NormalInlining:
338 case CodeGenOptions::OnlyHintInlining: {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800339 PMBuilder.Inliner =
340 createFunctionInliningPass(OptLevel, CodeGenOpts.OptimizeSize);
341 break;
342 }
343 case CodeGenOptions::OnlyAlwaysInlining:
344 // Respect always_inline.
345 if (OptLevel == 0)
346 // Do not insert lifetime intrinsics at -O0.
347 PMBuilder.Inliner = createAlwaysInlinerPass(false);
348 else
349 PMBuilder.Inliner = createAlwaysInlinerPass();
350 break;
351 }
352
Chris Lattner9ca02e52011-05-21 23:50:44 +0000353 PMBuilder.OptLevel = OptLevel;
354 PMBuilder.SizeLevel = CodeGenOpts.OptimizeSize;
Nick Lewyckyfdf137b2013-06-25 01:49:44 +0000355 PMBuilder.BBVectorize = CodeGenOpts.VectorizeBB;
356 PMBuilder.SLPVectorize = CodeGenOpts.VectorizeSLP;
357 PMBuilder.LoopVectorize = CodeGenOpts.VectorizeLoop;
Andrew Trick6445d622011-04-05 18:49:32 +0000358
Chris Lattner9ca02e52011-05-21 23:50:44 +0000359 PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;
Stephen Hines176edba2014-12-01 14:53:08 -0800360 PMBuilder.MergeFunctions = CodeGenOpts.MergeFunctions;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700361 PMBuilder.PrepareForThinLTO = CodeGenOpts.EmitSummaryIndex;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800362 PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO;
Hal Finkelce5b5f12013-11-17 16:03:29 +0000363 PMBuilder.RerollLoops = CodeGenOpts.RerollLoops;
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000364
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800365 legacy::PassManager *MPM = getPerModulePasses();
366
367 // If we are performing a ThinLTO importing compile, invoke the LTO
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700368 // pipeline and pass down the in-memory module summary index.
369 if (ModuleSummary) {
370 PMBuilder.ModuleSummary = ModuleSummary;
371 PMBuilder.populateThinLTOPassManager(*MPM);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800372 return;
373 }
374
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700375 // Add target-specific passes that need to run as early as possible.
376 if (TM)
377 PMBuilder.addExtension(
378 PassManagerBuilder::EP_EarlyAsPossible,
379 [&](const PassManagerBuilder &, legacy::PassManagerBase &PM) {
380 TM->addEarlyAsPossiblePasses(PM);
381 });
382
Stephen Hines651f13c2014-04-23 16:59:28 -0700383 PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
384 addAddDiscriminatorsPass);
385
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000386 // In ObjC ARC mode, add the main ARC optimization passes.
387 if (LangOpts.ObjCAutoRefCount) {
388 PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
389 addObjCARCExpandPass);
Dan Gohmana8398ea2012-01-17 20:54:51 +0000390 PMBuilder.addExtension(PassManagerBuilder::EP_ModuleOptimizerEarly,
391 addObjCARCAPElimPass);
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000392 PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
393 addObjCARCOptPass);
394 }
Kostya Serebryany1b4eca62011-11-16 17:34:26 +0000395
Stephen Hines176edba2014-12-01 14:53:08 -0800396 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
Nuno Lopesdef18492012-05-22 17:19:45 +0000397 PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
398 addBoundsCheckingPass);
399 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
400 addBoundsCheckingPass);
401 }
402
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700403 if (CodeGenOpts.SanitizeCoverageType ||
404 CodeGenOpts.SanitizeCoverageIndirectCalls ||
405 CodeGenOpts.SanitizeCoverageTraceCmp) {
Stephen Hines176edba2014-12-01 14:53:08 -0800406 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
407 addSanitizerCoveragePass);
408 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
409 addSanitizerCoveragePass);
410 }
411
412 if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
Kostya Serebryanyba1f0402012-10-15 14:22:56 +0000413 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000414 addAddressSanitizerPasses);
Kostya Serebryanye5dd2ea2011-11-30 22:20:21 +0000415 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
Alexey Samsonov4d1a6e42012-11-29 22:36:21 +0000416 addAddressSanitizerPasses);
Kostya Serebryany1b4eca62011-11-16 17:34:26 +0000417 }
Kostya Serebryany3c931222012-03-01 22:27:08 +0000418
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800419 if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) {
420 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
421 addKernelAddressSanitizerPasses);
422 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
423 addKernelAddressSanitizerPasses);
424 }
425
Stephen Hines176edba2014-12-01 14:53:08 -0800426 if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
Evgeniy Stepanov09ccf392012-12-03 13:20:43 +0000427 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
428 addMemorySanitizerPass);
429 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
430 addMemorySanitizerPass);
431 }
432
Stephen Hines176edba2014-12-01 14:53:08 -0800433 if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
Kostya Serebryanye78ec3e2012-03-23 23:25:23 +0000434 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
Kostya Serebryany3c931222012-03-01 22:27:08 +0000435 addThreadSanitizerPass);
436 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
437 addThreadSanitizerPass);
438 }
439
Stephen Hines176edba2014-12-01 14:53:08 -0800440 if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
Peter Collingbourne2eeed712013-08-07 22:47:34 +0000441 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
442 addDataFlowSanitizerPass);
443 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
444 addDataFlowSanitizerPass);
445 }
446
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700447 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Efficiency)) {
448 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
449 addEfficiencySanitizerPass);
450 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
451 addEfficiencySanitizerPass);
452 }
453
Chris Lattner33c09d52011-05-21 20:40:11 +0000454 // Set up the per-function pass manager.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700455 legacy::FunctionPassManager *FPM = getPerFunctionPasses();
Chris Lattner33c09d52011-05-21 20:40:11 +0000456 if (CodeGenOpts.VerifyModule)
457 FPM->add(createVerifierPass());
Andrew Trick6445d622011-04-05 18:49:32 +0000458
Chris Lattner33c09d52011-05-21 20:40:11 +0000459 // Set up the per-module pass manager.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700460 if (!CodeGenOpts.RewriteMapFiles.empty())
461 addSymbolRewriterPass(CodeGenOpts, MPM);
Chris Lattnerdf619762011-02-18 22:20:38 +0000462
Nick Lewyckyf2b5e072013-03-20 01:38:16 +0000463 if (!CodeGenOpts.DisableGCov &&
464 (CodeGenOpts.EmitGcovArcs || CodeGenOpts.EmitGcovNotes)) {
Nick Lewyckyc3ae5832013-03-14 05:14:01 +0000465 // Not using 'GCOVOptions::getDefault' allows us to avoid exiting if
466 // LLVM's -default-gcov-version flag is set to something invalid.
467 GCOVOptions Options;
468 Options.EmitNotes = CodeGenOpts.EmitGcovNotes;
469 Options.EmitData = CodeGenOpts.EmitGcovArcs;
470 memcpy(Options.Version, CodeGenOpts.CoverageVersion, 4);
471 Options.UseCfgChecksum = CodeGenOpts.CoverageExtraChecksum;
472 Options.NoRedZone = CodeGenOpts.DisableRedZone;
Nick Lewyckyc3ae5832013-03-14 05:14:01 +0000473 Options.FunctionNamesInData =
Nick Lewycky83c546a2013-03-20 02:14:38 +0000474 !CodeGenOpts.CoverageNoFunctionNamesInData;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700475 Options.ExitBlockBeforeBody = CodeGenOpts.CoverageExitBlockBeforeBody;
Nick Lewyckyc3ae5832013-03-14 05:14:01 +0000476 MPM->add(createGCOVProfilerPass(Options));
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700477 if (CodeGenOpts.getDebugInfo() == codegenoptions::NoDebugInfo)
Nick Lewyckye8ba8d72011-04-21 23:44:07 +0000478 MPM->add(createStripSymbolsPass(true));
479 }
Nadav Rotem129369d2012-10-24 03:52:31 +0000480
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700481 if (CodeGenOpts.hasProfileClangInstr()) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700482 InstrProfOptions Options;
483 Options.NoRedZone = CodeGenOpts.DisableRedZone;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700484 Options.InstrProfileOutput = CodeGenOpts.InstrProfileOutput;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700485 MPM->add(createInstrProfilingLegacyPass(Options));
486 }
487 if (CodeGenOpts.hasProfileIRInstr()) {
488 if (!CodeGenOpts.InstrProfileOutput.empty())
489 PMBuilder.PGOInstrGen = CodeGenOpts.InstrProfileOutput;
490 else
491 PMBuilder.PGOInstrGen = "default.profraw";
492 }
493 if (CodeGenOpts.hasProfileIRUse())
494 PMBuilder.PGOInstrUse = CodeGenOpts.ProfileInstrumentUsePath;
495
496 if (!CodeGenOpts.SampleProfileFile.empty()) {
497 MPM->add(createPruneEHPass());
498 MPM->add(createSampleProfileLoaderPass(CodeGenOpts.SampleProfileFile));
499 PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
500 addCleanupPassesForSampleProfiler);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700501 }
502
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700503 PMBuilder.populateFunctionPassManager(*FPM);
Chris Lattner33c09d52011-05-21 20:40:11 +0000504 PMBuilder.populateModulePassManager(*MPM);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000505}
506
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700507void EmitAssemblyHelper::setCommandLineOpts() {
508 SmallVector<const char *, 16> BackendArgs;
509 BackendArgs.push_back("clang"); // Fake program name.
510 if (!CodeGenOpts.DebugPass.empty()) {
511 BackendArgs.push_back("-debug-pass");
512 BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
513 }
514 if (!CodeGenOpts.LimitFloatPrecision.empty()) {
515 BackendArgs.push_back("-limit-float-precision");
516 BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
517 }
518 for (const std::string &BackendOption : CodeGenOpts.BackendOptions)
519 BackendArgs.push_back(BackendOption.c_str());
520 BackendArgs.push_back(nullptr);
521 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
522 BackendArgs.data());
523}
524
Nadav Rotem129369d2012-10-24 03:52:31 +0000525TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
Daniel Dunbar897c6762010-06-07 23:20:08 +0000526 // Create the TargetMachine for generating code.
527 std::string Error;
528 std::string Triple = TheModule->getTargetTriple();
529 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
530 if (!TheTarget) {
Nadav Rotem129369d2012-10-24 03:52:31 +0000531 if (MustCreateTM)
Chad Rosiera03fc6e2013-03-27 00:14:35 +0000532 Diags.Report(diag::err_fe_unable_to_create_target) << Error;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700533 return nullptr;
Daniel Dunbar897c6762010-06-07 23:20:08 +0000534 }
535
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700536 unsigned CodeModel =
537 llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
538 .Case("small", llvm::CodeModel::Small)
539 .Case("kernel", llvm::CodeModel::Kernel)
540 .Case("medium", llvm::CodeModel::Medium)
541 .Case("large", llvm::CodeModel::Large)
542 .Case("default", llvm::CodeModel::Default)
543 .Default(~0u);
544 assert(CodeModel != ~0u && "invalid code model!");
545 llvm::CodeModel::Model CM = static_cast<llvm::CodeModel::Model>(CodeModel);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000546
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800547 std::string FeaturesStr =
548 llvm::join(TargetOpts.Features.begin(), TargetOpts.Features.end(), ",");
Evan Cheng2860e302011-07-19 06:37:41 +0000549
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800550 // Keep this synced with the equivalent code in tools/driver/cc1as_main.cpp.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700551 llvm::Optional<llvm::Reloc::Model> RM;
Evan Cheng2860e302011-07-19 06:37:41 +0000552 if (CodeGenOpts.RelocationModel == "static") {
553 RM = llvm::Reloc::Static;
554 } else if (CodeGenOpts.RelocationModel == "pic") {
555 RM = llvm::Reloc::PIC_;
556 } else {
557 assert(CodeGenOpts.RelocationModel == "dynamic-no-pic" &&
558 "Invalid PIC model!");
559 RM = llvm::Reloc::DynamicNoPIC;
560 }
561
Evan Cheng9254bf72011-11-16 08:38:55 +0000562 CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
563 switch (CodeGenOpts.OptimizationLevel) {
564 default: break;
565 case 0: OptLevel = CodeGenOpt::None; break;
566 case 3: OptLevel = CodeGenOpt::Aggressive; break;
567 }
568
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000569 llvm::TargetOptions Options;
570
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700571 if (!TargetOpts.Reciprocals.empty())
572 Options.Reciprocals = TargetRecip(TargetOpts.Reciprocals);
573
Stephen Hines176edba2014-12-01 14:53:08 -0800574 Options.ThreadModel =
575 llvm::StringSwitch<llvm::ThreadModel::Model>(CodeGenOpts.ThreadModel)
576 .Case("posix", llvm::ThreadModel::POSIX)
577 .Case("single", llvm::ThreadModel::Single);
578
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000579 // Set float ABI type.
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800580 assert((CodeGenOpts.FloatABI == "soft" || CodeGenOpts.FloatABI == "softfp" ||
581 CodeGenOpts.FloatABI == "hard" || CodeGenOpts.FloatABI.empty()) &&
582 "Invalid Floating Point ABI!");
583 Options.FloatABIType =
584 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
585 .Case("soft", llvm::FloatABI::Soft)
586 .Case("softfp", llvm::FloatABI::Soft)
587 .Case("hard", llvm::FloatABI::Hard)
588 .Default(llvm::FloatABI::Default);
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000589
Lang Hamesc9686712012-07-06 00:59:19 +0000590 // Set FP fusion mode.
Lang Hames931c0832012-11-15 07:51:26 +0000591 switch (CodeGenOpts.getFPContractMode()) {
592 case CodeGenOptions::FPC_Off:
Lang Hamesc9686712012-07-06 00:59:19 +0000593 Options.AllowFPOpFusion = llvm::FPOpFusion::Strict;
594 break;
Lang Hames931c0832012-11-15 07:51:26 +0000595 case CodeGenOptions::FPC_On:
Lang Hamesc9686712012-07-06 00:59:19 +0000596 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
597 break;
Lang Hames931c0832012-11-15 07:51:26 +0000598 case CodeGenOptions::FPC_Fast:
Lang Hamesc9686712012-07-06 00:59:19 +0000599 Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
Nadav Rotem25030c42012-10-19 04:15:32 +0000600 break;
Lang Hamesc9686712012-07-06 00:59:19 +0000601 }
602
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800603 Options.UseInitArray = CodeGenOpts.UseInitArray;
604 Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
605 Options.CompressDebugSections = CodeGenOpts.CompressDebugSections;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700606 Options.RelaxELFRelocations = CodeGenOpts.RelaxELFRelocations;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800607
608 // Set EABI version.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700609 Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(TargetOpts.EABIVersion)
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800610 .Case("4", llvm::EABI::EABI4)
611 .Case("5", llvm::EABI::EABI5)
612 .Case("gnu", llvm::EABI::GNU)
613 .Default(llvm::EABI::Default);
614
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700615 if (LangOpts.SjLjExceptions)
616 Options.ExceptionModel = llvm::ExceptionHandling::SjLj;
617
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000618 Options.LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD;
619 Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath;
620 Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath;
621 Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
622 Options.UnsafeFPMath = CodeGenOpts.UnsafeFPMath;
Nick Lewycky4e785c92011-12-06 03:33:03 +0000623 Options.StackAlignmentOverride = CodeGenOpts.StackAlignment;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700624 Options.FunctionSections = CodeGenOpts.FunctionSections;
625 Options.DataSections = CodeGenOpts.DataSections;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700626 Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800627 Options.EmulatedTLS = CodeGenOpts.EmulatedTLS;
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700628 Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700629
630 Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
631 Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
632 Options.MCOptions.MCUseDwarfDirectory = !CodeGenOpts.NoDwarfDirectoryAsm;
633 Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800634 Options.MCOptions.MCIncrementalLinkerCompatible =
635 CodeGenOpts.IncrementalLinkerCompatible;
Stephen Hines176edba2014-12-01 14:53:08 -0800636 Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700637 Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700638 Options.MCOptions.ABIName = TargetOpts.ABI;
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000639
Evan Cheng368691e2011-06-30 02:06:32 +0000640 TargetMachine *TM = TheTarget->createTargetMachine(Triple, TargetOpts.CPU,
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000641 FeaturesStr, Options,
642 RM, CM, OptLevel);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000643
Nadav Rotemfa60be02012-10-24 00:53:38 +0000644 return TM;
645}
646
647bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700648 raw_pwrite_stream &OS) {
Nadav Rotemfa60be02012-10-24 00:53:38 +0000649
Daniel Dunbar897c6762010-06-07 23:20:08 +0000650 // Create the code generator passes.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700651 legacy::PassManager *PM = getCodeGenPasses();
Daniel Dunbar897c6762010-06-07 23:20:08 +0000652
Chad Rosier3f3335d2012-02-29 20:14:59 +0000653 // Add LibraryInfo.
Daniel Dunbarcbbe2c02012-10-19 20:10:10 +0000654 llvm::Triple TargetTriple(TheModule->getTargetTriple());
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700655 std::unique_ptr<TargetLibraryInfoImpl> TLII(
656 createTLII(TargetTriple, CodeGenOpts));
657 PM->add(new TargetLibraryInfoWrapperPass(*TLII));
Nadav Rotem25030c42012-10-19 04:15:32 +0000658
Daniel Dunbar897c6762010-06-07 23:20:08 +0000659 // Normal mode, emit a .s or .o file by running the code generator. Note,
660 // this also adds codegenerator level optimization passes.
661 TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
662 if (Action == Backend_EmitObj)
663 CGFT = TargetMachine::CGFT_ObjectFile;
664 else if (Action == Backend_EmitMCNull)
665 CGFT = TargetMachine::CGFT_Null;
666 else
667 assert(Action == Backend_EmitAssembly && "Invalid action!");
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000668
669 // Add ObjC ARC final-cleanup optimizations. This is done as part of the
670 // "codegen" passes so that it isn't run multiple times when there is
671 // inlining happening.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700672 if (CodeGenOpts.OptimizationLevel > 0)
Dan Gohmanb18b8ad2011-07-05 22:02:36 +0000673 PM->add(createObjCARCContractPass());
674
Evan Cheng9254bf72011-11-16 08:38:55 +0000675 if (TM->addPassesToEmitFile(*PM, OS, CGFT,
Daniel Dunbar897c6762010-06-07 23:20:08 +0000676 /*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
677 Diags.Report(diag::err_fe_unable_to_interface_with_target);
678 return false;
679 }
680
681 return true;
682}
683
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700684void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
685 raw_pwrite_stream *OS) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700686 TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : nullptr);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000687
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700688 setCommandLineOpts();
689
Nadav Rotem129369d2012-10-24 03:52:31 +0000690 bool UsesCodeGen = (Action != Backend_EmitNothing &&
691 Action != Backend_EmitBC &&
692 Action != Backend_EmitLL);
Stephen Hines651f13c2014-04-23 16:59:28 -0700693 if (!TM)
694 TM.reset(CreateTargetMachine(UsesCodeGen));
695
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800696 if (UsesCodeGen && !TM)
697 return;
698 if (TM)
699 TheModule->setDataLayout(TM->createDataLayout());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700700
701 // If we are performing a ThinLTO importing compile, load the function
702 // index into memory and pass it into CreatePasses, which will add it
703 // to the PassManagerBuilder and invoke LTO passes.
704 std::unique_ptr<ModuleSummaryIndex> ModuleSummary;
705 if (!CodeGenOpts.ThinLTOIndexFile.empty()) {
706 ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
707 llvm::getModuleSummaryIndexForFile(
708 CodeGenOpts.ThinLTOIndexFile, [&](const DiagnosticInfo &DI) {
709 TheModule->getContext().diagnose(DI);
710 });
711 if (std::error_code EC = IndexOrErr.getError()) {
712 std::string Error = EC.message();
713 errs() << "Error loading index file '" << CodeGenOpts.ThinLTOIndexFile
714 << "': " << Error << "\n";
715 return;
716 }
717 ModuleSummary = std::move(IndexOrErr.get());
718 assert(ModuleSummary && "Expected non-empty module summary index");
719 }
720
721 CreatePasses(ModuleSummary.get());
Nadav Rotemfa60be02012-10-24 00:53:38 +0000722
Daniel Dunbar897c6762010-06-07 23:20:08 +0000723 switch (Action) {
724 case Backend_EmitNothing:
725 break;
726
727 case Backend_EmitBC:
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800728 getPerModulePasses()->add(createBitcodeWriterPass(
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700729 *OS, CodeGenOpts.EmitLLVMUseLists, CodeGenOpts.EmitSummaryIndex,
730 CodeGenOpts.EmitSummaryIndex));
Daniel Dunbar897c6762010-06-07 23:20:08 +0000731 break;
732
733 case Backend_EmitLL:
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700734 getPerModulePasses()->add(
735 createPrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists));
Daniel Dunbar897c6762010-06-07 23:20:08 +0000736 break;
737
738 default:
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700739 if (!AddEmitPasses(Action, *OS))
Daniel Dunbar897c6762010-06-07 23:20:08 +0000740 return;
741 }
742
Andrew Trick92b5d942011-04-05 18:56:55 +0000743 // Before executing passes, print the final values of the LLVM options.
744 cl::PrintOptionValues();
745
Daniel Dunbar897c6762010-06-07 23:20:08 +0000746 // Run passes. For now we do all passes at once, but eventually we
747 // would like to have the option of streaming code generation.
748
749 if (PerFunctionPasses) {
750 PrettyStackTraceString CrashInfo("Per-function optimization");
751
752 PerFunctionPasses->doInitialization();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700753 for (Function &F : *TheModule)
754 if (!F.isDeclaration())
755 PerFunctionPasses->run(F);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000756 PerFunctionPasses->doFinalization();
757 }
758
759 if (PerModulePasses) {
760 PrettyStackTraceString CrashInfo("Per-module optimization passes");
761 PerModulePasses->run(*TheModule);
762 }
763
764 if (CodeGenPasses) {
765 PrettyStackTraceString CrashInfo("Code generation");
Daniel Dunbardb2f2372010-09-17 07:35:16 +0000766 CodeGenPasses->run(*TheModule);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000767 }
768}
769
David Blaikied6471f72011-09-25 23:23:43 +0000770void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
771 const CodeGenOptions &CGOpts,
Nick Lewycky3aaeccc2011-12-02 22:17:00 +0000772 const clang::TargetOptions &TOpts,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700773 const LangOptions &LOpts, const llvm::DataLayout &TDesc,
Stephen Hines651f13c2014-04-23 16:59:28 -0700774 Module *M, BackendAction Action,
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700775 raw_pwrite_stream *OS) {
776 EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M);
Daniel Dunbar897c6762010-06-07 23:20:08 +0000777
778 AsmHelper.EmitAssembly(Action, OS);
Stephen Hines651f13c2014-04-23 16:59:28 -0700779
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700780 // Verify clang's TargetInfo DataLayout against the LLVM TargetMachine's
781 // DataLayout.
782 if (AsmHelper.TM) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800783 std::string DLDesc = M->getDataLayout().getStringRepresentation();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700784 if (DLDesc != TDesc.getStringRepresentation()) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700785 unsigned DiagID = Diags.getCustomDiagID(
786 DiagnosticsEngine::Error, "backend data layout '%0' does not match "
787 "expected target description '%1'");
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700788 Diags.Report(DiagID) << DLDesc << TDesc.getStringRepresentation();
Stephen Hines651f13c2014-04-23 16:59:28 -0700789 }
790 }
Daniel Dunbar897c6762010-06-07 23:20:08 +0000791}
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700792
793static const char* getSectionNameForBitcode(const Triple &T) {
794 switch (T.getObjectFormat()) {
795 case Triple::MachO:
796 return "__LLVM,__bitcode";
797 case Triple::COFF:
798 case Triple::ELF:
799 case Triple::UnknownObjectFormat:
800 return ".llvmbc";
801 }
802 llvm_unreachable("Unimplemented ObjectFormatType");
803}
804
805static const char* getSectionNameForCommandline(const Triple &T) {
806 switch (T.getObjectFormat()) {
807 case Triple::MachO:
808 return "__LLVM,__cmdline";
809 case Triple::COFF:
810 case Triple::ELF:
811 case Triple::UnknownObjectFormat:
812 return ".llvmcmd";
813 }
814 llvm_unreachable("Unimplemented ObjectFormatType");
815}
816
817// With -fembed-bitcode, save a copy of the llvm IR as data in the
818// __LLVM,__bitcode section.
819void clang::EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts,
820 llvm::MemoryBufferRef Buf) {
821 if (CGOpts.getEmbedBitcode() == CodeGenOptions::Embed_Off)
822 return;
823
824 // Save llvm.compiler.used and remote it.
825 SmallVector<Constant*, 2> UsedArray;
826 SmallSet<GlobalValue*, 4> UsedGlobals;
827 Type *UsedElementType = Type::getInt8Ty(M->getContext())->getPointerTo(0);
828 GlobalVariable *Used = collectUsedGlobalVariables(*M, UsedGlobals, true);
829 for (auto *GV : UsedGlobals) {
830 if (GV->getName() != "llvm.embedded.module" &&
831 GV->getName() != "llvm.cmdline")
832 UsedArray.push_back(
833 ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
834 }
835 if (Used)
836 Used->eraseFromParent();
837
838 // Embed the bitcode for the llvm module.
839 std::string Data;
840 ArrayRef<uint8_t> ModuleData;
841 Triple T(M->getTargetTriple());
842 // Create a constant that contains the bitcode.
843 // In case of embedding a marker, ignore the input Buf and use the empty
844 // ArrayRef. It is also legal to create a bitcode marker even Buf is empty.
845 if (CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Marker) {
846 if (!isBitcode((const unsigned char *)Buf.getBufferStart(),
847 (const unsigned char *)Buf.getBufferEnd())) {
848 // If the input is LLVM Assembly, bitcode is produced by serializing
849 // the module. Use-lists order need to be perserved in this case.
850 llvm::raw_string_ostream OS(Data);
851 llvm::WriteBitcodeToFile(M, OS, /* ShouldPreserveUseListOrder */ true);
852 ModuleData =
853 ArrayRef<uint8_t>((const uint8_t *)OS.str().data(), OS.str().size());
854 } else
855 // If the input is LLVM bitcode, write the input byte stream directly.
856 ModuleData = ArrayRef<uint8_t>((const uint8_t *)Buf.getBufferStart(),
857 Buf.getBufferSize());
858 }
859 llvm::Constant *ModuleConstant =
860 llvm::ConstantDataArray::get(M->getContext(), ModuleData);
861 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
862 *M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage,
863 ModuleConstant);
864 GV->setSection(getSectionNameForBitcode(T));
865 UsedArray.push_back(
866 ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
867 if (llvm::GlobalVariable *Old =
868 M->getGlobalVariable("llvm.embedded.module", true)) {
869 assert(Old->hasOneUse() &&
870 "llvm.embedded.module can only be used once in llvm.compiler.used");
871 GV->takeName(Old);
872 Old->eraseFromParent();
873 } else {
874 GV->setName("llvm.embedded.module");
875 }
876
877 // Skip if only bitcode needs to be embedded.
878 if (CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Bitcode) {
879 // Embed command-line options.
880 ArrayRef<uint8_t> CmdData(const_cast<uint8_t *>(CGOpts.CmdArgs.data()),
881 CGOpts.CmdArgs.size());
882 llvm::Constant *CmdConstant =
883 llvm::ConstantDataArray::get(M->getContext(), CmdData);
884 GV = new llvm::GlobalVariable(*M, CmdConstant->getType(), true,
885 llvm::GlobalValue::PrivateLinkage,
886 CmdConstant);
887 GV->setSection(getSectionNameForCommandline(T));
888 UsedArray.push_back(
889 ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
890 if (llvm::GlobalVariable *Old =
891 M->getGlobalVariable("llvm.cmdline", true)) {
892 assert(Old->hasOneUse() &&
893 "llvm.cmdline can only be used once in llvm.compiler.used");
894 GV->takeName(Old);
895 Old->eraseFromParent();
896 } else {
897 GV->setName("llvm.cmdline");
898 }
899 }
900
901 if (UsedArray.empty())
902 return;
903
904 // Recreate llvm.compiler.used.
905 ArrayType *ATy = ArrayType::get(UsedElementType, UsedArray.size());
906 auto *NewUsed = new GlobalVariable(
907 *M, ATy, false, llvm::GlobalValue::AppendingLinkage,
908 llvm::ConstantArray::get(ATy, UsedArray), "llvm.compiler.used");
909 NewUsed->setSection("llvm.metadata");
910}