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