1c1b1729bSDaniel Dunbar //===--- BackendUtil.cpp - LLVM Backend Utilities -------------------------===//
2c1b1729bSDaniel Dunbar //
3c1b1729bSDaniel Dunbar //                     The LLVM Compiler Infrastructure
4c1b1729bSDaniel Dunbar //
5c1b1729bSDaniel Dunbar // This file is distributed under the University of Illinois Open Source
6c1b1729bSDaniel Dunbar // License. See LICENSE.TXT for details.
7c1b1729bSDaniel Dunbar //
8c1b1729bSDaniel Dunbar //===----------------------------------------------------------------------===//
9c1b1729bSDaniel Dunbar 
10c1b1729bSDaniel Dunbar #include "clang/CodeGen/BackendUtil.h"
11c1b1729bSDaniel Dunbar #include "clang/Basic/Diagnostic.h"
12fec0ff84SDan Gohman #include "clang/Basic/LangOptions.h"
133a02247dSChandler Carruth #include "clang/Basic/TargetOptions.h"
1410a4972aSSaleem Abdulrasool #include "clang/Frontend/CodeGenOptions.h"
15c1b1729bSDaniel Dunbar #include "clang/Frontend/FrontendDiagnostic.h"
16ce2c726eSKostya Serebryany #include "clang/Frontend/Utils.h"
17583a1f72SEric Christopher #include "llvm/ADT/StringExtras.h"
1862849c67SSaleem Abdulrasool #include "llvm/ADT/StringSwitch.h"
1927fb5227SSteven Wu #include "llvm/ADT/Triple.h"
20418bd1abSChandler Carruth #include "llvm/Analysis/TargetLibraryInfo.h"
21aab5ec07SChandler Carruth #include "llvm/Analysis/TargetTransformInfo.h"
221b3304deSChandler Carruth #include "llvm/Bitcode/BitcodeWriterPass.h"
2327fb5227SSteven Wu #include "llvm/Bitcode/ReaderWriter.h"
24c1b1729bSDaniel Dunbar #include "llvm/CodeGen/RegAllocRegistry.h"
25c1b1729bSDaniel Dunbar #include "llvm/CodeGen/SchedulerRegistry.h"
26ffd5551bSChandler Carruth #include "llvm/IR/DataLayout.h"
2710a4972aSSaleem Abdulrasool #include "llvm/IR/ModuleSummaryIndex.h"
280a50c496SChandler Carruth #include "llvm/IR/IRPrintingPasses.h"
299828e69aSChandler Carruth #include "llvm/IR/LegacyPassManager.h"
30ffd5551bSChandler Carruth #include "llvm/IR/Module.h"
31ca88474aSChandler Carruth #include "llvm/IR/Verifier.h"
329e3f4746STeresa Johnson #include "llvm/LTO/LTOBackend.h"
33eeb486ddSEvan Cheng #include "llvm/MC/SubtargetFeature.h"
34a0d29406STeresa Johnson #include "llvm/Object/ModuleSummaryIndexObjectFile.h"
35c1b1729bSDaniel Dunbar #include "llvm/Support/CommandLine.h"
369e3f4746STeresa Johnson #include "llvm/Support/MemoryBuffer.h"
37c1b1729bSDaniel Dunbar #include "llvm/Support/PrettyStackTrace.h"
38494eb062SEvan Cheng #include "llvm/Support/TargetRegistry.h"
39c1b1729bSDaniel Dunbar #include "llvm/Support/Timer.h"
40c1b1729bSDaniel Dunbar #include "llvm/Support/raw_ostream.h"
41c1b1729bSDaniel Dunbar #include "llvm/Target/TargetMachine.h"
42c1b1729bSDaniel Dunbar #include "llvm/Target/TargetOptions.h"
433de0853bSEric Christopher #include "llvm/Target/TargetSubtargetInfo.h"
4456a7dab0SRafael Espindola #include "llvm/Transforms/IPO.h"
45*b72c19f1SChandler Carruth #include "llvm/Transforms/IPO/AlwaysInliner.h"
4656a7dab0SRafael Espindola #include "llvm/Transforms/IPO/PassManagerBuilder.h"
473a02247dSChandler Carruth #include "llvm/Transforms/Instrumentation.h"
4890cae773SMichael Gottesman #include "llvm/Transforms/ObjCARC.h"
4956a7dab0SRafael Espindola #include "llvm/Transforms/Scalar.h"
504ddaadcaSChandler Carruth #include "llvm/Transforms/Scalar/GVN.h"
5176a4b95aSSaleem Abdulrasool #include "llvm/Transforms/Utils/SymbolRewriter.h"
52dfca6f97SAhmed Charles #include <memory>
53c1b1729bSDaniel Dunbar using namespace clang;
54c1b1729bSDaniel Dunbar using namespace llvm;
55c1b1729bSDaniel Dunbar 
56c1b1729bSDaniel Dunbar namespace {
57c1b1729bSDaniel Dunbar 
58c1b1729bSDaniel Dunbar class EmitAssemblyHelper {
599c902b55SDavid Blaikie   DiagnosticsEngine &Diags;
60c1b1729bSDaniel Dunbar   const CodeGenOptions &CodeGenOpts;
61432add5bSNick Lewycky   const clang::TargetOptions &TargetOpts;
62fec0ff84SDan Gohman   const LangOptions &LangOpts;
63c1b1729bSDaniel Dunbar   Module *TheModule;
64c1b1729bSDaniel Dunbar 
65c1b1729bSDaniel Dunbar   Timer CodeGenerationTime;
66c1b1729bSDaniel Dunbar 
6703f8907fSPeter Collingbourne   std::unique_ptr<raw_pwrite_stream> OS;
68c1b1729bSDaniel Dunbar 
69c1b1729bSDaniel Dunbar private:
70d294bdb5SChandler Carruth   TargetIRAnalysis getTargetIRAnalysis() const {
71aab5ec07SChandler Carruth     if (TM)
72d294bdb5SChandler Carruth       return TM->getTargetIRAnalysis();
73aab5ec07SChandler Carruth 
74d294bdb5SChandler Carruth     return TargetIRAnalysis();
75aab5ec07SChandler Carruth   }
76aab5ec07SChandler Carruth 
77b5e80c31SYaxun Liu   /// Set LLVM command line options passed through -backend-option.
78b5e80c31SYaxun Liu   void setCommandLineOpts();
79b5e80c31SYaxun Liu 
809e3f4746STeresa Johnson   void CreatePasses(legacy::PassManager &MPM, legacy::FunctionPassManager &FPM);
81ec57ab37SNadav Rotem 
822f16bc10SRafael Espindola   /// Generates the TargetMachine.
8303f8907fSPeter Collingbourne   /// Leaves TM unchanged if it is unable to create the target machine.
84dc06b2d3SNadav Rotem   /// Some of our clang tests specify triples which are not built
85dc06b2d3SNadav Rotem   /// into clang. This is okay because these tests check the generated
86dc06b2d3SNadav Rotem   /// IR, and they require DataLayout which depends on the triple.
87dc06b2d3SNadav Rotem   /// In this case, we allow this method to fail and not report an error.
88dc06b2d3SNadav Rotem   /// When MustCreateTM is used, we print an error if we are unable to load
89dc06b2d3SNadav Rotem   /// the requested target.
9003f8907fSPeter Collingbourne   void CreateTargetMachine(bool MustCreateTM);
91c1b1729bSDaniel Dunbar 
922f16bc10SRafael Espindola   /// Add passes necessary to emit assembly or LLVM IR.
93c1b1729bSDaniel Dunbar   ///
94c1b1729bSDaniel Dunbar   /// \return True on success.
9503f8907fSPeter Collingbourne   bool AddEmitPasses(legacy::PassManager &CodeGenPasses, BackendAction Action,
9603f8907fSPeter Collingbourne                      raw_pwrite_stream &OS);
97c1b1729bSDaniel Dunbar 
98c1b1729bSDaniel Dunbar public:
99aff22327STeresa Johnson   EmitAssemblyHelper(DiagnosticsEngine &_Diags, const CodeGenOptions &CGOpts,
100432add5bSNick Lewycky                      const clang::TargetOptions &TOpts,
1014b4f4b90STeresa Johnson                      const LangOptions &LOpts, Module *M)
102fec0ff84SDan Gohman       : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), LangOpts(LOpts),
10303f8907fSPeter Collingbourne         TheModule(M), CodeGenerationTime("Code Generation Time") {}
104c1b1729bSDaniel Dunbar 
105c1b1729bSDaniel Dunbar   ~EmitAssemblyHelper() {
106f4e22381SAlp Toker     if (CodeGenOpts.DisableFree)
107a97eaa1bSDavid Blaikie       BuryPointer(std::move(TM));
108c1b1729bSDaniel Dunbar   }
109c1b1729bSDaniel Dunbar 
110b8984329SAhmed Charles   std::unique_ptr<TargetMachine> TM;
111f4e22381SAlp Toker 
11203f8907fSPeter Collingbourne   void EmitAssembly(BackendAction Action,
11303f8907fSPeter Collingbourne                     std::unique_ptr<raw_pwrite_stream> OS);
114c1b1729bSDaniel Dunbar };
115c1b1729bSDaniel Dunbar 
116c6515b6aSAlexey Samsonov // We need this wrapper to access LangOpts and CGOpts from extension functions
117c6515b6aSAlexey Samsonov // that we add to the PassManagerBuilder.
1180e96becfSAlexey Samsonov class PassManagerBuilderWrapper : public PassManagerBuilder {
1190e96becfSAlexey Samsonov public:
1209ab73626SAlexey Samsonov   PassManagerBuilderWrapper(const CodeGenOptions &CGOpts,
1219ab73626SAlexey Samsonov                             const LangOptions &LangOpts)
1229ab73626SAlexey Samsonov       : PassManagerBuilder(), CGOpts(CGOpts), LangOpts(LangOpts) {}
1239ab73626SAlexey Samsonov   const CodeGenOptions &getCGOpts() const { return CGOpts; }
1240e96becfSAlexey Samsonov   const LangOptions &getLangOpts() const { return LangOpts; }
1250e96becfSAlexey Samsonov private:
1269ab73626SAlexey Samsonov   const CodeGenOptions &CGOpts;
1270e96becfSAlexey Samsonov   const LangOptions &LangOpts;
1280e96becfSAlexey Samsonov };
1290e96becfSAlexey Samsonov 
130ab9db510SAlexander Kornienko }
131c1b1729bSDaniel Dunbar 
1325932ce25SDan Gohman static void addObjCARCAPElimPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
1335932ce25SDan Gohman   if (Builder.OptLevel > 0)
1345932ce25SDan Gohman     PM.add(createObjCARCAPElimPass());
1355932ce25SDan Gohman }
1365932ce25SDan Gohman 
137fec0ff84SDan Gohman static void addObjCARCExpandPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
138fec0ff84SDan Gohman   if (Builder.OptLevel > 0)
139fec0ff84SDan Gohman     PM.add(createObjCARCExpandPass());
140fec0ff84SDan Gohman }
141fec0ff84SDan Gohman 
142fec0ff84SDan Gohman static void addObjCARCOptPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {
143fec0ff84SDan Gohman   if (Builder.OptLevel > 0)
144fec0ff84SDan Gohman     PM.add(createObjCARCOptPass());
145fec0ff84SDan Gohman }
146fec0ff84SDan Gohman 
147b56be645SDiego Novillo static void addAddDiscriminatorsPass(const PassManagerBuilder &Builder,
1488f4f5090SChandler Carruth                                      legacy::PassManagerBase &PM) {
149b56be645SDiego Novillo   PM.add(createAddDiscriminatorsPass());
150b56be645SDiego Novillo }
151b56be645SDiego Novillo 
152bd3ed3c5SDehao Chen static void addCleanupPassesForSampleProfiler(
153bd3ed3c5SDehao Chen     const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
154bd3ed3c5SDehao Chen   // instcombine is needed before sample profile annotation because it converts
155bd3ed3c5SDehao Chen   // certain function calls to be inlinable. simplifycfg and sroa are needed
156bd3ed3c5SDehao Chen   // before instcombine for necessary preparation. E.g. load store is eliminated
157bd3ed3c5SDehao Chen   // properly so that instcombine will not introduce unecessary liverange.
158bd3ed3c5SDehao Chen   PM.add(createCFGSimplificationPass());
159bd3ed3c5SDehao Chen   PM.add(createSROAPass());
160ed8c1beeSDehao Chen   PM.add(createInstructionCombiningPass());
161ed8c1beeSDehao Chen }
162ed8c1beeSDehao Chen 
163a425589fSNuno Lopes static void addBoundsCheckingPass(const PassManagerBuilder &Builder,
1648f4f5090SChandler Carruth                                   legacy::PassManagerBase &PM) {
165ebc59d5eSJoey Gouly   PM.add(createBoundsCheckingPass());
166a425589fSNuno Lopes }
167a425589fSNuno Lopes 
16875b4f9e1SKostya Serebryany static void addSanitizerCoveragePass(const PassManagerBuilder &Builder,
1698f4f5090SChandler Carruth                                      legacy::PassManagerBase &PM) {
17075b4f9e1SKostya Serebryany   const PassManagerBuilderWrapper &BuilderWrapper =
17175b4f9e1SKostya Serebryany       static_cast<const PassManagerBuilderWrapper&>(Builder);
17275b4f9e1SKostya Serebryany   const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
1733f3b3abeSAlexey Samsonov   SanitizerCoverageOptions Opts;
1743f3b3abeSAlexey Samsonov   Opts.CoverageType =
1753f3b3abeSAlexey Samsonov       static_cast<SanitizerCoverageOptions::Type>(CGOpts.SanitizeCoverageType);
1763f3b3abeSAlexey Samsonov   Opts.IndirectCalls = CGOpts.SanitizeCoverageIndirectCalls;
1773f3b3abeSAlexey Samsonov   Opts.TraceBB = CGOpts.SanitizeCoverageTraceBB;
1783f3b3abeSAlexey Samsonov   Opts.TraceCmp = CGOpts.SanitizeCoverageTraceCmp;
1793f3b3abeSAlexey Samsonov   Opts.Use8bitCounters = CGOpts.SanitizeCoverage8bitCounters;
180d4590c73SKostya Serebryany   Opts.TracePC = CGOpts.SanitizeCoverageTracePC;
1813f3b3abeSAlexey Samsonov   PM.add(createSanitizerCoverageModulePass(Opts));
18275b4f9e1SKostya Serebryany }
18375b4f9e1SKostya Serebryany 
1840e96becfSAlexey Samsonov static void addAddressSanitizerPasses(const PassManagerBuilder &Builder,
1858f4f5090SChandler Carruth                                       legacy::PassManagerBase &PM) {
1865bfeca12SYury Gribov   const PassManagerBuilderWrapper &BuilderWrapper =
1875bfeca12SYury Gribov       static_cast<const PassManagerBuilderWrapper&>(Builder);
1885bfeca12SYury Gribov   const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
1895bfeca12SYury Gribov   bool Recover = CGOpts.SanitizeRecover.has(SanitizerKind::Address);
1909d4eb6f3SVitaly Buka   bool UseAfterScope = CGOpts.SanitizeAddressUseAfterScope;
1919d4eb6f3SVitaly Buka   PM.add(createAddressSanitizerFunctionPass(/*CompileKernel*/ false, Recover,
1929d4eb6f3SVitaly Buka                                             UseAfterScope));
1935bfeca12SYury Gribov   PM.add(createAddressSanitizerModulePass(/*CompileKernel*/false, Recover));
194b9b73ef9SAlexander Potapenko }
195b9b73ef9SAlexander Potapenko 
196b9b73ef9SAlexander Potapenko static void addKernelAddressSanitizerPasses(const PassManagerBuilder &Builder,
197b9b73ef9SAlexander Potapenko                                             legacy::PassManagerBase &PM) {
1989d4eb6f3SVitaly Buka   PM.add(createAddressSanitizerFunctionPass(
1999d4eb6f3SVitaly Buka       /*CompileKernel*/ true,
2009d4eb6f3SVitaly Buka       /*Recover*/ true, /*UseAfterScope*/ false));
2015bfeca12SYury Gribov   PM.add(createAddressSanitizerModulePass(/*CompileKernel*/true,
2025bfeca12SYury Gribov                                           /*Recover*/true));
2038855ff61SKostya Serebryany }
2048855ff61SKostya Serebryany 
205aea92e53SEvgeniy Stepanov static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
2068f4f5090SChandler Carruth                                    legacy::PassManagerBase &PM) {
207ad8ab3d9SEvgeniy Stepanov   const PassManagerBuilderWrapper &BuilderWrapper =
208ad8ab3d9SEvgeniy Stepanov       static_cast<const PassManagerBuilderWrapper&>(Builder);
209ad8ab3d9SEvgeniy Stepanov   const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
2101cf07ea6SAlexey Samsonov   PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins));
21110284671SEvgeniy Stepanov 
21210284671SEvgeniy Stepanov   // MemorySanitizer inserts complex instrumentation that mostly follows
21310284671SEvgeniy Stepanov   // the logic of the original code, but operates on "shadow" values.
21410284671SEvgeniy Stepanov   // It can benefit from re-running some general purpose optimization passes.
21510284671SEvgeniy Stepanov   if (Builder.OptLevel > 0) {
21610284671SEvgeniy Stepanov     PM.add(createEarlyCSEPass());
21710284671SEvgeniy Stepanov     PM.add(createReassociatePass());
21810284671SEvgeniy Stepanov     PM.add(createLICMPass());
21910284671SEvgeniy Stepanov     PM.add(createGVNPass());
22010284671SEvgeniy Stepanov     PM.add(createInstructionCombiningPass());
22110284671SEvgeniy Stepanov     PM.add(createDeadStoreEliminationPass());
22210284671SEvgeniy Stepanov   }
223aea92e53SEvgeniy Stepanov }
224aea92e53SEvgeniy Stepanov 
22528a7a119SKostya Serebryany static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
2268f4f5090SChandler Carruth                                    legacy::PassManagerBase &PM) {
2271cf07ea6SAlexey Samsonov   PM.add(createThreadSanitizerPass());
22828a7a119SKostya Serebryany }
22928a7a119SKostya Serebryany 
230c377275aSPeter Collingbourne static void addDataFlowSanitizerPass(const PassManagerBuilder &Builder,
2318f4f5090SChandler Carruth                                      legacy::PassManagerBase &PM) {
232276be3c5SPeter Collingbourne   const PassManagerBuilderWrapper &BuilderWrapper =
233276be3c5SPeter Collingbourne       static_cast<const PassManagerBuilderWrapper&>(Builder);
234ae5804f3SAlexey Samsonov   const LangOptions &LangOpts = BuilderWrapper.getLangOpts();
235a511cdd2SAlexey Samsonov   PM.add(createDataFlowSanitizerPass(LangOpts.SanitizerBlacklistFiles));
236c377275aSPeter Collingbourne }
237c377275aSPeter Collingbourne 
238256c2e14SDerek Bruening static void addEfficiencySanitizerPass(const PassManagerBuilder &Builder,
239256c2e14SDerek Bruening                                        legacy::PassManagerBase &PM) {
240256c2e14SDerek Bruening   const PassManagerBuilderWrapper &BuilderWrapper =
241256c2e14SDerek Bruening       static_cast<const PassManagerBuilderWrapper&>(Builder);
242256c2e14SDerek Bruening   const LangOptions &LangOpts = BuilderWrapper.getLangOpts();
243256c2e14SDerek Bruening   EfficiencySanitizerOptions Opts;
244256c2e14SDerek Bruening   if (LangOpts.Sanitize.has(SanitizerKind::EfficiencyCacheFrag))
245256c2e14SDerek Bruening     Opts.ToolType = EfficiencySanitizerOptions::ESAN_CacheFrag;
246293772e7SDerek Bruening   else if (LangOpts.Sanitize.has(SanitizerKind::EfficiencyWorkingSet))
247293772e7SDerek Bruening     Opts.ToolType = EfficiencySanitizerOptions::ESAN_WorkingSet;
248256c2e14SDerek Bruening   PM.add(createEfficiencySanitizerPass(Opts));
249256c2e14SDerek Bruening }
250256c2e14SDerek Bruening 
25157bb7c7cSChandler Carruth static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
252b8a71c5eSRafael Espindola                                          const CodeGenOptions &CodeGenOpts) {
25357bb7c7cSChandler Carruth   TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
254b8a71c5eSRafael Espindola   if (!CodeGenOpts.SimplifyLibCalls)
25557bb7c7cSChandler Carruth     TLII->disableAllFunctions();
2567dbc9cf8SChad Rosier   else {
2577dbc9cf8SChad Rosier     // Disable individual libc/libm calls in TargetLibraryInfo.
2587dbc9cf8SChad Rosier     LibFunc::Func F;
2597dbc9cf8SChad Rosier     for (auto &FuncName : CodeGenOpts.getNoBuiltinFuncs())
2607dbc9cf8SChad Rosier       if (TLII->getLibFunc(FuncName, F))
2617dbc9cf8SChad Rosier         TLII->setUnavailable(F);
2627dbc9cf8SChad Rosier   }
263c888dd0cSMichael Zolotukhin 
264c888dd0cSMichael Zolotukhin   switch (CodeGenOpts.getVecLib()) {
265c888dd0cSMichael Zolotukhin   case CodeGenOptions::Accelerate:
266c888dd0cSMichael Zolotukhin     TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate);
267c888dd0cSMichael Zolotukhin     break;
2686731deadSMatt Masten   case CodeGenOptions::SVML:
2696731deadSMatt Masten     TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML);
2706731deadSMatt Masten     break;
271c888dd0cSMichael Zolotukhin   default:
272c888dd0cSMichael Zolotukhin     break;
273c888dd0cSMichael Zolotukhin   }
27457bb7c7cSChandler Carruth   return TLII;
275b8a71c5eSRafael Espindola }
276b8a71c5eSRafael Espindola 
27776a4b95aSSaleem Abdulrasool static void addSymbolRewriterPass(const CodeGenOptions &Opts,
2788f4f5090SChandler Carruth                                   legacy::PassManager *MPM) {
27976a4b95aSSaleem Abdulrasool   llvm::SymbolRewriter::RewriteDescriptorList DL;
28076a4b95aSSaleem Abdulrasool 
28176a4b95aSSaleem Abdulrasool   llvm::SymbolRewriter::RewriteMapParser MapParser;
28276a4b95aSSaleem Abdulrasool   for (const auto &MapFile : Opts.RewriteMapFiles)
28376a4b95aSSaleem Abdulrasool     MapParser.parse(MapFile, &DL);
28476a4b95aSSaleem Abdulrasool 
28576a4b95aSSaleem Abdulrasool   MPM->add(createRewriteSymbolsPass(DL));
28676a4b95aSSaleem Abdulrasool }
28776a4b95aSSaleem Abdulrasool 
28803f8907fSPeter Collingbourne void EmitAssemblyHelper::CreatePasses(legacy::PassManager &MPM,
2899e3f4746STeresa Johnson                                       legacy::FunctionPassManager &FPM) {
290546a1962SSteven Wu   if (CodeGenOpts.DisableLLVMPasses)
291546a1962SSteven Wu     return;
292546a1962SSteven Wu 
293c1b1729bSDaniel Dunbar   unsigned OptLevel = CodeGenOpts.OptimizationLevel;
294b0eea8b5SDouglas Gregor   CodeGenOptions::InliningMethod Inlining = CodeGenOpts.getInlining();
295c1b1729bSDaniel Dunbar 
296c1b1729bSDaniel Dunbar   // Handle disabling of LLVM optimization, where we want to preserve the
297c1b1729bSDaniel Dunbar   // internal module before any optimization.
298c1b1729bSDaniel Dunbar   if (CodeGenOpts.DisableLLVMOpts) {
299c1b1729bSDaniel Dunbar     OptLevel = 0;
300c1b1729bSDaniel Dunbar     Inlining = CodeGenOpts.NoInlining;
301c1b1729bSDaniel Dunbar   }
302c1b1729bSDaniel Dunbar 
3039ab73626SAlexey Samsonov   PassManagerBuilderWrapper PMBuilder(CodeGenOpts, LangOpts);
304aff22327STeresa Johnson 
305aff22327STeresa Johnson   // Figure out TargetLibraryInfo.
306aff22327STeresa Johnson   Triple TargetTriple(TheModule->getTargetTriple());
307aff22327STeresa Johnson   PMBuilder.LibraryInfo = createTLII(TargetTriple, CodeGenOpts);
308aff22327STeresa Johnson 
309aff22327STeresa Johnson   switch (Inlining) {
310aff22327STeresa Johnson   case CodeGenOptions::NoInlining:
311aff22327STeresa Johnson     break;
31244d061a4SHans Wennborg   case CodeGenOptions::NormalInlining:
31344d061a4SHans Wennborg   case CodeGenOptions::OnlyHintInlining: {
314aff22327STeresa Johnson     PMBuilder.Inliner =
315aff22327STeresa Johnson         createFunctionInliningPass(OptLevel, CodeGenOpts.OptimizeSize);
316aff22327STeresa Johnson     break;
317aff22327STeresa Johnson   }
318aff22327STeresa Johnson   case CodeGenOptions::OnlyAlwaysInlining:
319aff22327STeresa Johnson     // Respect always_inline.
320aff22327STeresa Johnson     if (OptLevel == 0)
321aff22327STeresa Johnson       // Do not insert lifetime intrinsics at -O0.
322*b72c19f1SChandler Carruth       PMBuilder.Inliner = createAlwaysInlinerLegacyPass(false);
323aff22327STeresa Johnson     else
324*b72c19f1SChandler Carruth       PMBuilder.Inliner = createAlwaysInlinerLegacyPass();
325aff22327STeresa Johnson     break;
326aff22327STeresa Johnson   }
327aff22327STeresa Johnson 
328ecf0ba5bSChris Lattner   PMBuilder.OptLevel = OptLevel;
329ecf0ba5bSChris Lattner   PMBuilder.SizeLevel = CodeGenOpts.OptimizeSize;
330d3f3e4f0SNick Lewycky   PMBuilder.BBVectorize = CodeGenOpts.VectorizeBB;
331d3f3e4f0SNick Lewycky   PMBuilder.SLPVectorize = CodeGenOpts.VectorizeSLP;
332d3f3e4f0SNick Lewycky   PMBuilder.LoopVectorize = CodeGenOpts.VectorizeLoop;
333d98cec5cSChris Lattner 
334ecf0ba5bSChris Lattner   PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;
335f04f237eSNick Lewycky   PMBuilder.MergeFunctions = CodeGenOpts.MergeFunctions;
336a0d29406STeresa Johnson   PMBuilder.PrepareForThinLTO = CodeGenOpts.EmitSummaryIndex;
3378749d804STeresa Johnson   PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO;
338ce0697f4SHal Finkel   PMBuilder.RerollLoops = CodeGenOpts.RerollLoops;
3395c12367bSChris Lattner 
3405a7df9c1SJustin Lebar   // Add target-specific passes that need to run as early as possible.
3415a7df9c1SJustin Lebar   if (TM)
3425a7df9c1SJustin Lebar     PMBuilder.addExtension(
3435a7df9c1SJustin Lebar         PassManagerBuilder::EP_EarlyAsPossible,
3445a7df9c1SJustin Lebar         [&](const PassManagerBuilder &, legacy::PassManagerBase &PM) {
3455a7df9c1SJustin Lebar           TM->addEarlyAsPossiblePasses(PM);
3465a7df9c1SJustin Lebar         });
3475a7df9c1SJustin Lebar 
348b56be645SDiego Novillo   PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
349b56be645SDiego Novillo                          addAddDiscriminatorsPass);
350b56be645SDiego Novillo 
351fec0ff84SDan Gohman   // In ObjC ARC mode, add the main ARC optimization passes.
352fec0ff84SDan Gohman   if (LangOpts.ObjCAutoRefCount) {
353fec0ff84SDan Gohman     PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
354fec0ff84SDan Gohman                            addObjCARCExpandPass);
3555932ce25SDan Gohman     PMBuilder.addExtension(PassManagerBuilder::EP_ModuleOptimizerEarly,
3565932ce25SDan Gohman                            addObjCARCAPElimPass);
357fec0ff84SDan Gohman     PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
358fec0ff84SDan Gohman                            addObjCARCOptPass);
359fec0ff84SDan Gohman   }
360fec0ff84SDan Gohman 
361edf99a92SAlexey Samsonov   if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
362a425589fSNuno Lopes     PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
363a425589fSNuno Lopes                            addBoundsCheckingPass);
364a425589fSNuno Lopes     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
365a425589fSNuno Lopes                            addBoundsCheckingPass);
366a425589fSNuno Lopes   }
367a425589fSNuno Lopes 
368dfa908c8SAlexey Samsonov   if (CodeGenOpts.SanitizeCoverageType ||
369dfa908c8SAlexey Samsonov       CodeGenOpts.SanitizeCoverageIndirectCalls ||
370dfa908c8SAlexey Samsonov       CodeGenOpts.SanitizeCoverageTraceCmp) {
37175b4f9e1SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
37275b4f9e1SKostya Serebryany                            addSanitizerCoveragePass);
37375b4f9e1SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
37475b4f9e1SKostya Serebryany                            addSanitizerCoveragePass);
37575b4f9e1SKostya Serebryany   }
37675b4f9e1SKostya Serebryany 
377edf99a92SAlexey Samsonov   if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
3787e247f22SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
3790e96becfSAlexey Samsonov                            addAddressSanitizerPasses);
380d4768576SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
3810e96becfSAlexey Samsonov                            addAddressSanitizerPasses);
3828855ff61SKostya Serebryany   }
3838855ff61SKostya Serebryany 
384b9b73ef9SAlexander Potapenko   if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) {
385b9b73ef9SAlexander Potapenko     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
386b9b73ef9SAlexander Potapenko                            addKernelAddressSanitizerPasses);
387b9b73ef9SAlexander Potapenko     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
388b9b73ef9SAlexander Potapenko                            addKernelAddressSanitizerPasses);
389b9b73ef9SAlexander Potapenko   }
390b9b73ef9SAlexander Potapenko 
391edf99a92SAlexey Samsonov   if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
392aea92e53SEvgeniy Stepanov     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
393aea92e53SEvgeniy Stepanov                            addMemorySanitizerPass);
394aea92e53SEvgeniy Stepanov     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
395aea92e53SEvgeniy Stepanov                            addMemorySanitizerPass);
396aea92e53SEvgeniy Stepanov   }
397aea92e53SEvgeniy Stepanov 
398edf99a92SAlexey Samsonov   if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
399d18cb502SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
40028a7a119SKostya Serebryany                            addThreadSanitizerPass);
40128a7a119SKostya Serebryany     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
40228a7a119SKostya Serebryany                            addThreadSanitizerPass);
40328a7a119SKostya Serebryany   }
40428a7a119SKostya Serebryany 
405edf99a92SAlexey Samsonov   if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
406c377275aSPeter Collingbourne     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
407c377275aSPeter Collingbourne                            addDataFlowSanitizerPass);
408c377275aSPeter Collingbourne     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
409c377275aSPeter Collingbourne                            addDataFlowSanitizerPass);
410c377275aSPeter Collingbourne   }
411c377275aSPeter Collingbourne 
412256c2e14SDerek Bruening   if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Efficiency)) {
413256c2e14SDerek Bruening     PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
414256c2e14SDerek Bruening                            addEfficiencySanitizerPass);
415256c2e14SDerek Bruening     PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
416256c2e14SDerek Bruening                            addEfficiencySanitizerPass);
417256c2e14SDerek Bruening   }
418256c2e14SDerek Bruening 
4195c12367bSChris Lattner   // Set up the per-function pass manager.
4205c12367bSChris Lattner   if (CodeGenOpts.VerifyModule)
42103f8907fSPeter Collingbourne     FPM.add(createVerifierPass());
4225c12367bSChris Lattner 
4235c12367bSChris Lattner   // Set up the per-module pass manager.
42476a4b95aSSaleem Abdulrasool   if (!CodeGenOpts.RewriteMapFiles.empty())
42503f8907fSPeter Collingbourne     addSymbolRewriterPass(CodeGenOpts, &MPM);
426d98cec5cSChris Lattner 
427c02bbb61SNick Lewycky   if (!CodeGenOpts.DisableGCov &&
428c02bbb61SNick Lewycky       (CodeGenOpts.EmitGcovArcs || CodeGenOpts.EmitGcovNotes)) {
429c8bf8249SNick Lewycky     // Not using 'GCOVOptions::getDefault' allows us to avoid exiting if
430c8bf8249SNick Lewycky     // LLVM's -default-gcov-version flag is set to something invalid.
431c8bf8249SNick Lewycky     GCOVOptions Options;
432c8bf8249SNick Lewycky     Options.EmitNotes = CodeGenOpts.EmitGcovNotes;
433c8bf8249SNick Lewycky     Options.EmitData = CodeGenOpts.EmitGcovArcs;
434c8bf8249SNick Lewycky     memcpy(Options.Version, CodeGenOpts.CoverageVersion, 4);
435c8bf8249SNick Lewycky     Options.UseCfgChecksum = CodeGenOpts.CoverageExtraChecksum;
436c8bf8249SNick Lewycky     Options.NoRedZone = CodeGenOpts.DisableRedZone;
437c8bf8249SNick Lewycky     Options.FunctionNamesInData =
4386f15b290SNick Lewycky         !CodeGenOpts.CoverageNoFunctionNamesInData;
4394e46237cSJustin Bogner     Options.ExitBlockBeforeBody = CodeGenOpts.CoverageExitBlockBeforeBody;
44003f8907fSPeter Collingbourne     MPM.add(createGCOVProfilerPass(Options));
4418c30592eSBenjamin Kramer     if (CodeGenOpts.getDebugInfo() == codegenoptions::NoDebugInfo)
44203f8907fSPeter Collingbourne       MPM.add(createStripSymbolsPass(true));
443207bce31SNick Lewycky   }
444207bce31SNick Lewycky 
4459837ef56SRong Xu   if (CodeGenOpts.hasProfileClangInstr()) {
446970ac605SJustin Bogner     InstrProfOptions Options;
447970ac605SJustin Bogner     Options.NoRedZone = CodeGenOpts.DisableRedZone;
448a71e6817SJustin Bogner     Options.InstrProfileOutput = CodeGenOpts.InstrProfileOutput;
44903f8907fSPeter Collingbourne     MPM.add(createInstrProfilingLegacyPass(Options));
450970ac605SJustin Bogner   }
451522b5cb3SRong Xu   if (CodeGenOpts.hasProfileIRInstr()) {
452b65f8ae9SXinliang David Li     PMBuilder.EnablePGOInstrGen = true;
453522b5cb3SRong Xu     if (!CodeGenOpts.InstrProfileOutput.empty())
454522b5cb3SRong Xu       PMBuilder.PGOInstrGen = CodeGenOpts.InstrProfileOutput;
455522b5cb3SRong Xu     else
456b7b335a2SXinliang David Li       PMBuilder.PGOInstrGen = "default_%m.profraw";
457522b5cb3SRong Xu   }
4589c6f1538SRong Xu   if (CodeGenOpts.hasProfileIRUse())
4599c6f1538SRong Xu     PMBuilder.PGOInstrUse = CodeGenOpts.ProfileInstrumentUsePath;
460970ac605SJustin Bogner 
461ed8c1beeSDehao Chen   if (!CodeGenOpts.SampleProfileFile.empty()) {
46203f8907fSPeter Collingbourne     MPM.add(createPruneEHPass());
46303f8907fSPeter Collingbourne     MPM.add(createSampleProfileLoaderPass(CodeGenOpts.SampleProfileFile));
464ed8c1beeSDehao Chen     PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
465bd3ed3c5SDehao Chen                            addCleanupPassesForSampleProfiler);
466ed8c1beeSDehao Chen   }
467d3ef1083SDiego Novillo 
46803f8907fSPeter Collingbourne   PMBuilder.populateFunctionPassManager(FPM);
46903f8907fSPeter Collingbourne   PMBuilder.populateModulePassManager(MPM);
470c1b1729bSDaniel Dunbar }
471c1b1729bSDaniel Dunbar 
472b5e80c31SYaxun Liu void EmitAssemblyHelper::setCommandLineOpts() {
473b5e80c31SYaxun Liu   SmallVector<const char *, 16> BackendArgs;
474b5e80c31SYaxun Liu   BackendArgs.push_back("clang"); // Fake program name.
475b5e80c31SYaxun Liu   if (!CodeGenOpts.DebugPass.empty()) {
476b5e80c31SYaxun Liu     BackendArgs.push_back("-debug-pass");
477b5e80c31SYaxun Liu     BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
478b5e80c31SYaxun Liu   }
479b5e80c31SYaxun Liu   if (!CodeGenOpts.LimitFloatPrecision.empty()) {
480b5e80c31SYaxun Liu     BackendArgs.push_back("-limit-float-precision");
481b5e80c31SYaxun Liu     BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
482b5e80c31SYaxun Liu   }
483b5e80c31SYaxun Liu   for (const std::string &BackendOption : CodeGenOpts.BackendOptions)
484b5e80c31SYaxun Liu     BackendArgs.push_back(BackendOption.c_str());
485b5e80c31SYaxun Liu   BackendArgs.push_back(nullptr);
486b5e80c31SYaxun Liu   llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
487b5e80c31SYaxun Liu                                     BackendArgs.data());
488b5e80c31SYaxun Liu }
489b5e80c31SYaxun Liu 
49003f8907fSPeter Collingbourne void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
491c1b1729bSDaniel Dunbar   // Create the TargetMachine for generating code.
492c1b1729bSDaniel Dunbar   std::string Error;
493c1b1729bSDaniel Dunbar   std::string Triple = TheModule->getTargetTriple();
494c1b1729bSDaniel Dunbar   const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
495c1b1729bSDaniel Dunbar   if (!TheTarget) {
496dc06b2d3SNadav Rotem     if (MustCreateTM)
497ecafbe60SChad Rosier       Diags.Report(diag::err_fe_unable_to_create_target) << Error;
49803f8907fSPeter Collingbourne     return;
499c1b1729bSDaniel Dunbar   }
500c1b1729bSDaniel Dunbar 
50162849c67SSaleem Abdulrasool   unsigned CodeModel =
50262849c67SSaleem Abdulrasool     llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
50362849c67SSaleem Abdulrasool       .Case("small", llvm::CodeModel::Small)
50462849c67SSaleem Abdulrasool       .Case("kernel", llvm::CodeModel::Kernel)
50562849c67SSaleem Abdulrasool       .Case("medium", llvm::CodeModel::Medium)
50661449c6bSSaleem Abdulrasool       .Case("large", llvm::CodeModel::Large)
50762849c67SSaleem Abdulrasool       .Case("default", llvm::CodeModel::Default)
50862849c67SSaleem Abdulrasool       .Default(~0u);
50962849c67SSaleem Abdulrasool   assert(CodeModel != ~0u && "invalid code model!");
51062849c67SSaleem Abdulrasool   llvm::CodeModel::Model CM = static_cast<llvm::CodeModel::Model>(CodeModel);
511c1b1729bSDaniel Dunbar 
512583a1f72SEric Christopher   std::string FeaturesStr =
513583a1f72SEric Christopher       llvm::join(TargetOpts.Features.begin(), TargetOpts.Features.end(), ",");
5143f37dd06SEvan Cheng 
515924f6ad6SJoerg Sonnenberger   // Keep this synced with the equivalent code in tools/driver/cc1as_main.cpp.
5163c70d38dSRafael Espindola   llvm::Optional<llvm::Reloc::Model> RM;
5173f37dd06SEvan Cheng   if (CodeGenOpts.RelocationModel == "static") {
5183f37dd06SEvan Cheng     RM = llvm::Reloc::Static;
5193f37dd06SEvan Cheng   } else if (CodeGenOpts.RelocationModel == "pic") {
5203f37dd06SEvan Cheng     RM = llvm::Reloc::PIC_;
521218c4cbdSOliver Stannard   } else if (CodeGenOpts.RelocationModel == "ropi") {
522218c4cbdSOliver Stannard     RM = llvm::Reloc::ROPI;
523218c4cbdSOliver Stannard   } else if (CodeGenOpts.RelocationModel == "rwpi") {
524218c4cbdSOliver Stannard     RM = llvm::Reloc::RWPI;
525218c4cbdSOliver Stannard   } else if (CodeGenOpts.RelocationModel == "ropi-rwpi") {
526218c4cbdSOliver Stannard     RM = llvm::Reloc::ROPI_RWPI;
5273f37dd06SEvan Cheng   } else {
5283f37dd06SEvan Cheng     assert(CodeGenOpts.RelocationModel == "dynamic-no-pic" &&
5293f37dd06SEvan Cheng            "Invalid PIC model!");
5303f37dd06SEvan Cheng     RM = llvm::Reloc::DynamicNoPIC;
5313f37dd06SEvan Cheng   }
5323f37dd06SEvan Cheng 
533dd286bceSEvan Cheng   CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
534dd286bceSEvan Cheng   switch (CodeGenOpts.OptimizationLevel) {
535dd286bceSEvan Cheng   default: break;
536dd286bceSEvan Cheng   case 0: OptLevel = CodeGenOpt::None; break;
537dd286bceSEvan Cheng   case 3: OptLevel = CodeGenOpt::Aggressive; break;
538dd286bceSEvan Cheng   }
539dd286bceSEvan Cheng 
540432add5bSNick Lewycky   llvm::TargetOptions Options;
541432add5bSNick Lewycky 
5422987c29aSSanjay Patel   if (!TargetOpts.Reciprocals.empty())
5432987c29aSSanjay Patel     Options.Reciprocals = TargetRecip(TargetOpts.Reciprocals);
5442987c29aSSanjay Patel 
545b140a100SJonathan Roelofs   Options.ThreadModel =
546b140a100SJonathan Roelofs     llvm::StringSwitch<llvm::ThreadModel::Model>(CodeGenOpts.ThreadModel)
547b140a100SJonathan Roelofs       .Case("posix", llvm::ThreadModel::POSIX)
548b140a100SJonathan Roelofs       .Case("single", llvm::ThreadModel::Single);
549b140a100SJonathan Roelofs 
550432add5bSNick Lewycky   // Set float ABI type.
551b25445cbSSaleem Abdulrasool   assert((CodeGenOpts.FloatABI == "soft" || CodeGenOpts.FloatABI == "softfp" ||
552b25445cbSSaleem Abdulrasool           CodeGenOpts.FloatABI == "hard" || CodeGenOpts.FloatABI.empty()) &&
553b25445cbSSaleem Abdulrasool          "Invalid Floating Point ABI!");
554b25445cbSSaleem Abdulrasool   Options.FloatABIType =
555b25445cbSSaleem Abdulrasool       llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
556b25445cbSSaleem Abdulrasool           .Case("soft", llvm::FloatABI::Soft)
557b25445cbSSaleem Abdulrasool           .Case("softfp", llvm::FloatABI::Soft)
558b25445cbSSaleem Abdulrasool           .Case("hard", llvm::FloatABI::Hard)
559b25445cbSSaleem Abdulrasool           .Default(llvm::FloatABI::Default);
560432add5bSNick Lewycky 
561aa53b936SLang Hames   // Set FP fusion mode.
56265992f45SLang Hames   switch (CodeGenOpts.getFPContractMode()) {
56365992f45SLang Hames   case CodeGenOptions::FPC_Off:
564aa53b936SLang Hames     Options.AllowFPOpFusion = llvm::FPOpFusion::Strict;
565aa53b936SLang Hames     break;
56665992f45SLang Hames   case CodeGenOptions::FPC_On:
567aa53b936SLang Hames     Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
568aa53b936SLang Hames     break;
56965992f45SLang Hames   case CodeGenOptions::FPC_Fast:
570aa53b936SLang Hames     Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
571aa53b936SLang Hames     break;
572aa53b936SLang Hames   }
573aa53b936SLang Hames 
574b25445cbSSaleem Abdulrasool   Options.UseInitArray = CodeGenOpts.UseInitArray;
575b25445cbSSaleem Abdulrasool   Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
576b25445cbSSaleem Abdulrasool   Options.CompressDebugSections = CodeGenOpts.CompressDebugSections;
577f8f01c3dSRafael Espindola   Options.RelaxELFRelocations = CodeGenOpts.RelaxELFRelocations;
5784854d80cSRenato Golin 
5794854d80cSRenato Golin   // Set EABI version.
580f7b3d6c5SSaleem Abdulrasool   Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(TargetOpts.EABIVersion)
5814854d80cSRenato Golin                             .Case("4", llvm::EABI::EABI4)
5824854d80cSRenato Golin                             .Case("5", llvm::EABI::EABI5)
5834854d80cSRenato Golin                             .Case("gnu", llvm::EABI::GNU)
5844854d80cSRenato Golin                             .Default(llvm::EABI::Default);
5854854d80cSRenato Golin 
58609d305fbSSaleem Abdulrasool   if (LangOpts.SjLjExceptions)
58709d305fbSSaleem Abdulrasool     Options.ExceptionModel = llvm::ExceptionHandling::SjLj;
58809d305fbSSaleem Abdulrasool 
589432add5bSNick Lewycky   Options.LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD;
590432add5bSNick Lewycky   Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath;
591432add5bSNick Lewycky   Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath;
592432add5bSNick Lewycky   Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
593432add5bSNick Lewycky   Options.UnsafeFPMath = CodeGenOpts.UnsafeFPMath;
594f4d3f7a0SNick Lewycky   Options.StackAlignmentOverride = CodeGenOpts.StackAlignment;
595acca0085SEric Christopher   Options.FunctionSections = CodeGenOpts.FunctionSections;
596acca0085SEric Christopher   Options.DataSections = CodeGenOpts.DataSections;
5976b07a1c6SRafael Espindola   Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
5982c656c94SChih-Hung Hsieh   Options.EmulatedTLS = CodeGenOpts.EmulatedTLS;
5999ef13db4SPaul Robinson   Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning();
600432add5bSNick Lewycky 
6017e72a093SEric Christopher   Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
6027e72a093SEric Christopher   Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
603e76eee46SEric Christopher   Options.MCOptions.MCUseDwarfDirectory = !CodeGenOpts.NoDwarfDirectoryAsm;
6047e72a093SEric Christopher   Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
6052b9349dbSDavid Majnemer   Options.MCOptions.MCIncrementalLinkerCompatible =
6062b9349dbSDavid Majnemer       CodeGenOpts.IncrementalLinkerCompatible;
607a43604adSJoerg Sonnenberger   Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
6084015e124SEric Christopher   Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
609993a1398SNirav Dave   Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments;
6102b8ef99aSEric Christopher   Options.MCOptions.ABIName = TargetOpts.ABI;
6117e72a093SEric Christopher 
61203f8907fSPeter Collingbourne   TM.reset(TheTarget->createTargetMachine(Triple, TargetOpts.CPU, FeaturesStr,
61303f8907fSPeter Collingbourne                                           Options, RM, CM, OptLevel));
614ec57ab37SNadav Rotem }
615ec57ab37SNadav Rotem 
61603f8907fSPeter Collingbourne bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
61703f8907fSPeter Collingbourne                                        BackendAction Action,
6182f16bc10SRafael Espindola                                        raw_pwrite_stream &OS) {
619b1cfc686SChad Rosier   // Add LibraryInfo.
620aa437df9SDaniel Dunbar   llvm::Triple TargetTriple(TheModule->getTargetTriple());
62157bb7c7cSChandler Carruth   std::unique_ptr<TargetLibraryInfoImpl> TLII(
62257bb7c7cSChandler Carruth       createTLII(TargetTriple, CodeGenOpts));
62303f8907fSPeter Collingbourne   CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII));
624e9c233b1SNadav Rotem 
625c1b1729bSDaniel Dunbar   // Normal mode, emit a .s or .o file by running the code generator. Note,
626c1b1729bSDaniel Dunbar   // this also adds codegenerator level optimization passes.
627c1b1729bSDaniel Dunbar   TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
628c1b1729bSDaniel Dunbar   if (Action == Backend_EmitObj)
629c1b1729bSDaniel Dunbar     CGFT = TargetMachine::CGFT_ObjectFile;
630c1b1729bSDaniel Dunbar   else if (Action == Backend_EmitMCNull)
631c1b1729bSDaniel Dunbar     CGFT = TargetMachine::CGFT_Null;
632c1b1729bSDaniel Dunbar   else
633c1b1729bSDaniel Dunbar     assert(Action == Backend_EmitAssembly && "Invalid action!");
634fec0ff84SDan Gohman 
635fec0ff84SDan Gohman   // Add ObjC ARC final-cleanup optimizations. This is done as part of the
636fec0ff84SDan Gohman   // "codegen" passes so that it isn't run multiple times when there is
637fec0ff84SDan Gohman   // inlining happening.
6381d56be86SSteven Wu   if (CodeGenOpts.OptimizationLevel > 0)
63903f8907fSPeter Collingbourne     CodeGenPasses.add(createObjCARCContractPass());
640fec0ff84SDan Gohman 
64103f8907fSPeter Collingbourne   if (TM->addPassesToEmitFile(CodeGenPasses, OS, CGFT,
642c1b1729bSDaniel Dunbar                               /*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
643c1b1729bSDaniel Dunbar     Diags.Report(diag::err_fe_unable_to_interface_with_target);
644c1b1729bSDaniel Dunbar     return false;
645c1b1729bSDaniel Dunbar   }
646c1b1729bSDaniel Dunbar 
647c1b1729bSDaniel Dunbar   return true;
648c1b1729bSDaniel Dunbar }
649c1b1729bSDaniel Dunbar 
6502f16bc10SRafael Espindola void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
65103f8907fSPeter Collingbourne                                       std::unique_ptr<raw_pwrite_stream> OS) {
6528a13c418SCraig Topper   TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : nullptr);
653c1b1729bSDaniel Dunbar 
654b5e80c31SYaxun Liu   setCommandLineOpts();
655b5e80c31SYaxun Liu 
656dc06b2d3SNadav Rotem   bool UsesCodeGen = (Action != Backend_EmitNothing &&
657dc06b2d3SNadav Rotem                       Action != Backend_EmitBC &&
658dc06b2d3SNadav Rotem                       Action != Backend_EmitLL);
65903f8907fSPeter Collingbourne   CreateTargetMachine(UsesCodeGen);
660f4e22381SAlp Toker 
661b633d20dSRafael Espindola   if (UsesCodeGen && !TM)
662b633d20dSRafael Espindola     return;
663b633d20dSRafael Espindola   if (TM)
664ca3cf9e6SMehdi Amini     TheModule->setDataLayout(TM->createDataLayout());
6654b4f4b90STeresa Johnson 
66603f8907fSPeter Collingbourne   legacy::PassManager PerModulePasses;
66703f8907fSPeter Collingbourne   PerModulePasses.add(
66803f8907fSPeter Collingbourne       createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
66903f8907fSPeter Collingbourne 
67003f8907fSPeter Collingbourne   legacy::FunctionPassManager PerFunctionPasses(TheModule);
67103f8907fSPeter Collingbourne   PerFunctionPasses.add(
67203f8907fSPeter Collingbourne       createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
67303f8907fSPeter Collingbourne 
6749e3f4746STeresa Johnson   CreatePasses(PerModulePasses, PerFunctionPasses);
67503f8907fSPeter Collingbourne 
67603f8907fSPeter Collingbourne   legacy::PassManager CodeGenPasses;
67703f8907fSPeter Collingbourne   CodeGenPasses.add(
67803f8907fSPeter Collingbourne       createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
679ec57ab37SNadav Rotem 
680c1b1729bSDaniel Dunbar   switch (Action) {
681c1b1729bSDaniel Dunbar   case Backend_EmitNothing:
682c1b1729bSDaniel Dunbar     break;
683c1b1729bSDaniel Dunbar 
684c1b1729bSDaniel Dunbar   case Backend_EmitBC:
68503f8907fSPeter Collingbourne     PerModulePasses.add(createBitcodeWriterPass(
686a0ef3ed8SMehdi Amini         *OS, CodeGenOpts.EmitLLVMUseLists, CodeGenOpts.EmitSummaryIndex,
687a0ef3ed8SMehdi Amini         CodeGenOpts.EmitSummaryIndex));
688c1b1729bSDaniel Dunbar     break;
689c1b1729bSDaniel Dunbar 
690c1b1729bSDaniel Dunbar   case Backend_EmitLL:
69103f8907fSPeter Collingbourne     PerModulePasses.add(
692bb9cadf4SDuncan P. N. Exon Smith         createPrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists));
693c1b1729bSDaniel Dunbar     break;
694c1b1729bSDaniel Dunbar 
695c1b1729bSDaniel Dunbar   default:
69603f8907fSPeter Collingbourne     if (!AddEmitPasses(CodeGenPasses, Action, *OS))
697c1b1729bSDaniel Dunbar       return;
698c1b1729bSDaniel Dunbar   }
699c1b1729bSDaniel Dunbar 
70015e36e8eSAndrew Trick   // Before executing passes, print the final values of the LLVM options.
70115e36e8eSAndrew Trick   cl::PrintOptionValues();
70215e36e8eSAndrew Trick 
703c1b1729bSDaniel Dunbar   // Run passes. For now we do all passes at once, but eventually we
704c1b1729bSDaniel Dunbar   // would like to have the option of streaming code generation.
705c1b1729bSDaniel Dunbar 
70603f8907fSPeter Collingbourne   {
707c1b1729bSDaniel Dunbar     PrettyStackTraceString CrashInfo("Per-function optimization");
708c1b1729bSDaniel Dunbar 
70903f8907fSPeter Collingbourne     PerFunctionPasses.doInitialization();
71010d6d168SYaron Keren     for (Function &F : *TheModule)
71110d6d168SYaron Keren       if (!F.isDeclaration())
71203f8907fSPeter Collingbourne         PerFunctionPasses.run(F);
71303f8907fSPeter Collingbourne     PerFunctionPasses.doFinalization();
714c1b1729bSDaniel Dunbar   }
715c1b1729bSDaniel Dunbar 
71603f8907fSPeter Collingbourne   {
717c1b1729bSDaniel Dunbar     PrettyStackTraceString CrashInfo("Per-module optimization passes");
71803f8907fSPeter Collingbourne     PerModulePasses.run(*TheModule);
719c1b1729bSDaniel Dunbar   }
720c1b1729bSDaniel Dunbar 
72103f8907fSPeter Collingbourne   {
722c1b1729bSDaniel Dunbar     PrettyStackTraceString CrashInfo("Code generation");
72303f8907fSPeter Collingbourne     CodeGenPasses.run(*TheModule);
724c1b1729bSDaniel Dunbar   }
725c1b1729bSDaniel Dunbar }
726c1b1729bSDaniel Dunbar 
7279e3f4746STeresa Johnson static void runThinLTOBackend(const CodeGenOptions &CGOpts, Module *M,
7289e3f4746STeresa Johnson                               std::unique_ptr<raw_pwrite_stream> OS) {
7299e3f4746STeresa Johnson   // If we are performing a ThinLTO importing compile, load the function index
7309e3f4746STeresa Johnson   // into memory and pass it into thinBackend, which will run the function
7319e3f4746STeresa Johnson   // importer and invoke LTO passes.
7329e3f4746STeresa Johnson   ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
7339e3f4746STeresa Johnson       llvm::getModuleSummaryIndexForFile(
7349e3f4746STeresa Johnson           CGOpts.ThinLTOIndexFile,
7359e3f4746STeresa Johnson           [&](const DiagnosticInfo &DI) { M->getContext().diagnose(DI); });
7369e3f4746STeresa Johnson   if (std::error_code EC = IndexOrErr.getError()) {
7379e3f4746STeresa Johnson     std::string Error = EC.message();
7389e3f4746STeresa Johnson     errs() << "Error loading index file '" << CGOpts.ThinLTOIndexFile
7399e3f4746STeresa Johnson            << "': " << Error << "\n";
7409e3f4746STeresa Johnson     return;
7419e3f4746STeresa Johnson   }
7429e3f4746STeresa Johnson   std::unique_ptr<ModuleSummaryIndex> CombinedIndex = std::move(*IndexOrErr);
7439e3f4746STeresa Johnson 
7449e3f4746STeresa Johnson   auto AddStream = [&](size_t Task) { return std::move(OS); };
7459e3f4746STeresa Johnson 
7469e3f4746STeresa Johnson   StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>>
7479e3f4746STeresa Johnson       ModuleToDefinedGVSummaries;
7489e3f4746STeresa Johnson   CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
7499e3f4746STeresa Johnson 
7509e3f4746STeresa Johnson   // FIXME: We could simply import the modules mentioned in the combined index
7519e3f4746STeresa Johnson   // here.
7529e3f4746STeresa Johnson   FunctionImporter::ImportMapTy ImportList;
7539e3f4746STeresa Johnson   ComputeCrossModuleImportForModule(M->getModuleIdentifier(), *CombinedIndex,
7549e3f4746STeresa Johnson                                     ImportList);
7559e3f4746STeresa Johnson 
7569e3f4746STeresa Johnson   std::vector<std::unique_ptr<llvm::MemoryBuffer>> OwnedImports;
7579e3f4746STeresa Johnson   MapVector<llvm::StringRef, llvm::MemoryBufferRef> ModuleMap;
7589e3f4746STeresa Johnson 
7599e3f4746STeresa Johnson   for (auto &I : ImportList) {
7609e3f4746STeresa Johnson     ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MBOrErr =
7619e3f4746STeresa Johnson         llvm::MemoryBuffer::getFile(I.first());
7629e3f4746STeresa Johnson     if (!MBOrErr) {
7639e3f4746STeresa Johnson       errs() << "Error loading imported file '" << I.first()
7649e3f4746STeresa Johnson              << "': " << MBOrErr.getError().message() << "\n";
7659e3f4746STeresa Johnson       return;
7669e3f4746STeresa Johnson     }
7679e3f4746STeresa Johnson     ModuleMap[I.first()] = (*MBOrErr)->getMemBufferRef();
7689e3f4746STeresa Johnson     OwnedImports.push_back(std::move(*MBOrErr));
7699e3f4746STeresa Johnson   }
7709e3f4746STeresa Johnson 
7719e3f4746STeresa Johnson   lto::Config Conf;
7729e3f4746STeresa Johnson   if (Error E = thinBackend(
7739e3f4746STeresa Johnson           Conf, 0, AddStream, *M, *CombinedIndex, ImportList,
7749e3f4746STeresa Johnson           ModuleToDefinedGVSummaries[M->getModuleIdentifier()], ModuleMap)) {
7759e3f4746STeresa Johnson     handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
7769e3f4746STeresa Johnson       errs() << "Error running ThinLTO backend: " << EIB.message() << '\n';
7779e3f4746STeresa Johnson     });
7789e3f4746STeresa Johnson   }
7799e3f4746STeresa Johnson }
7809e3f4746STeresa Johnson 
7819c902b55SDavid Blaikie void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
7829c902b55SDavid Blaikie                               const CodeGenOptions &CGOpts,
783432add5bSNick Lewycky                               const clang::TargetOptions &TOpts,
784b214cbc7SJames Y Knight                               const LangOptions &LOpts, const llvm::DataLayout &TDesc,
785e83b9060SAlp Toker                               Module *M, BackendAction Action,
78603f8907fSPeter Collingbourne                               std::unique_ptr<raw_pwrite_stream> OS) {
7879e3f4746STeresa Johnson   if (!CGOpts.ThinLTOIndexFile.empty()) {
7889e3f4746STeresa Johnson     runThinLTOBackend(CGOpts, M, std::move(OS));
7899e3f4746STeresa Johnson     return;
7909e3f4746STeresa Johnson   }
7919e3f4746STeresa Johnson 
7924b4f4b90STeresa Johnson   EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M);
793c1b1729bSDaniel Dunbar 
79403f8907fSPeter Collingbourne   AsmHelper.EmitAssembly(Action, std::move(OS));
795e83b9060SAlp Toker 
796b214cbc7SJames Y Knight   // Verify clang's TargetInfo DataLayout against the LLVM TargetMachine's
797b214cbc7SJames Y Knight   // DataLayout.
798b214cbc7SJames Y Knight   if (AsmHelper.TM) {
799ca3cf9e6SMehdi Amini     std::string DLDesc = M->getDataLayout().getStringRepresentation();
800b214cbc7SJames Y Knight     if (DLDesc != TDesc.getStringRepresentation()) {
801e83b9060SAlp Toker       unsigned DiagID = Diags.getCustomDiagID(
802e83b9060SAlp Toker           DiagnosticsEngine::Error, "backend data layout '%0' does not match "
803e83b9060SAlp Toker                                     "expected target description '%1'");
804b214cbc7SJames Y Knight       Diags.Report(DiagID) << DLDesc << TDesc.getStringRepresentation();
805e83b9060SAlp Toker     }
806e83b9060SAlp Toker   }
807c1b1729bSDaniel Dunbar }
80827fb5227SSteven Wu 
80927fb5227SSteven Wu static const char* getSectionNameForBitcode(const Triple &T) {
81027fb5227SSteven Wu   switch (T.getObjectFormat()) {
81127fb5227SSteven Wu   case Triple::MachO:
81227fb5227SSteven Wu     return "__LLVM,__bitcode";
81327fb5227SSteven Wu   case Triple::COFF:
81427fb5227SSteven Wu   case Triple::ELF:
81527fb5227SSteven Wu   case Triple::UnknownObjectFormat:
81627fb5227SSteven Wu     return ".llvmbc";
81727fb5227SSteven Wu   }
818bff9dae3SSimon Pilgrim   llvm_unreachable("Unimplemented ObjectFormatType");
81927fb5227SSteven Wu }
82027fb5227SSteven Wu 
82127fb5227SSteven Wu static const char* getSectionNameForCommandline(const Triple &T) {
82227fb5227SSteven Wu   switch (T.getObjectFormat()) {
82327fb5227SSteven Wu   case Triple::MachO:
82427fb5227SSteven Wu     return "__LLVM,__cmdline";
82527fb5227SSteven Wu   case Triple::COFF:
82627fb5227SSteven Wu   case Triple::ELF:
82727fb5227SSteven Wu   case Triple::UnknownObjectFormat:
82827fb5227SSteven Wu     return ".llvmcmd";
82927fb5227SSteven Wu   }
830bff9dae3SSimon Pilgrim   llvm_unreachable("Unimplemented ObjectFormatType");
83127fb5227SSteven Wu }
83227fb5227SSteven Wu 
83327fb5227SSteven Wu // With -fembed-bitcode, save a copy of the llvm IR as data in the
83427fb5227SSteven Wu // __LLVM,__bitcode section.
83527fb5227SSteven Wu void clang::EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts,
83627fb5227SSteven Wu                          llvm::MemoryBufferRef Buf) {
83727fb5227SSteven Wu   if (CGOpts.getEmbedBitcode() == CodeGenOptions::Embed_Off)
83827fb5227SSteven Wu     return;
83927fb5227SSteven Wu 
8402c059a55SSteven Wu   // Save llvm.compiler.used and remote it.
8412c059a55SSteven Wu   SmallVector<Constant*, 2> UsedArray;
8422c059a55SSteven Wu   SmallSet<GlobalValue*, 4> UsedGlobals;
8432c059a55SSteven Wu   Type *UsedElementType = Type::getInt8Ty(M->getContext())->getPointerTo(0);
8442c059a55SSteven Wu   GlobalVariable *Used = collectUsedGlobalVariables(*M, UsedGlobals, true);
8452c059a55SSteven Wu   for (auto *GV : UsedGlobals) {
8462c059a55SSteven Wu     if (GV->getName() != "llvm.embedded.module" &&
8472c059a55SSteven Wu         GV->getName() != "llvm.cmdline")
8482c059a55SSteven Wu       UsedArray.push_back(
8492c059a55SSteven Wu           ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
8502c059a55SSteven Wu   }
8512c059a55SSteven Wu   if (Used)
8522c059a55SSteven Wu     Used->eraseFromParent();
8532c059a55SSteven Wu 
85427fb5227SSteven Wu   // Embed the bitcode for the llvm module.
85527fb5227SSteven Wu   std::string Data;
85627fb5227SSteven Wu   ArrayRef<uint8_t> ModuleData;
85727fb5227SSteven Wu   Triple T(M->getTargetTriple());
85827fb5227SSteven Wu   // Create a constant that contains the bitcode.
85927fb5227SSteven Wu   // In case of embedding a marker, ignore the input Buf and use the empty
86027fb5227SSteven Wu   // ArrayRef. It is also legal to create a bitcode marker even Buf is empty.
86127fb5227SSteven Wu   if (CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Marker) {
86227fb5227SSteven Wu     if (!isBitcode((const unsigned char *)Buf.getBufferStart(),
86327fb5227SSteven Wu                    (const unsigned char *)Buf.getBufferEnd())) {
86427fb5227SSteven Wu       // If the input is LLVM Assembly, bitcode is produced by serializing
86527fb5227SSteven Wu       // the module. Use-lists order need to be perserved in this case.
86627fb5227SSteven Wu       llvm::raw_string_ostream OS(Data);
86727fb5227SSteven Wu       llvm::WriteBitcodeToFile(M, OS, /* ShouldPreserveUseListOrder */ true);
86827fb5227SSteven Wu       ModuleData =
86927fb5227SSteven Wu           ArrayRef<uint8_t>((const uint8_t *)OS.str().data(), OS.str().size());
87027fb5227SSteven Wu     } else
87127fb5227SSteven Wu       // If the input is LLVM bitcode, write the input byte stream directly.
87227fb5227SSteven Wu       ModuleData = ArrayRef<uint8_t>((const uint8_t *)Buf.getBufferStart(),
87327fb5227SSteven Wu                                      Buf.getBufferSize());
87427fb5227SSteven Wu   }
87527fb5227SSteven Wu   llvm::Constant *ModuleConstant =
87627fb5227SSteven Wu       llvm::ConstantDataArray::get(M->getContext(), ModuleData);
87727fb5227SSteven Wu   llvm::GlobalVariable *GV = new llvm::GlobalVariable(
8782c059a55SSteven Wu       *M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage,
87927fb5227SSteven Wu       ModuleConstant);
88027fb5227SSteven Wu   GV->setSection(getSectionNameForBitcode(T));
8812c059a55SSteven Wu   UsedArray.push_back(
8822c059a55SSteven Wu       ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
88327fb5227SSteven Wu   if (llvm::GlobalVariable *Old =
8842c059a55SSteven Wu           M->getGlobalVariable("llvm.embedded.module", true)) {
8852c059a55SSteven Wu     assert(Old->hasOneUse() &&
8862c059a55SSteven Wu            "llvm.embedded.module can only be used once in llvm.compiler.used");
88727fb5227SSteven Wu     GV->takeName(Old);
88827fb5227SSteven Wu     Old->eraseFromParent();
88927fb5227SSteven Wu   } else {
89027fb5227SSteven Wu     GV->setName("llvm.embedded.module");
89127fb5227SSteven Wu   }
89227fb5227SSteven Wu 
8932c059a55SSteven Wu   // Skip if only bitcode needs to be embedded.
8942c059a55SSteven Wu   if (CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Bitcode) {
89527fb5227SSteven Wu     // Embed command-line options.
896b1d50c1cSSaleem Abdulrasool     ArrayRef<uint8_t> CmdData(const_cast<uint8_t *>(CGOpts.CmdArgs.data()),
89727fb5227SSteven Wu                               CGOpts.CmdArgs.size());
89827fb5227SSteven Wu     llvm::Constant *CmdConstant =
89927fb5227SSteven Wu       llvm::ConstantDataArray::get(M->getContext(), CmdData);
90027fb5227SSteven Wu     GV = new llvm::GlobalVariable(*M, CmdConstant->getType(), true,
9012c059a55SSteven Wu                                   llvm::GlobalValue::PrivateLinkage,
90227fb5227SSteven Wu                                   CmdConstant);
90327fb5227SSteven Wu     GV->setSection(getSectionNameForCommandline(T));
9042c059a55SSteven Wu     UsedArray.push_back(
9052c059a55SSteven Wu         ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));
9062c059a55SSteven Wu     if (llvm::GlobalVariable *Old =
9072c059a55SSteven Wu             M->getGlobalVariable("llvm.cmdline", true)) {
9082c059a55SSteven Wu       assert(Old->hasOneUse() &&
9092c059a55SSteven Wu              "llvm.cmdline can only be used once in llvm.compiler.used");
91027fb5227SSteven Wu       GV->takeName(Old);
91127fb5227SSteven Wu       Old->eraseFromParent();
91227fb5227SSteven Wu     } else {
91327fb5227SSteven Wu       GV->setName("llvm.cmdline");
91427fb5227SSteven Wu     }
91527fb5227SSteven Wu   }
9162c059a55SSteven Wu 
9172c059a55SSteven Wu   if (UsedArray.empty())
9182c059a55SSteven Wu     return;
9192c059a55SSteven Wu 
9202c059a55SSteven Wu   // Recreate llvm.compiler.used.
9212c059a55SSteven Wu   ArrayType *ATy = ArrayType::get(UsedElementType, UsedArray.size());
9222c059a55SSteven Wu   auto *NewUsed = new GlobalVariable(
9232c059a55SSteven Wu       *M, ATy, false, llvm::GlobalValue::AppendingLinkage,
9242c059a55SSteven Wu       llvm::ConstantArray::get(ATy, UsedArray), "llvm.compiler.used");
9252c059a55SSteven Wu   NewUsed->setSection("llvm.metadata");
9262c059a55SSteven Wu }
927