1f22ef01cSRoman Divacky //===--- CodeGenModule.cpp - Emit LLVM Code from ASTs for a Module --------===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // This coordinates the per-module state used while generating code. 11f22ef01cSRoman Divacky // 12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 13f22ef01cSRoman Divacky 14f22ef01cSRoman Divacky #include "CodeGenModule.h" 156122f3e6SDimitry Andric #include "CGCUDARuntime.h" 16e580952dSDimitry Andric #include "CGCXXABI.h" 17139f7f9bSDimitry Andric #include "CGCall.h" 18139f7f9bSDimitry Andric #include "CGDebugInfo.h" 19f22ef01cSRoman Divacky #include "CGObjCRuntime.h" 206122f3e6SDimitry Andric #include "CGOpenCLRuntime.h" 2159d1ed5bSDimitry Andric #include "CGOpenMPRuntime.h" 22139f7f9bSDimitry Andric #include "CodeGenFunction.h" 2359d1ed5bSDimitry Andric #include "CodeGenPGO.h" 24139f7f9bSDimitry Andric #include "CodeGenTBAA.h" 25f22ef01cSRoman Divacky #include "TargetInfo.h" 26f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h" 27f22ef01cSRoman Divacky #include "clang/AST/CharUnits.h" 28f22ef01cSRoman Divacky #include "clang/AST/DeclCXX.h" 29139f7f9bSDimitry Andric #include "clang/AST/DeclObjC.h" 30ffd1746dSEd Schouten #include "clang/AST/DeclTemplate.h" 312754fe60SDimitry Andric #include "clang/AST/Mangle.h" 32f22ef01cSRoman Divacky #include "clang/AST/RecordLayout.h" 33f8254f43SDimitry Andric #include "clang/AST/RecursiveASTVisitor.h" 34dff0c46cSDimitry Andric #include "clang/Basic/Builtins.h" 35139f7f9bSDimitry Andric #include "clang/Basic/CharInfo.h" 36f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h" 37139f7f9bSDimitry Andric #include "clang/Basic/Module.h" 38f22ef01cSRoman Divacky #include "clang/Basic/SourceManager.h" 39f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h" 40f785676fSDimitry Andric #include "clang/Basic/Version.h" 41139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h" 42f785676fSDimitry Andric #include "clang/Sema/SemaDiagnostic.h" 43dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h" 44f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h" 4559d1ed5bSDimitry Andric #include "llvm/IR/CallSite.h" 46139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h" 47139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 48139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h" 49139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h" 50139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 5159d1ed5bSDimitry Andric #include "llvm/ProfileData/InstrProfReader.h" 52139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h" 53f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 54139f7f9bSDimitry Andric 55f22ef01cSRoman Divacky using namespace clang; 56f22ef01cSRoman Divacky using namespace CodeGen; 57f22ef01cSRoman Divacky 586122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata"; 596122f3e6SDimitry Andric 6059d1ed5bSDimitry Andric static CGCXXABI *createCXXABI(CodeGenModule &CGM) { 61284c1978SDimitry Andric switch (CGM.getTarget().getCXXABI().getKind()) { 62139f7f9bSDimitry Andric case TargetCXXABI::GenericAArch64: 63139f7f9bSDimitry Andric case TargetCXXABI::GenericARM: 64139f7f9bSDimitry Andric case TargetCXXABI::iOS: 6559d1ed5bSDimitry Andric case TargetCXXABI::iOS64: 66139f7f9bSDimitry Andric case TargetCXXABI::GenericItanium: 6759d1ed5bSDimitry Andric return CreateItaniumCXXABI(CGM); 68139f7f9bSDimitry Andric case TargetCXXABI::Microsoft: 6959d1ed5bSDimitry Andric return CreateMicrosoftCXXABI(CGM); 70e580952dSDimitry Andric } 71e580952dSDimitry Andric 72e580952dSDimitry Andric llvm_unreachable("invalid C++ ABI kind"); 73e580952dSDimitry Andric } 74e580952dSDimitry Andric 75f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 76284c1978SDimitry Andric llvm::Module &M, const llvm::DataLayout &TD, 776122f3e6SDimitry Andric DiagnosticsEngine &diags) 78284c1978SDimitry Andric : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M), 79284c1978SDimitry Andric Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()), 8059d1ed5bSDimitry Andric ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(nullptr), 8159d1ed5bSDimitry Andric TheTargetCodeGenInfo(nullptr), Types(*this), VTables(*this), 8259d1ed5bSDimitry Andric ObjCRuntime(nullptr), OpenCLRuntime(nullptr), OpenMPRuntime(nullptr), 8359d1ed5bSDimitry Andric CUDARuntime(nullptr), DebugInfo(nullptr), ARCData(nullptr), 8459d1ed5bSDimitry Andric NoObjCARCExceptionsMetadata(nullptr), RRData(nullptr), PGOReader(nullptr), 8559d1ed5bSDimitry Andric CFConstantStringClassRef(nullptr), ConstantStringClassRef(nullptr), 8659d1ed5bSDimitry Andric NSConstantStringType(nullptr), NSConcreteGlobalBlock(nullptr), 8759d1ed5bSDimitry Andric NSConcreteStackBlock(nullptr), BlockObjectAssign(nullptr), 8859d1ed5bSDimitry Andric BlockObjectDispose(nullptr), BlockDescriptorType(nullptr), 8959d1ed5bSDimitry Andric GenericBlockLiteralType(nullptr), LifetimeStartFn(nullptr), 9059d1ed5bSDimitry Andric LifetimeEndFn(nullptr), SanitizerBL(llvm::SpecialCaseList::createOrDie( 9159d1ed5bSDimitry Andric CGO.SanitizerBlacklistFile)) { 92dff0c46cSDimitry Andric 93dff0c46cSDimitry Andric // Initialize the type cache. 94dff0c46cSDimitry Andric llvm::LLVMContext &LLVMContext = M.getContext(); 95dff0c46cSDimitry Andric VoidTy = llvm::Type::getVoidTy(LLVMContext); 96dff0c46cSDimitry Andric Int8Ty = llvm::Type::getInt8Ty(LLVMContext); 97dff0c46cSDimitry Andric Int16Ty = llvm::Type::getInt16Ty(LLVMContext); 98dff0c46cSDimitry Andric Int32Ty = llvm::Type::getInt32Ty(LLVMContext); 99dff0c46cSDimitry Andric Int64Ty = llvm::Type::getInt64Ty(LLVMContext); 100dff0c46cSDimitry Andric FloatTy = llvm::Type::getFloatTy(LLVMContext); 101dff0c46cSDimitry Andric DoubleTy = llvm::Type::getDoubleTy(LLVMContext); 102dff0c46cSDimitry Andric PointerWidthInBits = C.getTargetInfo().getPointerWidth(0); 103dff0c46cSDimitry Andric PointerAlignInBytes = 104dff0c46cSDimitry Andric C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity(); 105dff0c46cSDimitry Andric IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth()); 106dff0c46cSDimitry Andric IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits); 107dff0c46cSDimitry Andric Int8PtrTy = Int8Ty->getPointerTo(0); 108dff0c46cSDimitry Andric Int8PtrPtrTy = Int8PtrTy->getPointerTo(0); 109dff0c46cSDimitry Andric 110139f7f9bSDimitry Andric RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC(); 111139f7f9bSDimitry Andric 112dff0c46cSDimitry Andric if (LangOpts.ObjC1) 1133b0f4066SDimitry Andric createObjCRuntime(); 114dff0c46cSDimitry Andric if (LangOpts.OpenCL) 1156122f3e6SDimitry Andric createOpenCLRuntime(); 11659d1ed5bSDimitry Andric if (LangOpts.OpenMP) 11759d1ed5bSDimitry Andric createOpenMPRuntime(); 118dff0c46cSDimitry Andric if (LangOpts.CUDA) 1196122f3e6SDimitry Andric createCUDARuntime(); 120f22ef01cSRoman Divacky 1217ae0e2c9SDimitry Andric // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0. 12259d1ed5bSDimitry Andric if (LangOpts.Sanitize.Thread || 1237ae0e2c9SDimitry Andric (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)) 1247ae0e2c9SDimitry Andric TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(), 12559d1ed5bSDimitry Andric getCXXABI().getMangleContext()); 1262754fe60SDimitry Andric 1273b0f4066SDimitry Andric // If debug info or coverage generation is enabled, create the CGDebugInfo 1283b0f4066SDimitry Andric // object. 1293861d79fSDimitry Andric if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo || 1307ae0e2c9SDimitry Andric CodeGenOpts.EmitGcovArcs || 1313b0f4066SDimitry Andric CodeGenOpts.EmitGcovNotes) 1323b0f4066SDimitry Andric DebugInfo = new CGDebugInfo(*this); 1332754fe60SDimitry Andric 1342754fe60SDimitry Andric Block.GlobalUniqueCount = 0; 1352754fe60SDimitry Andric 136dff0c46cSDimitry Andric if (C.getLangOpts().ObjCAutoRefCount) 13717a519f9SDimitry Andric ARCData = new ARCEntrypoints(); 13817a519f9SDimitry Andric RRData = new RREntrypoints(); 13959d1ed5bSDimitry Andric 14059d1ed5bSDimitry Andric if (!CodeGenOpts.InstrProfileInput.empty()) { 14159d1ed5bSDimitry Andric if (std::error_code EC = llvm::IndexedInstrProfReader::create( 14259d1ed5bSDimitry Andric CodeGenOpts.InstrProfileInput, PGOReader)) { 14359d1ed5bSDimitry Andric unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 14459d1ed5bSDimitry Andric "Could not read profile: %0"); 14559d1ed5bSDimitry Andric getDiags().Report(DiagID) << EC.message(); 14659d1ed5bSDimitry Andric } 14759d1ed5bSDimitry Andric } 148f22ef01cSRoman Divacky } 149f22ef01cSRoman Divacky 150f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() { 1516122f3e6SDimitry Andric delete ObjCRuntime; 1526122f3e6SDimitry Andric delete OpenCLRuntime; 15359d1ed5bSDimitry Andric delete OpenMPRuntime; 1546122f3e6SDimitry Andric delete CUDARuntime; 1556122f3e6SDimitry Andric delete TheTargetCodeGenInfo; 1562754fe60SDimitry Andric delete TBAA; 157f22ef01cSRoman Divacky delete DebugInfo; 15817a519f9SDimitry Andric delete ARCData; 15917a519f9SDimitry Andric delete RRData; 160f22ef01cSRoman Divacky } 161f22ef01cSRoman Divacky 162f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() { 1637ae0e2c9SDimitry Andric // This is just isGNUFamily(), but we want to force implementors of 1647ae0e2c9SDimitry Andric // new ABIs to decide how best to do this. 1657ae0e2c9SDimitry Andric switch (LangOpts.ObjCRuntime.getKind()) { 1667ae0e2c9SDimitry Andric case ObjCRuntime::GNUstep: 1677ae0e2c9SDimitry Andric case ObjCRuntime::GCC: 1687ae0e2c9SDimitry Andric case ObjCRuntime::ObjFW: 1696122f3e6SDimitry Andric ObjCRuntime = CreateGNUObjCRuntime(*this); 1707ae0e2c9SDimitry Andric return; 1717ae0e2c9SDimitry Andric 1727ae0e2c9SDimitry Andric case ObjCRuntime::FragileMacOSX: 1737ae0e2c9SDimitry Andric case ObjCRuntime::MacOSX: 1747ae0e2c9SDimitry Andric case ObjCRuntime::iOS: 1756122f3e6SDimitry Andric ObjCRuntime = CreateMacObjCRuntime(*this); 1767ae0e2c9SDimitry Andric return; 1777ae0e2c9SDimitry Andric } 1787ae0e2c9SDimitry Andric llvm_unreachable("bad runtime kind"); 1796122f3e6SDimitry Andric } 1806122f3e6SDimitry Andric 1816122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() { 1826122f3e6SDimitry Andric OpenCLRuntime = new CGOpenCLRuntime(*this); 1836122f3e6SDimitry Andric } 1846122f3e6SDimitry Andric 18559d1ed5bSDimitry Andric void CodeGenModule::createOpenMPRuntime() { 18659d1ed5bSDimitry Andric OpenMPRuntime = new CGOpenMPRuntime(*this); 18759d1ed5bSDimitry Andric } 18859d1ed5bSDimitry Andric 1896122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() { 1906122f3e6SDimitry Andric CUDARuntime = CreateNVCUDARuntime(*this); 191f22ef01cSRoman Divacky } 192f22ef01cSRoman Divacky 193f785676fSDimitry Andric void CodeGenModule::applyReplacements() { 194f785676fSDimitry Andric for (ReplacementsTy::iterator I = Replacements.begin(), 195f785676fSDimitry Andric E = Replacements.end(); 196f785676fSDimitry Andric I != E; ++I) { 197f785676fSDimitry Andric StringRef MangledName = I->first(); 198f785676fSDimitry Andric llvm::Constant *Replacement = I->second; 199f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 200f785676fSDimitry Andric if (!Entry) 201f785676fSDimitry Andric continue; 20259d1ed5bSDimitry Andric auto *OldF = cast<llvm::Function>(Entry); 20359d1ed5bSDimitry Andric auto *NewF = dyn_cast<llvm::Function>(Replacement); 204f785676fSDimitry Andric if (!NewF) { 20559d1ed5bSDimitry Andric if (auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) { 20659d1ed5bSDimitry Andric NewF = dyn_cast<llvm::Function>(Alias->getAliasee()); 20759d1ed5bSDimitry Andric } else { 20859d1ed5bSDimitry Andric auto *CE = cast<llvm::ConstantExpr>(Replacement); 209f785676fSDimitry Andric assert(CE->getOpcode() == llvm::Instruction::BitCast || 210f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::GetElementPtr); 211f785676fSDimitry Andric NewF = dyn_cast<llvm::Function>(CE->getOperand(0)); 212f785676fSDimitry Andric } 21359d1ed5bSDimitry Andric } 214f785676fSDimitry Andric 215f785676fSDimitry Andric // Replace old with new, but keep the old order. 216f785676fSDimitry Andric OldF->replaceAllUsesWith(Replacement); 217f785676fSDimitry Andric if (NewF) { 218f785676fSDimitry Andric NewF->removeFromParent(); 219f785676fSDimitry Andric OldF->getParent()->getFunctionList().insertAfter(OldF, NewF); 220f785676fSDimitry Andric } 221f785676fSDimitry Andric OldF->eraseFromParent(); 222f785676fSDimitry Andric } 223f785676fSDimitry Andric } 224f785676fSDimitry Andric 22559d1ed5bSDimitry Andric // This is only used in aliases that we created and we know they have a 22659d1ed5bSDimitry Andric // linear structure. 22759d1ed5bSDimitry Andric static const llvm::GlobalObject *getAliasedGlobal(const llvm::GlobalAlias &GA) { 22859d1ed5bSDimitry Andric llvm::SmallPtrSet<const llvm::GlobalAlias*, 4> Visited; 22959d1ed5bSDimitry Andric const llvm::Constant *C = &GA; 23059d1ed5bSDimitry Andric for (;;) { 23159d1ed5bSDimitry Andric C = C->stripPointerCasts(); 23259d1ed5bSDimitry Andric if (auto *GO = dyn_cast<llvm::GlobalObject>(C)) 23359d1ed5bSDimitry Andric return GO; 23459d1ed5bSDimitry Andric // stripPointerCasts will not walk over weak aliases. 23559d1ed5bSDimitry Andric auto *GA2 = dyn_cast<llvm::GlobalAlias>(C); 23659d1ed5bSDimitry Andric if (!GA2) 23759d1ed5bSDimitry Andric return nullptr; 23859d1ed5bSDimitry Andric if (!Visited.insert(GA2)) 23959d1ed5bSDimitry Andric return nullptr; 24059d1ed5bSDimitry Andric C = GA2->getAliasee(); 24159d1ed5bSDimitry Andric } 24259d1ed5bSDimitry Andric } 24359d1ed5bSDimitry Andric 244f785676fSDimitry Andric void CodeGenModule::checkAliases() { 24559d1ed5bSDimitry Andric // Check if the constructed aliases are well formed. It is really unfortunate 24659d1ed5bSDimitry Andric // that we have to do this in CodeGen, but we only construct mangled names 24759d1ed5bSDimitry Andric // and aliases during codegen. 248f785676fSDimitry Andric bool Error = false; 24959d1ed5bSDimitry Andric DiagnosticsEngine &Diags = getDiags(); 250f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 251f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 252f785676fSDimitry Andric const GlobalDecl &GD = *I; 25359d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 254f785676fSDimitry Andric const AliasAttr *AA = D->getAttr<AliasAttr>(); 255f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 256f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 25759d1ed5bSDimitry Andric auto *Alias = cast<llvm::GlobalAlias>(Entry); 25859d1ed5bSDimitry Andric const llvm::GlobalValue *GV = getAliasedGlobal(*Alias); 25959d1ed5bSDimitry Andric if (!GV) { 260f785676fSDimitry Andric Error = true; 26159d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_cyclic_alias); 26259d1ed5bSDimitry Andric } else if (GV->isDeclaration()) { 263f785676fSDimitry Andric Error = true; 26459d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_alias_to_undefined); 26559d1ed5bSDimitry Andric } 26659d1ed5bSDimitry Andric 26759d1ed5bSDimitry Andric llvm::Constant *Aliasee = Alias->getAliasee(); 26859d1ed5bSDimitry Andric llvm::GlobalValue *AliaseeGV; 26959d1ed5bSDimitry Andric if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee)) 27059d1ed5bSDimitry Andric AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0)); 27159d1ed5bSDimitry Andric else 27259d1ed5bSDimitry Andric AliaseeGV = cast<llvm::GlobalValue>(Aliasee); 27359d1ed5bSDimitry Andric 27459d1ed5bSDimitry Andric if (const SectionAttr *SA = D->getAttr<SectionAttr>()) { 27559d1ed5bSDimitry Andric StringRef AliasSection = SA->getName(); 27659d1ed5bSDimitry Andric if (AliasSection != AliaseeGV->getSection()) 27759d1ed5bSDimitry Andric Diags.Report(SA->getLocation(), diag::warn_alias_with_section) 27859d1ed5bSDimitry Andric << AliasSection; 27959d1ed5bSDimitry Andric } 28059d1ed5bSDimitry Andric 28159d1ed5bSDimitry Andric // We have to handle alias to weak aliases in here. LLVM itself disallows 28259d1ed5bSDimitry Andric // this since the object semantics would not match the IL one. For 28359d1ed5bSDimitry Andric // compatibility with gcc we implement it by just pointing the alias 28459d1ed5bSDimitry Andric // to its aliasee's aliasee. We also warn, since the user is probably 28559d1ed5bSDimitry Andric // expecting the link to be weak. 28659d1ed5bSDimitry Andric if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) { 28759d1ed5bSDimitry Andric if (GA->mayBeOverridden()) { 28859d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias) 28959d1ed5bSDimitry Andric << GV->getName() << GA->getName(); 29059d1ed5bSDimitry Andric Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast( 29159d1ed5bSDimitry Andric GA->getAliasee(), Alias->getType()); 29259d1ed5bSDimitry Andric Alias->setAliasee(Aliasee); 29359d1ed5bSDimitry Andric } 294f785676fSDimitry Andric } 295f785676fSDimitry Andric } 296f785676fSDimitry Andric if (!Error) 297f785676fSDimitry Andric return; 298f785676fSDimitry Andric 299f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 300f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 301f785676fSDimitry Andric const GlobalDecl &GD = *I; 302f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 303f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 30459d1ed5bSDimitry Andric auto *Alias = cast<llvm::GlobalAlias>(Entry); 305f785676fSDimitry Andric Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType())); 306f785676fSDimitry Andric Alias->eraseFromParent(); 307f785676fSDimitry Andric } 308f785676fSDimitry Andric } 309f785676fSDimitry Andric 31059d1ed5bSDimitry Andric void CodeGenModule::clear() { 31159d1ed5bSDimitry Andric DeferredDeclsToEmit.clear(); 31259d1ed5bSDimitry Andric } 31359d1ed5bSDimitry Andric 31459d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags, 31559d1ed5bSDimitry Andric StringRef MainFile) { 31659d1ed5bSDimitry Andric if (!hasDiagnostics()) 31759d1ed5bSDimitry Andric return; 31859d1ed5bSDimitry Andric if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) { 31959d1ed5bSDimitry Andric if (MainFile.empty()) 32059d1ed5bSDimitry Andric MainFile = "<stdin>"; 32159d1ed5bSDimitry Andric Diags.Report(diag::warn_profile_data_unprofiled) << MainFile; 32259d1ed5bSDimitry Andric } else 32359d1ed5bSDimitry Andric Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing 32459d1ed5bSDimitry Andric << Mismatched; 32559d1ed5bSDimitry Andric } 32659d1ed5bSDimitry Andric 327f22ef01cSRoman Divacky void CodeGenModule::Release() { 328f22ef01cSRoman Divacky EmitDeferred(); 329f785676fSDimitry Andric applyReplacements(); 330f785676fSDimitry Andric checkAliases(); 331f22ef01cSRoman Divacky EmitCXXGlobalInitFunc(); 332f22ef01cSRoman Divacky EmitCXXGlobalDtorFunc(); 333284c1978SDimitry Andric EmitCXXThreadLocalInitFunc(); 3346122f3e6SDimitry Andric if (ObjCRuntime) 3356122f3e6SDimitry Andric if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction()) 336f22ef01cSRoman Divacky AddGlobalCtor(ObjCInitFunction); 33759d1ed5bSDimitry Andric if (getCodeGenOpts().ProfileInstrGenerate) 33859d1ed5bSDimitry Andric if (llvm::Function *PGOInit = CodeGenPGO::emitInitialization(*this)) 33959d1ed5bSDimitry Andric AddGlobalCtor(PGOInit, 0); 34059d1ed5bSDimitry Andric if (PGOReader && PGOStats.hasDiagnostics()) 34159d1ed5bSDimitry Andric PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName); 342f22ef01cSRoman Divacky EmitCtorList(GlobalCtors, "llvm.global_ctors"); 343f22ef01cSRoman Divacky EmitCtorList(GlobalDtors, "llvm.global_dtors"); 3446122f3e6SDimitry Andric EmitGlobalAnnotations(); 345284c1978SDimitry Andric EmitStaticExternCAliases(); 34659d1ed5bSDimitry Andric emitLLVMUsed(); 347ffd1746dSEd Schouten 348f785676fSDimitry Andric if (CodeGenOpts.Autolink && 349f785676fSDimitry Andric (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) { 350139f7f9bSDimitry Andric EmitModuleLinkOptions(); 351139f7f9bSDimitry Andric } 352f785676fSDimitry Andric if (CodeGenOpts.DwarfVersion) 353f785676fSDimitry Andric // We actually want the latest version when there are conflicts. 354f785676fSDimitry Andric // We can change from Warning to Latest if such mode is supported. 355f785676fSDimitry Andric getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version", 356f785676fSDimitry Andric CodeGenOpts.DwarfVersion); 357f785676fSDimitry Andric if (DebugInfo) 35859d1ed5bSDimitry Andric // We support a single version in the linked module. The LLVM 35959d1ed5bSDimitry Andric // parser will drop debug info with a different version number 36059d1ed5bSDimitry Andric // (and warn about it, too). 36159d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version", 362f785676fSDimitry Andric llvm::DEBUG_METADATA_VERSION); 363139f7f9bSDimitry Andric 36459d1ed5bSDimitry Andric // We need to record the widths of enums and wchar_t, so that we can generate 36559d1ed5bSDimitry Andric // the correct build attributes in the ARM backend. 36659d1ed5bSDimitry Andric llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch(); 36759d1ed5bSDimitry Andric if ( Arch == llvm::Triple::arm 36859d1ed5bSDimitry Andric || Arch == llvm::Triple::armeb 36959d1ed5bSDimitry Andric || Arch == llvm::Triple::thumb 37059d1ed5bSDimitry Andric || Arch == llvm::Triple::thumbeb) { 37159d1ed5bSDimitry Andric // Width of wchar_t in bytes 37259d1ed5bSDimitry Andric uint64_t WCharWidth = 37359d1ed5bSDimitry Andric Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity(); 37459d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth); 37559d1ed5bSDimitry Andric 37659d1ed5bSDimitry Andric // The minimum width of an enum in bytes 37759d1ed5bSDimitry Andric uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4; 37859d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth); 37959d1ed5bSDimitry Andric } 38059d1ed5bSDimitry Andric 3812754fe60SDimitry Andric SimplifyPersonality(); 3822754fe60SDimitry Andric 383ffd1746dSEd Schouten if (getCodeGenOpts().EmitDeclMetadata) 384ffd1746dSEd Schouten EmitDeclMetadata(); 385bd5abe19SDimitry Andric 386bd5abe19SDimitry Andric if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) 387bd5abe19SDimitry Andric EmitCoverageFile(); 3886122f3e6SDimitry Andric 3896122f3e6SDimitry Andric if (DebugInfo) 3906122f3e6SDimitry Andric DebugInfo->finalize(); 391f785676fSDimitry Andric 392f785676fSDimitry Andric EmitVersionIdentMetadata(); 39359d1ed5bSDimitry Andric 39459d1ed5bSDimitry Andric EmitTargetMetadata(); 395f22ef01cSRoman Divacky } 396f22ef01cSRoman Divacky 3973b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 3983b0f4066SDimitry Andric // Make sure that this type is translated. 3993b0f4066SDimitry Andric Types.UpdateCompletedType(TD); 4003b0f4066SDimitry Andric } 4013b0f4066SDimitry Andric 4022754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) { 4032754fe60SDimitry Andric if (!TBAA) 40459d1ed5bSDimitry Andric return nullptr; 4052754fe60SDimitry Andric return TBAA->getTBAAInfo(QTy); 4062754fe60SDimitry Andric } 4072754fe60SDimitry Andric 408dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() { 409dff0c46cSDimitry Andric if (!TBAA) 41059d1ed5bSDimitry Andric return nullptr; 411dff0c46cSDimitry Andric return TBAA->getTBAAInfoForVTablePtr(); 412dff0c46cSDimitry Andric } 413dff0c46cSDimitry Andric 4143861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) { 4153861d79fSDimitry Andric if (!TBAA) 41659d1ed5bSDimitry Andric return nullptr; 4173861d79fSDimitry Andric return TBAA->getTBAAStructInfo(QTy); 4183861d79fSDimitry Andric } 4193861d79fSDimitry Andric 420139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) { 421139f7f9bSDimitry Andric if (!TBAA) 42259d1ed5bSDimitry Andric return nullptr; 423139f7f9bSDimitry Andric return TBAA->getTBAAStructTypeInfo(QTy); 424139f7f9bSDimitry Andric } 425139f7f9bSDimitry Andric 426139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy, 427139f7f9bSDimitry Andric llvm::MDNode *AccessN, 428139f7f9bSDimitry Andric uint64_t O) { 429139f7f9bSDimitry Andric if (!TBAA) 43059d1ed5bSDimitry Andric return nullptr; 431139f7f9bSDimitry Andric return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O); 432139f7f9bSDimitry Andric } 433139f7f9bSDimitry Andric 434f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA 435f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format: 436f785676fSDimitry Andric /// base type, access type and offset. 437284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type. 4382754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst, 439284c1978SDimitry Andric llvm::MDNode *TBAAInfo, 440284c1978SDimitry Andric bool ConvertTypeToTag) { 441f785676fSDimitry Andric if (ConvertTypeToTag && TBAA) 442284c1978SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, 443284c1978SDimitry Andric TBAA->getTBAAScalarTagInfo(TBAAInfo)); 444284c1978SDimitry Andric else 4452754fe60SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo); 4462754fe60SDimitry Andric } 4472754fe60SDimitry Andric 44859d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) { 44959d1ed5bSDimitry Andric unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0"); 45059d1ed5bSDimitry Andric getDiags().Report(Context.getFullLoc(loc), diagID) << message; 451f22ef01cSRoman Divacky } 452f22ef01cSRoman Divacky 453f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 454f22ef01cSRoman Divacky /// specified stmt yet. 455f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) { 4566122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 457f22ef01cSRoman Divacky "cannot compile this %0 yet"); 458f22ef01cSRoman Divacky std::string Msg = Type; 459f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 460f22ef01cSRoman Divacky << Msg << S->getSourceRange(); 461f22ef01cSRoman Divacky } 462f22ef01cSRoman Divacky 463f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 464f22ef01cSRoman Divacky /// specified decl yet. 465f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) { 4666122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 467f22ef01cSRoman Divacky "cannot compile this %0 yet"); 468f22ef01cSRoman Divacky std::string Msg = Type; 469f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 470f22ef01cSRoman Divacky } 471f22ef01cSRoman Divacky 47217a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { 47317a519f9SDimitry Andric return llvm::ConstantInt::get(SizeTy, size.getQuantity()); 47417a519f9SDimitry Andric } 47517a519f9SDimitry Andric 476f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, 4772754fe60SDimitry Andric const NamedDecl *D) const { 478f22ef01cSRoman Divacky // Internal definitions always have default visibility. 479f22ef01cSRoman Divacky if (GV->hasLocalLinkage()) { 480f22ef01cSRoman Divacky GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 481f22ef01cSRoman Divacky return; 482f22ef01cSRoman Divacky } 483f22ef01cSRoman Divacky 4842754fe60SDimitry Andric // Set visibility for definitions. 485139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 486139f7f9bSDimitry Andric if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage()) 487139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 488f22ef01cSRoman Divacky } 489f22ef01cSRoman Divacky 4907ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { 4917ae0e2c9SDimitry Andric return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) 4927ae0e2c9SDimitry Andric .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) 4937ae0e2c9SDimitry Andric .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) 4947ae0e2c9SDimitry Andric .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) 4957ae0e2c9SDimitry Andric .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); 4967ae0e2c9SDimitry Andric } 4977ae0e2c9SDimitry Andric 4987ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( 4997ae0e2c9SDimitry Andric CodeGenOptions::TLSModel M) { 5007ae0e2c9SDimitry Andric switch (M) { 5017ae0e2c9SDimitry Andric case CodeGenOptions::GeneralDynamicTLSModel: 5027ae0e2c9SDimitry Andric return llvm::GlobalVariable::GeneralDynamicTLSModel; 5037ae0e2c9SDimitry Andric case CodeGenOptions::LocalDynamicTLSModel: 5047ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalDynamicTLSModel; 5057ae0e2c9SDimitry Andric case CodeGenOptions::InitialExecTLSModel: 5067ae0e2c9SDimitry Andric return llvm::GlobalVariable::InitialExecTLSModel; 5077ae0e2c9SDimitry Andric case CodeGenOptions::LocalExecTLSModel: 5087ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalExecTLSModel; 5097ae0e2c9SDimitry Andric } 5107ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model!"); 5117ae0e2c9SDimitry Andric } 5127ae0e2c9SDimitry Andric 5137ae0e2c9SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, 5147ae0e2c9SDimitry Andric const VarDecl &D) const { 515284c1978SDimitry Andric assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); 5167ae0e2c9SDimitry Andric 5177ae0e2c9SDimitry Andric llvm::GlobalVariable::ThreadLocalMode TLM; 5183861d79fSDimitry Andric TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); 5197ae0e2c9SDimitry Andric 5207ae0e2c9SDimitry Andric // Override the TLS model if it is explicitly specified. 52159d1ed5bSDimitry Andric if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) { 5227ae0e2c9SDimitry Andric TLM = GetLLVMTLSModel(Attr->getModel()); 5237ae0e2c9SDimitry Andric } 5247ae0e2c9SDimitry Andric 5257ae0e2c9SDimitry Andric GV->setThreadLocalMode(TLM); 5267ae0e2c9SDimitry Andric } 5277ae0e2c9SDimitry Andric 5286122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) { 52959d1ed5bSDimitry Andric StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()]; 53059d1ed5bSDimitry Andric if (!FoundStr.empty()) 53159d1ed5bSDimitry Andric return FoundStr; 532f22ef01cSRoman Divacky 53359d1ed5bSDimitry Andric const auto *ND = cast<NamedDecl>(GD.getDecl()); 534dff0c46cSDimitry Andric SmallString<256> Buffer; 53559d1ed5bSDimitry Andric StringRef Str; 53659d1ed5bSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) { 5372754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer); 53859d1ed5bSDimitry Andric if (const auto *D = dyn_cast<CXXConstructorDecl>(ND)) 5392754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out); 54059d1ed5bSDimitry Andric else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND)) 5412754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out); 542ffd1746dSEd Schouten else 5432754fe60SDimitry Andric getCXXABI().getMangleContext().mangleName(ND, Out); 54459d1ed5bSDimitry Andric Str = Out.str(); 54559d1ed5bSDimitry Andric } else { 54659d1ed5bSDimitry Andric IdentifierInfo *II = ND->getIdentifier(); 54759d1ed5bSDimitry Andric assert(II && "Attempt to mangle unnamed decl."); 54859d1ed5bSDimitry Andric Str = II->getName(); 549ffd1746dSEd Schouten } 550ffd1746dSEd Schouten 55159d1ed5bSDimitry Andric auto &Mangled = Manglings.GetOrCreateValue(Str); 55259d1ed5bSDimitry Andric Mangled.second = GD; 55359d1ed5bSDimitry Andric return FoundStr = Mangled.first(); 55459d1ed5bSDimitry Andric } 55559d1ed5bSDimitry Andric 55659d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD, 557ffd1746dSEd Schouten const BlockDecl *BD) { 5582754fe60SDimitry Andric MangleContext &MangleCtx = getCXXABI().getMangleContext(); 5592754fe60SDimitry Andric const Decl *D = GD.getDecl(); 56059d1ed5bSDimitry Andric 56159d1ed5bSDimitry Andric SmallString<256> Buffer; 56259d1ed5bSDimitry Andric llvm::raw_svector_ostream Out(Buffer); 56359d1ed5bSDimitry Andric if (!D) 5647ae0e2c9SDimitry Andric MangleCtx.mangleGlobalBlock(BD, 5657ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out); 56659d1ed5bSDimitry Andric else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D)) 5672754fe60SDimitry Andric MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out); 56859d1ed5bSDimitry Andric else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D)) 5692754fe60SDimitry Andric MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out); 5702754fe60SDimitry Andric else 5712754fe60SDimitry Andric MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out); 57259d1ed5bSDimitry Andric 57359d1ed5bSDimitry Andric auto &Mangled = Manglings.GetOrCreateValue(Out.str()); 57459d1ed5bSDimitry Andric Mangled.second = BD; 57559d1ed5bSDimitry Andric return Mangled.first(); 576f22ef01cSRoman Divacky } 577f22ef01cSRoman Divacky 5786122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) { 579f22ef01cSRoman Divacky return getModule().getNamedValue(Name); 580f22ef01cSRoman Divacky } 581f22ef01cSRoman Divacky 582f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before 583f22ef01cSRoman Divacky /// main() runs. 58459d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority, 58559d1ed5bSDimitry Andric llvm::Constant *AssociatedData) { 586f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 58759d1ed5bSDimitry Andric GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData)); 588f22ef01cSRoman Divacky } 589f22ef01cSRoman Divacky 590f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called 591f22ef01cSRoman Divacky /// when the module is unloaded. 592f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) { 593f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 59459d1ed5bSDimitry Andric GlobalDtors.push_back(Structor(Priority, Dtor, nullptr)); 595f22ef01cSRoman Divacky } 596f22ef01cSRoman Divacky 597f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 598f22ef01cSRoman Divacky // Ctor function type is void()*. 599bd5abe19SDimitry Andric llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); 600f22ef01cSRoman Divacky llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 601f22ef01cSRoman Divacky 60259d1ed5bSDimitry Andric // Get the type of a ctor entry, { i32, void ()*, i8* }. 60359d1ed5bSDimitry Andric llvm::StructType *CtorStructTy = llvm::StructType::get( 60459d1ed5bSDimitry Andric Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, NULL); 605f22ef01cSRoman Divacky 606f22ef01cSRoman Divacky // Construct the constructor and destructor arrays. 607dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> Ctors; 608f22ef01cSRoman Divacky for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 609dff0c46cSDimitry Andric llvm::Constant *S[] = { 61059d1ed5bSDimitry Andric llvm::ConstantInt::get(Int32Ty, I->Priority, false), 61159d1ed5bSDimitry Andric llvm::ConstantExpr::getBitCast(I->Initializer, CtorPFTy), 61259d1ed5bSDimitry Andric (I->AssociatedData 61359d1ed5bSDimitry Andric ? llvm::ConstantExpr::getBitCast(I->AssociatedData, VoidPtrTy) 61459d1ed5bSDimitry Andric : llvm::Constant::getNullValue(VoidPtrTy)) 615dff0c46cSDimitry Andric }; 616f22ef01cSRoman Divacky Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 617f22ef01cSRoman Divacky } 618f22ef01cSRoman Divacky 619f22ef01cSRoman Divacky if (!Ctors.empty()) { 620f22ef01cSRoman Divacky llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 621f22ef01cSRoman Divacky new llvm::GlobalVariable(TheModule, AT, false, 622f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 623f22ef01cSRoman Divacky llvm::ConstantArray::get(AT, Ctors), 624f22ef01cSRoman Divacky GlobalName); 625f22ef01cSRoman Divacky } 626f22ef01cSRoman Divacky } 627f22ef01cSRoman Divacky 628f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes 629f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) { 63059d1ed5bSDimitry Andric const auto *D = cast<FunctionDecl>(GD.getDecl()); 631f785676fSDimitry Andric 632e580952dSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); 633f22ef01cSRoman Divacky 63459d1ed5bSDimitry Andric if (isa<CXXDestructorDecl>(D) && 63559d1ed5bSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 63659d1ed5bSDimitry Andric GD.getDtorType())) { 63759d1ed5bSDimitry Andric // Destructor variants in the Microsoft C++ ABI are always internal or 63859d1ed5bSDimitry Andric // linkonce_odr thunks emitted on an as-needed basis. 63959d1ed5bSDimitry Andric return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage 64059d1ed5bSDimitry Andric : llvm::GlobalValue::LinkOnceODRLinkage; 641f22ef01cSRoman Divacky } 642f22ef01cSRoman Divacky 64359d1ed5bSDimitry Andric return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false); 64459d1ed5bSDimitry Andric } 645f22ef01cSRoman Divacky 64659d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D, 64759d1ed5bSDimitry Andric llvm::Function *F) { 64859d1ed5bSDimitry Andric setNonAliasAttributes(D, F); 649f22ef01cSRoman Divacky } 650f22ef01cSRoman Divacky 651f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D, 652f22ef01cSRoman Divacky const CGFunctionInfo &Info, 653f22ef01cSRoman Divacky llvm::Function *F) { 654f22ef01cSRoman Divacky unsigned CallingConv; 655f22ef01cSRoman Divacky AttributeListType AttributeList; 656139f7f9bSDimitry Andric ConstructAttributeList(Info, D, AttributeList, CallingConv, false); 657139f7f9bSDimitry Andric F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList)); 658f22ef01cSRoman Divacky F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); 659f22ef01cSRoman Divacky } 660f22ef01cSRoman Divacky 6616122f3e6SDimitry Andric /// Determines whether the language options require us to model 6626122f3e6SDimitry Andric /// unwind exceptions. We treat -fexceptions as mandating this 6636122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions 6646122f3e6SDimitry Andric /// enabled. This means, for example, that C with -fexceptions 6656122f3e6SDimitry Andric /// enables this. 666dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) { 6676122f3e6SDimitry Andric // If exceptions are completely disabled, obviously this is false. 668dff0c46cSDimitry Andric if (!LangOpts.Exceptions) return false; 6696122f3e6SDimitry Andric 6706122f3e6SDimitry Andric // If C++ exceptions are enabled, this is true. 671dff0c46cSDimitry Andric if (LangOpts.CXXExceptions) return true; 6726122f3e6SDimitry Andric 6736122f3e6SDimitry Andric // If ObjC exceptions are enabled, this depends on the ABI. 674dff0c46cSDimitry Andric if (LangOpts.ObjCExceptions) { 6757ae0e2c9SDimitry Andric return LangOpts.ObjCRuntime.hasUnwindExceptions(); 6766122f3e6SDimitry Andric } 6776122f3e6SDimitry Andric 6786122f3e6SDimitry Andric return true; 6796122f3e6SDimitry Andric } 6806122f3e6SDimitry Andric 681f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, 682f22ef01cSRoman Divacky llvm::Function *F) { 683f785676fSDimitry Andric llvm::AttrBuilder B; 684f785676fSDimitry Andric 685bd5abe19SDimitry Andric if (CodeGenOpts.UnwindTables) 686f785676fSDimitry Andric B.addAttribute(llvm::Attribute::UWTable); 687bd5abe19SDimitry Andric 688dff0c46cSDimitry Andric if (!hasUnwindExceptions(LangOpts)) 689f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoUnwind); 690f22ef01cSRoman Divacky 6916122f3e6SDimitry Andric if (D->hasAttr<NakedAttr>()) { 6926122f3e6SDimitry Andric // Naked implies noinline: we should not be inlining such functions. 693f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Naked); 694f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 69559d1ed5bSDimitry Andric } else if (D->hasAttr<OptimizeNoneAttr>()) { 69659d1ed5bSDimitry Andric // OptimizeNone implies noinline; we should not be inlining such functions. 69759d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::OptimizeNone); 69859d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 69959d1ed5bSDimitry Andric } else if (D->hasAttr<NoDuplicateAttr>()) { 70059d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::NoDuplicate); 701f785676fSDimitry Andric } else if (D->hasAttr<NoInlineAttr>()) { 702f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 70359d1ed5bSDimitry Andric } else if (D->hasAttr<AlwaysInlineAttr>() && 704f785676fSDimitry Andric !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex, 705f785676fSDimitry Andric llvm::Attribute::NoInline)) { 706f785676fSDimitry Andric // (noinline wins over always_inline, and we can't specify both in IR) 707f785676fSDimitry Andric B.addAttribute(llvm::Attribute::AlwaysInline); 7086122f3e6SDimitry Andric } 7092754fe60SDimitry Andric 710f785676fSDimitry Andric if (D->hasAttr<ColdAttr>()) { 711f785676fSDimitry Andric B.addAttribute(llvm::Attribute::OptimizeForSize); 712f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Cold); 713f785676fSDimitry Andric } 7143861d79fSDimitry Andric 7153861d79fSDimitry Andric if (D->hasAttr<MinSizeAttr>()) 716f785676fSDimitry Andric B.addAttribute(llvm::Attribute::MinSize); 717f22ef01cSRoman Divacky 71859d1ed5bSDimitry Andric if (D->hasAttr<OptimizeNoneAttr>()) { 71959d1ed5bSDimitry Andric // OptimizeNone wins over OptimizeForSize and MinSize. 72059d1ed5bSDimitry Andric B.removeAttribute(llvm::Attribute::OptimizeForSize); 72159d1ed5bSDimitry Andric B.removeAttribute(llvm::Attribute::MinSize); 72259d1ed5bSDimitry Andric } 72359d1ed5bSDimitry Andric 7243861d79fSDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 725f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtect); 72659d1ed5bSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPStrong) 72759d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::StackProtectStrong); 7283861d79fSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 729f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtectReq); 7303861d79fSDimitry Andric 731139f7f9bSDimitry Andric // Add sanitizer attributes if function is not blacklisted. 73259d1ed5bSDimitry Andric if (!SanitizerBL.isIn(*F)) { 733139f7f9bSDimitry Andric // When AddressSanitizer is enabled, set SanitizeAddress attribute 734139f7f9bSDimitry Andric // unless __attribute__((no_sanitize_address)) is used. 73559d1ed5bSDimitry Andric if (LangOpts.Sanitize.Address && !D->hasAttr<NoSanitizeAddressAttr>()) 736f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeAddress); 737139f7f9bSDimitry Andric // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) 73859d1ed5bSDimitry Andric if (LangOpts.Sanitize.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) 739f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeThread); 740139f7f9bSDimitry Andric // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) 74159d1ed5bSDimitry Andric if (LangOpts.Sanitize.Memory && !D->hasAttr<NoSanitizeMemoryAttr>()) 742f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeMemory); 743dff0c46cSDimitry Andric } 744dff0c46cSDimitry Andric 745f785676fSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 746f785676fSDimitry Andric llvm::AttributeSet::get( 747f785676fSDimitry Andric F->getContext(), llvm::AttributeSet::FunctionIndex, B)); 748f785676fSDimitry Andric 749f785676fSDimitry Andric if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D)) 750f785676fSDimitry Andric F->setUnnamedAddr(true); 75159d1ed5bSDimitry Andric else if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) 752f785676fSDimitry Andric if (MD->isVirtual()) 753f785676fSDimitry Andric F->setUnnamedAddr(true); 754f785676fSDimitry Andric 755e580952dSDimitry Andric unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); 756e580952dSDimitry Andric if (alignment) 757e580952dSDimitry Andric F->setAlignment(alignment); 758e580952dSDimitry Andric 759f22ef01cSRoman Divacky // C++ ABI requires 2-byte alignment for member functions. 760f22ef01cSRoman Divacky if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) 761f22ef01cSRoman Divacky F->setAlignment(2); 762f22ef01cSRoman Divacky } 763f22ef01cSRoman Divacky 764f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D, 765f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 76659d1ed5bSDimitry Andric if (const auto *ND = dyn_cast<NamedDecl>(D)) 7672754fe60SDimitry Andric setGlobalVisibility(GV, ND); 7682754fe60SDimitry Andric else 7692754fe60SDimitry Andric GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 770f22ef01cSRoman Divacky 771f22ef01cSRoman Divacky if (D->hasAttr<UsedAttr>()) 77259d1ed5bSDimitry Andric addUsedGlobal(GV); 77359d1ed5bSDimitry Andric } 77459d1ed5bSDimitry Andric 77559d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D, 77659d1ed5bSDimitry Andric llvm::GlobalObject *GO) { 77759d1ed5bSDimitry Andric SetCommonAttributes(D, GO); 778f22ef01cSRoman Divacky 779f22ef01cSRoman Divacky if (const SectionAttr *SA = D->getAttr<SectionAttr>()) 78059d1ed5bSDimitry Andric GO->setSection(SA->getName()); 781f22ef01cSRoman Divacky 78259d1ed5bSDimitry Andric getTargetCodeGenInfo().SetTargetAttributes(D, GO, *this); 783f22ef01cSRoman Divacky } 784f22ef01cSRoman Divacky 785f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D, 786f22ef01cSRoman Divacky llvm::Function *F, 787f22ef01cSRoman Divacky const CGFunctionInfo &FI) { 788f22ef01cSRoman Divacky SetLLVMFunctionAttributes(D, FI, F); 789f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, F); 790f22ef01cSRoman Divacky 791f22ef01cSRoman Divacky F->setLinkage(llvm::Function::InternalLinkage); 792f22ef01cSRoman Divacky 79359d1ed5bSDimitry Andric setNonAliasAttributes(D, F); 79459d1ed5bSDimitry Andric } 79559d1ed5bSDimitry Andric 79659d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV, 79759d1ed5bSDimitry Andric const NamedDecl *ND) { 79859d1ed5bSDimitry Andric // Set linkage and visibility in case we never see a definition. 79959d1ed5bSDimitry Andric LinkageInfo LV = ND->getLinkageAndVisibility(); 80059d1ed5bSDimitry Andric if (LV.getLinkage() != ExternalLinkage) { 80159d1ed5bSDimitry Andric // Don't set internal linkage on declarations. 80259d1ed5bSDimitry Andric } else { 80359d1ed5bSDimitry Andric if (ND->hasAttr<DLLImportAttr>()) { 80459d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalLinkage); 80559d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 80659d1ed5bSDimitry Andric } else if (ND->hasAttr<DLLExportAttr>()) { 80759d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalLinkage); 80859d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 80959d1ed5bSDimitry Andric } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) { 81059d1ed5bSDimitry Andric // "extern_weak" is overloaded in LLVM; we probably should have 81159d1ed5bSDimitry Andric // separate linkage types for this. 81259d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); 81359d1ed5bSDimitry Andric } 81459d1ed5bSDimitry Andric 81559d1ed5bSDimitry Andric // Set visibility on a declaration only if it's explicit. 81659d1ed5bSDimitry Andric if (LV.isVisibilityExplicit()) 81759d1ed5bSDimitry Andric GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility())); 81859d1ed5bSDimitry Andric } 819f22ef01cSRoman Divacky } 820f22ef01cSRoman Divacky 821f22ef01cSRoman Divacky void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, 822f22ef01cSRoman Divacky llvm::Function *F, 823f22ef01cSRoman Divacky bool IsIncompleteFunction) { 8243b0f4066SDimitry Andric if (unsigned IID = F->getIntrinsicID()) { 8253b0f4066SDimitry Andric // If this is an intrinsic function, set the function's attributes 8263b0f4066SDimitry Andric // to the intrinsic's attributes. 8273861d79fSDimitry Andric F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), 8283861d79fSDimitry Andric (llvm::Intrinsic::ID)IID)); 8293b0f4066SDimitry Andric return; 8303b0f4066SDimitry Andric } 8313b0f4066SDimitry Andric 83259d1ed5bSDimitry Andric const auto *FD = cast<FunctionDecl>(GD.getDecl()); 833f22ef01cSRoman Divacky 834f22ef01cSRoman Divacky if (!IsIncompleteFunction) 835dff0c46cSDimitry Andric SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F); 836f22ef01cSRoman Divacky 83759d1ed5bSDimitry Andric // Add the Returned attribute for "this", except for iOS 5 and earlier 83859d1ed5bSDimitry Andric // where substantial code, including the libstdc++ dylib, was compiled with 83959d1ed5bSDimitry Andric // GCC and does not actually return "this". 84059d1ed5bSDimitry Andric if (getCXXABI().HasThisReturn(GD) && 84159d1ed5bSDimitry Andric !(getTarget().getTriple().isiOS() && 84259d1ed5bSDimitry Andric getTarget().getTriple().isOSVersionLT(6))) { 843f785676fSDimitry Andric assert(!F->arg_empty() && 844f785676fSDimitry Andric F->arg_begin()->getType() 845f785676fSDimitry Andric ->canLosslesslyBitCastTo(F->getReturnType()) && 846f785676fSDimitry Andric "unexpected this return"); 847f785676fSDimitry Andric F->addAttribute(1, llvm::Attribute::Returned); 848f785676fSDimitry Andric } 849f785676fSDimitry Andric 850f22ef01cSRoman Divacky // Only a few attributes are set on declarations; these may later be 851f22ef01cSRoman Divacky // overridden by a definition. 852f22ef01cSRoman Divacky 85359d1ed5bSDimitry Andric setLinkageAndVisibilityForGV(F, FD); 8542754fe60SDimitry Andric 85559d1ed5bSDimitry Andric if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) { 85659d1ed5bSDimitry Andric if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) { 85759d1ed5bSDimitry Andric // Don't dllexport/import destructor thunks. 85859d1ed5bSDimitry Andric F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); 8592754fe60SDimitry Andric } 860f22ef01cSRoman Divacky } 861f22ef01cSRoman Divacky 862f22ef01cSRoman Divacky if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) 863f22ef01cSRoman Divacky F->setSection(SA->getName()); 864f785676fSDimitry Andric 865f785676fSDimitry Andric // A replaceable global allocation function does not act like a builtin by 866f785676fSDimitry Andric // default, only if it is invoked by a new-expression or delete-expression. 867f785676fSDimitry Andric if (FD->isReplaceableGlobalAllocationFunction()) 868f785676fSDimitry Andric F->addAttribute(llvm::AttributeSet::FunctionIndex, 869f785676fSDimitry Andric llvm::Attribute::NoBuiltin); 870f22ef01cSRoman Divacky } 871f22ef01cSRoman Divacky 87259d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { 873f22ef01cSRoman Divacky assert(!GV->isDeclaration() && 874f22ef01cSRoman Divacky "Only globals with definition can force usage."); 875f22ef01cSRoman Divacky LLVMUsed.push_back(GV); 876f22ef01cSRoman Divacky } 877f22ef01cSRoman Divacky 87859d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) { 87959d1ed5bSDimitry Andric assert(!GV->isDeclaration() && 88059d1ed5bSDimitry Andric "Only globals with definition can force usage."); 88159d1ed5bSDimitry Andric LLVMCompilerUsed.push_back(GV); 88259d1ed5bSDimitry Andric } 88359d1ed5bSDimitry Andric 88459d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name, 88559d1ed5bSDimitry Andric std::vector<llvm::WeakVH> &List) { 886f22ef01cSRoman Divacky // Don't create llvm.used if there is no need. 88759d1ed5bSDimitry Andric if (List.empty()) 888f22ef01cSRoman Divacky return; 889f22ef01cSRoman Divacky 89059d1ed5bSDimitry Andric // Convert List to what ConstantArray needs. 891dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> UsedArray; 89259d1ed5bSDimitry Andric UsedArray.resize(List.size()); 89359d1ed5bSDimitry Andric for (unsigned i = 0, e = List.size(); i != e; ++i) { 894f22ef01cSRoman Divacky UsedArray[i] = 89559d1ed5bSDimitry Andric llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*List[i]), 89659d1ed5bSDimitry Andric CGM.Int8PtrTy); 897f22ef01cSRoman Divacky } 898f22ef01cSRoman Divacky 899f22ef01cSRoman Divacky if (UsedArray.empty()) 900f22ef01cSRoman Divacky return; 90159d1ed5bSDimitry Andric llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size()); 902f22ef01cSRoman Divacky 90359d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 90459d1ed5bSDimitry Andric CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage, 90559d1ed5bSDimitry Andric llvm::ConstantArray::get(ATy, UsedArray), Name); 906f22ef01cSRoman Divacky 907f22ef01cSRoman Divacky GV->setSection("llvm.metadata"); 908f22ef01cSRoman Divacky } 909f22ef01cSRoman Divacky 91059d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() { 91159d1ed5bSDimitry Andric emitUsed(*this, "llvm.used", LLVMUsed); 91259d1ed5bSDimitry Andric emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed); 91359d1ed5bSDimitry Andric } 91459d1ed5bSDimitry Andric 915f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) { 916f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opts); 917f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 918f785676fSDimitry Andric } 919f785676fSDimitry Andric 920f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) { 921f785676fSDimitry Andric llvm::SmallString<32> Opt; 922f785676fSDimitry Andric getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt); 923f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 924f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 925f785676fSDimitry Andric } 926f785676fSDimitry Andric 927f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) { 928f785676fSDimitry Andric llvm::SmallString<24> Opt; 929f785676fSDimitry Andric getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt); 930f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 931f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 932f785676fSDimitry Andric } 933f785676fSDimitry Andric 934139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules 935139f7f9bSDimitry Andric /// it depends on, using a postorder walk. 936f785676fSDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, 937139f7f9bSDimitry Andric Module *Mod, 938139f7f9bSDimitry Andric SmallVectorImpl<llvm::Value *> &Metadata, 939139f7f9bSDimitry Andric llvm::SmallPtrSet<Module *, 16> &Visited) { 940139f7f9bSDimitry Andric // Import this module's parent. 941139f7f9bSDimitry Andric if (Mod->Parent && Visited.insert(Mod->Parent)) { 942f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited); 943139f7f9bSDimitry Andric } 944139f7f9bSDimitry Andric 945139f7f9bSDimitry Andric // Import this module's dependencies. 946139f7f9bSDimitry Andric for (unsigned I = Mod->Imports.size(); I > 0; --I) { 947139f7f9bSDimitry Andric if (Visited.insert(Mod->Imports[I-1])) 948f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited); 949139f7f9bSDimitry Andric } 950139f7f9bSDimitry Andric 951139f7f9bSDimitry Andric // Add linker options to link against the libraries/frameworks 952139f7f9bSDimitry Andric // described by this module. 953f785676fSDimitry Andric llvm::LLVMContext &Context = CGM.getLLVMContext(); 954139f7f9bSDimitry Andric for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) { 955f785676fSDimitry Andric // Link against a framework. Frameworks are currently Darwin only, so we 956f785676fSDimitry Andric // don't to ask TargetCodeGenInfo for the spelling of the linker option. 957139f7f9bSDimitry Andric if (Mod->LinkLibraries[I-1].IsFramework) { 958139f7f9bSDimitry Andric llvm::Value *Args[2] = { 959139f7f9bSDimitry Andric llvm::MDString::get(Context, "-framework"), 960139f7f9bSDimitry Andric llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library) 961139f7f9bSDimitry Andric }; 962139f7f9bSDimitry Andric 963139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, Args)); 964139f7f9bSDimitry Andric continue; 965139f7f9bSDimitry Andric } 966139f7f9bSDimitry Andric 967139f7f9bSDimitry Andric // Link against a library. 968f785676fSDimitry Andric llvm::SmallString<24> Opt; 969f785676fSDimitry Andric CGM.getTargetCodeGenInfo().getDependentLibraryOption( 970f785676fSDimitry Andric Mod->LinkLibraries[I-1].Library, Opt); 971f785676fSDimitry Andric llvm::Value *OptString = llvm::MDString::get(Context, Opt); 972139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, OptString)); 973139f7f9bSDimitry Andric } 974139f7f9bSDimitry Andric } 975139f7f9bSDimitry Andric 976139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() { 977139f7f9bSDimitry Andric // Collect the set of all of the modules we want to visit to emit link 978139f7f9bSDimitry Andric // options, which is essentially the imported modules and all of their 979139f7f9bSDimitry Andric // non-explicit child modules. 980139f7f9bSDimitry Andric llvm::SetVector<clang::Module *> LinkModules; 981139f7f9bSDimitry Andric llvm::SmallPtrSet<clang::Module *, 16> Visited; 982139f7f9bSDimitry Andric SmallVector<clang::Module *, 16> Stack; 983139f7f9bSDimitry Andric 984139f7f9bSDimitry Andric // Seed the stack with imported modules. 985139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(), 986139f7f9bSDimitry Andric MEnd = ImportedModules.end(); 987139f7f9bSDimitry Andric M != MEnd; ++M) { 988139f7f9bSDimitry Andric if (Visited.insert(*M)) 989139f7f9bSDimitry Andric Stack.push_back(*M); 990139f7f9bSDimitry Andric } 991139f7f9bSDimitry Andric 992139f7f9bSDimitry Andric // Find all of the modules to import, making a little effort to prune 993139f7f9bSDimitry Andric // non-leaf modules. 994139f7f9bSDimitry Andric while (!Stack.empty()) { 995f785676fSDimitry Andric clang::Module *Mod = Stack.pop_back_val(); 996139f7f9bSDimitry Andric 997139f7f9bSDimitry Andric bool AnyChildren = false; 998139f7f9bSDimitry Andric 999139f7f9bSDimitry Andric // Visit the submodules of this module. 1000139f7f9bSDimitry Andric for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(), 1001139f7f9bSDimitry Andric SubEnd = Mod->submodule_end(); 1002139f7f9bSDimitry Andric Sub != SubEnd; ++Sub) { 1003139f7f9bSDimitry Andric // Skip explicit children; they need to be explicitly imported to be 1004139f7f9bSDimitry Andric // linked against. 1005139f7f9bSDimitry Andric if ((*Sub)->IsExplicit) 1006139f7f9bSDimitry Andric continue; 1007139f7f9bSDimitry Andric 1008139f7f9bSDimitry Andric if (Visited.insert(*Sub)) { 1009139f7f9bSDimitry Andric Stack.push_back(*Sub); 1010139f7f9bSDimitry Andric AnyChildren = true; 1011139f7f9bSDimitry Andric } 1012139f7f9bSDimitry Andric } 1013139f7f9bSDimitry Andric 1014139f7f9bSDimitry Andric // We didn't find any children, so add this module to the list of 1015139f7f9bSDimitry Andric // modules to link against. 1016139f7f9bSDimitry Andric if (!AnyChildren) { 1017139f7f9bSDimitry Andric LinkModules.insert(Mod); 1018139f7f9bSDimitry Andric } 1019139f7f9bSDimitry Andric } 1020139f7f9bSDimitry Andric 1021139f7f9bSDimitry Andric // Add link options for all of the imported modules in reverse topological 1022f785676fSDimitry Andric // order. We don't do anything to try to order import link flags with respect 1023f785676fSDimitry Andric // to linker options inserted by things like #pragma comment(). 1024139f7f9bSDimitry Andric SmallVector<llvm::Value *, 16> MetadataArgs; 1025139f7f9bSDimitry Andric Visited.clear(); 1026139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(), 1027139f7f9bSDimitry Andric MEnd = LinkModules.end(); 1028139f7f9bSDimitry Andric M != MEnd; ++M) { 1029139f7f9bSDimitry Andric if (Visited.insert(*M)) 1030f785676fSDimitry Andric addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited); 1031139f7f9bSDimitry Andric } 1032139f7f9bSDimitry Andric std::reverse(MetadataArgs.begin(), MetadataArgs.end()); 1033f785676fSDimitry Andric LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end()); 1034139f7f9bSDimitry Andric 1035139f7f9bSDimitry Andric // Add the linker options metadata flag. 1036139f7f9bSDimitry Andric getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options", 1037f785676fSDimitry Andric llvm::MDNode::get(getLLVMContext(), 1038f785676fSDimitry Andric LinkerOptionsMetadata)); 1039139f7f9bSDimitry Andric } 1040139f7f9bSDimitry Andric 1041f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() { 1042f22ef01cSRoman Divacky // Emit code for any potentially referenced deferred decls. Since a 1043f22ef01cSRoman Divacky // previously unused static decl may become used during the generation of code 1044f22ef01cSRoman Divacky // for a static function, iterate until no changes are made. 1045f22ef01cSRoman Divacky 1046139f7f9bSDimitry Andric while (true) { 1047f22ef01cSRoman Divacky if (!DeferredVTables.empty()) { 1048139f7f9bSDimitry Andric EmitDeferredVTables(); 1049139f7f9bSDimitry Andric 1050139f7f9bSDimitry Andric // Emitting a v-table doesn't directly cause more v-tables to 1051139f7f9bSDimitry Andric // become deferred, although it can cause functions to be 1052139f7f9bSDimitry Andric // emitted that then need those v-tables. 1053139f7f9bSDimitry Andric assert(DeferredVTables.empty()); 1054f22ef01cSRoman Divacky } 1055f22ef01cSRoman Divacky 1056139f7f9bSDimitry Andric // Stop if we're out of both deferred v-tables and deferred declarations. 1057139f7f9bSDimitry Andric if (DeferredDeclsToEmit.empty()) break; 1058139f7f9bSDimitry Andric 105959d1ed5bSDimitry Andric DeferredGlobal &G = DeferredDeclsToEmit.back(); 106059d1ed5bSDimitry Andric GlobalDecl D = G.GD; 106159d1ed5bSDimitry Andric llvm::GlobalValue *GV = G.GV; 1062f22ef01cSRoman Divacky DeferredDeclsToEmit.pop_back(); 1063f22ef01cSRoman Divacky 106459d1ed5bSDimitry Andric assert(GV == GetGlobalValue(getMangledName(D))); 1065f22ef01cSRoman Divacky // Check to see if we've already emitted this. This is necessary 1066f22ef01cSRoman Divacky // for a couple of reasons: first, decls can end up in the 1067f22ef01cSRoman Divacky // deferred-decls queue multiple times, and second, decls can end 1068f22ef01cSRoman Divacky // up with definitions in unusual ways (e.g. by an extern inline 1069f22ef01cSRoman Divacky // function acquiring a strong function redefinition). Just 1070f22ef01cSRoman Divacky // ignore these cases. 107159d1ed5bSDimitry Andric if(!GV->isDeclaration()) 1072f22ef01cSRoman Divacky continue; 1073f22ef01cSRoman Divacky 1074f22ef01cSRoman Divacky // Otherwise, emit the definition and move on to the next one. 107559d1ed5bSDimitry Andric EmitGlobalDefinition(D, GV); 1076f22ef01cSRoman Divacky } 1077f22ef01cSRoman Divacky } 1078f22ef01cSRoman Divacky 10796122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() { 10806122f3e6SDimitry Andric if (Annotations.empty()) 10816122f3e6SDimitry Andric return; 10826122f3e6SDimitry Andric 10836122f3e6SDimitry Andric // Create a new global variable for the ConstantStruct in the Module. 10846122f3e6SDimitry Andric llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get( 10856122f3e6SDimitry Andric Annotations[0]->getType(), Annotations.size()), Annotations); 108659d1ed5bSDimitry Andric auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false, 108759d1ed5bSDimitry Andric llvm::GlobalValue::AppendingLinkage, 108859d1ed5bSDimitry Andric Array, "llvm.global.annotations"); 10896122f3e6SDimitry Andric gv->setSection(AnnotationSection); 10906122f3e6SDimitry Andric } 10916122f3e6SDimitry Andric 1092139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) { 1093f785676fSDimitry Andric llvm::Constant *&AStr = AnnotationStrings[Str]; 1094f785676fSDimitry Andric if (AStr) 1095f785676fSDimitry Andric return AStr; 10966122f3e6SDimitry Andric 10976122f3e6SDimitry Andric // Not found yet, create a new global. 1098dff0c46cSDimitry Andric llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str); 109959d1ed5bSDimitry Andric auto *gv = 110059d1ed5bSDimitry Andric new llvm::GlobalVariable(getModule(), s->getType(), true, 110159d1ed5bSDimitry Andric llvm::GlobalValue::PrivateLinkage, s, ".str"); 11026122f3e6SDimitry Andric gv->setSection(AnnotationSection); 11036122f3e6SDimitry Andric gv->setUnnamedAddr(true); 1104f785676fSDimitry Andric AStr = gv; 11056122f3e6SDimitry Andric return gv; 11066122f3e6SDimitry Andric } 11076122f3e6SDimitry Andric 11086122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) { 11096122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 11106122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(Loc); 11116122f3e6SDimitry Andric if (PLoc.isValid()) 11126122f3e6SDimitry Andric return EmitAnnotationString(PLoc.getFilename()); 11136122f3e6SDimitry Andric return EmitAnnotationString(SM.getBufferName(Loc)); 11146122f3e6SDimitry Andric } 11156122f3e6SDimitry Andric 11166122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { 11176122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 11186122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(L); 11196122f3e6SDimitry Andric unsigned LineNo = PLoc.isValid() ? PLoc.getLine() : 11206122f3e6SDimitry Andric SM.getExpansionLineNumber(L); 11216122f3e6SDimitry Andric return llvm::ConstantInt::get(Int32Ty, LineNo); 11226122f3e6SDimitry Andric } 11236122f3e6SDimitry Andric 1124f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 1125f22ef01cSRoman Divacky const AnnotateAttr *AA, 11266122f3e6SDimitry Andric SourceLocation L) { 11276122f3e6SDimitry Andric // Get the globals for file name, annotation, and the line number. 11286122f3e6SDimitry Andric llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), 11296122f3e6SDimitry Andric *UnitGV = EmitAnnotationUnit(L), 11306122f3e6SDimitry Andric *LineNoCst = EmitAnnotationLineNo(L); 1131f22ef01cSRoman Divacky 1132f22ef01cSRoman Divacky // Create the ConstantStruct for the global annotation. 1133f22ef01cSRoman Divacky llvm::Constant *Fields[4] = { 11346122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), 11356122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), 11366122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), 11376122f3e6SDimitry Andric LineNoCst 1138f22ef01cSRoman Divacky }; 113917a519f9SDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 1140f22ef01cSRoman Divacky } 1141f22ef01cSRoman Divacky 11426122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D, 11436122f3e6SDimitry Andric llvm::GlobalValue *GV) { 11446122f3e6SDimitry Andric assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute"); 11456122f3e6SDimitry Andric // Get the struct elements for these annotations. 114659d1ed5bSDimitry Andric for (const auto *I : D->specific_attrs<AnnotateAttr>()) 114759d1ed5bSDimitry Andric Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation())); 11486122f3e6SDimitry Andric } 11496122f3e6SDimitry Andric 1150f22ef01cSRoman Divacky bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { 1151e580952dSDimitry Andric // Never defer when EmitAllDecls is specified. 1152dff0c46cSDimitry Andric if (LangOpts.EmitAllDecls) 1153f22ef01cSRoman Divacky return false; 1154f22ef01cSRoman Divacky 1155e580952dSDimitry Andric return !getContext().DeclMustBeEmitted(Global); 1156f22ef01cSRoman Divacky } 1157f22ef01cSRoman Divacky 11583861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( 11593861d79fSDimitry Andric const CXXUuidofExpr* E) { 11603861d79fSDimitry Andric // Sema has verified that IIDSource has a __declspec(uuid()), and that its 11613861d79fSDimitry Andric // well-formed. 1162f785676fSDimitry Andric StringRef Uuid = E->getUuidAsStringRef(Context); 1163f785676fSDimitry Andric std::string Name = "_GUID_" + Uuid.lower(); 1164f785676fSDimitry Andric std::replace(Name.begin(), Name.end(), '-', '_'); 11653861d79fSDimitry Andric 11663861d79fSDimitry Andric // Look for an existing global. 11673861d79fSDimitry Andric if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name)) 11683861d79fSDimitry Andric return GV; 11693861d79fSDimitry Andric 11703861d79fSDimitry Andric llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType()); 11713861d79fSDimitry Andric assert(Init && "failed to initialize as constant"); 11723861d79fSDimitry Andric 117359d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 1174f785676fSDimitry Andric getModule(), Init->getType(), 1175f785676fSDimitry Andric /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name); 11763861d79fSDimitry Andric return GV; 11773861d79fSDimitry Andric } 11783861d79fSDimitry Andric 1179f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { 1180f22ef01cSRoman Divacky const AliasAttr *AA = VD->getAttr<AliasAttr>(); 1181f22ef01cSRoman Divacky assert(AA && "No alias?"); 1182f22ef01cSRoman Divacky 11836122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); 1184f22ef01cSRoman Divacky 1185f22ef01cSRoman Divacky // See if there is already something with the target's name in the module. 1186f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); 11873861d79fSDimitry Andric if (Entry) { 11883861d79fSDimitry Andric unsigned AS = getContext().getTargetAddressSpace(VD->getType()); 11893861d79fSDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); 11903861d79fSDimitry Andric } 1191f22ef01cSRoman Divacky 1192f22ef01cSRoman Divacky llvm::Constant *Aliasee; 1193f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 11943861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, 11953861d79fSDimitry Andric GlobalDecl(cast<FunctionDecl>(VD)), 11962754fe60SDimitry Andric /*ForVTable=*/false); 1197f22ef01cSRoman Divacky else 1198f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 119959d1ed5bSDimitry Andric llvm::PointerType::getUnqual(DeclTy), 120059d1ed5bSDimitry Andric nullptr); 12013861d79fSDimitry Andric 120259d1ed5bSDimitry Andric auto *F = cast<llvm::GlobalValue>(Aliasee); 1203f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 1204f22ef01cSRoman Divacky WeakRefReferences.insert(F); 1205f22ef01cSRoman Divacky 1206f22ef01cSRoman Divacky return Aliasee; 1207f22ef01cSRoman Divacky } 1208f22ef01cSRoman Divacky 1209f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) { 121059d1ed5bSDimitry Andric const auto *Global = cast<ValueDecl>(GD.getDecl()); 1211f22ef01cSRoman Divacky 1212f22ef01cSRoman Divacky // Weak references don't produce any output by themselves. 1213f22ef01cSRoman Divacky if (Global->hasAttr<WeakRefAttr>()) 1214f22ef01cSRoman Divacky return; 1215f22ef01cSRoman Divacky 1216f22ef01cSRoman Divacky // If this is an alias definition (which otherwise looks like a declaration) 1217f22ef01cSRoman Divacky // emit it now. 1218f22ef01cSRoman Divacky if (Global->hasAttr<AliasAttr>()) 1219f22ef01cSRoman Divacky return EmitAliasDefinition(GD); 1220f22ef01cSRoman Divacky 12216122f3e6SDimitry Andric // If this is CUDA, be selective about which declarations we emit. 1222dff0c46cSDimitry Andric if (LangOpts.CUDA) { 12236122f3e6SDimitry Andric if (CodeGenOpts.CUDAIsDevice) { 12246122f3e6SDimitry Andric if (!Global->hasAttr<CUDADeviceAttr>() && 12256122f3e6SDimitry Andric !Global->hasAttr<CUDAGlobalAttr>() && 12266122f3e6SDimitry Andric !Global->hasAttr<CUDAConstantAttr>() && 12276122f3e6SDimitry Andric !Global->hasAttr<CUDASharedAttr>()) 12286122f3e6SDimitry Andric return; 12296122f3e6SDimitry Andric } else { 12306122f3e6SDimitry Andric if (!Global->hasAttr<CUDAHostAttr>() && ( 12316122f3e6SDimitry Andric Global->hasAttr<CUDADeviceAttr>() || 12326122f3e6SDimitry Andric Global->hasAttr<CUDAConstantAttr>() || 12336122f3e6SDimitry Andric Global->hasAttr<CUDASharedAttr>())) 12346122f3e6SDimitry Andric return; 1235e580952dSDimitry Andric } 1236e580952dSDimitry Andric } 1237e580952dSDimitry Andric 12386122f3e6SDimitry Andric // Ignore declarations, they will be emitted on their first use. 123959d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(Global)) { 1240f22ef01cSRoman Divacky // Forward declarations are emitted lazily on first use. 12416122f3e6SDimitry Andric if (!FD->doesThisDeclarationHaveABody()) { 12426122f3e6SDimitry Andric if (!FD->doesDeclarationForceExternallyVisibleDefinition()) 1243f22ef01cSRoman Divacky return; 12446122f3e6SDimitry Andric 12456122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 124659d1ed5bSDimitry Andric 124759d1ed5bSDimitry Andric // Compute the function info and LLVM type. 124859d1ed5bSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 124959d1ed5bSDimitry Andric llvm::Type *Ty = getTypes().GetFunctionType(FI); 125059d1ed5bSDimitry Andric 125159d1ed5bSDimitry Andric GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false, 125259d1ed5bSDimitry Andric /*DontDefer=*/false); 12536122f3e6SDimitry Andric return; 12546122f3e6SDimitry Andric } 1255f22ef01cSRoman Divacky } else { 125659d1ed5bSDimitry Andric const auto *VD = cast<VarDecl>(Global); 1257f22ef01cSRoman Divacky assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 1258f22ef01cSRoman Divacky 125959d1ed5bSDimitry Andric if (VD->isThisDeclarationADefinition() != VarDecl::Definition && 126059d1ed5bSDimitry Andric !Context.isMSStaticDataMemberInlineDefinition(VD)) 1261f22ef01cSRoman Divacky return; 1262f22ef01cSRoman Divacky } 1263f22ef01cSRoman Divacky 1264f22ef01cSRoman Divacky // Defer code generation when possible if this is a static definition, inline 1265f22ef01cSRoman Divacky // function etc. These we only want to emit if they are used. 1266f22ef01cSRoman Divacky if (!MayDeferGeneration(Global)) { 1267f22ef01cSRoman Divacky // Emit the definition if it can't be deferred. 1268f22ef01cSRoman Divacky EmitGlobalDefinition(GD); 1269f22ef01cSRoman Divacky return; 1270f22ef01cSRoman Divacky } 1271f22ef01cSRoman Divacky 1272e580952dSDimitry Andric // If we're deferring emission of a C++ variable with an 1273e580952dSDimitry Andric // initializer, remember the order in which it appeared in the file. 1274dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) && 1275e580952dSDimitry Andric cast<VarDecl>(Global)->hasInit()) { 1276e580952dSDimitry Andric DelayedCXXInitPosition[Global] = CXXGlobalInits.size(); 127759d1ed5bSDimitry Andric CXXGlobalInits.push_back(nullptr); 1278e580952dSDimitry Andric } 1279e580952dSDimitry Andric 1280f22ef01cSRoman Divacky // If the value has already been used, add it directly to the 1281f22ef01cSRoman Divacky // DeferredDeclsToEmit list. 12826122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 128359d1ed5bSDimitry Andric if (llvm::GlobalValue *GV = GetGlobalValue(MangledName)) 128459d1ed5bSDimitry Andric addDeferredDeclToEmit(GV, GD); 1285f22ef01cSRoman Divacky else { 1286f22ef01cSRoman Divacky // Otherwise, remember that we saw a deferred decl with this name. The 1287f22ef01cSRoman Divacky // first use of the mangled name will cause it to move into 1288f22ef01cSRoman Divacky // DeferredDeclsToEmit. 1289f22ef01cSRoman Divacky DeferredDecls[MangledName] = GD; 1290f22ef01cSRoman Divacky } 1291f22ef01cSRoman Divacky } 1292f22ef01cSRoman Divacky 1293f8254f43SDimitry Andric namespace { 1294f8254f43SDimitry Andric struct FunctionIsDirectlyRecursive : 1295f8254f43SDimitry Andric public RecursiveASTVisitor<FunctionIsDirectlyRecursive> { 1296f8254f43SDimitry Andric const StringRef Name; 1297dff0c46cSDimitry Andric const Builtin::Context &BI; 1298f8254f43SDimitry Andric bool Result; 1299dff0c46cSDimitry Andric FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) : 1300dff0c46cSDimitry Andric Name(N), BI(C), Result(false) { 1301f8254f43SDimitry Andric } 1302f8254f43SDimitry Andric typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base; 1303f8254f43SDimitry Andric 1304f8254f43SDimitry Andric bool TraverseCallExpr(CallExpr *E) { 1305dff0c46cSDimitry Andric const FunctionDecl *FD = E->getDirectCallee(); 1306dff0c46cSDimitry Andric if (!FD) 1307f8254f43SDimitry Andric return true; 1308dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1309dff0c46cSDimitry Andric if (Attr && Name == Attr->getLabel()) { 1310dff0c46cSDimitry Andric Result = true; 1311dff0c46cSDimitry Andric return false; 1312dff0c46cSDimitry Andric } 1313dff0c46cSDimitry Andric unsigned BuiltinID = FD->getBuiltinID(); 1314dff0c46cSDimitry Andric if (!BuiltinID) 1315f8254f43SDimitry Andric return true; 1316dff0c46cSDimitry Andric StringRef BuiltinName = BI.GetName(BuiltinID); 1317dff0c46cSDimitry Andric if (BuiltinName.startswith("__builtin_") && 1318dff0c46cSDimitry Andric Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) { 1319f8254f43SDimitry Andric Result = true; 1320f8254f43SDimitry Andric return false; 1321f8254f43SDimitry Andric } 1322f8254f43SDimitry Andric return true; 1323f8254f43SDimitry Andric } 1324f8254f43SDimitry Andric }; 1325f8254f43SDimitry Andric } 1326f8254f43SDimitry Andric 1327dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another 1328dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin, 1329dff0c46cSDimitry Andric // ends up pointing to itself. 1330f8254f43SDimitry Andric bool 1331dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { 1332dff0c46cSDimitry Andric StringRef Name; 1333dff0c46cSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) { 1334dff0c46cSDimitry Andric // asm labels are a special kind of mangling we have to support. 1335dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1336dff0c46cSDimitry Andric if (!Attr) 1337f8254f43SDimitry Andric return false; 1338dff0c46cSDimitry Andric Name = Attr->getLabel(); 1339dff0c46cSDimitry Andric } else { 1340dff0c46cSDimitry Andric Name = FD->getName(); 1341dff0c46cSDimitry Andric } 1342f8254f43SDimitry Andric 1343dff0c46cSDimitry Andric FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); 1344dff0c46cSDimitry Andric Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); 1345f8254f43SDimitry Andric return Walker.Result; 1346f8254f43SDimitry Andric } 1347f8254f43SDimitry Andric 1348f8254f43SDimitry Andric bool 1349f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) { 1350f785676fSDimitry Andric if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage) 1351f8254f43SDimitry Andric return true; 135259d1ed5bSDimitry Andric const auto *F = cast<FunctionDecl>(GD.getDecl()); 135359d1ed5bSDimitry Andric if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>()) 1354f8254f43SDimitry Andric return false; 1355f8254f43SDimitry Andric // PR9614. Avoid cases where the source code is lying to us. An available 1356f8254f43SDimitry Andric // externally function should have an equivalent function somewhere else, 1357f8254f43SDimitry Andric // but a function that calls itself is clearly not equivalent to the real 1358f8254f43SDimitry Andric // implementation. 1359f8254f43SDimitry Andric // This happens in glibc's btowc and in some configure checks. 1360dff0c46cSDimitry Andric return !isTriviallyRecursive(F); 1361f8254f43SDimitry Andric } 1362f8254f43SDimitry Andric 1363f785676fSDimitry Andric /// If the type for the method's class was generated by 1364f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a 1365f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart() 1366f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need 1367f785676fSDimitry Andric /// to construct the complete type prior to emitting the method. 1368f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) { 1369f785676fSDimitry Andric if (!D->isInstance()) 1370f785676fSDimitry Andric return; 1371f785676fSDimitry Andric 1372f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 1373f785676fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) { 137459d1ed5bSDimitry Andric const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext())); 1375f785676fSDimitry Andric DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation()); 1376f785676fSDimitry Andric } 1377f785676fSDimitry Andric } 1378f785676fSDimitry Andric 137959d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) { 138059d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 1381f22ef01cSRoman Divacky 1382f22ef01cSRoman Divacky PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(), 1383f22ef01cSRoman Divacky Context.getSourceManager(), 1384f22ef01cSRoman Divacky "Generating code for declaration"); 1385f22ef01cSRoman Divacky 1386f785676fSDimitry Andric if (isa<FunctionDecl>(D)) { 1387ffd1746dSEd Schouten // At -O0, don't generate IR for functions with available_externally 1388ffd1746dSEd Schouten // linkage. 1389f785676fSDimitry Andric if (!shouldEmitFunction(GD)) 1390ffd1746dSEd Schouten return; 1391ffd1746dSEd Schouten 139259d1ed5bSDimitry Andric if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) { 1393f785676fSDimitry Andric CompleteDIClassType(Method); 1394bd5abe19SDimitry Andric // Make sure to emit the definition(s) before we emit the thunks. 1395bd5abe19SDimitry Andric // This is necessary for the generation of certain thunks. 139659d1ed5bSDimitry Andric if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method)) 1397bd5abe19SDimitry Andric EmitCXXConstructor(CD, GD.getCtorType()); 139859d1ed5bSDimitry Andric else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method)) 1399bd5abe19SDimitry Andric EmitCXXDestructor(DD, GD.getDtorType()); 1400bd5abe19SDimitry Andric else 140159d1ed5bSDimitry Andric EmitGlobalFunctionDefinition(GD, GV); 1402bd5abe19SDimitry Andric 1403f22ef01cSRoman Divacky if (Method->isVirtual()) 1404f22ef01cSRoman Divacky getVTables().EmitThunks(GD); 1405f22ef01cSRoman Divacky 1406bd5abe19SDimitry Andric return; 1407ffd1746dSEd Schouten } 1408f22ef01cSRoman Divacky 140959d1ed5bSDimitry Andric return EmitGlobalFunctionDefinition(GD, GV); 1410ffd1746dSEd Schouten } 1411f22ef01cSRoman Divacky 141259d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(D)) 1413f22ef01cSRoman Divacky return EmitGlobalVarDefinition(VD); 1414f22ef01cSRoman Divacky 14156122f3e6SDimitry Andric llvm_unreachable("Invalid argument to EmitGlobalDefinition()"); 1416f22ef01cSRoman Divacky } 1417f22ef01cSRoman Divacky 1418f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the 1419f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there 1420f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1421f22ef01cSRoman Divacky /// bitcasted to the right type. 1422f22ef01cSRoman Divacky /// 1423f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1424f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created. 1425f22ef01cSRoman Divacky llvm::Constant * 14266122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 14276122f3e6SDimitry Andric llvm::Type *Ty, 1428f785676fSDimitry Andric GlobalDecl GD, bool ForVTable, 142959d1ed5bSDimitry Andric bool DontDefer, 1430139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1431f785676fSDimitry Andric const Decl *D = GD.getDecl(); 1432f785676fSDimitry Andric 1433f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1434f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1435f22ef01cSRoman Divacky if (Entry) { 14363861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1437f785676fSDimitry Andric const FunctionDecl *FD = cast_or_null<FunctionDecl>(D); 1438f22ef01cSRoman Divacky if (FD && !FD->hasAttr<WeakAttr>()) 1439f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1440f22ef01cSRoman Divacky } 1441f22ef01cSRoman Divacky 1442f22ef01cSRoman Divacky if (Entry->getType()->getElementType() == Ty) 1443f22ef01cSRoman Divacky return Entry; 1444f22ef01cSRoman Divacky 1445f22ef01cSRoman Divacky // Make sure the result is of the correct type. 144617a519f9SDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); 1447f22ef01cSRoman Divacky } 1448f22ef01cSRoman Divacky 1449f22ef01cSRoman Divacky // This function doesn't have a complete type (for example, the return 1450f22ef01cSRoman Divacky // type is an incomplete struct). Use a fake type instead, and make 1451f22ef01cSRoman Divacky // sure not to try to set attributes. 1452f22ef01cSRoman Divacky bool IsIncompleteFunction = false; 1453f22ef01cSRoman Divacky 14546122f3e6SDimitry Andric llvm::FunctionType *FTy; 1455f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(Ty)) { 1456f22ef01cSRoman Divacky FTy = cast<llvm::FunctionType>(Ty); 1457f22ef01cSRoman Divacky } else { 1458bd5abe19SDimitry Andric FTy = llvm::FunctionType::get(VoidTy, false); 1459f22ef01cSRoman Divacky IsIncompleteFunction = true; 1460f22ef01cSRoman Divacky } 1461ffd1746dSEd Schouten 1462f22ef01cSRoman Divacky llvm::Function *F = llvm::Function::Create(FTy, 1463f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 1464f22ef01cSRoman Divacky MangledName, &getModule()); 1465f22ef01cSRoman Divacky assert(F->getName() == MangledName && "name was uniqued!"); 1466f785676fSDimitry Andric if (D) 1467f785676fSDimitry Andric SetFunctionAttributes(GD, F, IsIncompleteFunction); 1468139f7f9bSDimitry Andric if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) { 1469139f7f9bSDimitry Andric llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex); 1470139f7f9bSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 1471139f7f9bSDimitry Andric llvm::AttributeSet::get(VMContext, 1472139f7f9bSDimitry Andric llvm::AttributeSet::FunctionIndex, 1473139f7f9bSDimitry Andric B)); 1474139f7f9bSDimitry Andric } 1475f22ef01cSRoman Divacky 147659d1ed5bSDimitry Andric if (!DontDefer) { 147759d1ed5bSDimitry Andric // All MSVC dtors other than the base dtor are linkonce_odr and delegate to 147859d1ed5bSDimitry Andric // each other bottoming out with the base dtor. Therefore we emit non-base 147959d1ed5bSDimitry Andric // dtors on usage, even if there is no dtor definition in the TU. 148059d1ed5bSDimitry Andric if (D && isa<CXXDestructorDecl>(D) && 148159d1ed5bSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 148259d1ed5bSDimitry Andric GD.getDtorType())) 148359d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD); 148459d1ed5bSDimitry Andric 1485f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1486f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1487f22ef01cSRoman Divacky // of the file. 148859d1ed5bSDimitry Andric auto DDI = DeferredDecls.find(MangledName); 1489f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 149059d1ed5bSDimitry Andric // Move the potentially referenced deferred decl to the 149159d1ed5bSDimitry Andric // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we 149259d1ed5bSDimitry Andric // don't need it anymore). 149359d1ed5bSDimitry Andric addDeferredDeclToEmit(F, DDI->second); 1494f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 14952754fe60SDimitry Andric 149659d1ed5bSDimitry Andric // Otherwise, if this is a sized deallocation function, emit a weak 149759d1ed5bSDimitry Andric // definition 1498f785676fSDimitry Andric // for it at the end of the translation unit. 1499f785676fSDimitry Andric } else if (D && cast<FunctionDecl>(D) 1500f785676fSDimitry Andric ->getCorrespondingUnsizedGlobalDeallocationFunction()) { 150159d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD); 1502f785676fSDimitry Andric 15032754fe60SDimitry Andric // Otherwise, there are cases we have to worry about where we're 15042754fe60SDimitry Andric // using a declaration for which we must emit a definition but where 15052754fe60SDimitry Andric // we might not find a top-level definition: 15062754fe60SDimitry Andric // - member functions defined inline in their classes 15072754fe60SDimitry Andric // - friend functions defined inline in some class 15082754fe60SDimitry Andric // - special member functions with implicit definitions 15092754fe60SDimitry Andric // If we ever change our AST traversal to walk into class methods, 15102754fe60SDimitry Andric // this will be unnecessary. 15112754fe60SDimitry Andric // 151259d1ed5bSDimitry Andric // We also don't emit a definition for a function if it's going to be an 151359d1ed5bSDimitry Andric // entry 15142754fe60SDimitry Andric // in a vtable, unless it's already marked as used. 1515f785676fSDimitry Andric } else if (getLangOpts().CPlusPlus && D) { 15162754fe60SDimitry Andric // Look for a declaration that's lexically in a record. 151759d1ed5bSDimitry Andric const auto *FD = cast<FunctionDecl>(D); 15187ae0e2c9SDimitry Andric FD = FD->getMostRecentDecl(); 15192754fe60SDimitry Andric do { 15202754fe60SDimitry Andric if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) { 15212754fe60SDimitry Andric if (FD->isImplicit() && !ForVTable) { 152259d1ed5bSDimitry Andric assert(FD->isUsed() && 152359d1ed5bSDimitry Andric "Sema didn't mark implicit function as used!"); 152459d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD.getWithDecl(FD)); 15252754fe60SDimitry Andric break; 1526bd5abe19SDimitry Andric } else if (FD->doesThisDeclarationHaveABody()) { 152759d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD.getWithDecl(FD)); 15282754fe60SDimitry Andric break; 1529f22ef01cSRoman Divacky } 1530f22ef01cSRoman Divacky } 1531dff0c46cSDimitry Andric FD = FD->getPreviousDecl(); 15322754fe60SDimitry Andric } while (FD); 1533f22ef01cSRoman Divacky } 153459d1ed5bSDimitry Andric } 1535f22ef01cSRoman Divacky 1536f22ef01cSRoman Divacky // Make sure the result is of the requested type. 1537f22ef01cSRoman Divacky if (!IsIncompleteFunction) { 1538f22ef01cSRoman Divacky assert(F->getType()->getElementType() == Ty); 1539f22ef01cSRoman Divacky return F; 1540f22ef01cSRoman Divacky } 1541f22ef01cSRoman Divacky 154217a519f9SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 1543f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(F, PTy); 1544f22ef01cSRoman Divacky } 1545f22ef01cSRoman Divacky 1546f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function. If Ty is 1547f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to 1548f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function). 1549f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, 15506122f3e6SDimitry Andric llvm::Type *Ty, 155159d1ed5bSDimitry Andric bool ForVTable, 155259d1ed5bSDimitry Andric bool DontDefer) { 1553f22ef01cSRoman Divacky // If there was no specific requested type, just convert it now. 1554f22ef01cSRoman Divacky if (!Ty) 1555f22ef01cSRoman Divacky Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType()); 1556ffd1746dSEd Schouten 15576122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 155859d1ed5bSDimitry Andric return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer); 1559f22ef01cSRoman Divacky } 1560f22ef01cSRoman Divacky 1561f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified 1562f22ef01cSRoman Divacky /// type and name. 1563f22ef01cSRoman Divacky llvm::Constant * 15646122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, 15656122f3e6SDimitry Andric StringRef Name, 1566139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 156759d1ed5bSDimitry Andric llvm::Constant *C = 156859d1ed5bSDimitry Andric GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 156959d1ed5bSDimitry Andric /*DontDefer=*/false, ExtraAttrs); 157059d1ed5bSDimitry Andric if (auto *F = dyn_cast<llvm::Function>(C)) 1571139f7f9bSDimitry Andric if (F->empty()) 1572139f7f9bSDimitry Andric F->setCallingConv(getRuntimeCC()); 1573139f7f9bSDimitry Andric return C; 1574f22ef01cSRoman Divacky } 1575f22ef01cSRoman Divacky 1576dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted 1577dff0c46cSDimitry Andric /// as a constant. 1578dff0c46cSDimitry Andric /// 1579dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs 1580dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is 1581dff0c46cSDimitry Andric /// not written to during its construction. 1582dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) { 1583dff0c46cSDimitry Andric if (!Ty.isConstant(Context) && !Ty->isReferenceType()) 1584f22ef01cSRoman Divacky return false; 1585bd5abe19SDimitry Andric 1586dff0c46cSDimitry Andric if (Context.getLangOpts().CPlusPlus) { 1587dff0c46cSDimitry Andric if (const CXXRecordDecl *Record 1588dff0c46cSDimitry Andric = Context.getBaseElementType(Ty)->getAsCXXRecordDecl()) 1589dff0c46cSDimitry Andric return ExcludeCtor && !Record->hasMutableFields() && 1590dff0c46cSDimitry Andric Record->hasTrivialDestructor(); 1591f22ef01cSRoman Divacky } 1592bd5abe19SDimitry Andric 1593f22ef01cSRoman Divacky return true; 1594f22ef01cSRoman Divacky } 1595f22ef01cSRoman Divacky 1596f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, 1597f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type. If there 1598f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1599f22ef01cSRoman Divacky /// bitcasted to the right type. 1600f22ef01cSRoman Divacky /// 1601f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1602f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created. 1603f22ef01cSRoman Divacky llvm::Constant * 16046122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, 16056122f3e6SDimitry Andric llvm::PointerType *Ty, 160659d1ed5bSDimitry Andric const VarDecl *D) { 1607f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1608f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1609f22ef01cSRoman Divacky if (Entry) { 16103861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1611f22ef01cSRoman Divacky if (D && !D->hasAttr<WeakAttr>()) 1612f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1613f22ef01cSRoman Divacky } 1614f22ef01cSRoman Divacky 1615f22ef01cSRoman Divacky if (Entry->getType() == Ty) 1616f22ef01cSRoman Divacky return Entry; 1617f22ef01cSRoman Divacky 1618f22ef01cSRoman Divacky // Make sure the result is of the correct type. 1619f785676fSDimitry Andric if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace()) 1620f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty); 1621f785676fSDimitry Andric 1622f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(Entry, Ty); 1623f22ef01cSRoman Divacky } 1624f22ef01cSRoman Divacky 162559d1ed5bSDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace()); 162659d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 162759d1ed5bSDimitry Andric getModule(), Ty->getElementType(), false, 162859d1ed5bSDimitry Andric llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, nullptr, 162959d1ed5bSDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 163059d1ed5bSDimitry Andric 1631f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1632f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1633f22ef01cSRoman Divacky // of the file. 163459d1ed5bSDimitry Andric auto DDI = DeferredDecls.find(MangledName); 1635f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1636f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1637f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 163859d1ed5bSDimitry Andric addDeferredDeclToEmit(GV, DDI->second); 1639f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 1640f22ef01cSRoman Divacky } 1641f22ef01cSRoman Divacky 1642f22ef01cSRoman Divacky // Handle things which are present even on external declarations. 1643f22ef01cSRoman Divacky if (D) { 1644f22ef01cSRoman Divacky // FIXME: This code is overly simple and should be merged with other global 1645f22ef01cSRoman Divacky // handling. 1646dff0c46cSDimitry Andric GV->setConstant(isTypeConstant(D->getType(), false)); 1647f22ef01cSRoman Divacky 164859d1ed5bSDimitry Andric setLinkageAndVisibilityForGV(GV, D); 16492754fe60SDimitry Andric 1650284c1978SDimitry Andric if (D->getTLSKind()) { 1651284c1978SDimitry Andric if (D->getTLSKind() == VarDecl::TLS_Dynamic) 1652284c1978SDimitry Andric CXXThreadLocals.push_back(std::make_pair(D, GV)); 16537ae0e2c9SDimitry Andric setTLSMode(GV, *D); 1654f22ef01cSRoman Divacky } 1655f785676fSDimitry Andric 1656f785676fSDimitry Andric // If required by the ABI, treat declarations of static data members with 1657f785676fSDimitry Andric // inline initializers as definitions. 165859d1ed5bSDimitry Andric if (getContext().isMSStaticDataMemberInlineDefinition(D)) { 1659f785676fSDimitry Andric EmitGlobalVarDefinition(D); 1660284c1978SDimitry Andric } 1661f22ef01cSRoman Divacky 166259d1ed5bSDimitry Andric // Handle XCore specific ABI requirements. 166359d1ed5bSDimitry Andric if (getTarget().getTriple().getArch() == llvm::Triple::xcore && 166459d1ed5bSDimitry Andric D->getLanguageLinkage() == CLanguageLinkage && 166559d1ed5bSDimitry Andric D->getType().isConstant(Context) && 166659d1ed5bSDimitry Andric isExternallyVisible(D->getLinkageAndVisibility().getLinkage())) 166759d1ed5bSDimitry Andric GV->setSection(".cp.rodata"); 166859d1ed5bSDimitry Andric } 166959d1ed5bSDimitry Andric 16707ae0e2c9SDimitry Andric if (AddrSpace != Ty->getAddressSpace()) 1671f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty); 1672f785676fSDimitry Andric 1673f22ef01cSRoman Divacky return GV; 1674f22ef01cSRoman Divacky } 1675f22ef01cSRoman Divacky 1676f22ef01cSRoman Divacky 16772754fe60SDimitry Andric llvm::GlobalVariable * 16786122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, 16796122f3e6SDimitry Andric llvm::Type *Ty, 16802754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage) { 16812754fe60SDimitry Andric llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name); 168259d1ed5bSDimitry Andric llvm::GlobalVariable *OldGV = nullptr; 16832754fe60SDimitry Andric 16842754fe60SDimitry Andric if (GV) { 16852754fe60SDimitry Andric // Check if the variable has the right type. 16862754fe60SDimitry Andric if (GV->getType()->getElementType() == Ty) 16872754fe60SDimitry Andric return GV; 16882754fe60SDimitry Andric 16892754fe60SDimitry Andric // Because C++ name mangling, the only way we can end up with an already 16902754fe60SDimitry Andric // existing global with the same name is if it has been declared extern "C". 16912754fe60SDimitry Andric assert(GV->isDeclaration() && "Declaration has wrong type!"); 16922754fe60SDimitry Andric OldGV = GV; 16932754fe60SDimitry Andric } 16942754fe60SDimitry Andric 16952754fe60SDimitry Andric // Create a new variable. 16962754fe60SDimitry Andric GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true, 169759d1ed5bSDimitry Andric Linkage, nullptr, Name); 16982754fe60SDimitry Andric 16992754fe60SDimitry Andric if (OldGV) { 17002754fe60SDimitry Andric // Replace occurrences of the old variable if needed. 17012754fe60SDimitry Andric GV->takeName(OldGV); 17022754fe60SDimitry Andric 17032754fe60SDimitry Andric if (!OldGV->use_empty()) { 17042754fe60SDimitry Andric llvm::Constant *NewPtrForOldDecl = 17052754fe60SDimitry Andric llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 17062754fe60SDimitry Andric OldGV->replaceAllUsesWith(NewPtrForOldDecl); 17072754fe60SDimitry Andric } 17082754fe60SDimitry Andric 17092754fe60SDimitry Andric OldGV->eraseFromParent(); 17102754fe60SDimitry Andric } 17112754fe60SDimitry Andric 17122754fe60SDimitry Andric return GV; 17132754fe60SDimitry Andric } 17142754fe60SDimitry Andric 1715f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the 1716f22ef01cSRoman Divacky /// given global variable. If Ty is non-null and if the global doesn't exist, 1717cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the 1718f22ef01cSRoman Divacky /// normal requested type would be. 1719f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, 17206122f3e6SDimitry Andric llvm::Type *Ty) { 1721f22ef01cSRoman Divacky assert(D->hasGlobalStorage() && "Not a global variable"); 1722f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 172359d1ed5bSDimitry Andric if (!Ty) 1724f22ef01cSRoman Divacky Ty = getTypes().ConvertTypeForMem(ASTTy); 1725f22ef01cSRoman Divacky 17266122f3e6SDimitry Andric llvm::PointerType *PTy = 17273b0f4066SDimitry Andric llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy)); 1728f22ef01cSRoman Divacky 17296122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1730f22ef01cSRoman Divacky return GetOrCreateLLVMGlobal(MangledName, PTy, D); 1731f22ef01cSRoman Divacky } 1732f22ef01cSRoman Divacky 1733f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the 1734f22ef01cSRoman Divacky /// specified type and name. 1735f22ef01cSRoman Divacky llvm::Constant * 17366122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, 17376122f3e6SDimitry Andric StringRef Name) { 173859d1ed5bSDimitry Andric return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr); 1739f22ef01cSRoman Divacky } 1740f22ef01cSRoman Divacky 1741f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { 1742f22ef01cSRoman Divacky assert(!D->getInit() && "Cannot emit definite definitions here!"); 1743f22ef01cSRoman Divacky 1744f22ef01cSRoman Divacky if (MayDeferGeneration(D)) { 1745f22ef01cSRoman Divacky // If we have not seen a reference to this variable yet, place it 1746f22ef01cSRoman Divacky // into the deferred declarations table to be emitted if needed 1747f22ef01cSRoman Divacky // later. 17486122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1749f22ef01cSRoman Divacky if (!GetGlobalValue(MangledName)) { 1750f22ef01cSRoman Divacky DeferredDecls[MangledName] = D; 1751f22ef01cSRoman Divacky return; 1752f22ef01cSRoman Divacky } 1753f22ef01cSRoman Divacky } 1754f22ef01cSRoman Divacky 1755f22ef01cSRoman Divacky // The tentative definition is the only definition. 1756f22ef01cSRoman Divacky EmitGlobalVarDefinition(D); 1757f22ef01cSRoman Divacky } 1758f22ef01cSRoman Divacky 17596122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const { 17602754fe60SDimitry Andric return Context.toCharUnitsFromBits( 17613861d79fSDimitry Andric TheDataLayout.getTypeStoreSizeInBits(Ty)); 1762f22ef01cSRoman Divacky } 1763f22ef01cSRoman Divacky 17647ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D, 17657ae0e2c9SDimitry Andric unsigned AddrSpace) { 17667ae0e2c9SDimitry Andric if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) { 17677ae0e2c9SDimitry Andric if (D->hasAttr<CUDAConstantAttr>()) 17687ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant); 17697ae0e2c9SDimitry Andric else if (D->hasAttr<CUDASharedAttr>()) 17707ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared); 17717ae0e2c9SDimitry Andric else 17727ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device); 17737ae0e2c9SDimitry Andric } 17747ae0e2c9SDimitry Andric 17757ae0e2c9SDimitry Andric return AddrSpace; 17767ae0e2c9SDimitry Andric } 17777ae0e2c9SDimitry Andric 1778284c1978SDimitry Andric template<typename SomeDecl> 1779284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D, 1780284c1978SDimitry Andric llvm::GlobalValue *GV) { 1781284c1978SDimitry Andric if (!getLangOpts().CPlusPlus) 1782284c1978SDimitry Andric return; 1783284c1978SDimitry Andric 1784284c1978SDimitry Andric // Must have 'used' attribute, or else inline assembly can't rely on 1785284c1978SDimitry Andric // the name existing. 1786284c1978SDimitry Andric if (!D->template hasAttr<UsedAttr>()) 1787284c1978SDimitry Andric return; 1788284c1978SDimitry Andric 1789284c1978SDimitry Andric // Must have internal linkage and an ordinary name. 1790f785676fSDimitry Andric if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage) 1791284c1978SDimitry Andric return; 1792284c1978SDimitry Andric 1793284c1978SDimitry Andric // Must be in an extern "C" context. Entities declared directly within 1794284c1978SDimitry Andric // a record are not extern "C" even if the record is in such a context. 1795f785676fSDimitry Andric const SomeDecl *First = D->getFirstDecl(); 1796284c1978SDimitry Andric if (First->getDeclContext()->isRecord() || !First->isInExternCContext()) 1797284c1978SDimitry Andric return; 1798284c1978SDimitry Andric 1799284c1978SDimitry Andric // OK, this is an internal linkage entity inside an extern "C" linkage 1800284c1978SDimitry Andric // specification. Make a note of that so we can give it the "expected" 1801284c1978SDimitry Andric // mangled name if nothing else is using that name. 1802284c1978SDimitry Andric std::pair<StaticExternCMap::iterator, bool> R = 1803284c1978SDimitry Andric StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV)); 1804284c1978SDimitry Andric 1805284c1978SDimitry Andric // If we have multiple internal linkage entities with the same name 1806284c1978SDimitry Andric // in extern "C" regions, none of them gets that name. 1807284c1978SDimitry Andric if (!R.second) 180859d1ed5bSDimitry Andric R.first->second = nullptr; 1809284c1978SDimitry Andric } 1810284c1978SDimitry Andric 1811f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 181259d1ed5bSDimitry Andric llvm::Constant *Init = nullptr; 1813f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1814dff0c46cSDimitry Andric CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 1815dff0c46cSDimitry Andric bool NeedsGlobalCtor = false; 1816dff0c46cSDimitry Andric bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor(); 1817f22ef01cSRoman Divacky 1818dff0c46cSDimitry Andric const VarDecl *InitDecl; 1819dff0c46cSDimitry Andric const Expr *InitExpr = D->getAnyInitializer(InitDecl); 1820f22ef01cSRoman Divacky 1821f22ef01cSRoman Divacky if (!InitExpr) { 1822f22ef01cSRoman Divacky // This is a tentative definition; tentative definitions are 1823f22ef01cSRoman Divacky // implicitly initialized with { 0 }. 1824f22ef01cSRoman Divacky // 1825f22ef01cSRoman Divacky // Note that tentative definitions are only emitted at the end of 1826f22ef01cSRoman Divacky // a translation unit, so they should never have incomplete 1827f22ef01cSRoman Divacky // type. In addition, EmitTentativeDefinition makes sure that we 1828f22ef01cSRoman Divacky // never attempt to emit a tentative definition if a real one 1829f22ef01cSRoman Divacky // exists. A use may still exists, however, so we still may need 1830f22ef01cSRoman Divacky // to do a RAUW. 1831f22ef01cSRoman Divacky assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type"); 1832f22ef01cSRoman Divacky Init = EmitNullConstant(D->getType()); 1833f22ef01cSRoman Divacky } else { 18347ae0e2c9SDimitry Andric initializedGlobalDecl = GlobalDecl(D); 1835dff0c46cSDimitry Andric Init = EmitConstantInit(*InitDecl); 1836f785676fSDimitry Andric 1837f22ef01cSRoman Divacky if (!Init) { 1838f22ef01cSRoman Divacky QualType T = InitExpr->getType(); 1839f22ef01cSRoman Divacky if (D->getType()->isReferenceType()) 1840f22ef01cSRoman Divacky T = D->getType(); 1841f22ef01cSRoman Divacky 1842dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus) { 1843f22ef01cSRoman Divacky Init = EmitNullConstant(T); 1844dff0c46cSDimitry Andric NeedsGlobalCtor = true; 1845f22ef01cSRoman Divacky } else { 1846f22ef01cSRoman Divacky ErrorUnsupported(D, "static initializer"); 1847f22ef01cSRoman Divacky Init = llvm::UndefValue::get(getTypes().ConvertType(T)); 1848f22ef01cSRoman Divacky } 1849e580952dSDimitry Andric } else { 1850e580952dSDimitry Andric // We don't need an initializer, so remove the entry for the delayed 1851dff0c46cSDimitry Andric // initializer position (just in case this entry was delayed) if we 1852dff0c46cSDimitry Andric // also don't need to register a destructor. 1853dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && !NeedsGlobalDtor) 1854e580952dSDimitry Andric DelayedCXXInitPosition.erase(D); 1855f22ef01cSRoman Divacky } 1856f22ef01cSRoman Divacky } 1857f22ef01cSRoman Divacky 18586122f3e6SDimitry Andric llvm::Type* InitType = Init->getType(); 1859f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); 1860f22ef01cSRoman Divacky 1861f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 186259d1ed5bSDimitry Andric if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 1863f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast || 1864f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::AddrSpaceCast || 1865f785676fSDimitry Andric // All zero index gep. 1866f22ef01cSRoman Divacky CE->getOpcode() == llvm::Instruction::GetElementPtr); 1867f22ef01cSRoman Divacky Entry = CE->getOperand(0); 1868f22ef01cSRoman Divacky } 1869f22ef01cSRoman Divacky 1870f22ef01cSRoman Divacky // Entry is now either a Function or GlobalVariable. 187159d1ed5bSDimitry Andric auto *GV = dyn_cast<llvm::GlobalVariable>(Entry); 1872f22ef01cSRoman Divacky 1873f22ef01cSRoman Divacky // We have a definition after a declaration with the wrong type. 1874f22ef01cSRoman Divacky // We must make a new GlobalVariable* and update everything that used OldGV 1875f22ef01cSRoman Divacky // (a declaration or tentative definition) with the new GlobalVariable* 1876f22ef01cSRoman Divacky // (which will be a definition). 1877f22ef01cSRoman Divacky // 1878f22ef01cSRoman Divacky // This happens if there is a prototype for a global (e.g. 1879f22ef01cSRoman Divacky // "extern int x[];") and then a definition of a different type (e.g. 1880f22ef01cSRoman Divacky // "int x[10];"). This also happens when an initializer has a different type 1881f22ef01cSRoman Divacky // from the type of the global (this happens with unions). 188259d1ed5bSDimitry Andric if (!GV || 1883f22ef01cSRoman Divacky GV->getType()->getElementType() != InitType || 18843b0f4066SDimitry Andric GV->getType()->getAddressSpace() != 18857ae0e2c9SDimitry Andric GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) { 1886f22ef01cSRoman Divacky 1887f22ef01cSRoman Divacky // Move the old entry aside so that we'll create a new one. 18886122f3e6SDimitry Andric Entry->setName(StringRef()); 1889f22ef01cSRoman Divacky 1890f22ef01cSRoman Divacky // Make a new global with the correct type, this is now guaranteed to work. 1891f22ef01cSRoman Divacky GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType)); 1892f22ef01cSRoman Divacky 1893f22ef01cSRoman Divacky // Replace all uses of the old global with the new global 1894f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 1895f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(GV, Entry->getType()); 1896f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 1897f22ef01cSRoman Divacky 1898f22ef01cSRoman Divacky // Erase the old global, since it is no longer used. 1899f22ef01cSRoman Divacky cast<llvm::GlobalValue>(Entry)->eraseFromParent(); 1900f22ef01cSRoman Divacky } 1901f22ef01cSRoman Divacky 1902284c1978SDimitry Andric MaybeHandleStaticInExternC(D, GV); 1903284c1978SDimitry Andric 19046122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 19056122f3e6SDimitry Andric AddGlobalAnnotations(D, GV); 1906f22ef01cSRoman Divacky 1907f22ef01cSRoman Divacky GV->setInitializer(Init); 1908f22ef01cSRoman Divacky 1909f22ef01cSRoman Divacky // If it is safe to mark the global 'constant', do so now. 1910dff0c46cSDimitry Andric GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor && 1911dff0c46cSDimitry Andric isTypeConstant(D->getType(), true)); 1912f22ef01cSRoman Divacky 1913f22ef01cSRoman Divacky GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 1914f22ef01cSRoman Divacky 1915f22ef01cSRoman Divacky // Set the llvm linkage type as appropriate. 19162754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 191759d1ed5bSDimitry Andric getLLVMLinkageVarDefinition(D, GV->isConstant()); 1918f785676fSDimitry Andric 191959d1ed5bSDimitry Andric // On Darwin, the backing variable for a C++11 thread_local variable always 192059d1ed5bSDimitry Andric // has internal linkage; all accesses should just be calls to the 192159d1ed5bSDimitry Andric // Itanium-specified entry point, which has the normal linkage of the 192259d1ed5bSDimitry Andric // variable. 192359d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(D)) 192459d1ed5bSDimitry Andric if (!VD->isStaticLocal() && VD->getTLSKind() == VarDecl::TLS_Dynamic && 192559d1ed5bSDimitry Andric Context.getTargetInfo().getTriple().isMacOSX()) 192659d1ed5bSDimitry Andric Linkage = llvm::GlobalValue::InternalLinkage; 192759d1ed5bSDimitry Andric 192859d1ed5bSDimitry Andric GV->setLinkage(Linkage); 192959d1ed5bSDimitry Andric if (D->hasAttr<DLLImportAttr>()) 193059d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); 193159d1ed5bSDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 193259d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass); 1933f785676fSDimitry Andric 19342754fe60SDimitry Andric if (Linkage == llvm::GlobalVariable::CommonLinkage) 1935f22ef01cSRoman Divacky // common vars aren't constant even if declared const. 1936f22ef01cSRoman Divacky GV->setConstant(false); 1937f22ef01cSRoman Divacky 193859d1ed5bSDimitry Andric setNonAliasAttributes(D, GV); 1939f22ef01cSRoman Divacky 19402754fe60SDimitry Andric // Emit the initializer function if necessary. 1941dff0c46cSDimitry Andric if (NeedsGlobalCtor || NeedsGlobalDtor) 1942dff0c46cSDimitry Andric EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor); 19432754fe60SDimitry Andric 194459d1ed5bSDimitry Andric reportGlobalToASan(GV, *D, NeedsGlobalCtor); 19453861d79fSDimitry Andric 1946f22ef01cSRoman Divacky // Emit global variable debug information. 19476122f3e6SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 19483861d79fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 1949f22ef01cSRoman Divacky DI->EmitGlobalVariable(GV, D); 1950f22ef01cSRoman Divacky } 1951f22ef01cSRoman Divacky 195259d1ed5bSDimitry Andric void CodeGenModule::reportGlobalToASan(llvm::GlobalVariable *GV, 195359d1ed5bSDimitry Andric SourceLocation Loc, StringRef Name, 195459d1ed5bSDimitry Andric bool IsDynInit, bool IsBlacklisted) { 195559d1ed5bSDimitry Andric if (!LangOpts.Sanitize.Address) 195659d1ed5bSDimitry Andric return; 195759d1ed5bSDimitry Andric IsDynInit &= !SanitizerBL.isIn(*GV, "init"); 195859d1ed5bSDimitry Andric IsBlacklisted |= SanitizerBL.isIn(*GV); 195959d1ed5bSDimitry Andric 196059d1ed5bSDimitry Andric llvm::GlobalVariable *LocDescr = nullptr; 196159d1ed5bSDimitry Andric llvm::GlobalVariable *GlobalName = nullptr; 196259d1ed5bSDimitry Andric if (!IsBlacklisted) { 196359d1ed5bSDimitry Andric // Don't generate source location and global name if it is blacklisted - 196459d1ed5bSDimitry Andric // it won't be instrumented anyway. 196559d1ed5bSDimitry Andric PresumedLoc PLoc = Context.getSourceManager().getPresumedLoc(Loc); 196659d1ed5bSDimitry Andric if (PLoc.isValid()) { 196759d1ed5bSDimitry Andric llvm::Constant *LocData[] = { 196859d1ed5bSDimitry Andric GetAddrOfConstantCString(PLoc.getFilename()), 196959d1ed5bSDimitry Andric llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 197059d1ed5bSDimitry Andric PLoc.getLine()), 197159d1ed5bSDimitry Andric llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 197259d1ed5bSDimitry Andric PLoc.getColumn()), 197359d1ed5bSDimitry Andric }; 197459d1ed5bSDimitry Andric auto LocStruct = llvm::ConstantStruct::getAnon(LocData); 197559d1ed5bSDimitry Andric LocDescr = new llvm::GlobalVariable(TheModule, LocStruct->getType(), true, 197659d1ed5bSDimitry Andric llvm::GlobalValue::PrivateLinkage, 197759d1ed5bSDimitry Andric LocStruct, ".asan_loc_descr"); 197859d1ed5bSDimitry Andric LocDescr->setUnnamedAddr(true); 197959d1ed5bSDimitry Andric // Add LocDescr to llvm.compiler.used, so that it won't be removed by 198059d1ed5bSDimitry Andric // the optimizer before the ASan instrumentation pass. 198159d1ed5bSDimitry Andric addCompilerUsedGlobal(LocDescr); 198259d1ed5bSDimitry Andric } 198359d1ed5bSDimitry Andric if (!Name.empty()) { 198459d1ed5bSDimitry Andric GlobalName = GetAddrOfConstantCString(Name); 198559d1ed5bSDimitry Andric // GlobalName shouldn't be removed by the optimizer. 198659d1ed5bSDimitry Andric addCompilerUsedGlobal(GlobalName); 198759d1ed5bSDimitry Andric } 198859d1ed5bSDimitry Andric } 198959d1ed5bSDimitry Andric 199059d1ed5bSDimitry Andric llvm::Value *GlobalMetadata[] = { 199159d1ed5bSDimitry Andric GV, LocDescr, GlobalName, 199259d1ed5bSDimitry Andric llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsDynInit), 199359d1ed5bSDimitry Andric llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsBlacklisted)}; 199459d1ed5bSDimitry Andric 199559d1ed5bSDimitry Andric llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalMetadata); 199659d1ed5bSDimitry Andric llvm::NamedMDNode *AsanGlobals = 199759d1ed5bSDimitry Andric TheModule.getOrInsertNamedMetadata("llvm.asan.globals"); 199859d1ed5bSDimitry Andric AsanGlobals->addOperand(ThisGlobal); 199959d1ed5bSDimitry Andric } 200059d1ed5bSDimitry Andric 200159d1ed5bSDimitry Andric void CodeGenModule::reportGlobalToASan(llvm::GlobalVariable *GV, 200259d1ed5bSDimitry Andric const VarDecl &D, bool IsDynInit) { 200359d1ed5bSDimitry Andric if (!LangOpts.Sanitize.Address) 200459d1ed5bSDimitry Andric return; 200559d1ed5bSDimitry Andric std::string QualName; 200659d1ed5bSDimitry Andric llvm::raw_string_ostream OS(QualName); 200759d1ed5bSDimitry Andric D.printQualifiedName(OS); 200859d1ed5bSDimitry Andric reportGlobalToASan(GV, D.getLocation(), OS.str(), IsDynInit); 200959d1ed5bSDimitry Andric } 201059d1ed5bSDimitry Andric 201159d1ed5bSDimitry Andric void CodeGenModule::disableSanitizerForGlobal(llvm::GlobalVariable *GV) { 201259d1ed5bSDimitry Andric // For now, just make sure the global is not modified by the ASan 201359d1ed5bSDimitry Andric // instrumentation. 201459d1ed5bSDimitry Andric if (LangOpts.Sanitize.Address) 201559d1ed5bSDimitry Andric reportGlobalToASan(GV, SourceLocation(), "", false, true); 201659d1ed5bSDimitry Andric } 201759d1ed5bSDimitry Andric 201859d1ed5bSDimitry Andric static bool isVarDeclStrongDefinition(const VarDecl *D, bool NoCommon) { 201959d1ed5bSDimitry Andric // Don't give variables common linkage if -fno-common was specified unless it 202059d1ed5bSDimitry Andric // was overridden by a NoCommon attribute. 202159d1ed5bSDimitry Andric if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>()) 202259d1ed5bSDimitry Andric return true; 202359d1ed5bSDimitry Andric 202459d1ed5bSDimitry Andric // C11 6.9.2/2: 202559d1ed5bSDimitry Andric // A declaration of an identifier for an object that has file scope without 202659d1ed5bSDimitry Andric // an initializer, and without a storage-class specifier or with the 202759d1ed5bSDimitry Andric // storage-class specifier static, constitutes a tentative definition. 202859d1ed5bSDimitry Andric if (D->getInit() || D->hasExternalStorage()) 202959d1ed5bSDimitry Andric return true; 203059d1ed5bSDimitry Andric 203159d1ed5bSDimitry Andric // A variable cannot be both common and exist in a section. 203259d1ed5bSDimitry Andric if (D->hasAttr<SectionAttr>()) 203359d1ed5bSDimitry Andric return true; 203459d1ed5bSDimitry Andric 203559d1ed5bSDimitry Andric // Thread local vars aren't considered common linkage. 203659d1ed5bSDimitry Andric if (D->getTLSKind()) 203759d1ed5bSDimitry Andric return true; 203859d1ed5bSDimitry Andric 203959d1ed5bSDimitry Andric // Tentative definitions marked with WeakImportAttr are true definitions. 204059d1ed5bSDimitry Andric if (D->hasAttr<WeakImportAttr>()) 204159d1ed5bSDimitry Andric return true; 204259d1ed5bSDimitry Andric 204359d1ed5bSDimitry Andric return false; 204459d1ed5bSDimitry Andric } 204559d1ed5bSDimitry Andric 204659d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator( 204759d1ed5bSDimitry Andric const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) { 20482754fe60SDimitry Andric if (Linkage == GVA_Internal) 20492754fe60SDimitry Andric return llvm::Function::InternalLinkage; 205059d1ed5bSDimitry Andric 205159d1ed5bSDimitry Andric if (D->hasAttr<WeakAttr>()) { 205259d1ed5bSDimitry Andric if (IsConstantVariable) 205359d1ed5bSDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 205459d1ed5bSDimitry Andric else 205559d1ed5bSDimitry Andric return llvm::GlobalVariable::WeakAnyLinkage; 205659d1ed5bSDimitry Andric } 205759d1ed5bSDimitry Andric 205859d1ed5bSDimitry Andric // We are guaranteed to have a strong definition somewhere else, 205959d1ed5bSDimitry Andric // so we can use available_externally linkage. 206059d1ed5bSDimitry Andric if (Linkage == GVA_AvailableExternally) 206159d1ed5bSDimitry Andric return llvm::Function::AvailableExternallyLinkage; 206259d1ed5bSDimitry Andric 206359d1ed5bSDimitry Andric // Note that Apple's kernel linker doesn't support symbol 206459d1ed5bSDimitry Andric // coalescing, so we need to avoid linkonce and weak linkages there. 206559d1ed5bSDimitry Andric // Normally, this means we just map to internal, but for explicit 206659d1ed5bSDimitry Andric // instantiations we'll map to external. 206759d1ed5bSDimitry Andric 206859d1ed5bSDimitry Andric // In C++, the compiler has to emit a definition in every translation unit 206959d1ed5bSDimitry Andric // that references the function. We should use linkonce_odr because 207059d1ed5bSDimitry Andric // a) if all references in this translation unit are optimized away, we 207159d1ed5bSDimitry Andric // don't need to codegen it. b) if the function persists, it needs to be 207259d1ed5bSDimitry Andric // merged with other definitions. c) C++ has the ODR, so we know the 207359d1ed5bSDimitry Andric // definition is dependable. 207459d1ed5bSDimitry Andric if (Linkage == GVA_DiscardableODR) 207559d1ed5bSDimitry Andric return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage 207659d1ed5bSDimitry Andric : llvm::Function::InternalLinkage; 207759d1ed5bSDimitry Andric 207859d1ed5bSDimitry Andric // An explicit instantiation of a template has weak linkage, since 207959d1ed5bSDimitry Andric // explicit instantiations can occur in multiple translation units 208059d1ed5bSDimitry Andric // and must all be equivalent. However, we are not allowed to 208159d1ed5bSDimitry Andric // throw away these explicit instantiations. 208259d1ed5bSDimitry Andric if (Linkage == GVA_StrongODR) 208359d1ed5bSDimitry Andric return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage 208459d1ed5bSDimitry Andric : llvm::Function::ExternalLinkage; 208559d1ed5bSDimitry Andric 208659d1ed5bSDimitry Andric // C++ doesn't have tentative definitions and thus cannot have common 208759d1ed5bSDimitry Andric // linkage. 208859d1ed5bSDimitry Andric if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) && 208959d1ed5bSDimitry Andric !isVarDeclStrongDefinition(cast<VarDecl>(D), CodeGenOpts.NoCommon)) 209059d1ed5bSDimitry Andric return llvm::GlobalVariable::CommonLinkage; 209159d1ed5bSDimitry Andric 2092f785676fSDimitry Andric // selectany symbols are externally visible, so use weak instead of 2093f785676fSDimitry Andric // linkonce. MSVC optimizes away references to const selectany globals, so 2094f785676fSDimitry Andric // all definitions should be the same and ODR linkage should be used. 2095f785676fSDimitry Andric // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx 209659d1ed5bSDimitry Andric if (D->hasAttr<SelectAnyAttr>()) 2097f785676fSDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 209859d1ed5bSDimitry Andric 209959d1ed5bSDimitry Andric // Otherwise, we have strong external linkage. 210059d1ed5bSDimitry Andric assert(Linkage == GVA_StrongExternal); 21012754fe60SDimitry Andric return llvm::GlobalVariable::ExternalLinkage; 21022754fe60SDimitry Andric } 21032754fe60SDimitry Andric 210459d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition( 210559d1ed5bSDimitry Andric const VarDecl *VD, bool IsConstant) { 210659d1ed5bSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD); 210759d1ed5bSDimitry Andric return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant); 210859d1ed5bSDimitry Andric } 210959d1ed5bSDimitry Andric 2110139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type. 2111139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites 2112139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old, 2113139f7f9bSDimitry Andric llvm::Function *newFn) { 2114139f7f9bSDimitry Andric // Fast path. 2115139f7f9bSDimitry Andric if (old->use_empty()) return; 2116139f7f9bSDimitry Andric 2117139f7f9bSDimitry Andric llvm::Type *newRetTy = newFn->getReturnType(); 2118139f7f9bSDimitry Andric SmallVector<llvm::Value*, 4> newArgs; 2119139f7f9bSDimitry Andric 2120139f7f9bSDimitry Andric for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end(); 2121139f7f9bSDimitry Andric ui != ue; ) { 2122139f7f9bSDimitry Andric llvm::Value::use_iterator use = ui++; // Increment before the use is erased. 212359d1ed5bSDimitry Andric llvm::User *user = use->getUser(); 2124139f7f9bSDimitry Andric 2125139f7f9bSDimitry Andric // Recognize and replace uses of bitcasts. Most calls to 2126139f7f9bSDimitry Andric // unprototyped functions will use bitcasts. 212759d1ed5bSDimitry Andric if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) { 2128139f7f9bSDimitry Andric if (bitcast->getOpcode() == llvm::Instruction::BitCast) 2129139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(bitcast, newFn); 2130139f7f9bSDimitry Andric continue; 2131139f7f9bSDimitry Andric } 2132139f7f9bSDimitry Andric 2133139f7f9bSDimitry Andric // Recognize calls to the function. 2134139f7f9bSDimitry Andric llvm::CallSite callSite(user); 2135139f7f9bSDimitry Andric if (!callSite) continue; 213659d1ed5bSDimitry Andric if (!callSite.isCallee(&*use)) continue; 2137139f7f9bSDimitry Andric 2138139f7f9bSDimitry Andric // If the return types don't match exactly, then we can't 2139139f7f9bSDimitry Andric // transform this call unless it's dead. 2140139f7f9bSDimitry Andric if (callSite->getType() != newRetTy && !callSite->use_empty()) 2141139f7f9bSDimitry Andric continue; 2142139f7f9bSDimitry Andric 2143139f7f9bSDimitry Andric // Get the call site's attribute list. 2144139f7f9bSDimitry Andric SmallVector<llvm::AttributeSet, 8> newAttrs; 2145139f7f9bSDimitry Andric llvm::AttributeSet oldAttrs = callSite.getAttributes(); 2146139f7f9bSDimitry Andric 2147139f7f9bSDimitry Andric // Collect any return attributes from the call. 2148139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex)) 2149139f7f9bSDimitry Andric newAttrs.push_back( 2150139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), 2151139f7f9bSDimitry Andric oldAttrs.getRetAttributes())); 2152139f7f9bSDimitry Andric 2153139f7f9bSDimitry Andric // If the function was passed too few arguments, don't transform. 2154139f7f9bSDimitry Andric unsigned newNumArgs = newFn->arg_size(); 2155139f7f9bSDimitry Andric if (callSite.arg_size() < newNumArgs) continue; 2156139f7f9bSDimitry Andric 2157139f7f9bSDimitry Andric // If extra arguments were passed, we silently drop them. 2158139f7f9bSDimitry Andric // If any of the types mismatch, we don't transform. 2159139f7f9bSDimitry Andric unsigned argNo = 0; 2160139f7f9bSDimitry Andric bool dontTransform = false; 2161139f7f9bSDimitry Andric for (llvm::Function::arg_iterator ai = newFn->arg_begin(), 2162139f7f9bSDimitry Andric ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) { 2163139f7f9bSDimitry Andric if (callSite.getArgument(argNo)->getType() != ai->getType()) { 2164139f7f9bSDimitry Andric dontTransform = true; 2165139f7f9bSDimitry Andric break; 2166139f7f9bSDimitry Andric } 2167139f7f9bSDimitry Andric 2168139f7f9bSDimitry Andric // Add any parameter attributes. 2169139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(argNo + 1)) 2170139f7f9bSDimitry Andric newAttrs. 2171139f7f9bSDimitry Andric push_back(llvm:: 2172139f7f9bSDimitry Andric AttributeSet::get(newFn->getContext(), 2173139f7f9bSDimitry Andric oldAttrs.getParamAttributes(argNo + 1))); 2174139f7f9bSDimitry Andric } 2175139f7f9bSDimitry Andric if (dontTransform) 2176139f7f9bSDimitry Andric continue; 2177139f7f9bSDimitry Andric 2178139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) 2179139f7f9bSDimitry Andric newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(), 2180139f7f9bSDimitry Andric oldAttrs.getFnAttributes())); 2181139f7f9bSDimitry Andric 2182139f7f9bSDimitry Andric // Okay, we can transform this. Create the new call instruction and copy 2183139f7f9bSDimitry Andric // over the required information. 2184139f7f9bSDimitry Andric newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo); 2185139f7f9bSDimitry Andric 2186139f7f9bSDimitry Andric llvm::CallSite newCall; 2187139f7f9bSDimitry Andric if (callSite.isCall()) { 2188139f7f9bSDimitry Andric newCall = llvm::CallInst::Create(newFn, newArgs, "", 2189139f7f9bSDimitry Andric callSite.getInstruction()); 2190139f7f9bSDimitry Andric } else { 219159d1ed5bSDimitry Andric auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction()); 2192139f7f9bSDimitry Andric newCall = llvm::InvokeInst::Create(newFn, 2193139f7f9bSDimitry Andric oldInvoke->getNormalDest(), 2194139f7f9bSDimitry Andric oldInvoke->getUnwindDest(), 2195139f7f9bSDimitry Andric newArgs, "", 2196139f7f9bSDimitry Andric callSite.getInstruction()); 2197139f7f9bSDimitry Andric } 2198139f7f9bSDimitry Andric newArgs.clear(); // for the next iteration 2199139f7f9bSDimitry Andric 2200139f7f9bSDimitry Andric if (!newCall->getType()->isVoidTy()) 2201139f7f9bSDimitry Andric newCall->takeName(callSite.getInstruction()); 2202139f7f9bSDimitry Andric newCall.setAttributes( 2203139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), newAttrs)); 2204139f7f9bSDimitry Andric newCall.setCallingConv(callSite.getCallingConv()); 2205139f7f9bSDimitry Andric 2206139f7f9bSDimitry Andric // Finally, remove the old call, replacing any uses with the new one. 2207139f7f9bSDimitry Andric if (!callSite->use_empty()) 2208139f7f9bSDimitry Andric callSite->replaceAllUsesWith(newCall.getInstruction()); 2209139f7f9bSDimitry Andric 2210139f7f9bSDimitry Andric // Copy debug location attached to CI. 2211139f7f9bSDimitry Andric if (!callSite->getDebugLoc().isUnknown()) 2212139f7f9bSDimitry Andric newCall->setDebugLoc(callSite->getDebugLoc()); 2213139f7f9bSDimitry Andric callSite->eraseFromParent(); 2214139f7f9bSDimitry Andric } 2215139f7f9bSDimitry Andric } 2216139f7f9bSDimitry Andric 2217f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we 2218f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}". If there are 2219f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to 2220f22ef01cSRoman Divacky /// call the new function directly. 2221f22ef01cSRoman Divacky /// 2222f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to 2223f22ef01cSRoman Divacky /// functions to be able to inline them. If there is a bitcast in the way, it 2224f22ef01cSRoman Divacky /// won't inline them. Instcombine normally deletes these calls, but it isn't 2225f22ef01cSRoman Divacky /// run at -O0. 2226f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, 2227f22ef01cSRoman Divacky llvm::Function *NewFn) { 2228f22ef01cSRoman Divacky // If we're redefining a global as a function, don't transform it. 2229139f7f9bSDimitry Andric if (!isa<llvm::Function>(Old)) return; 2230f22ef01cSRoman Divacky 2231139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(Old, NewFn); 2232f22ef01cSRoman Divacky } 2233f22ef01cSRoman Divacky 2234dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 2235dff0c46cSDimitry Andric TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind(); 2236dff0c46cSDimitry Andric // If we have a definition, this might be a deferred decl. If the 2237dff0c46cSDimitry Andric // instantiation is explicit, make sure we emit it at the end. 2238dff0c46cSDimitry Andric if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition) 2239dff0c46cSDimitry Andric GetAddrOfGlobalVar(VD); 2240139f7f9bSDimitry Andric 2241139f7f9bSDimitry Andric EmitTopLevelDecl(VD); 2242dff0c46cSDimitry Andric } 2243f22ef01cSRoman Divacky 224459d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD, 224559d1ed5bSDimitry Andric llvm::GlobalValue *GV) { 224659d1ed5bSDimitry Andric const auto *D = cast<FunctionDecl>(GD.getDecl()); 22473b0f4066SDimitry Andric 22483b0f4066SDimitry Andric // Compute the function info and LLVM type. 2249dff0c46cSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 2250dff0c46cSDimitry Andric llvm::FunctionType *Ty = getTypes().GetFunctionType(FI); 22513b0f4066SDimitry Andric 2252f22ef01cSRoman Divacky // Get or create the prototype for the function. 225359d1ed5bSDimitry Andric if (!GV) { 225459d1ed5bSDimitry Andric llvm::Constant *C = 225559d1ed5bSDimitry Andric GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true); 2256f22ef01cSRoman Divacky 2257f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 225859d1ed5bSDimitry Andric if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) { 2259f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast); 226059d1ed5bSDimitry Andric GV = cast<llvm::GlobalValue>(CE->getOperand(0)); 226159d1ed5bSDimitry Andric } else { 226259d1ed5bSDimitry Andric GV = cast<llvm::GlobalValue>(C); 226359d1ed5bSDimitry Andric } 2264f22ef01cSRoman Divacky } 2265f22ef01cSRoman Divacky 226659d1ed5bSDimitry Andric if (!GV->isDeclaration()) { 2267f785676fSDimitry Andric getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name); 2268f785676fSDimitry Andric return; 2269f785676fSDimitry Andric } 2270f22ef01cSRoman Divacky 227159d1ed5bSDimitry Andric if (GV->getType()->getElementType() != Ty) { 2272f22ef01cSRoman Divacky // If the types mismatch then we have to rewrite the definition. 227359d1ed5bSDimitry Andric assert(GV->isDeclaration() && "Shouldn't replace non-declaration"); 2274f22ef01cSRoman Divacky 2275f22ef01cSRoman Divacky // F is the Function* for the one with the wrong type, we must make a new 2276f22ef01cSRoman Divacky // Function* and update everything that used F (a declaration) with the new 2277f22ef01cSRoman Divacky // Function* (which will be a definition). 2278f22ef01cSRoman Divacky // 2279f22ef01cSRoman Divacky // This happens if there is a prototype for a function 2280f22ef01cSRoman Divacky // (e.g. "int f()") and then a definition of a different type 2281f22ef01cSRoman Divacky // (e.g. "int f(int x)"). Move the old function aside so that it 2282f22ef01cSRoman Divacky // doesn't interfere with GetAddrOfFunction. 228359d1ed5bSDimitry Andric GV->setName(StringRef()); 228459d1ed5bSDimitry Andric auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty)); 2285f22ef01cSRoman Divacky 2286139f7f9bSDimitry Andric // This might be an implementation of a function without a 2287139f7f9bSDimitry Andric // prototype, in which case, try to do special replacement of 2288139f7f9bSDimitry Andric // calls which match the new prototype. The really key thing here 2289139f7f9bSDimitry Andric // is that we also potentially drop arguments from the call site 2290139f7f9bSDimitry Andric // so as to make a direct call, which makes the inliner happier 2291139f7f9bSDimitry Andric // and suppresses a number of optimizer warnings (!) about 2292139f7f9bSDimitry Andric // dropping arguments. 229359d1ed5bSDimitry Andric if (!GV->use_empty()) { 229459d1ed5bSDimitry Andric ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn); 229559d1ed5bSDimitry Andric GV->removeDeadConstantUsers(); 2296f22ef01cSRoman Divacky } 2297f22ef01cSRoman Divacky 2298f22ef01cSRoman Divacky // Replace uses of F with the Function we will endow with a body. 229959d1ed5bSDimitry Andric if (!GV->use_empty()) { 2300f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 230159d1ed5bSDimitry Andric llvm::ConstantExpr::getBitCast(NewFn, GV->getType()); 230259d1ed5bSDimitry Andric GV->replaceAllUsesWith(NewPtrForOldDecl); 2303f22ef01cSRoman Divacky } 2304f22ef01cSRoman Divacky 2305f22ef01cSRoman Divacky // Ok, delete the old function now, which is dead. 230659d1ed5bSDimitry Andric GV->eraseFromParent(); 2307f22ef01cSRoman Divacky 230859d1ed5bSDimitry Andric GV = NewFn; 2309f22ef01cSRoman Divacky } 2310f22ef01cSRoman Divacky 23112754fe60SDimitry Andric // We need to set linkage and visibility on the function before 23122754fe60SDimitry Andric // generating code for it because various parts of IR generation 23132754fe60SDimitry Andric // want to propagate this information down (e.g. to local static 23142754fe60SDimitry Andric // declarations). 231559d1ed5bSDimitry Andric auto *Fn = cast<llvm::Function>(GV); 2316f785676fSDimitry Andric setFunctionLinkage(GD, Fn); 2317f22ef01cSRoman Divacky 231859d1ed5bSDimitry Andric // FIXME: this is redundant with part of setFunctionDefinitionAttributes 23192754fe60SDimitry Andric setGlobalVisibility(Fn, D); 23202754fe60SDimitry Andric 2321284c1978SDimitry Andric MaybeHandleStaticInExternC(D, Fn); 2322284c1978SDimitry Andric 23233b0f4066SDimitry Andric CodeGenFunction(*this).GenerateCode(D, Fn, FI); 2324f22ef01cSRoman Divacky 232559d1ed5bSDimitry Andric setFunctionDefinitionAttributes(D, Fn); 2326f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, Fn); 2327f22ef01cSRoman Divacky 2328f22ef01cSRoman Divacky if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) 2329f22ef01cSRoman Divacky AddGlobalCtor(Fn, CA->getPriority()); 2330f22ef01cSRoman Divacky if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) 2331f22ef01cSRoman Divacky AddGlobalDtor(Fn, DA->getPriority()); 23326122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 23336122f3e6SDimitry Andric AddGlobalAnnotations(D, Fn); 2334f22ef01cSRoman Divacky } 2335f22ef01cSRoman Divacky 2336f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { 233759d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 2338f22ef01cSRoman Divacky const AliasAttr *AA = D->getAttr<AliasAttr>(); 2339f22ef01cSRoman Divacky assert(AA && "Not an alias?"); 2340f22ef01cSRoman Divacky 23416122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 2342f22ef01cSRoman Divacky 2343f22ef01cSRoman Divacky // If there is a definition in the module, then it wins over the alias. 2344f22ef01cSRoman Divacky // This is dubious, but allow it to be safe. Just ignore the alias. 2345f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 2346f22ef01cSRoman Divacky if (Entry && !Entry->isDeclaration()) 2347f22ef01cSRoman Divacky return; 2348f22ef01cSRoman Divacky 2349f785676fSDimitry Andric Aliases.push_back(GD); 2350f785676fSDimitry Andric 23516122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); 2352f22ef01cSRoman Divacky 2353f22ef01cSRoman Divacky // Create a reference to the named value. This ensures that it is emitted 2354f22ef01cSRoman Divacky // if a deferred decl. 2355f22ef01cSRoman Divacky llvm::Constant *Aliasee; 2356f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 23573861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, 23582754fe60SDimitry Andric /*ForVTable=*/false); 2359f22ef01cSRoman Divacky else 2360f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 236159d1ed5bSDimitry Andric llvm::PointerType::getUnqual(DeclTy), 236259d1ed5bSDimitry Andric nullptr); 2363f22ef01cSRoman Divacky 2364f22ef01cSRoman Divacky // Create the new alias itself, but don't set a name yet. 236559d1ed5bSDimitry Andric auto *GA = llvm::GlobalAlias::create( 236659d1ed5bSDimitry Andric cast<llvm::PointerType>(Aliasee->getType())->getElementType(), 0, 236759d1ed5bSDimitry Andric llvm::Function::ExternalLinkage, "", Aliasee, &getModule()); 2368f22ef01cSRoman Divacky 2369f22ef01cSRoman Divacky if (Entry) { 237059d1ed5bSDimitry Andric if (GA->getAliasee() == Entry) { 237159d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_cyclic_alias); 237259d1ed5bSDimitry Andric return; 237359d1ed5bSDimitry Andric } 237459d1ed5bSDimitry Andric 2375f22ef01cSRoman Divacky assert(Entry->isDeclaration()); 2376f22ef01cSRoman Divacky 2377f22ef01cSRoman Divacky // If there is a declaration in the module, then we had an extern followed 2378f22ef01cSRoman Divacky // by the alias, as in: 2379f22ef01cSRoman Divacky // extern int test6(); 2380f22ef01cSRoman Divacky // ... 2381f22ef01cSRoman Divacky // int test6() __attribute__((alias("test7"))); 2382f22ef01cSRoman Divacky // 2383f22ef01cSRoman Divacky // Remove it and replace uses of it with the alias. 2384f22ef01cSRoman Divacky GA->takeName(Entry); 2385f22ef01cSRoman Divacky 2386f22ef01cSRoman Divacky Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, 2387f22ef01cSRoman Divacky Entry->getType())); 2388f22ef01cSRoman Divacky Entry->eraseFromParent(); 2389f22ef01cSRoman Divacky } else { 2390ffd1746dSEd Schouten GA->setName(MangledName); 2391f22ef01cSRoman Divacky } 2392f22ef01cSRoman Divacky 2393f22ef01cSRoman Divacky // Set attributes which are particular to an alias; this is a 2394f22ef01cSRoman Divacky // specialization of the attributes which may be set on a global 2395f22ef01cSRoman Divacky // variable/function. 2396f22ef01cSRoman Divacky if (D->hasAttr<DLLExportAttr>()) { 239759d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(D)) { 2398f22ef01cSRoman Divacky // The dllexport attribute is ignored for undefined symbols. 2399ffd1746dSEd Schouten if (FD->hasBody()) 240059d1ed5bSDimitry Andric GA->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 2401f22ef01cSRoman Divacky } else { 240259d1ed5bSDimitry Andric GA->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 2403f22ef01cSRoman Divacky } 2404f22ef01cSRoman Divacky } else if (D->hasAttr<WeakAttr>() || 2405f22ef01cSRoman Divacky D->hasAttr<WeakRefAttr>() || 24063b0f4066SDimitry Andric D->isWeakImported()) { 2407f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::WeakAnyLinkage); 2408f22ef01cSRoman Divacky } 2409f22ef01cSRoman Divacky 2410f22ef01cSRoman Divacky SetCommonAttributes(D, GA); 2411f22ef01cSRoman Divacky } 2412f22ef01cSRoman Divacky 241317a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID, 24146122f3e6SDimitry Andric ArrayRef<llvm::Type*> Tys) { 241517a519f9SDimitry Andric return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID, 241617a519f9SDimitry Andric Tys); 2417f22ef01cSRoman Divacky } 2418f22ef01cSRoman Divacky 2419f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> & 2420f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2421f22ef01cSRoman Divacky const StringLiteral *Literal, 2422f22ef01cSRoman Divacky bool TargetIsLSB, 2423f22ef01cSRoman Divacky bool &IsUTF16, 2424f22ef01cSRoman Divacky unsigned &StringLength) { 24256122f3e6SDimitry Andric StringRef String = Literal->getString(); 2426e580952dSDimitry Andric unsigned NumBytes = String.size(); 2427f22ef01cSRoman Divacky 2428f22ef01cSRoman Divacky // Check for simple case. 2429f22ef01cSRoman Divacky if (!Literal->containsNonAsciiOrNull()) { 2430f22ef01cSRoman Divacky StringLength = NumBytes; 2431e580952dSDimitry Andric return Map.GetOrCreateValue(String); 2432f22ef01cSRoman Divacky } 2433f22ef01cSRoman Divacky 2434dff0c46cSDimitry Andric // Otherwise, convert the UTF8 literals into a string of shorts. 2435dff0c46cSDimitry Andric IsUTF16 = true; 2436dff0c46cSDimitry Andric 2437dff0c46cSDimitry Andric SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls. 24383861d79fSDimitry Andric const UTF8 *FromPtr = (const UTF8 *)String.data(); 2439f22ef01cSRoman Divacky UTF16 *ToPtr = &ToBuf[0]; 2440f22ef01cSRoman Divacky 24412754fe60SDimitry Andric (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, 2442f22ef01cSRoman Divacky &ToPtr, ToPtr + NumBytes, 2443f22ef01cSRoman Divacky strictConversion); 2444f22ef01cSRoman Divacky 2445f22ef01cSRoman Divacky // ConvertUTF8toUTF16 returns the length in ToPtr. 2446f22ef01cSRoman Divacky StringLength = ToPtr - &ToBuf[0]; 2447f22ef01cSRoman Divacky 2448dff0c46cSDimitry Andric // Add an explicit null. 2449dff0c46cSDimitry Andric *ToPtr = 0; 2450dff0c46cSDimitry Andric return Map. 2451dff0c46cSDimitry Andric GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()), 2452dff0c46cSDimitry Andric (StringLength + 1) * 2)); 2453f22ef01cSRoman Divacky } 2454f22ef01cSRoman Divacky 2455bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> & 2456bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2457bd5abe19SDimitry Andric const StringLiteral *Literal, 2458dff0c46cSDimitry Andric unsigned &StringLength) { 24596122f3e6SDimitry Andric StringRef String = Literal->getString(); 2460bd5abe19SDimitry Andric StringLength = String.size(); 2461bd5abe19SDimitry Andric return Map.GetOrCreateValue(String); 2462bd5abe19SDimitry Andric } 2463bd5abe19SDimitry Andric 2464f22ef01cSRoman Divacky llvm::Constant * 2465f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { 2466f22ef01cSRoman Divacky unsigned StringLength = 0; 2467f22ef01cSRoman Divacky bool isUTF16 = false; 2468f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2469f22ef01cSRoman Divacky GetConstantCFStringEntry(CFConstantStringMap, Literal, 24703861d79fSDimitry Andric getDataLayout().isLittleEndian(), 2471f22ef01cSRoman Divacky isUTF16, StringLength); 2472f22ef01cSRoman Divacky 2473f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2474f22ef01cSRoman Divacky return C; 2475f22ef01cSRoman Divacky 2476dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2477f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2478284c1978SDimitry Andric llvm::Value *V; 2479f22ef01cSRoman Divacky 2480f22ef01cSRoman Divacky // If we don't already have it, get __CFConstantStringClassReference. 2481f22ef01cSRoman Divacky if (!CFConstantStringClassRef) { 24826122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 2483f22ef01cSRoman Divacky Ty = llvm::ArrayType::get(Ty, 0); 2484f22ef01cSRoman Divacky llvm::Constant *GV = CreateRuntimeVariable(Ty, 2485f22ef01cSRoman Divacky "__CFConstantStringClassReference"); 2486f22ef01cSRoman Divacky // Decay array -> ptr 2487284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2488284c1978SDimitry Andric CFConstantStringClassRef = V; 2489f22ef01cSRoman Divacky } 2490284c1978SDimitry Andric else 2491284c1978SDimitry Andric V = CFConstantStringClassRef; 2492f22ef01cSRoman Divacky 2493f22ef01cSRoman Divacky QualType CFTy = getContext().getCFConstantStringType(); 2494f22ef01cSRoman Divacky 249559d1ed5bSDimitry Andric auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 2496f22ef01cSRoman Divacky 2497dff0c46cSDimitry Andric llvm::Constant *Fields[4]; 2498f22ef01cSRoman Divacky 2499f22ef01cSRoman Divacky // Class pointer. 2500284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2501f22ef01cSRoman Divacky 2502f22ef01cSRoman Divacky // Flags. 25036122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2504f22ef01cSRoman Divacky Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) : 2505f22ef01cSRoman Divacky llvm::ConstantInt::get(Ty, 0x07C8); 2506f22ef01cSRoman Divacky 2507f22ef01cSRoman Divacky // String pointer. 250859d1ed5bSDimitry Andric llvm::Constant *C = nullptr; 2509dff0c46cSDimitry Andric if (isUTF16) { 2510dff0c46cSDimitry Andric ArrayRef<uint16_t> Arr = 2511139f7f9bSDimitry Andric llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>( 2512139f7f9bSDimitry Andric const_cast<char *>(Entry.getKey().data())), 2513dff0c46cSDimitry Andric Entry.getKey().size() / 2); 2514dff0c46cSDimitry Andric C = llvm::ConstantDataArray::get(VMContext, Arr); 2515dff0c46cSDimitry Andric } else { 2516dff0c46cSDimitry Andric C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2517dff0c46cSDimitry Andric } 2518f22ef01cSRoman Divacky 2519dff0c46cSDimitry Andric // Note: -fwritable-strings doesn't make the backing store strings of 2520dff0c46cSDimitry Andric // CFStrings writable. (See <rdar://problem/10657500>) 252159d1ed5bSDimitry Andric auto *GV = 2522dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true, 252359d1ed5bSDimitry Andric llvm::GlobalValue::PrivateLinkage, C, ".str"); 25242754fe60SDimitry Andric GV->setUnnamedAddr(true); 2525284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2526284c1978SDimitry Andric // of the string is via this class initializer. 252759d1ed5bSDimitry Andric // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without 252859d1ed5bSDimitry Andric // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing 252959d1ed5bSDimitry Andric // that changes the section it ends in, which surprises ld64. 2530f22ef01cSRoman Divacky if (isUTF16) { 2531f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy); 2532f22ef01cSRoman Divacky GV->setAlignment(Align.getQuantity()); 253359d1ed5bSDimitry Andric GV->setSection("__TEXT,__ustring"); 25343b0f4066SDimitry Andric } else { 25353b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 25363b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 253759d1ed5bSDimitry Andric GV->setSection("__TEXT,__cstring,cstring_literals"); 2538f22ef01cSRoman Divacky } 2539dff0c46cSDimitry Andric 2540dff0c46cSDimitry Andric // String. 25416122f3e6SDimitry Andric Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2542f22ef01cSRoman Divacky 2543dff0c46cSDimitry Andric if (isUTF16) 2544dff0c46cSDimitry Andric // Cast the UTF16 string to the correct type. 2545dff0c46cSDimitry Andric Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy); 2546dff0c46cSDimitry Andric 2547f22ef01cSRoman Divacky // String length. 2548f22ef01cSRoman Divacky Ty = getTypes().ConvertType(getContext().LongTy); 2549f22ef01cSRoman Divacky Fields[3] = llvm::ConstantInt::get(Ty, StringLength); 2550f22ef01cSRoman Divacky 2551f22ef01cSRoman Divacky // The struct. 2552f22ef01cSRoman Divacky C = llvm::ConstantStruct::get(STy, Fields); 2553f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2554f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2555f22ef01cSRoman Divacky "_unnamed_cfstring_"); 255659d1ed5bSDimitry Andric GV->setSection("__DATA,__cfstring"); 2557f22ef01cSRoman Divacky Entry.setValue(GV); 2558f22ef01cSRoman Divacky 2559f22ef01cSRoman Divacky return GV; 2560f22ef01cSRoman Divacky } 2561f22ef01cSRoman Divacky 2562f22ef01cSRoman Divacky llvm::Constant * 25632754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) { 2564f22ef01cSRoman Divacky unsigned StringLength = 0; 2565f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2566bd5abe19SDimitry Andric GetConstantStringEntry(CFConstantStringMap, Literal, StringLength); 2567f22ef01cSRoman Divacky 2568f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2569f22ef01cSRoman Divacky return C; 2570f22ef01cSRoman Divacky 2571dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2572f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2573284c1978SDimitry Andric llvm::Value *V; 2574f22ef01cSRoman Divacky // If we don't already have it, get _NSConstantStringClassReference. 25752754fe60SDimitry Andric if (!ConstantStringClassRef) { 2576dff0c46cSDimitry Andric std::string StringClass(getLangOpts().ObjCConstantStringClass); 25776122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 25782754fe60SDimitry Andric llvm::Constant *GV; 25797ae0e2c9SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 2580bd5abe19SDimitry Andric std::string str = 2581bd5abe19SDimitry Andric StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" 2582bd5abe19SDimitry Andric : "OBJC_CLASS_$_" + StringClass; 2583bd5abe19SDimitry Andric GV = getObjCRuntime().GetClassGlobal(str); 2584bd5abe19SDimitry Andric // Make sure the result is of the correct type. 25856122f3e6SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 2586284c1978SDimitry Andric V = llvm::ConstantExpr::getBitCast(GV, PTy); 2587284c1978SDimitry Andric ConstantStringClassRef = V; 2588bd5abe19SDimitry Andric } else { 2589bd5abe19SDimitry Andric std::string str = 2590bd5abe19SDimitry Andric StringClass.empty() ? "_NSConstantStringClassReference" 2591bd5abe19SDimitry Andric : "_" + StringClass + "ClassReference"; 25926122f3e6SDimitry Andric llvm::Type *PTy = llvm::ArrayType::get(Ty, 0); 2593bd5abe19SDimitry Andric GV = CreateRuntimeVariable(PTy, str); 2594f22ef01cSRoman Divacky // Decay array -> ptr 2595284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2596284c1978SDimitry Andric ConstantStringClassRef = V; 2597f22ef01cSRoman Divacky } 2598bd5abe19SDimitry Andric } 2599284c1978SDimitry Andric else 2600284c1978SDimitry Andric V = ConstantStringClassRef; 2601f22ef01cSRoman Divacky 26026122f3e6SDimitry Andric if (!NSConstantStringType) { 26036122f3e6SDimitry Andric // Construct the type for a constant NSString. 260459d1ed5bSDimitry Andric RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString"); 26056122f3e6SDimitry Andric D->startDefinition(); 2606f22ef01cSRoman Divacky 26076122f3e6SDimitry Andric QualType FieldTypes[3]; 26086122f3e6SDimitry Andric 26096122f3e6SDimitry Andric // const int *isa; 26106122f3e6SDimitry Andric FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst()); 26116122f3e6SDimitry Andric // const char *str; 26126122f3e6SDimitry Andric FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst()); 26136122f3e6SDimitry Andric // unsigned int length; 26146122f3e6SDimitry Andric FieldTypes[2] = Context.UnsignedIntTy; 26156122f3e6SDimitry Andric 26166122f3e6SDimitry Andric // Create fields 26176122f3e6SDimitry Andric for (unsigned i = 0; i < 3; ++i) { 26186122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, D, 26196122f3e6SDimitry Andric SourceLocation(), 262059d1ed5bSDimitry Andric SourceLocation(), nullptr, 262159d1ed5bSDimitry Andric FieldTypes[i], /*TInfo=*/nullptr, 262259d1ed5bSDimitry Andric /*BitWidth=*/nullptr, 26236122f3e6SDimitry Andric /*Mutable=*/false, 26247ae0e2c9SDimitry Andric ICIS_NoInit); 26256122f3e6SDimitry Andric Field->setAccess(AS_public); 26266122f3e6SDimitry Andric D->addDecl(Field); 26276122f3e6SDimitry Andric } 26286122f3e6SDimitry Andric 26296122f3e6SDimitry Andric D->completeDefinition(); 26306122f3e6SDimitry Andric QualType NSTy = Context.getTagDeclType(D); 26316122f3e6SDimitry Andric NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy)); 26326122f3e6SDimitry Andric } 2633f22ef01cSRoman Divacky 2634dff0c46cSDimitry Andric llvm::Constant *Fields[3]; 2635f22ef01cSRoman Divacky 2636f22ef01cSRoman Divacky // Class pointer. 2637284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2638f22ef01cSRoman Divacky 2639f22ef01cSRoman Divacky // String pointer. 2640dff0c46cSDimitry Andric llvm::Constant *C = 2641dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2642f22ef01cSRoman Divacky 2643f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2644f22ef01cSRoman Divacky bool isConstant; 2645f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::PrivateLinkage; 2646dff0c46cSDimitry Andric isConstant = !LangOpts.WritableStrings; 2647f22ef01cSRoman Divacky 264859d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant, 264959d1ed5bSDimitry Andric Linkage, C, ".str"); 26502754fe60SDimitry Andric GV->setUnnamedAddr(true); 2651284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2652284c1978SDimitry Andric // of the string is via this class initializer. 26533b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 26543b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 26556122f3e6SDimitry Andric Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2656f22ef01cSRoman Divacky 2657f22ef01cSRoman Divacky // String length. 26586122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2659f22ef01cSRoman Divacky Fields[2] = llvm::ConstantInt::get(Ty, StringLength); 2660f22ef01cSRoman Divacky 2661f22ef01cSRoman Divacky // The struct. 26626122f3e6SDimitry Andric C = llvm::ConstantStruct::get(NSConstantStringType, Fields); 2663f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2664f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2665f22ef01cSRoman Divacky "_unnamed_nsstring_"); 266659d1ed5bSDimitry Andric const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip"; 266759d1ed5bSDimitry Andric const char *NSStringNonFragileABISection = 266859d1ed5bSDimitry Andric "__DATA,__objc_stringobj,regular,no_dead_strip"; 2669f22ef01cSRoman Divacky // FIXME. Fix section. 267059d1ed5bSDimitry Andric GV->setSection(LangOpts.ObjCRuntime.isNonFragile() 267159d1ed5bSDimitry Andric ? NSStringNonFragileABISection 267259d1ed5bSDimitry Andric : NSStringSection); 2673f22ef01cSRoman Divacky Entry.setValue(GV); 2674f22ef01cSRoman Divacky 2675f22ef01cSRoman Divacky return GV; 2676f22ef01cSRoman Divacky } 2677f22ef01cSRoman Divacky 26786122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() { 26796122f3e6SDimitry Andric if (ObjCFastEnumerationStateType.isNull()) { 268059d1ed5bSDimitry Andric RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState"); 26816122f3e6SDimitry Andric D->startDefinition(); 26826122f3e6SDimitry Andric 26836122f3e6SDimitry Andric QualType FieldTypes[] = { 26846122f3e6SDimitry Andric Context.UnsignedLongTy, 26856122f3e6SDimitry Andric Context.getPointerType(Context.getObjCIdType()), 26866122f3e6SDimitry Andric Context.getPointerType(Context.UnsignedLongTy), 26876122f3e6SDimitry Andric Context.getConstantArrayType(Context.UnsignedLongTy, 26886122f3e6SDimitry Andric llvm::APInt(32, 5), ArrayType::Normal, 0) 26896122f3e6SDimitry Andric }; 26906122f3e6SDimitry Andric 26916122f3e6SDimitry Andric for (size_t i = 0; i < 4; ++i) { 26926122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, 26936122f3e6SDimitry Andric D, 26946122f3e6SDimitry Andric SourceLocation(), 269559d1ed5bSDimitry Andric SourceLocation(), nullptr, 269659d1ed5bSDimitry Andric FieldTypes[i], /*TInfo=*/nullptr, 269759d1ed5bSDimitry Andric /*BitWidth=*/nullptr, 26986122f3e6SDimitry Andric /*Mutable=*/false, 26997ae0e2c9SDimitry Andric ICIS_NoInit); 27006122f3e6SDimitry Andric Field->setAccess(AS_public); 27016122f3e6SDimitry Andric D->addDecl(Field); 27026122f3e6SDimitry Andric } 27036122f3e6SDimitry Andric 27046122f3e6SDimitry Andric D->completeDefinition(); 27056122f3e6SDimitry Andric ObjCFastEnumerationStateType = Context.getTagDeclType(D); 27066122f3e6SDimitry Andric } 27076122f3e6SDimitry Andric 27086122f3e6SDimitry Andric return ObjCFastEnumerationStateType; 27096122f3e6SDimitry Andric } 27106122f3e6SDimitry Andric 2711dff0c46cSDimitry Andric llvm::Constant * 2712dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { 2713dff0c46cSDimitry Andric assert(!E->getType()->isPointerType() && "Strings are always arrays"); 2714f22ef01cSRoman Divacky 2715dff0c46cSDimitry Andric // Don't emit it as the address of the string, emit the string data itself 2716dff0c46cSDimitry Andric // as an inline array. 2717dff0c46cSDimitry Andric if (E->getCharByteWidth() == 1) { 2718dff0c46cSDimitry Andric SmallString<64> Str(E->getString()); 2719f22ef01cSRoman Divacky 2720dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2721dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType()); 2722dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2723dff0c46cSDimitry Andric return llvm::ConstantDataArray::getString(VMContext, Str, false); 27246122f3e6SDimitry Andric } 2725f22ef01cSRoman Divacky 272659d1ed5bSDimitry Andric auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType())); 2727dff0c46cSDimitry Andric llvm::Type *ElemTy = AType->getElementType(); 2728dff0c46cSDimitry Andric unsigned NumElements = AType->getNumElements(); 2729f22ef01cSRoman Divacky 2730dff0c46cSDimitry Andric // Wide strings have either 2-byte or 4-byte elements. 2731dff0c46cSDimitry Andric if (ElemTy->getPrimitiveSizeInBits() == 16) { 2732dff0c46cSDimitry Andric SmallVector<uint16_t, 32> Elements; 2733dff0c46cSDimitry Andric Elements.reserve(NumElements); 2734dff0c46cSDimitry Andric 2735dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2736dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2737dff0c46cSDimitry Andric Elements.resize(NumElements); 2738dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2739dff0c46cSDimitry Andric } 2740dff0c46cSDimitry Andric 2741dff0c46cSDimitry Andric assert(ElemTy->getPrimitiveSizeInBits() == 32); 2742dff0c46cSDimitry Andric SmallVector<uint32_t, 32> Elements; 2743dff0c46cSDimitry Andric Elements.reserve(NumElements); 2744dff0c46cSDimitry Andric 2745dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2746dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2747dff0c46cSDimitry Andric Elements.resize(NumElements); 2748dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2749f22ef01cSRoman Divacky } 2750f22ef01cSRoman Divacky 275159d1ed5bSDimitry Andric static llvm::GlobalVariable * 275259d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, 275359d1ed5bSDimitry Andric CodeGenModule &CGM, StringRef GlobalName, 275459d1ed5bSDimitry Andric unsigned Alignment) { 275559d1ed5bSDimitry Andric // OpenCL v1.2 s6.5.3: a string literal is in the constant address space. 275659d1ed5bSDimitry Andric unsigned AddrSpace = 0; 275759d1ed5bSDimitry Andric if (CGM.getLangOpts().OpenCL) 275859d1ed5bSDimitry Andric AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant); 2759dff0c46cSDimitry Andric 276059d1ed5bSDimitry Andric // Create a global variable for this string 276159d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 276259d1ed5bSDimitry Andric CGM.getModule(), C->getType(), !CGM.getLangOpts().WritableStrings, LT, C, 276359d1ed5bSDimitry Andric GlobalName, nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace); 276459d1ed5bSDimitry Andric GV->setAlignment(Alignment); 276559d1ed5bSDimitry Andric GV->setUnnamedAddr(true); 276659d1ed5bSDimitry Andric return GV; 2767f22ef01cSRoman Divacky } 2768dff0c46cSDimitry Andric 276959d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a 277059d1ed5bSDimitry Andric /// constant array for the given string literal. 277159d1ed5bSDimitry Andric llvm::GlobalVariable * 277259d1ed5bSDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 277359d1ed5bSDimitry Andric auto Alignment = 277459d1ed5bSDimitry Andric getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity(); 2775dff0c46cSDimitry Andric 277659d1ed5bSDimitry Andric llvm::Constant *C = GetConstantArrayFromStringLiteral(S); 277759d1ed5bSDimitry Andric llvm::GlobalVariable **Entry = nullptr; 277859d1ed5bSDimitry Andric if (!LangOpts.WritableStrings) { 277959d1ed5bSDimitry Andric Entry = &ConstantStringMap[C]; 278059d1ed5bSDimitry Andric if (auto GV = *Entry) { 278159d1ed5bSDimitry Andric if (Alignment > GV->getAlignment()) 278259d1ed5bSDimitry Andric GV->setAlignment(Alignment); 278359d1ed5bSDimitry Andric return GV; 278459d1ed5bSDimitry Andric } 278559d1ed5bSDimitry Andric } 278659d1ed5bSDimitry Andric 278759d1ed5bSDimitry Andric SmallString<256> MangledNameBuffer; 278859d1ed5bSDimitry Andric StringRef GlobalVariableName; 278959d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes LT; 279059d1ed5bSDimitry Andric 279159d1ed5bSDimitry Andric // Mangle the string literal if the ABI allows for it. However, we cannot 279259d1ed5bSDimitry Andric // do this if we are compiling with ASan or -fwritable-strings because they 279359d1ed5bSDimitry Andric // rely on strings having normal linkage. 279459d1ed5bSDimitry Andric if (!LangOpts.WritableStrings && !LangOpts.Sanitize.Address && 279559d1ed5bSDimitry Andric getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) { 279659d1ed5bSDimitry Andric llvm::raw_svector_ostream Out(MangledNameBuffer); 279759d1ed5bSDimitry Andric getCXXABI().getMangleContext().mangleStringLiteral(S, Out); 279859d1ed5bSDimitry Andric Out.flush(); 279959d1ed5bSDimitry Andric 280059d1ed5bSDimitry Andric LT = llvm::GlobalValue::LinkOnceODRLinkage; 280159d1ed5bSDimitry Andric GlobalVariableName = MangledNameBuffer; 280259d1ed5bSDimitry Andric } else { 280359d1ed5bSDimitry Andric LT = llvm::GlobalValue::PrivateLinkage; 280459d1ed5bSDimitry Andric GlobalVariableName = ".str"; 280559d1ed5bSDimitry Andric } 280659d1ed5bSDimitry Andric 280759d1ed5bSDimitry Andric auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment); 280859d1ed5bSDimitry Andric if (Entry) 280959d1ed5bSDimitry Andric *Entry = GV; 281059d1ed5bSDimitry Andric 281159d1ed5bSDimitry Andric reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>"); 2812dff0c46cSDimitry Andric return GV; 2813f22ef01cSRoman Divacky } 2814f22ef01cSRoman Divacky 2815f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant 2816f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node. 281759d1ed5bSDimitry Andric llvm::GlobalVariable * 2818f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { 2819f22ef01cSRoman Divacky std::string Str; 2820f22ef01cSRoman Divacky getContext().getObjCEncodingForType(E->getEncodedType(), Str); 2821f22ef01cSRoman Divacky 2822f22ef01cSRoman Divacky return GetAddrOfConstantCString(Str); 2823f22ef01cSRoman Divacky } 2824f22ef01cSRoman Divacky 282559d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing 282659d1ed5bSDimitry Andric /// the literal and a terminating '\0' character. 282759d1ed5bSDimitry Andric /// The result has pointer to array type. 282859d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString( 282959d1ed5bSDimitry Andric const std::string &Str, const char *GlobalName, unsigned Alignment) { 283059d1ed5bSDimitry Andric StringRef StrWithNull(Str.c_str(), Str.size() + 1); 283159d1ed5bSDimitry Andric if (Alignment == 0) { 283259d1ed5bSDimitry Andric Alignment = getContext() 283359d1ed5bSDimitry Andric .getAlignOfGlobalVarInChars(getContext().CharTy) 283459d1ed5bSDimitry Andric .getQuantity(); 2835f22ef01cSRoman Divacky } 2836f22ef01cSRoman Divacky 283759d1ed5bSDimitry Andric llvm::Constant *C = 283859d1ed5bSDimitry Andric llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false); 283959d1ed5bSDimitry Andric 284059d1ed5bSDimitry Andric // Don't share any string literals if strings aren't constant. 284159d1ed5bSDimitry Andric llvm::GlobalVariable **Entry = nullptr; 284259d1ed5bSDimitry Andric if (!LangOpts.WritableStrings) { 284359d1ed5bSDimitry Andric Entry = &ConstantStringMap[C]; 284459d1ed5bSDimitry Andric if (auto GV = *Entry) { 284559d1ed5bSDimitry Andric if (Alignment > GV->getAlignment()) 284659d1ed5bSDimitry Andric GV->setAlignment(Alignment); 284759d1ed5bSDimitry Andric return GV; 284859d1ed5bSDimitry Andric } 284959d1ed5bSDimitry Andric } 285059d1ed5bSDimitry Andric 2851f22ef01cSRoman Divacky // Get the default prefix if a name wasn't specified. 2852f22ef01cSRoman Divacky if (!GlobalName) 2853f22ef01cSRoman Divacky GlobalName = ".str"; 2854f22ef01cSRoman Divacky // Create a global variable for this. 285559d1ed5bSDimitry Andric auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this, 285659d1ed5bSDimitry Andric GlobalName, Alignment); 285759d1ed5bSDimitry Andric if (Entry) 285859d1ed5bSDimitry Andric *Entry = GV; 28596122f3e6SDimitry Andric return GV; 2860f22ef01cSRoman Divacky } 2861f22ef01cSRoman Divacky 2862f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary( 2863f785676fSDimitry Andric const MaterializeTemporaryExpr *E, const Expr *Init) { 2864f785676fSDimitry Andric assert((E->getStorageDuration() == SD_Static || 2865f785676fSDimitry Andric E->getStorageDuration() == SD_Thread) && "not a global temporary"); 286659d1ed5bSDimitry Andric const auto *VD = cast<VarDecl>(E->getExtendingDecl()); 2867f785676fSDimitry Andric 2868f785676fSDimitry Andric // If we're not materializing a subobject of the temporary, keep the 2869f785676fSDimitry Andric // cv-qualifiers from the type of the MaterializeTemporaryExpr. 2870f785676fSDimitry Andric QualType MaterializedType = Init->getType(); 2871f785676fSDimitry Andric if (Init == E->GetTemporaryExpr()) 2872f785676fSDimitry Andric MaterializedType = E->getType(); 2873f785676fSDimitry Andric 2874f785676fSDimitry Andric llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E]; 2875f785676fSDimitry Andric if (Slot) 2876f785676fSDimitry Andric return Slot; 2877f785676fSDimitry Andric 2878f785676fSDimitry Andric // FIXME: If an externally-visible declaration extends multiple temporaries, 2879f785676fSDimitry Andric // we need to give each temporary the same name in every translation unit (and 2880f785676fSDimitry Andric // we also need to make the temporaries externally-visible). 2881f785676fSDimitry Andric SmallString<256> Name; 2882f785676fSDimitry Andric llvm::raw_svector_ostream Out(Name); 288359d1ed5bSDimitry Andric getCXXABI().getMangleContext().mangleReferenceTemporary( 288459d1ed5bSDimitry Andric VD, E->getManglingNumber(), Out); 2885f785676fSDimitry Andric Out.flush(); 2886f785676fSDimitry Andric 288759d1ed5bSDimitry Andric APValue *Value = nullptr; 2888f785676fSDimitry Andric if (E->getStorageDuration() == SD_Static) { 2889f785676fSDimitry Andric // We might have a cached constant initializer for this temporary. Note 2890f785676fSDimitry Andric // that this might have a different value from the value computed by 2891f785676fSDimitry Andric // evaluating the initializer if the surrounding constant expression 2892f785676fSDimitry Andric // modifies the temporary. 2893f785676fSDimitry Andric Value = getContext().getMaterializedTemporaryValue(E, false); 2894f785676fSDimitry Andric if (Value && Value->isUninit()) 289559d1ed5bSDimitry Andric Value = nullptr; 2896f785676fSDimitry Andric } 2897f785676fSDimitry Andric 2898f785676fSDimitry Andric // Try evaluating it now, it might have a constant initializer. 2899f785676fSDimitry Andric Expr::EvalResult EvalResult; 2900f785676fSDimitry Andric if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) && 2901f785676fSDimitry Andric !EvalResult.hasSideEffects()) 2902f785676fSDimitry Andric Value = &EvalResult.Val; 2903f785676fSDimitry Andric 290459d1ed5bSDimitry Andric llvm::Constant *InitialValue = nullptr; 2905f785676fSDimitry Andric bool Constant = false; 2906f785676fSDimitry Andric llvm::Type *Type; 2907f785676fSDimitry Andric if (Value) { 2908f785676fSDimitry Andric // The temporary has a constant initializer, use it. 290959d1ed5bSDimitry Andric InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr); 2910f785676fSDimitry Andric Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value); 2911f785676fSDimitry Andric Type = InitialValue->getType(); 2912f785676fSDimitry Andric } else { 2913f785676fSDimitry Andric // No initializer, the initialization will be provided when we 2914f785676fSDimitry Andric // initialize the declaration which performed lifetime extension. 2915f785676fSDimitry Andric Type = getTypes().ConvertTypeForMem(MaterializedType); 2916f785676fSDimitry Andric } 2917f785676fSDimitry Andric 2918f785676fSDimitry Andric // Create a global variable for this lifetime-extended temporary. 291959d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 292059d1ed5bSDimitry Andric getLLVMLinkageVarDefinition(VD, Constant); 292159d1ed5bSDimitry Andric // There is no need for this temporary to have global linkage if the global 292259d1ed5bSDimitry Andric // variable has external linkage. 292359d1ed5bSDimitry Andric if (Linkage == llvm::GlobalVariable::ExternalLinkage) 292459d1ed5bSDimitry Andric Linkage = llvm::GlobalVariable::PrivateLinkage; 292559d1ed5bSDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace( 292659d1ed5bSDimitry Andric VD, getContext().getTargetAddressSpace(MaterializedType)); 292759d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 292859d1ed5bSDimitry Andric getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(), 292959d1ed5bSDimitry Andric /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, 293059d1ed5bSDimitry Andric AddrSpace); 293159d1ed5bSDimitry Andric setGlobalVisibility(GV, VD); 2932f785676fSDimitry Andric GV->setAlignment( 2933f785676fSDimitry Andric getContext().getTypeAlignInChars(MaterializedType).getQuantity()); 2934f785676fSDimitry Andric if (VD->getTLSKind()) 2935f785676fSDimitry Andric setTLSMode(GV, *VD); 2936f785676fSDimitry Andric Slot = GV; 2937f785676fSDimitry Andric return GV; 2938f785676fSDimitry Andric } 2939f785676fSDimitry Andric 2940f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized 2941f22ef01cSRoman Divacky /// properties for an implementation. 2942f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const 2943f22ef01cSRoman Divacky ObjCImplementationDecl *D) { 294459d1ed5bSDimitry Andric for (const auto *PID : D->property_impls()) { 2945f22ef01cSRoman Divacky // Dynamic is just for type-checking. 2946f22ef01cSRoman Divacky if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 2947f22ef01cSRoman Divacky ObjCPropertyDecl *PD = PID->getPropertyDecl(); 2948f22ef01cSRoman Divacky 2949f22ef01cSRoman Divacky // Determine which methods need to be implemented, some may have 29503861d79fSDimitry Andric // been overridden. Note that ::isPropertyAccessor is not the method 2951f22ef01cSRoman Divacky // we want, that just indicates if the decl came from a 2952f22ef01cSRoman Divacky // property. What we want to know is if the method is defined in 2953f22ef01cSRoman Divacky // this implementation. 2954f22ef01cSRoman Divacky if (!D->getInstanceMethod(PD->getGetterName())) 2955f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCGetter( 2956f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2957f22ef01cSRoman Divacky if (!PD->isReadOnly() && 2958f22ef01cSRoman Divacky !D->getInstanceMethod(PD->getSetterName())) 2959f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCSetter( 2960f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2961f22ef01cSRoman Divacky } 2962f22ef01cSRoman Divacky } 2963f22ef01cSRoman Divacky } 2964f22ef01cSRoman Divacky 29653b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) { 29666122f3e6SDimitry Andric const ObjCInterfaceDecl *iface = impl->getClassInterface(); 29676122f3e6SDimitry Andric for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin(); 29683b0f4066SDimitry Andric ivar; ivar = ivar->getNextIvar()) 29693b0f4066SDimitry Andric if (ivar->getType().isDestructedType()) 29703b0f4066SDimitry Andric return true; 29713b0f4066SDimitry Andric 29723b0f4066SDimitry Andric return false; 29733b0f4066SDimitry Andric } 29743b0f4066SDimitry Andric 2975f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization 2976f22ef01cSRoman Divacky /// for an implementation. 2977f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) { 29783b0f4066SDimitry Andric // We might need a .cxx_destruct even if we don't have any ivar initializers. 29793b0f4066SDimitry Andric if (needsDestructMethod(D)) { 2980f22ef01cSRoman Divacky IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct"); 2981f22ef01cSRoman Divacky Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 29823b0f4066SDimitry Andric ObjCMethodDecl *DTORMethod = 29833b0f4066SDimitry Andric ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(), 298459d1ed5bSDimitry Andric cxxSelector, getContext().VoidTy, nullptr, D, 29856122f3e6SDimitry Andric /*isInstance=*/true, /*isVariadic=*/false, 29863861d79fSDimitry Andric /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true, 29876122f3e6SDimitry Andric /*isDefined=*/false, ObjCMethodDecl::Required); 2988f22ef01cSRoman Divacky D->addInstanceMethod(DTORMethod); 2989f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false); 29903861d79fSDimitry Andric D->setHasDestructors(true); 29913b0f4066SDimitry Andric } 2992f22ef01cSRoman Divacky 29933b0f4066SDimitry Andric // If the implementation doesn't have any ivar initializers, we don't need 29943b0f4066SDimitry Andric // a .cxx_construct. 29953b0f4066SDimitry Andric if (D->getNumIvarInitializers() == 0) 29963b0f4066SDimitry Andric return; 29973b0f4066SDimitry Andric 29983b0f4066SDimitry Andric IdentifierInfo *II = &getContext().Idents.get(".cxx_construct"); 29993b0f4066SDimitry Andric Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 3000f22ef01cSRoman Divacky // The constructor returns 'self'. 3001f22ef01cSRoman Divacky ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(), 3002f22ef01cSRoman Divacky D->getLocation(), 30036122f3e6SDimitry Andric D->getLocation(), 30046122f3e6SDimitry Andric cxxSelector, 300559d1ed5bSDimitry Andric getContext().getObjCIdType(), 300659d1ed5bSDimitry Andric nullptr, D, /*isInstance=*/true, 30076122f3e6SDimitry Andric /*isVariadic=*/false, 30083861d79fSDimitry Andric /*isPropertyAccessor=*/true, 30096122f3e6SDimitry Andric /*isImplicitlyDeclared=*/true, 30106122f3e6SDimitry Andric /*isDefined=*/false, 3011f22ef01cSRoman Divacky ObjCMethodDecl::Required); 3012f22ef01cSRoman Divacky D->addInstanceMethod(CTORMethod); 3013f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true); 30143861d79fSDimitry Andric D->setHasNonZeroConstructors(true); 3015f22ef01cSRoman Divacky } 3016f22ef01cSRoman Divacky 3017f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace. 3018f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) { 301959d1ed5bSDimitry Andric for (auto *I : ND->decls()) { 302059d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(I)) 3021f785676fSDimitry Andric if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization && 3022f785676fSDimitry Andric VD->getTemplateSpecializationKind() != TSK_Undeclared) 3023f785676fSDimitry Andric continue; 302459d1ed5bSDimitry Andric EmitTopLevelDecl(I); 3025f22ef01cSRoman Divacky } 3026f785676fSDimitry Andric } 3027f22ef01cSRoman Divacky 3028f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec. 3029f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { 3030f22ef01cSRoman Divacky if (LSD->getLanguage() != LinkageSpecDecl::lang_c && 3031f22ef01cSRoman Divacky LSD->getLanguage() != LinkageSpecDecl::lang_cxx) { 3032f22ef01cSRoman Divacky ErrorUnsupported(LSD, "linkage spec"); 3033f22ef01cSRoman Divacky return; 3034f22ef01cSRoman Divacky } 3035f22ef01cSRoman Divacky 303659d1ed5bSDimitry Andric for (auto *I : LSD->decls()) { 30373861d79fSDimitry Andric // Meta-data for ObjC class includes references to implemented methods. 30383861d79fSDimitry Andric // Generate class's method definitions first. 303959d1ed5bSDimitry Andric if (auto *OID = dyn_cast<ObjCImplDecl>(I)) { 304059d1ed5bSDimitry Andric for (auto *M : OID->methods()) 304159d1ed5bSDimitry Andric EmitTopLevelDecl(M); 30423861d79fSDimitry Andric } 304359d1ed5bSDimitry Andric EmitTopLevelDecl(I); 3044f22ef01cSRoman Divacky } 30453861d79fSDimitry Andric } 3046f22ef01cSRoman Divacky 3047f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration. 3048f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) { 3049f22ef01cSRoman Divacky // Ignore dependent declarations. 3050f22ef01cSRoman Divacky if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) 3051f22ef01cSRoman Divacky return; 3052f22ef01cSRoman Divacky 3053f22ef01cSRoman Divacky switch (D->getKind()) { 3054f22ef01cSRoman Divacky case Decl::CXXConversion: 3055f22ef01cSRoman Divacky case Decl::CXXMethod: 3056f22ef01cSRoman Divacky case Decl::Function: 3057f22ef01cSRoman Divacky // Skip function templates 30583b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 30593b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 3060f22ef01cSRoman Divacky return; 3061f22ef01cSRoman Divacky 3062f22ef01cSRoman Divacky EmitGlobal(cast<FunctionDecl>(D)); 3063f22ef01cSRoman Divacky break; 3064f22ef01cSRoman Divacky 3065f22ef01cSRoman Divacky case Decl::Var: 3066f785676fSDimitry Andric // Skip variable templates 3067f785676fSDimitry Andric if (cast<VarDecl>(D)->getDescribedVarTemplate()) 3068f785676fSDimitry Andric return; 3069f785676fSDimitry Andric case Decl::VarTemplateSpecialization: 3070f22ef01cSRoman Divacky EmitGlobal(cast<VarDecl>(D)); 3071f22ef01cSRoman Divacky break; 3072f22ef01cSRoman Divacky 30733b0f4066SDimitry Andric // Indirect fields from global anonymous structs and unions can be 30743b0f4066SDimitry Andric // ignored; only the actual variable requires IR gen support. 30753b0f4066SDimitry Andric case Decl::IndirectField: 30763b0f4066SDimitry Andric break; 30773b0f4066SDimitry Andric 3078f22ef01cSRoman Divacky // C++ Decls 3079f22ef01cSRoman Divacky case Decl::Namespace: 3080f22ef01cSRoman Divacky EmitNamespace(cast<NamespaceDecl>(D)); 3081f22ef01cSRoman Divacky break; 3082f22ef01cSRoman Divacky // No code generation needed. 3083f22ef01cSRoman Divacky case Decl::UsingShadow: 3084f22ef01cSRoman Divacky case Decl::ClassTemplate: 3085f785676fSDimitry Andric case Decl::VarTemplate: 3086f785676fSDimitry Andric case Decl::VarTemplatePartialSpecialization: 3087f22ef01cSRoman Divacky case Decl::FunctionTemplate: 3088bd5abe19SDimitry Andric case Decl::TypeAliasTemplate: 3089bd5abe19SDimitry Andric case Decl::Block: 3090139f7f9bSDimitry Andric case Decl::Empty: 3091f22ef01cSRoman Divacky break; 309259d1ed5bSDimitry Andric case Decl::Using: // using X; [C++] 309359d1ed5bSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 309459d1ed5bSDimitry Andric DI->EmitUsingDecl(cast<UsingDecl>(*D)); 309559d1ed5bSDimitry Andric return; 3096f785676fSDimitry Andric case Decl::NamespaceAlias: 3097f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3098f785676fSDimitry Andric DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D)); 3099f785676fSDimitry Andric return; 3100284c1978SDimitry Andric case Decl::UsingDirective: // using namespace X; [C++] 3101284c1978SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3102284c1978SDimitry Andric DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D)); 3103284c1978SDimitry Andric return; 3104f22ef01cSRoman Divacky case Decl::CXXConstructor: 3105f22ef01cSRoman Divacky // Skip function templates 31063b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 31073b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 3108f22ef01cSRoman Divacky return; 3109f22ef01cSRoman Divacky 3110f785676fSDimitry Andric getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D)); 3111f22ef01cSRoman Divacky break; 3112f22ef01cSRoman Divacky case Decl::CXXDestructor: 31133b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->isLateTemplateParsed()) 31143b0f4066SDimitry Andric return; 3115f785676fSDimitry Andric getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D)); 3116f22ef01cSRoman Divacky break; 3117f22ef01cSRoman Divacky 3118f22ef01cSRoman Divacky case Decl::StaticAssert: 3119f22ef01cSRoman Divacky // Nothing to do. 3120f22ef01cSRoman Divacky break; 3121f22ef01cSRoman Divacky 3122f22ef01cSRoman Divacky // Objective-C Decls 3123f22ef01cSRoman Divacky 3124f22ef01cSRoman Divacky // Forward declarations, no (immediate) code generation. 3125f22ef01cSRoman Divacky case Decl::ObjCInterface: 31267ae0e2c9SDimitry Andric case Decl::ObjCCategory: 3127f22ef01cSRoman Divacky break; 3128f22ef01cSRoman Divacky 3129dff0c46cSDimitry Andric case Decl::ObjCProtocol: { 313059d1ed5bSDimitry Andric auto *Proto = cast<ObjCProtocolDecl>(D); 3131dff0c46cSDimitry Andric if (Proto->isThisDeclarationADefinition()) 3132dff0c46cSDimitry Andric ObjCRuntime->GenerateProtocol(Proto); 3133f22ef01cSRoman Divacky break; 3134dff0c46cSDimitry Andric } 3135f22ef01cSRoman Divacky 3136f22ef01cSRoman Divacky case Decl::ObjCCategoryImpl: 3137f22ef01cSRoman Divacky // Categories have properties but don't support synthesize so we 3138f22ef01cSRoman Divacky // can ignore them here. 31396122f3e6SDimitry Andric ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 3140f22ef01cSRoman Divacky break; 3141f22ef01cSRoman Divacky 3142f22ef01cSRoman Divacky case Decl::ObjCImplementation: { 314359d1ed5bSDimitry Andric auto *OMD = cast<ObjCImplementationDecl>(D); 3144f22ef01cSRoman Divacky EmitObjCPropertyImplementations(OMD); 3145f22ef01cSRoman Divacky EmitObjCIvarInitializations(OMD); 31466122f3e6SDimitry Andric ObjCRuntime->GenerateClass(OMD); 3147dff0c46cSDimitry Andric // Emit global variable debug information. 3148dff0c46cSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3149139f7f9bSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 3150139f7f9bSDimitry Andric DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( 3151139f7f9bSDimitry Andric OMD->getClassInterface()), OMD->getLocation()); 3152f22ef01cSRoman Divacky break; 3153f22ef01cSRoman Divacky } 3154f22ef01cSRoman Divacky case Decl::ObjCMethod: { 315559d1ed5bSDimitry Andric auto *OMD = cast<ObjCMethodDecl>(D); 3156f22ef01cSRoman Divacky // If this is not a prototype, emit the body. 3157f22ef01cSRoman Divacky if (OMD->getBody()) 3158f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCMethod(OMD); 3159f22ef01cSRoman Divacky break; 3160f22ef01cSRoman Divacky } 3161f22ef01cSRoman Divacky case Decl::ObjCCompatibleAlias: 3162dff0c46cSDimitry Andric ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D)); 3163f22ef01cSRoman Divacky break; 3164f22ef01cSRoman Divacky 3165f22ef01cSRoman Divacky case Decl::LinkageSpec: 3166f22ef01cSRoman Divacky EmitLinkageSpec(cast<LinkageSpecDecl>(D)); 3167f22ef01cSRoman Divacky break; 3168f22ef01cSRoman Divacky 3169f22ef01cSRoman Divacky case Decl::FileScopeAsm: { 317059d1ed5bSDimitry Andric auto *AD = cast<FileScopeAsmDecl>(D); 31716122f3e6SDimitry Andric StringRef AsmString = AD->getAsmString()->getString(); 3172f22ef01cSRoman Divacky 3173f22ef01cSRoman Divacky const std::string &S = getModule().getModuleInlineAsm(); 3174f22ef01cSRoman Divacky if (S.empty()) 3175f22ef01cSRoman Divacky getModule().setModuleInlineAsm(AsmString); 31767ae0e2c9SDimitry Andric else if (S.end()[-1] == '\n') 31776122f3e6SDimitry Andric getModule().setModuleInlineAsm(S + AsmString.str()); 3178f22ef01cSRoman Divacky else 3179f22ef01cSRoman Divacky getModule().setModuleInlineAsm(S + '\n' + AsmString.str()); 3180f22ef01cSRoman Divacky break; 3181f22ef01cSRoman Divacky } 3182f22ef01cSRoman Divacky 3183139f7f9bSDimitry Andric case Decl::Import: { 318459d1ed5bSDimitry Andric auto *Import = cast<ImportDecl>(D); 3185139f7f9bSDimitry Andric 3186139f7f9bSDimitry Andric // Ignore import declarations that come from imported modules. 3187139f7f9bSDimitry Andric if (clang::Module *Owner = Import->getOwningModule()) { 3188139f7f9bSDimitry Andric if (getLangOpts().CurrentModule.empty() || 3189139f7f9bSDimitry Andric Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) 3190139f7f9bSDimitry Andric break; 3191139f7f9bSDimitry Andric } 3192139f7f9bSDimitry Andric 3193139f7f9bSDimitry Andric ImportedModules.insert(Import->getImportedModule()); 3194139f7f9bSDimitry Andric break; 3195139f7f9bSDimitry Andric } 3196139f7f9bSDimitry Andric 319759d1ed5bSDimitry Andric case Decl::ClassTemplateSpecialization: { 319859d1ed5bSDimitry Andric const auto *Spec = cast<ClassTemplateSpecializationDecl>(D); 319959d1ed5bSDimitry Andric if (DebugInfo && 320059d1ed5bSDimitry Andric Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition) 320159d1ed5bSDimitry Andric DebugInfo->completeTemplateDefinition(*Spec); 320259d1ed5bSDimitry Andric } 320359d1ed5bSDimitry Andric 3204f22ef01cSRoman Divacky default: 3205f22ef01cSRoman Divacky // Make sure we handled everything we should, every other kind is a 3206f22ef01cSRoman Divacky // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind 3207f22ef01cSRoman Divacky // function. Need to recode Decl::Kind to do that easily. 3208f22ef01cSRoman Divacky assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 3209f22ef01cSRoman Divacky } 3210f22ef01cSRoman Divacky } 3211ffd1746dSEd Schouten 3212ffd1746dSEd Schouten /// Turns the given pointer into a constant. 3213ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context, 3214ffd1746dSEd Schouten const void *Ptr) { 3215ffd1746dSEd Schouten uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr); 32166122f3e6SDimitry Andric llvm::Type *i64 = llvm::Type::getInt64Ty(Context); 3217ffd1746dSEd Schouten return llvm::ConstantInt::get(i64, PtrInt); 3218ffd1746dSEd Schouten } 3219ffd1746dSEd Schouten 3220ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM, 3221ffd1746dSEd Schouten llvm::NamedMDNode *&GlobalMetadata, 3222ffd1746dSEd Schouten GlobalDecl D, 3223ffd1746dSEd Schouten llvm::GlobalValue *Addr) { 3224ffd1746dSEd Schouten if (!GlobalMetadata) 3225ffd1746dSEd Schouten GlobalMetadata = 3226ffd1746dSEd Schouten CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs"); 3227ffd1746dSEd Schouten 3228ffd1746dSEd Schouten // TODO: should we report variant information for ctors/dtors? 3229ffd1746dSEd Schouten llvm::Value *Ops[] = { 3230ffd1746dSEd Schouten Addr, 3231ffd1746dSEd Schouten GetPointerConstant(CGM.getLLVMContext(), D.getDecl()) 3232ffd1746dSEd Schouten }; 32333b0f4066SDimitry Andric GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 3234ffd1746dSEd Schouten } 3235ffd1746dSEd Schouten 3236284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked 3237284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled 3238284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer 3239284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the 3240284c1978SDimitry Andric /// same translation unit. 3241284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() { 3242284c1978SDimitry Andric for (StaticExternCMap::iterator I = StaticExternCValues.begin(), 3243284c1978SDimitry Andric E = StaticExternCValues.end(); 3244284c1978SDimitry Andric I != E; ++I) { 3245284c1978SDimitry Andric IdentifierInfo *Name = I->first; 3246284c1978SDimitry Andric llvm::GlobalValue *Val = I->second; 3247284c1978SDimitry Andric if (Val && !getModule().getNamedValue(Name->getName())) 324859d1ed5bSDimitry Andric addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val)); 3249284c1978SDimitry Andric } 3250284c1978SDimitry Andric } 3251284c1978SDimitry Andric 325259d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName, 325359d1ed5bSDimitry Andric GlobalDecl &Result) const { 325459d1ed5bSDimitry Andric auto Res = Manglings.find(MangledName); 325559d1ed5bSDimitry Andric if (Res == Manglings.end()) 325659d1ed5bSDimitry Andric return false; 325759d1ed5bSDimitry Andric Result = Res->getValue(); 325859d1ed5bSDimitry Andric return true; 325959d1ed5bSDimitry Andric } 326059d1ed5bSDimitry Andric 3261ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the 3262ffd1746dSEd Schouten /// current module with the Decls they came from. This is useful for 3263ffd1746dSEd Schouten /// projects using IR gen as a subroutine. 3264ffd1746dSEd Schouten /// 3265ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly 3266ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata 3267ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'. 3268ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() { 326959d1ed5bSDimitry Andric llvm::NamedMDNode *GlobalMetadata = nullptr; 3270ffd1746dSEd Schouten 3271ffd1746dSEd Schouten // StaticLocalDeclMap 327259d1ed5bSDimitry Andric for (auto &I : MangledDeclNames) { 327359d1ed5bSDimitry Andric llvm::GlobalValue *Addr = getModule().getNamedValue(I.second); 327459d1ed5bSDimitry Andric EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr); 3275ffd1746dSEd Schouten } 3276ffd1746dSEd Schouten } 3277ffd1746dSEd Schouten 3278ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current 3279ffd1746dSEd Schouten /// function. 3280ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() { 3281ffd1746dSEd Schouten if (LocalDeclMap.empty()) return; 3282ffd1746dSEd Schouten 3283ffd1746dSEd Schouten llvm::LLVMContext &Context = getLLVMContext(); 3284ffd1746dSEd Schouten 3285ffd1746dSEd Schouten // Find the unique metadata ID for this name. 3286ffd1746dSEd Schouten unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr"); 3287ffd1746dSEd Schouten 328859d1ed5bSDimitry Andric llvm::NamedMDNode *GlobalMetadata = nullptr; 3289ffd1746dSEd Schouten 329059d1ed5bSDimitry Andric for (auto &I : LocalDeclMap) { 329159d1ed5bSDimitry Andric const Decl *D = I.first; 329259d1ed5bSDimitry Andric llvm::Value *Addr = I.second; 329359d1ed5bSDimitry Andric if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) { 3294ffd1746dSEd Schouten llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D); 32953b0f4066SDimitry Andric Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr)); 329659d1ed5bSDimitry Andric } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) { 3297ffd1746dSEd Schouten GlobalDecl GD = GlobalDecl(cast<VarDecl>(D)); 3298ffd1746dSEd Schouten EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV); 3299ffd1746dSEd Schouten } 3300ffd1746dSEd Schouten } 3301ffd1746dSEd Schouten } 3302e580952dSDimitry Andric 3303f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() { 3304f785676fSDimitry Andric llvm::NamedMDNode *IdentMetadata = 3305f785676fSDimitry Andric TheModule.getOrInsertNamedMetadata("llvm.ident"); 3306f785676fSDimitry Andric std::string Version = getClangFullVersion(); 3307f785676fSDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3308f785676fSDimitry Andric 3309f785676fSDimitry Andric llvm::Value *IdentNode[] = { 3310f785676fSDimitry Andric llvm::MDString::get(Ctx, Version) 3311f785676fSDimitry Andric }; 3312f785676fSDimitry Andric IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode)); 3313f785676fSDimitry Andric } 3314f785676fSDimitry Andric 331559d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() { 331659d1ed5bSDimitry Andric for (auto &I : MangledDeclNames) { 331759d1ed5bSDimitry Andric const Decl *D = I.first.getDecl()->getMostRecentDecl(); 331859d1ed5bSDimitry Andric llvm::GlobalValue *GV = GetGlobalValue(I.second); 331959d1ed5bSDimitry Andric getTargetCodeGenInfo().emitTargetMD(D, GV, *this); 332059d1ed5bSDimitry Andric } 332159d1ed5bSDimitry Andric } 332259d1ed5bSDimitry Andric 3323bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() { 3324bd5abe19SDimitry Andric if (!getCodeGenOpts().CoverageFile.empty()) { 3325bd5abe19SDimitry Andric if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { 3326bd5abe19SDimitry Andric llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); 3327bd5abe19SDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3328bd5abe19SDimitry Andric llvm::MDString *CoverageFile = 3329bd5abe19SDimitry Andric llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); 3330bd5abe19SDimitry Andric for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { 3331bd5abe19SDimitry Andric llvm::MDNode *CU = CUNode->getOperand(i); 3332bd5abe19SDimitry Andric llvm::Value *node[] = { CoverageFile, CU }; 3333bd5abe19SDimitry Andric llvm::MDNode *N = llvm::MDNode::get(Ctx, node); 3334bd5abe19SDimitry Andric GCov->addOperand(N); 3335bd5abe19SDimitry Andric } 3336bd5abe19SDimitry Andric } 3337bd5abe19SDimitry Andric } 3338bd5abe19SDimitry Andric } 33393861d79fSDimitry Andric 33403861d79fSDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid, 33413861d79fSDimitry Andric QualType GuidType) { 33423861d79fSDimitry Andric // Sema has checked that all uuid strings are of the form 33433861d79fSDimitry Andric // "12345678-1234-1234-1234-1234567890ab". 33443861d79fSDimitry Andric assert(Uuid.size() == 36); 3345f785676fSDimitry Andric for (unsigned i = 0; i < 36; ++i) { 3346f785676fSDimitry Andric if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-'); 3347f785676fSDimitry Andric else assert(isHexDigit(Uuid[i])); 33483861d79fSDimitry Andric } 33493861d79fSDimitry Andric 3350f785676fSDimitry Andric const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 }; 33513861d79fSDimitry Andric 3352f785676fSDimitry Andric llvm::Constant *Field3[8]; 3353f785676fSDimitry Andric for (unsigned Idx = 0; Idx < 8; ++Idx) 3354f785676fSDimitry Andric Field3[Idx] = llvm::ConstantInt::get( 3355f785676fSDimitry Andric Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16); 33563861d79fSDimitry Andric 3357f785676fSDimitry Andric llvm::Constant *Fields[4] = { 3358f785676fSDimitry Andric llvm::ConstantInt::get(Int32Ty, Uuid.substr(0, 8), 16), 3359f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(9, 4), 16), 3360f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16), 3361f785676fSDimitry Andric llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3) 3362f785676fSDimitry Andric }; 3363f785676fSDimitry Andric 3364f785676fSDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 33653861d79fSDimitry Andric } 336659d1ed5bSDimitry Andric 336759d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, 336859d1ed5bSDimitry Andric bool ForEH) { 336959d1ed5bSDimitry Andric // Return a bogus pointer if RTTI is disabled, unless it's for EH. 337059d1ed5bSDimitry Andric // FIXME: should we even be calling this method if RTTI is disabled 337159d1ed5bSDimitry Andric // and it's not for EH? 337259d1ed5bSDimitry Andric if (!ForEH && !getLangOpts().RTTI) 337359d1ed5bSDimitry Andric return llvm::Constant::getNullValue(Int8PtrTy); 337459d1ed5bSDimitry Andric 337559d1ed5bSDimitry Andric if (ForEH && Ty->isObjCObjectPointerType() && 337659d1ed5bSDimitry Andric LangOpts.ObjCRuntime.isGNUFamily()) 337759d1ed5bSDimitry Andric return ObjCRuntime->GetEHType(Ty); 337859d1ed5bSDimitry Andric 337959d1ed5bSDimitry Andric return getCXXABI().getAddrOfRTTIDescriptor(Ty); 338059d1ed5bSDimitry Andric } 338159d1ed5bSDimitry Andric 3382