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" 2539d628a0SDimitry Andric #include "CoverageMappingGen.h" 26f22ef01cSRoman Divacky #include "TargetInfo.h" 27f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h" 28f22ef01cSRoman Divacky #include "clang/AST/CharUnits.h" 29f22ef01cSRoman Divacky #include "clang/AST/DeclCXX.h" 30139f7f9bSDimitry Andric #include "clang/AST/DeclObjC.h" 31ffd1746dSEd Schouten #include "clang/AST/DeclTemplate.h" 322754fe60SDimitry Andric #include "clang/AST/Mangle.h" 33f22ef01cSRoman Divacky #include "clang/AST/RecordLayout.h" 34f8254f43SDimitry Andric #include "clang/AST/RecursiveASTVisitor.h" 35dff0c46cSDimitry Andric #include "clang/Basic/Builtins.h" 36139f7f9bSDimitry Andric #include "clang/Basic/CharInfo.h" 37f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h" 38139f7f9bSDimitry Andric #include "clang/Basic/Module.h" 39f22ef01cSRoman Divacky #include "clang/Basic/SourceManager.h" 40f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h" 41f785676fSDimitry Andric #include "clang/Basic/Version.h" 42139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h" 43f785676fSDimitry Andric #include "clang/Sema/SemaDiagnostic.h" 44dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h" 45f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h" 4659d1ed5bSDimitry Andric #include "llvm/IR/CallSite.h" 47139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h" 48139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 49139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h" 50139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h" 51139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 5259d1ed5bSDimitry Andric #include "llvm/ProfileData/InstrProfReader.h" 53139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h" 54f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 55139f7f9bSDimitry Andric 56f22ef01cSRoman Divacky using namespace clang; 57f22ef01cSRoman Divacky using namespace CodeGen; 58f22ef01cSRoman Divacky 596122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata"; 606122f3e6SDimitry Andric 6159d1ed5bSDimitry Andric static CGCXXABI *createCXXABI(CodeGenModule &CGM) { 62284c1978SDimitry Andric switch (CGM.getTarget().getCXXABI().getKind()) { 63139f7f9bSDimitry Andric case TargetCXXABI::GenericAArch64: 64139f7f9bSDimitry Andric case TargetCXXABI::GenericARM: 65139f7f9bSDimitry Andric case TargetCXXABI::iOS: 6659d1ed5bSDimitry Andric case TargetCXXABI::iOS64: 67ef6fa9e2SDimitry Andric case TargetCXXABI::GenericMIPS: 68139f7f9bSDimitry Andric case TargetCXXABI::GenericItanium: 6959d1ed5bSDimitry Andric return CreateItaniumCXXABI(CGM); 70139f7f9bSDimitry Andric case TargetCXXABI::Microsoft: 7159d1ed5bSDimitry Andric return CreateMicrosoftCXXABI(CGM); 72e580952dSDimitry Andric } 73e580952dSDimitry Andric 74e580952dSDimitry Andric llvm_unreachable("invalid C++ ABI kind"); 75e580952dSDimitry Andric } 76e580952dSDimitry Andric 77f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 78284c1978SDimitry Andric llvm::Module &M, const llvm::DataLayout &TD, 7939d628a0SDimitry Andric DiagnosticsEngine &diags, 8039d628a0SDimitry Andric CoverageSourceInfo *CoverageInfo) 81284c1978SDimitry Andric : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M), 82284c1978SDimitry Andric Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()), 8359d1ed5bSDimitry Andric ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(nullptr), 8459d1ed5bSDimitry Andric TheTargetCodeGenInfo(nullptr), Types(*this), VTables(*this), 8559d1ed5bSDimitry Andric ObjCRuntime(nullptr), OpenCLRuntime(nullptr), OpenMPRuntime(nullptr), 8659d1ed5bSDimitry Andric CUDARuntime(nullptr), DebugInfo(nullptr), ARCData(nullptr), 8759d1ed5bSDimitry Andric NoObjCARCExceptionsMetadata(nullptr), RRData(nullptr), PGOReader(nullptr), 8859d1ed5bSDimitry Andric CFConstantStringClassRef(nullptr), ConstantStringClassRef(nullptr), 8959d1ed5bSDimitry Andric NSConstantStringType(nullptr), NSConcreteGlobalBlock(nullptr), 9059d1ed5bSDimitry Andric NSConcreteStackBlock(nullptr), BlockObjectAssign(nullptr), 9159d1ed5bSDimitry Andric BlockObjectDispose(nullptr), BlockDescriptorType(nullptr), 9259d1ed5bSDimitry Andric GenericBlockLiteralType(nullptr), LifetimeStartFn(nullptr), 9339d628a0SDimitry Andric LifetimeEndFn(nullptr), SanitizerMD(new SanitizerMetadata(*this)) { 94dff0c46cSDimitry Andric 95dff0c46cSDimitry Andric // Initialize the type cache. 96dff0c46cSDimitry Andric llvm::LLVMContext &LLVMContext = M.getContext(); 97dff0c46cSDimitry Andric VoidTy = llvm::Type::getVoidTy(LLVMContext); 98dff0c46cSDimitry Andric Int8Ty = llvm::Type::getInt8Ty(LLVMContext); 99dff0c46cSDimitry Andric Int16Ty = llvm::Type::getInt16Ty(LLVMContext); 100dff0c46cSDimitry Andric Int32Ty = llvm::Type::getInt32Ty(LLVMContext); 101dff0c46cSDimitry Andric Int64Ty = llvm::Type::getInt64Ty(LLVMContext); 102dff0c46cSDimitry Andric FloatTy = llvm::Type::getFloatTy(LLVMContext); 103dff0c46cSDimitry Andric DoubleTy = llvm::Type::getDoubleTy(LLVMContext); 104dff0c46cSDimitry Andric PointerWidthInBits = C.getTargetInfo().getPointerWidth(0); 105dff0c46cSDimitry Andric PointerAlignInBytes = 106dff0c46cSDimitry Andric C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity(); 107dff0c46cSDimitry Andric IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth()); 108dff0c46cSDimitry Andric IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits); 109dff0c46cSDimitry Andric Int8PtrTy = Int8Ty->getPointerTo(0); 110dff0c46cSDimitry Andric Int8PtrPtrTy = Int8PtrTy->getPointerTo(0); 111dff0c46cSDimitry Andric 112139f7f9bSDimitry Andric RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC(); 11339d628a0SDimitry Andric BuiltinCC = getTargetCodeGenInfo().getABIInfo().getBuiltinCC(); 114139f7f9bSDimitry Andric 115dff0c46cSDimitry Andric if (LangOpts.ObjC1) 1163b0f4066SDimitry Andric createObjCRuntime(); 117dff0c46cSDimitry Andric if (LangOpts.OpenCL) 1186122f3e6SDimitry Andric createOpenCLRuntime(); 11959d1ed5bSDimitry Andric if (LangOpts.OpenMP) 12059d1ed5bSDimitry Andric createOpenMPRuntime(); 121dff0c46cSDimitry Andric if (LangOpts.CUDA) 1226122f3e6SDimitry Andric createCUDARuntime(); 123f22ef01cSRoman Divacky 1247ae0e2c9SDimitry Andric // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0. 12539d628a0SDimitry Andric if (LangOpts.Sanitize.has(SanitizerKind::Thread) || 1267ae0e2c9SDimitry Andric (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)) 1277ae0e2c9SDimitry Andric TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(), 12859d1ed5bSDimitry Andric getCXXABI().getMangleContext()); 1292754fe60SDimitry Andric 1303b0f4066SDimitry Andric // If debug info or coverage generation is enabled, create the CGDebugInfo 1313b0f4066SDimitry Andric // object. 1323861d79fSDimitry Andric if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo || 1337ae0e2c9SDimitry Andric CodeGenOpts.EmitGcovArcs || 1343b0f4066SDimitry Andric CodeGenOpts.EmitGcovNotes) 1353b0f4066SDimitry Andric DebugInfo = new CGDebugInfo(*this); 1362754fe60SDimitry Andric 1372754fe60SDimitry Andric Block.GlobalUniqueCount = 0; 1382754fe60SDimitry Andric 139dff0c46cSDimitry Andric if (C.getLangOpts().ObjCAutoRefCount) 14017a519f9SDimitry Andric ARCData = new ARCEntrypoints(); 14117a519f9SDimitry Andric RRData = new RREntrypoints(); 14259d1ed5bSDimitry Andric 14359d1ed5bSDimitry Andric if (!CodeGenOpts.InstrProfileInput.empty()) { 14433956c43SDimitry Andric auto ReaderOrErr = 14533956c43SDimitry Andric llvm::IndexedInstrProfReader::create(CodeGenOpts.InstrProfileInput); 14633956c43SDimitry Andric if (std::error_code EC = ReaderOrErr.getError()) { 14759d1ed5bSDimitry Andric unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 14859d1ed5bSDimitry Andric "Could not read profile: %0"); 14959d1ed5bSDimitry Andric getDiags().Report(DiagID) << EC.message(); 15033956c43SDimitry Andric } else 15133956c43SDimitry Andric PGOReader = std::move(ReaderOrErr.get()); 15259d1ed5bSDimitry Andric } 15339d628a0SDimitry Andric 15439d628a0SDimitry Andric // If coverage mapping generation is enabled, create the 15539d628a0SDimitry Andric // CoverageMappingModuleGen object. 15639d628a0SDimitry Andric if (CodeGenOpts.CoverageMapping) 15739d628a0SDimitry Andric CoverageMapping.reset(new CoverageMappingModuleGen(*this, *CoverageInfo)); 158f22ef01cSRoman Divacky } 159f22ef01cSRoman Divacky 160f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() { 1616122f3e6SDimitry Andric delete ObjCRuntime; 1626122f3e6SDimitry Andric delete OpenCLRuntime; 16359d1ed5bSDimitry Andric delete OpenMPRuntime; 1646122f3e6SDimitry Andric delete CUDARuntime; 1656122f3e6SDimitry Andric delete TheTargetCodeGenInfo; 1662754fe60SDimitry Andric delete TBAA; 167f22ef01cSRoman Divacky delete DebugInfo; 16817a519f9SDimitry Andric delete ARCData; 16917a519f9SDimitry Andric delete RRData; 170f22ef01cSRoman Divacky } 171f22ef01cSRoman Divacky 172f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() { 1737ae0e2c9SDimitry Andric // This is just isGNUFamily(), but we want to force implementors of 1747ae0e2c9SDimitry Andric // new ABIs to decide how best to do this. 1757ae0e2c9SDimitry Andric switch (LangOpts.ObjCRuntime.getKind()) { 1767ae0e2c9SDimitry Andric case ObjCRuntime::GNUstep: 1777ae0e2c9SDimitry Andric case ObjCRuntime::GCC: 1787ae0e2c9SDimitry Andric case ObjCRuntime::ObjFW: 1796122f3e6SDimitry Andric ObjCRuntime = CreateGNUObjCRuntime(*this); 1807ae0e2c9SDimitry Andric return; 1817ae0e2c9SDimitry Andric 1827ae0e2c9SDimitry Andric case ObjCRuntime::FragileMacOSX: 1837ae0e2c9SDimitry Andric case ObjCRuntime::MacOSX: 1847ae0e2c9SDimitry Andric case ObjCRuntime::iOS: 1856122f3e6SDimitry Andric ObjCRuntime = CreateMacObjCRuntime(*this); 1867ae0e2c9SDimitry Andric return; 1877ae0e2c9SDimitry Andric } 1887ae0e2c9SDimitry Andric llvm_unreachable("bad runtime kind"); 1896122f3e6SDimitry Andric } 1906122f3e6SDimitry Andric 1916122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() { 1926122f3e6SDimitry Andric OpenCLRuntime = new CGOpenCLRuntime(*this); 1936122f3e6SDimitry Andric } 1946122f3e6SDimitry Andric 19559d1ed5bSDimitry Andric void CodeGenModule::createOpenMPRuntime() { 19659d1ed5bSDimitry Andric OpenMPRuntime = new CGOpenMPRuntime(*this); 19759d1ed5bSDimitry Andric } 19859d1ed5bSDimitry Andric 1996122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() { 2006122f3e6SDimitry Andric CUDARuntime = CreateNVCUDARuntime(*this); 201f22ef01cSRoman Divacky } 202f22ef01cSRoman Divacky 20339d628a0SDimitry Andric void CodeGenModule::addReplacement(StringRef Name, llvm::Constant *C) { 20439d628a0SDimitry Andric Replacements[Name] = C; 20539d628a0SDimitry Andric } 20639d628a0SDimitry Andric 207f785676fSDimitry Andric void CodeGenModule::applyReplacements() { 208f785676fSDimitry Andric for (ReplacementsTy::iterator I = Replacements.begin(), 209f785676fSDimitry Andric E = Replacements.end(); 210f785676fSDimitry Andric I != E; ++I) { 211f785676fSDimitry Andric StringRef MangledName = I->first(); 212f785676fSDimitry Andric llvm::Constant *Replacement = I->second; 213f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 214f785676fSDimitry Andric if (!Entry) 215f785676fSDimitry Andric continue; 21659d1ed5bSDimitry Andric auto *OldF = cast<llvm::Function>(Entry); 21759d1ed5bSDimitry Andric auto *NewF = dyn_cast<llvm::Function>(Replacement); 218f785676fSDimitry Andric if (!NewF) { 21959d1ed5bSDimitry Andric if (auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) { 22059d1ed5bSDimitry Andric NewF = dyn_cast<llvm::Function>(Alias->getAliasee()); 22159d1ed5bSDimitry Andric } else { 22259d1ed5bSDimitry Andric auto *CE = cast<llvm::ConstantExpr>(Replacement); 223f785676fSDimitry Andric assert(CE->getOpcode() == llvm::Instruction::BitCast || 224f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::GetElementPtr); 225f785676fSDimitry Andric NewF = dyn_cast<llvm::Function>(CE->getOperand(0)); 226f785676fSDimitry Andric } 22759d1ed5bSDimitry Andric } 228f785676fSDimitry Andric 229f785676fSDimitry Andric // Replace old with new, but keep the old order. 230f785676fSDimitry Andric OldF->replaceAllUsesWith(Replacement); 231f785676fSDimitry Andric if (NewF) { 232f785676fSDimitry Andric NewF->removeFromParent(); 233f785676fSDimitry Andric OldF->getParent()->getFunctionList().insertAfter(OldF, NewF); 234f785676fSDimitry Andric } 235f785676fSDimitry Andric OldF->eraseFromParent(); 236f785676fSDimitry Andric } 237f785676fSDimitry Andric } 238f785676fSDimitry Andric 23959d1ed5bSDimitry Andric // This is only used in aliases that we created and we know they have a 24059d1ed5bSDimitry Andric // linear structure. 24159d1ed5bSDimitry Andric static const llvm::GlobalObject *getAliasedGlobal(const llvm::GlobalAlias &GA) { 24259d1ed5bSDimitry Andric llvm::SmallPtrSet<const llvm::GlobalAlias*, 4> Visited; 24359d1ed5bSDimitry Andric const llvm::Constant *C = &GA; 24459d1ed5bSDimitry Andric for (;;) { 24559d1ed5bSDimitry Andric C = C->stripPointerCasts(); 24659d1ed5bSDimitry Andric if (auto *GO = dyn_cast<llvm::GlobalObject>(C)) 24759d1ed5bSDimitry Andric return GO; 24859d1ed5bSDimitry Andric // stripPointerCasts will not walk over weak aliases. 24959d1ed5bSDimitry Andric auto *GA2 = dyn_cast<llvm::GlobalAlias>(C); 25059d1ed5bSDimitry Andric if (!GA2) 25159d1ed5bSDimitry Andric return nullptr; 25239d628a0SDimitry Andric if (!Visited.insert(GA2).second) 25359d1ed5bSDimitry Andric return nullptr; 25459d1ed5bSDimitry Andric C = GA2->getAliasee(); 25559d1ed5bSDimitry Andric } 25659d1ed5bSDimitry Andric } 25759d1ed5bSDimitry Andric 258f785676fSDimitry Andric void CodeGenModule::checkAliases() { 25959d1ed5bSDimitry Andric // Check if the constructed aliases are well formed. It is really unfortunate 26059d1ed5bSDimitry Andric // that we have to do this in CodeGen, but we only construct mangled names 26159d1ed5bSDimitry Andric // and aliases during codegen. 262f785676fSDimitry Andric bool Error = false; 26359d1ed5bSDimitry Andric DiagnosticsEngine &Diags = getDiags(); 264f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 265f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 266f785676fSDimitry Andric const GlobalDecl &GD = *I; 26759d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 268f785676fSDimitry Andric const AliasAttr *AA = D->getAttr<AliasAttr>(); 269f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 270f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 27159d1ed5bSDimitry Andric auto *Alias = cast<llvm::GlobalAlias>(Entry); 27259d1ed5bSDimitry Andric const llvm::GlobalValue *GV = getAliasedGlobal(*Alias); 27359d1ed5bSDimitry Andric if (!GV) { 274f785676fSDimitry Andric Error = true; 27559d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_cyclic_alias); 27659d1ed5bSDimitry Andric } else if (GV->isDeclaration()) { 277f785676fSDimitry Andric Error = true; 27859d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_alias_to_undefined); 27959d1ed5bSDimitry Andric } 28059d1ed5bSDimitry Andric 28159d1ed5bSDimitry Andric llvm::Constant *Aliasee = Alias->getAliasee(); 28259d1ed5bSDimitry Andric llvm::GlobalValue *AliaseeGV; 28359d1ed5bSDimitry Andric if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee)) 28459d1ed5bSDimitry Andric AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0)); 28559d1ed5bSDimitry Andric else 28659d1ed5bSDimitry Andric AliaseeGV = cast<llvm::GlobalValue>(Aliasee); 28759d1ed5bSDimitry Andric 28859d1ed5bSDimitry Andric if (const SectionAttr *SA = D->getAttr<SectionAttr>()) { 28959d1ed5bSDimitry Andric StringRef AliasSection = SA->getName(); 29059d1ed5bSDimitry Andric if (AliasSection != AliaseeGV->getSection()) 29159d1ed5bSDimitry Andric Diags.Report(SA->getLocation(), diag::warn_alias_with_section) 29259d1ed5bSDimitry Andric << AliasSection; 29359d1ed5bSDimitry Andric } 29459d1ed5bSDimitry Andric 29559d1ed5bSDimitry Andric // We have to handle alias to weak aliases in here. LLVM itself disallows 29659d1ed5bSDimitry Andric // this since the object semantics would not match the IL one. For 29759d1ed5bSDimitry Andric // compatibility with gcc we implement it by just pointing the alias 29859d1ed5bSDimitry Andric // to its aliasee's aliasee. We also warn, since the user is probably 29959d1ed5bSDimitry Andric // expecting the link to be weak. 30059d1ed5bSDimitry Andric if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) { 30159d1ed5bSDimitry Andric if (GA->mayBeOverridden()) { 30259d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias) 30359d1ed5bSDimitry Andric << GV->getName() << GA->getName(); 30459d1ed5bSDimitry Andric Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast( 30559d1ed5bSDimitry Andric GA->getAliasee(), Alias->getType()); 30659d1ed5bSDimitry Andric Alias->setAliasee(Aliasee); 30759d1ed5bSDimitry Andric } 308f785676fSDimitry Andric } 309f785676fSDimitry Andric } 310f785676fSDimitry Andric if (!Error) 311f785676fSDimitry Andric return; 312f785676fSDimitry Andric 313f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 314f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 315f785676fSDimitry Andric const GlobalDecl &GD = *I; 316f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 317f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 31859d1ed5bSDimitry Andric auto *Alias = cast<llvm::GlobalAlias>(Entry); 319f785676fSDimitry Andric Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType())); 320f785676fSDimitry Andric Alias->eraseFromParent(); 321f785676fSDimitry Andric } 322f785676fSDimitry Andric } 323f785676fSDimitry Andric 32459d1ed5bSDimitry Andric void CodeGenModule::clear() { 32559d1ed5bSDimitry Andric DeferredDeclsToEmit.clear(); 32633956c43SDimitry Andric if (OpenMPRuntime) 32733956c43SDimitry Andric OpenMPRuntime->clear(); 32859d1ed5bSDimitry Andric } 32959d1ed5bSDimitry Andric 33059d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags, 33159d1ed5bSDimitry Andric StringRef MainFile) { 33259d1ed5bSDimitry Andric if (!hasDiagnostics()) 33359d1ed5bSDimitry Andric return; 33459d1ed5bSDimitry Andric if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) { 33559d1ed5bSDimitry Andric if (MainFile.empty()) 33659d1ed5bSDimitry Andric MainFile = "<stdin>"; 33759d1ed5bSDimitry Andric Diags.Report(diag::warn_profile_data_unprofiled) << MainFile; 33859d1ed5bSDimitry Andric } else 33959d1ed5bSDimitry Andric Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing 34059d1ed5bSDimitry Andric << Mismatched; 34159d1ed5bSDimitry Andric } 34259d1ed5bSDimitry Andric 343f22ef01cSRoman Divacky void CodeGenModule::Release() { 344f22ef01cSRoman Divacky EmitDeferred(); 345f785676fSDimitry Andric applyReplacements(); 346f785676fSDimitry Andric checkAliases(); 347f22ef01cSRoman Divacky EmitCXXGlobalInitFunc(); 348f22ef01cSRoman Divacky EmitCXXGlobalDtorFunc(); 349284c1978SDimitry Andric EmitCXXThreadLocalInitFunc(); 3506122f3e6SDimitry Andric if (ObjCRuntime) 3516122f3e6SDimitry Andric if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction()) 352f22ef01cSRoman Divacky AddGlobalCtor(ObjCInitFunction); 35333956c43SDimitry Andric if (Context.getLangOpts().CUDA && !Context.getLangOpts().CUDAIsDevice && 35433956c43SDimitry Andric CUDARuntime) { 35533956c43SDimitry Andric if (llvm::Function *CudaCtorFunction = CUDARuntime->makeModuleCtorFunction()) 35633956c43SDimitry Andric AddGlobalCtor(CudaCtorFunction); 35733956c43SDimitry Andric if (llvm::Function *CudaDtorFunction = CUDARuntime->makeModuleDtorFunction()) 35833956c43SDimitry Andric AddGlobalDtor(CudaDtorFunction); 35933956c43SDimitry Andric } 36059d1ed5bSDimitry Andric if (PGOReader && PGOStats.hasDiagnostics()) 36159d1ed5bSDimitry Andric PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName); 362f22ef01cSRoman Divacky EmitCtorList(GlobalCtors, "llvm.global_ctors"); 363f22ef01cSRoman Divacky EmitCtorList(GlobalDtors, "llvm.global_dtors"); 3646122f3e6SDimitry Andric EmitGlobalAnnotations(); 365284c1978SDimitry Andric EmitStaticExternCAliases(); 36639d628a0SDimitry Andric EmitDeferredUnusedCoverageMappings(); 36739d628a0SDimitry Andric if (CoverageMapping) 36839d628a0SDimitry Andric CoverageMapping->emit(); 36959d1ed5bSDimitry Andric emitLLVMUsed(); 370ffd1746dSEd Schouten 371f785676fSDimitry Andric if (CodeGenOpts.Autolink && 372f785676fSDimitry Andric (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) { 373139f7f9bSDimitry Andric EmitModuleLinkOptions(); 374139f7f9bSDimitry Andric } 375f785676fSDimitry Andric if (CodeGenOpts.DwarfVersion) 376f785676fSDimitry Andric // We actually want the latest version when there are conflicts. 377f785676fSDimitry Andric // We can change from Warning to Latest if such mode is supported. 378f785676fSDimitry Andric getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version", 379f785676fSDimitry Andric CodeGenOpts.DwarfVersion); 380f785676fSDimitry Andric if (DebugInfo) 38159d1ed5bSDimitry Andric // We support a single version in the linked module. The LLVM 38259d1ed5bSDimitry Andric // parser will drop debug info with a different version number 38359d1ed5bSDimitry Andric // (and warn about it, too). 38459d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version", 385f785676fSDimitry Andric llvm::DEBUG_METADATA_VERSION); 386139f7f9bSDimitry Andric 38759d1ed5bSDimitry Andric // We need to record the widths of enums and wchar_t, so that we can generate 38859d1ed5bSDimitry Andric // the correct build attributes in the ARM backend. 38959d1ed5bSDimitry Andric llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch(); 39059d1ed5bSDimitry Andric if ( Arch == llvm::Triple::arm 39159d1ed5bSDimitry Andric || Arch == llvm::Triple::armeb 39259d1ed5bSDimitry Andric || Arch == llvm::Triple::thumb 39359d1ed5bSDimitry Andric || Arch == llvm::Triple::thumbeb) { 39459d1ed5bSDimitry Andric // Width of wchar_t in bytes 39559d1ed5bSDimitry Andric uint64_t WCharWidth = 39659d1ed5bSDimitry Andric Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity(); 39759d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth); 39859d1ed5bSDimitry Andric 39959d1ed5bSDimitry Andric // The minimum width of an enum in bytes 40059d1ed5bSDimitry Andric uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4; 40159d1ed5bSDimitry Andric getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth); 40259d1ed5bSDimitry Andric } 40359d1ed5bSDimitry Andric 40439d628a0SDimitry Andric if (uint32_t PLevel = Context.getLangOpts().PICLevel) { 40539d628a0SDimitry Andric llvm::PICLevel::Level PL = llvm::PICLevel::Default; 40639d628a0SDimitry Andric switch (PLevel) { 40739d628a0SDimitry Andric case 0: break; 40839d628a0SDimitry Andric case 1: PL = llvm::PICLevel::Small; break; 40939d628a0SDimitry Andric case 2: PL = llvm::PICLevel::Large; break; 41039d628a0SDimitry Andric default: llvm_unreachable("Invalid PIC Level"); 41139d628a0SDimitry Andric } 41239d628a0SDimitry Andric 41339d628a0SDimitry Andric getModule().setPICLevel(PL); 41439d628a0SDimitry Andric } 41539d628a0SDimitry Andric 4162754fe60SDimitry Andric SimplifyPersonality(); 4172754fe60SDimitry Andric 418ffd1746dSEd Schouten if (getCodeGenOpts().EmitDeclMetadata) 419ffd1746dSEd Schouten EmitDeclMetadata(); 420bd5abe19SDimitry Andric 421bd5abe19SDimitry Andric if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) 422bd5abe19SDimitry Andric EmitCoverageFile(); 4236122f3e6SDimitry Andric 4246122f3e6SDimitry Andric if (DebugInfo) 4256122f3e6SDimitry Andric DebugInfo->finalize(); 426f785676fSDimitry Andric 427f785676fSDimitry Andric EmitVersionIdentMetadata(); 42859d1ed5bSDimitry Andric 42959d1ed5bSDimitry Andric EmitTargetMetadata(); 430f22ef01cSRoman Divacky } 431f22ef01cSRoman Divacky 4323b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 4333b0f4066SDimitry Andric // Make sure that this type is translated. 4343b0f4066SDimitry Andric Types.UpdateCompletedType(TD); 4353b0f4066SDimitry Andric } 4363b0f4066SDimitry Andric 4372754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) { 4382754fe60SDimitry Andric if (!TBAA) 43959d1ed5bSDimitry Andric return nullptr; 4402754fe60SDimitry Andric return TBAA->getTBAAInfo(QTy); 4412754fe60SDimitry Andric } 4422754fe60SDimitry Andric 443dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() { 444dff0c46cSDimitry Andric if (!TBAA) 44559d1ed5bSDimitry Andric return nullptr; 446dff0c46cSDimitry Andric return TBAA->getTBAAInfoForVTablePtr(); 447dff0c46cSDimitry Andric } 448dff0c46cSDimitry Andric 4493861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) { 4503861d79fSDimitry Andric if (!TBAA) 45159d1ed5bSDimitry Andric return nullptr; 4523861d79fSDimitry Andric return TBAA->getTBAAStructInfo(QTy); 4533861d79fSDimitry Andric } 4543861d79fSDimitry Andric 455139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) { 456139f7f9bSDimitry Andric if (!TBAA) 45759d1ed5bSDimitry Andric return nullptr; 458139f7f9bSDimitry Andric return TBAA->getTBAAStructTypeInfo(QTy); 459139f7f9bSDimitry Andric } 460139f7f9bSDimitry Andric 461139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy, 462139f7f9bSDimitry Andric llvm::MDNode *AccessN, 463139f7f9bSDimitry Andric uint64_t O) { 464139f7f9bSDimitry Andric if (!TBAA) 46559d1ed5bSDimitry Andric return nullptr; 466139f7f9bSDimitry Andric return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O); 467139f7f9bSDimitry Andric } 468139f7f9bSDimitry Andric 469f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA 470f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format: 471f785676fSDimitry Andric /// base type, access type and offset. 472284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type. 4732754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst, 474284c1978SDimitry Andric llvm::MDNode *TBAAInfo, 475284c1978SDimitry Andric bool ConvertTypeToTag) { 476f785676fSDimitry Andric if (ConvertTypeToTag && TBAA) 477284c1978SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, 478284c1978SDimitry Andric TBAA->getTBAAScalarTagInfo(TBAAInfo)); 479284c1978SDimitry Andric else 4802754fe60SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo); 4812754fe60SDimitry Andric } 4822754fe60SDimitry Andric 48359d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) { 48459d1ed5bSDimitry Andric unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0"); 48559d1ed5bSDimitry Andric getDiags().Report(Context.getFullLoc(loc), diagID) << message; 486f22ef01cSRoman Divacky } 487f22ef01cSRoman Divacky 488f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 489f22ef01cSRoman Divacky /// specified stmt yet. 490f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) { 4916122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 492f22ef01cSRoman Divacky "cannot compile this %0 yet"); 493f22ef01cSRoman Divacky std::string Msg = Type; 494f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 495f22ef01cSRoman Divacky << Msg << S->getSourceRange(); 496f22ef01cSRoman Divacky } 497f22ef01cSRoman Divacky 498f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 499f22ef01cSRoman Divacky /// specified decl yet. 500f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) { 5016122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 502f22ef01cSRoman Divacky "cannot compile this %0 yet"); 503f22ef01cSRoman Divacky std::string Msg = Type; 504f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 505f22ef01cSRoman Divacky } 506f22ef01cSRoman Divacky 50717a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { 50817a519f9SDimitry Andric return llvm::ConstantInt::get(SizeTy, size.getQuantity()); 50917a519f9SDimitry Andric } 51017a519f9SDimitry Andric 511f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, 5122754fe60SDimitry Andric const NamedDecl *D) const { 513f22ef01cSRoman Divacky // Internal definitions always have default visibility. 514f22ef01cSRoman Divacky if (GV->hasLocalLinkage()) { 515f22ef01cSRoman Divacky GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 516f22ef01cSRoman Divacky return; 517f22ef01cSRoman Divacky } 518f22ef01cSRoman Divacky 5192754fe60SDimitry Andric // Set visibility for definitions. 520139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 521139f7f9bSDimitry Andric if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage()) 522139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 523f22ef01cSRoman Divacky } 524f22ef01cSRoman Divacky 5257ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { 5267ae0e2c9SDimitry Andric return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) 5277ae0e2c9SDimitry Andric .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) 5287ae0e2c9SDimitry Andric .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) 5297ae0e2c9SDimitry Andric .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) 5307ae0e2c9SDimitry Andric .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); 5317ae0e2c9SDimitry Andric } 5327ae0e2c9SDimitry Andric 5337ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( 5347ae0e2c9SDimitry Andric CodeGenOptions::TLSModel M) { 5357ae0e2c9SDimitry Andric switch (M) { 5367ae0e2c9SDimitry Andric case CodeGenOptions::GeneralDynamicTLSModel: 5377ae0e2c9SDimitry Andric return llvm::GlobalVariable::GeneralDynamicTLSModel; 5387ae0e2c9SDimitry Andric case CodeGenOptions::LocalDynamicTLSModel: 5397ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalDynamicTLSModel; 5407ae0e2c9SDimitry Andric case CodeGenOptions::InitialExecTLSModel: 5417ae0e2c9SDimitry Andric return llvm::GlobalVariable::InitialExecTLSModel; 5427ae0e2c9SDimitry Andric case CodeGenOptions::LocalExecTLSModel: 5437ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalExecTLSModel; 5447ae0e2c9SDimitry Andric } 5457ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model!"); 5467ae0e2c9SDimitry Andric } 5477ae0e2c9SDimitry Andric 54839d628a0SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const { 549284c1978SDimitry Andric assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); 5507ae0e2c9SDimitry Andric 55139d628a0SDimitry Andric llvm::GlobalValue::ThreadLocalMode TLM; 5523861d79fSDimitry Andric TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); 5537ae0e2c9SDimitry Andric 5547ae0e2c9SDimitry Andric // Override the TLS model if it is explicitly specified. 55559d1ed5bSDimitry Andric if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) { 5567ae0e2c9SDimitry Andric TLM = GetLLVMTLSModel(Attr->getModel()); 5577ae0e2c9SDimitry Andric } 5587ae0e2c9SDimitry Andric 5597ae0e2c9SDimitry Andric GV->setThreadLocalMode(TLM); 5607ae0e2c9SDimitry Andric } 5617ae0e2c9SDimitry Andric 5626122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) { 56359d1ed5bSDimitry Andric StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()]; 56459d1ed5bSDimitry Andric if (!FoundStr.empty()) 56559d1ed5bSDimitry Andric return FoundStr; 566f22ef01cSRoman Divacky 56759d1ed5bSDimitry Andric const auto *ND = cast<NamedDecl>(GD.getDecl()); 568dff0c46cSDimitry Andric SmallString<256> Buffer; 56959d1ed5bSDimitry Andric StringRef Str; 57059d1ed5bSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) { 5712754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer); 57259d1ed5bSDimitry Andric if (const auto *D = dyn_cast<CXXConstructorDecl>(ND)) 5732754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out); 57459d1ed5bSDimitry Andric else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND)) 5752754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out); 576ffd1746dSEd Schouten else 5772754fe60SDimitry Andric getCXXABI().getMangleContext().mangleName(ND, Out); 57859d1ed5bSDimitry Andric Str = Out.str(); 57959d1ed5bSDimitry Andric } else { 58059d1ed5bSDimitry Andric IdentifierInfo *II = ND->getIdentifier(); 58159d1ed5bSDimitry Andric assert(II && "Attempt to mangle unnamed decl."); 58259d1ed5bSDimitry Andric Str = II->getName(); 583ffd1746dSEd Schouten } 584ffd1746dSEd Schouten 58539d628a0SDimitry Andric // Keep the first result in the case of a mangling collision. 58639d628a0SDimitry Andric auto Result = Manglings.insert(std::make_pair(Str, GD)); 58739d628a0SDimitry Andric return FoundStr = Result.first->first(); 58859d1ed5bSDimitry Andric } 58959d1ed5bSDimitry Andric 59059d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD, 591ffd1746dSEd Schouten const BlockDecl *BD) { 5922754fe60SDimitry Andric MangleContext &MangleCtx = getCXXABI().getMangleContext(); 5932754fe60SDimitry Andric const Decl *D = GD.getDecl(); 59459d1ed5bSDimitry Andric 59559d1ed5bSDimitry Andric SmallString<256> Buffer; 59659d1ed5bSDimitry Andric llvm::raw_svector_ostream Out(Buffer); 59759d1ed5bSDimitry Andric if (!D) 5987ae0e2c9SDimitry Andric MangleCtx.mangleGlobalBlock(BD, 5997ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out); 60059d1ed5bSDimitry Andric else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D)) 6012754fe60SDimitry Andric MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out); 60259d1ed5bSDimitry Andric else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D)) 6032754fe60SDimitry Andric MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out); 6042754fe60SDimitry Andric else 6052754fe60SDimitry Andric MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out); 60659d1ed5bSDimitry Andric 60739d628a0SDimitry Andric auto Result = Manglings.insert(std::make_pair(Out.str(), BD)); 60839d628a0SDimitry Andric return Result.first->first(); 609f22ef01cSRoman Divacky } 610f22ef01cSRoman Divacky 6116122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) { 612f22ef01cSRoman Divacky return getModule().getNamedValue(Name); 613f22ef01cSRoman Divacky } 614f22ef01cSRoman Divacky 615f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before 616f22ef01cSRoman Divacky /// main() runs. 61759d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority, 61859d1ed5bSDimitry Andric llvm::Constant *AssociatedData) { 619f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 62059d1ed5bSDimitry Andric GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData)); 621f22ef01cSRoman Divacky } 622f22ef01cSRoman Divacky 623f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called 624f22ef01cSRoman Divacky /// when the module is unloaded. 625f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) { 626f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 62759d1ed5bSDimitry Andric GlobalDtors.push_back(Structor(Priority, Dtor, nullptr)); 628f22ef01cSRoman Divacky } 629f22ef01cSRoman Divacky 630f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 631f22ef01cSRoman Divacky // Ctor function type is void()*. 632bd5abe19SDimitry Andric llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); 633f22ef01cSRoman Divacky llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 634f22ef01cSRoman Divacky 63559d1ed5bSDimitry Andric // Get the type of a ctor entry, { i32, void ()*, i8* }. 63659d1ed5bSDimitry Andric llvm::StructType *CtorStructTy = llvm::StructType::get( 63739d628a0SDimitry Andric Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, nullptr); 638f22ef01cSRoman Divacky 639f22ef01cSRoman Divacky // Construct the constructor and destructor arrays. 640dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> Ctors; 641f22ef01cSRoman Divacky for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 642dff0c46cSDimitry Andric llvm::Constant *S[] = { 64359d1ed5bSDimitry Andric llvm::ConstantInt::get(Int32Ty, I->Priority, false), 64459d1ed5bSDimitry Andric llvm::ConstantExpr::getBitCast(I->Initializer, CtorPFTy), 64559d1ed5bSDimitry Andric (I->AssociatedData 64659d1ed5bSDimitry Andric ? llvm::ConstantExpr::getBitCast(I->AssociatedData, VoidPtrTy) 64759d1ed5bSDimitry Andric : llvm::Constant::getNullValue(VoidPtrTy)) 648dff0c46cSDimitry Andric }; 649f22ef01cSRoman Divacky Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 650f22ef01cSRoman Divacky } 651f22ef01cSRoman Divacky 652f22ef01cSRoman Divacky if (!Ctors.empty()) { 653f22ef01cSRoman Divacky llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 654f22ef01cSRoman Divacky new llvm::GlobalVariable(TheModule, AT, false, 655f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 656f22ef01cSRoman Divacky llvm::ConstantArray::get(AT, Ctors), 657f22ef01cSRoman Divacky GlobalName); 658f22ef01cSRoman Divacky } 659f22ef01cSRoman Divacky } 660f22ef01cSRoman Divacky 661f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes 662f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) { 66359d1ed5bSDimitry Andric const auto *D = cast<FunctionDecl>(GD.getDecl()); 664f785676fSDimitry Andric 665e580952dSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); 666f22ef01cSRoman Divacky 66759d1ed5bSDimitry Andric if (isa<CXXDestructorDecl>(D) && 66859d1ed5bSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 66959d1ed5bSDimitry Andric GD.getDtorType())) { 67059d1ed5bSDimitry Andric // Destructor variants in the Microsoft C++ ABI are always internal or 67159d1ed5bSDimitry Andric // linkonce_odr thunks emitted on an as-needed basis. 67259d1ed5bSDimitry Andric return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage 67359d1ed5bSDimitry Andric : llvm::GlobalValue::LinkOnceODRLinkage; 674f22ef01cSRoman Divacky } 675f22ef01cSRoman Divacky 67659d1ed5bSDimitry Andric return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false); 67759d1ed5bSDimitry Andric } 678f22ef01cSRoman Divacky 67959d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D, 68059d1ed5bSDimitry Andric llvm::Function *F) { 68159d1ed5bSDimitry Andric setNonAliasAttributes(D, F); 682f22ef01cSRoman Divacky } 683f22ef01cSRoman Divacky 684f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D, 685f22ef01cSRoman Divacky const CGFunctionInfo &Info, 686f22ef01cSRoman Divacky llvm::Function *F) { 687f22ef01cSRoman Divacky unsigned CallingConv; 688f22ef01cSRoman Divacky AttributeListType AttributeList; 689139f7f9bSDimitry Andric ConstructAttributeList(Info, D, AttributeList, CallingConv, false); 690139f7f9bSDimitry Andric F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList)); 691f22ef01cSRoman Divacky F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); 692f22ef01cSRoman Divacky } 693f22ef01cSRoman Divacky 6946122f3e6SDimitry Andric /// Determines whether the language options require us to model 6956122f3e6SDimitry Andric /// unwind exceptions. We treat -fexceptions as mandating this 6966122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions 6976122f3e6SDimitry Andric /// enabled. This means, for example, that C with -fexceptions 6986122f3e6SDimitry Andric /// enables this. 699dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) { 7006122f3e6SDimitry Andric // If exceptions are completely disabled, obviously this is false. 701dff0c46cSDimitry Andric if (!LangOpts.Exceptions) return false; 7026122f3e6SDimitry Andric 7036122f3e6SDimitry Andric // If C++ exceptions are enabled, this is true. 704dff0c46cSDimitry Andric if (LangOpts.CXXExceptions) return true; 7056122f3e6SDimitry Andric 7066122f3e6SDimitry Andric // If ObjC exceptions are enabled, this depends on the ABI. 707dff0c46cSDimitry Andric if (LangOpts.ObjCExceptions) { 7087ae0e2c9SDimitry Andric return LangOpts.ObjCRuntime.hasUnwindExceptions(); 7096122f3e6SDimitry Andric } 7106122f3e6SDimitry Andric 7116122f3e6SDimitry Andric return true; 7126122f3e6SDimitry Andric } 7136122f3e6SDimitry Andric 714f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, 715f22ef01cSRoman Divacky llvm::Function *F) { 716f785676fSDimitry Andric llvm::AttrBuilder B; 717f785676fSDimitry Andric 718bd5abe19SDimitry Andric if (CodeGenOpts.UnwindTables) 719f785676fSDimitry Andric B.addAttribute(llvm::Attribute::UWTable); 720bd5abe19SDimitry Andric 721dff0c46cSDimitry Andric if (!hasUnwindExceptions(LangOpts)) 722f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoUnwind); 723f22ef01cSRoman Divacky 7246122f3e6SDimitry Andric if (D->hasAttr<NakedAttr>()) { 7256122f3e6SDimitry Andric // Naked implies noinline: we should not be inlining such functions. 726f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Naked); 727f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 72859d1ed5bSDimitry Andric } else if (D->hasAttr<NoDuplicateAttr>()) { 72959d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::NoDuplicate); 730f785676fSDimitry Andric } else if (D->hasAttr<NoInlineAttr>()) { 731f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 73259d1ed5bSDimitry Andric } else if (D->hasAttr<AlwaysInlineAttr>() && 733f785676fSDimitry Andric !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex, 734f785676fSDimitry Andric llvm::Attribute::NoInline)) { 735f785676fSDimitry Andric // (noinline wins over always_inline, and we can't specify both in IR) 736f785676fSDimitry Andric B.addAttribute(llvm::Attribute::AlwaysInline); 7376122f3e6SDimitry Andric } 7382754fe60SDimitry Andric 739f785676fSDimitry Andric if (D->hasAttr<ColdAttr>()) { 74039d628a0SDimitry Andric if (!D->hasAttr<OptimizeNoneAttr>()) 741f785676fSDimitry Andric B.addAttribute(llvm::Attribute::OptimizeForSize); 742f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Cold); 743f785676fSDimitry Andric } 7443861d79fSDimitry Andric 7453861d79fSDimitry Andric if (D->hasAttr<MinSizeAttr>()) 746f785676fSDimitry Andric B.addAttribute(llvm::Attribute::MinSize); 747f22ef01cSRoman Divacky 7483861d79fSDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 749f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtect); 75059d1ed5bSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPStrong) 75159d1ed5bSDimitry Andric B.addAttribute(llvm::Attribute::StackProtectStrong); 7523861d79fSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 753f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtectReq); 7543861d79fSDimitry Andric 755f785676fSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 756f785676fSDimitry Andric llvm::AttributeSet::get( 757f785676fSDimitry Andric F->getContext(), llvm::AttributeSet::FunctionIndex, B)); 758f785676fSDimitry Andric 75939d628a0SDimitry Andric if (D->hasAttr<OptimizeNoneAttr>()) { 76039d628a0SDimitry Andric // OptimizeNone implies noinline; we should not be inlining such functions. 76139d628a0SDimitry Andric F->addFnAttr(llvm::Attribute::OptimizeNone); 76239d628a0SDimitry Andric F->addFnAttr(llvm::Attribute::NoInline); 76339d628a0SDimitry Andric 76439d628a0SDimitry Andric // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline. 76539d628a0SDimitry Andric assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) && 76639d628a0SDimitry Andric "OptimizeNone and OptimizeForSize on same function!"); 76739d628a0SDimitry Andric assert(!F->hasFnAttribute(llvm::Attribute::MinSize) && 76839d628a0SDimitry Andric "OptimizeNone and MinSize on same function!"); 76939d628a0SDimitry Andric assert(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) && 77039d628a0SDimitry Andric "OptimizeNone and AlwaysInline on same function!"); 77139d628a0SDimitry Andric 77239d628a0SDimitry Andric // Attribute 'inlinehint' has no effect on 'optnone' functions. 77339d628a0SDimitry Andric // Explicitly remove it from the set of function attributes. 77439d628a0SDimitry Andric F->removeFnAttr(llvm::Attribute::InlineHint); 77539d628a0SDimitry Andric } 77639d628a0SDimitry Andric 777f785676fSDimitry Andric if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D)) 778f785676fSDimitry Andric F->setUnnamedAddr(true); 77959d1ed5bSDimitry Andric else if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) 780f785676fSDimitry Andric if (MD->isVirtual()) 781f785676fSDimitry Andric F->setUnnamedAddr(true); 782f785676fSDimitry Andric 783e580952dSDimitry Andric unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); 784e580952dSDimitry Andric if (alignment) 785e580952dSDimitry Andric F->setAlignment(alignment); 786e580952dSDimitry Andric 787f22ef01cSRoman Divacky // C++ ABI requires 2-byte alignment for member functions. 788f22ef01cSRoman Divacky if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) 789f22ef01cSRoman Divacky F->setAlignment(2); 790f22ef01cSRoman Divacky } 791f22ef01cSRoman Divacky 792f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D, 793f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 79459d1ed5bSDimitry Andric if (const auto *ND = dyn_cast<NamedDecl>(D)) 7952754fe60SDimitry Andric setGlobalVisibility(GV, ND); 7962754fe60SDimitry Andric else 7972754fe60SDimitry Andric GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 798f22ef01cSRoman Divacky 799f22ef01cSRoman Divacky if (D->hasAttr<UsedAttr>()) 80059d1ed5bSDimitry Andric addUsedGlobal(GV); 80159d1ed5bSDimitry Andric } 80259d1ed5bSDimitry Andric 80339d628a0SDimitry Andric void CodeGenModule::setAliasAttributes(const Decl *D, 80439d628a0SDimitry Andric llvm::GlobalValue *GV) { 80539d628a0SDimitry Andric SetCommonAttributes(D, GV); 80639d628a0SDimitry Andric 80739d628a0SDimitry Andric // Process the dllexport attribute based on whether the original definition 80839d628a0SDimitry Andric // (not necessarily the aliasee) was exported. 80939d628a0SDimitry Andric if (D->hasAttr<DLLExportAttr>()) 81039d628a0SDimitry Andric GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 81139d628a0SDimitry Andric } 81239d628a0SDimitry Andric 81359d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D, 81459d1ed5bSDimitry Andric llvm::GlobalObject *GO) { 81559d1ed5bSDimitry Andric SetCommonAttributes(D, GO); 816f22ef01cSRoman Divacky 817f22ef01cSRoman Divacky if (const SectionAttr *SA = D->getAttr<SectionAttr>()) 81859d1ed5bSDimitry Andric GO->setSection(SA->getName()); 819f22ef01cSRoman Divacky 82059d1ed5bSDimitry Andric getTargetCodeGenInfo().SetTargetAttributes(D, GO, *this); 821f22ef01cSRoman Divacky } 822f22ef01cSRoman Divacky 823f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D, 824f22ef01cSRoman Divacky llvm::Function *F, 825f22ef01cSRoman Divacky const CGFunctionInfo &FI) { 826f22ef01cSRoman Divacky SetLLVMFunctionAttributes(D, FI, F); 827f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, F); 828f22ef01cSRoman Divacky 829f22ef01cSRoman Divacky F->setLinkage(llvm::Function::InternalLinkage); 830f22ef01cSRoman Divacky 83159d1ed5bSDimitry Andric setNonAliasAttributes(D, F); 83259d1ed5bSDimitry Andric } 83359d1ed5bSDimitry Andric 83459d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV, 83559d1ed5bSDimitry Andric const NamedDecl *ND) { 83659d1ed5bSDimitry Andric // Set linkage and visibility in case we never see a definition. 83759d1ed5bSDimitry Andric LinkageInfo LV = ND->getLinkageAndVisibility(); 83859d1ed5bSDimitry Andric if (LV.getLinkage() != ExternalLinkage) { 83959d1ed5bSDimitry Andric // Don't set internal linkage on declarations. 84059d1ed5bSDimitry Andric } else { 84159d1ed5bSDimitry Andric if (ND->hasAttr<DLLImportAttr>()) { 84259d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalLinkage); 84359d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 84459d1ed5bSDimitry Andric } else if (ND->hasAttr<DLLExportAttr>()) { 84559d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalLinkage); 84659d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 84759d1ed5bSDimitry Andric } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) { 84859d1ed5bSDimitry Andric // "extern_weak" is overloaded in LLVM; we probably should have 84959d1ed5bSDimitry Andric // separate linkage types for this. 85059d1ed5bSDimitry Andric GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); 85159d1ed5bSDimitry Andric } 85259d1ed5bSDimitry Andric 85359d1ed5bSDimitry Andric // Set visibility on a declaration only if it's explicit. 85459d1ed5bSDimitry Andric if (LV.isVisibilityExplicit()) 85559d1ed5bSDimitry Andric GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility())); 85659d1ed5bSDimitry Andric } 857f22ef01cSRoman Divacky } 858f22ef01cSRoman Divacky 85939d628a0SDimitry Andric void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, 86039d628a0SDimitry Andric bool IsIncompleteFunction, 86139d628a0SDimitry Andric bool IsThunk) { 86233956c43SDimitry Andric if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) { 8633b0f4066SDimitry Andric // If this is an intrinsic function, set the function's attributes 8643b0f4066SDimitry Andric // to the intrinsic's attributes. 86533956c43SDimitry Andric F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), IID)); 8663b0f4066SDimitry Andric return; 8673b0f4066SDimitry Andric } 8683b0f4066SDimitry Andric 86959d1ed5bSDimitry Andric const auto *FD = cast<FunctionDecl>(GD.getDecl()); 870f22ef01cSRoman Divacky 871f22ef01cSRoman Divacky if (!IsIncompleteFunction) 872dff0c46cSDimitry Andric SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F); 873f22ef01cSRoman Divacky 87459d1ed5bSDimitry Andric // Add the Returned attribute for "this", except for iOS 5 and earlier 87559d1ed5bSDimitry Andric // where substantial code, including the libstdc++ dylib, was compiled with 87659d1ed5bSDimitry Andric // GCC and does not actually return "this". 87739d628a0SDimitry Andric if (!IsThunk && getCXXABI().HasThisReturn(GD) && 87859d1ed5bSDimitry Andric !(getTarget().getTriple().isiOS() && 87959d1ed5bSDimitry Andric getTarget().getTriple().isOSVersionLT(6))) { 880f785676fSDimitry Andric assert(!F->arg_empty() && 881f785676fSDimitry Andric F->arg_begin()->getType() 882f785676fSDimitry Andric ->canLosslesslyBitCastTo(F->getReturnType()) && 883f785676fSDimitry Andric "unexpected this return"); 884f785676fSDimitry Andric F->addAttribute(1, llvm::Attribute::Returned); 885f785676fSDimitry Andric } 886f785676fSDimitry Andric 887f22ef01cSRoman Divacky // Only a few attributes are set on declarations; these may later be 888f22ef01cSRoman Divacky // overridden by a definition. 889f22ef01cSRoman Divacky 89059d1ed5bSDimitry Andric setLinkageAndVisibilityForGV(F, FD); 8912754fe60SDimitry Andric 89259d1ed5bSDimitry Andric if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) { 89359d1ed5bSDimitry Andric if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) { 89459d1ed5bSDimitry Andric // Don't dllexport/import destructor thunks. 89559d1ed5bSDimitry Andric F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); 8962754fe60SDimitry Andric } 897f22ef01cSRoman Divacky } 898f22ef01cSRoman Divacky 899f22ef01cSRoman Divacky if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) 900f22ef01cSRoman Divacky F->setSection(SA->getName()); 901f785676fSDimitry Andric 902f785676fSDimitry Andric // A replaceable global allocation function does not act like a builtin by 903f785676fSDimitry Andric // default, only if it is invoked by a new-expression or delete-expression. 904f785676fSDimitry Andric if (FD->isReplaceableGlobalAllocationFunction()) 905f785676fSDimitry Andric F->addAttribute(llvm::AttributeSet::FunctionIndex, 906f785676fSDimitry Andric llvm::Attribute::NoBuiltin); 907f22ef01cSRoman Divacky } 908f22ef01cSRoman Divacky 90959d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { 910f22ef01cSRoman Divacky assert(!GV->isDeclaration() && 911f22ef01cSRoman Divacky "Only globals with definition can force usage."); 912f22ef01cSRoman Divacky LLVMUsed.push_back(GV); 913f22ef01cSRoman Divacky } 914f22ef01cSRoman Divacky 91559d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) { 91659d1ed5bSDimitry Andric assert(!GV->isDeclaration() && 91759d1ed5bSDimitry Andric "Only globals with definition can force usage."); 91859d1ed5bSDimitry Andric LLVMCompilerUsed.push_back(GV); 91959d1ed5bSDimitry Andric } 92059d1ed5bSDimitry Andric 92159d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name, 92259d1ed5bSDimitry Andric std::vector<llvm::WeakVH> &List) { 923f22ef01cSRoman Divacky // Don't create llvm.used if there is no need. 92459d1ed5bSDimitry Andric if (List.empty()) 925f22ef01cSRoman Divacky return; 926f22ef01cSRoman Divacky 92759d1ed5bSDimitry Andric // Convert List to what ConstantArray needs. 928dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> UsedArray; 92959d1ed5bSDimitry Andric UsedArray.resize(List.size()); 93059d1ed5bSDimitry Andric for (unsigned i = 0, e = List.size(); i != e; ++i) { 931f22ef01cSRoman Divacky UsedArray[i] = 93244f7b0dcSDimitry Andric llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast( 93344f7b0dcSDimitry Andric cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy); 934f22ef01cSRoman Divacky } 935f22ef01cSRoman Divacky 936f22ef01cSRoman Divacky if (UsedArray.empty()) 937f22ef01cSRoman Divacky return; 93859d1ed5bSDimitry Andric llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size()); 939f22ef01cSRoman Divacky 94059d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 94159d1ed5bSDimitry Andric CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage, 94259d1ed5bSDimitry Andric llvm::ConstantArray::get(ATy, UsedArray), Name); 943f22ef01cSRoman Divacky 944f22ef01cSRoman Divacky GV->setSection("llvm.metadata"); 945f22ef01cSRoman Divacky } 946f22ef01cSRoman Divacky 94759d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() { 94859d1ed5bSDimitry Andric emitUsed(*this, "llvm.used", LLVMUsed); 94959d1ed5bSDimitry Andric emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed); 95059d1ed5bSDimitry Andric } 95159d1ed5bSDimitry Andric 952f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) { 95339d628a0SDimitry Andric auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opts); 954f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 955f785676fSDimitry Andric } 956f785676fSDimitry Andric 957f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) { 958f785676fSDimitry Andric llvm::SmallString<32> Opt; 959f785676fSDimitry Andric getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt); 96039d628a0SDimitry Andric auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 961f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 962f785676fSDimitry Andric } 963f785676fSDimitry Andric 964f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) { 965f785676fSDimitry Andric llvm::SmallString<24> Opt; 966f785676fSDimitry Andric getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt); 96739d628a0SDimitry Andric auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 968f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 969f785676fSDimitry Andric } 970f785676fSDimitry Andric 971139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules 972139f7f9bSDimitry Andric /// it depends on, using a postorder walk. 97339d628a0SDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, 97439d628a0SDimitry Andric SmallVectorImpl<llvm::Metadata *> &Metadata, 975139f7f9bSDimitry Andric llvm::SmallPtrSet<Module *, 16> &Visited) { 976139f7f9bSDimitry Andric // Import this module's parent. 97739d628a0SDimitry Andric if (Mod->Parent && Visited.insert(Mod->Parent).second) { 978f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited); 979139f7f9bSDimitry Andric } 980139f7f9bSDimitry Andric 981139f7f9bSDimitry Andric // Import this module's dependencies. 982139f7f9bSDimitry Andric for (unsigned I = Mod->Imports.size(); I > 0; --I) { 98339d628a0SDimitry Andric if (Visited.insert(Mod->Imports[I - 1]).second) 984f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited); 985139f7f9bSDimitry Andric } 986139f7f9bSDimitry Andric 987139f7f9bSDimitry Andric // Add linker options to link against the libraries/frameworks 988139f7f9bSDimitry Andric // described by this module. 989f785676fSDimitry Andric llvm::LLVMContext &Context = CGM.getLLVMContext(); 990139f7f9bSDimitry Andric for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) { 991f785676fSDimitry Andric // Link against a framework. Frameworks are currently Darwin only, so we 992f785676fSDimitry Andric // don't to ask TargetCodeGenInfo for the spelling of the linker option. 993139f7f9bSDimitry Andric if (Mod->LinkLibraries[I-1].IsFramework) { 99439d628a0SDimitry Andric llvm::Metadata *Args[2] = { 995139f7f9bSDimitry Andric llvm::MDString::get(Context, "-framework"), 99639d628a0SDimitry Andric llvm::MDString::get(Context, Mod->LinkLibraries[I - 1].Library)}; 997139f7f9bSDimitry Andric 998139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, Args)); 999139f7f9bSDimitry Andric continue; 1000139f7f9bSDimitry Andric } 1001139f7f9bSDimitry Andric 1002139f7f9bSDimitry Andric // Link against a library. 1003f785676fSDimitry Andric llvm::SmallString<24> Opt; 1004f785676fSDimitry Andric CGM.getTargetCodeGenInfo().getDependentLibraryOption( 1005f785676fSDimitry Andric Mod->LinkLibraries[I-1].Library, Opt); 100639d628a0SDimitry Andric auto *OptString = llvm::MDString::get(Context, Opt); 1007139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, OptString)); 1008139f7f9bSDimitry Andric } 1009139f7f9bSDimitry Andric } 1010139f7f9bSDimitry Andric 1011139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() { 1012139f7f9bSDimitry Andric // Collect the set of all of the modules we want to visit to emit link 1013139f7f9bSDimitry Andric // options, which is essentially the imported modules and all of their 1014139f7f9bSDimitry Andric // non-explicit child modules. 1015139f7f9bSDimitry Andric llvm::SetVector<clang::Module *> LinkModules; 1016139f7f9bSDimitry Andric llvm::SmallPtrSet<clang::Module *, 16> Visited; 1017139f7f9bSDimitry Andric SmallVector<clang::Module *, 16> Stack; 1018139f7f9bSDimitry Andric 1019139f7f9bSDimitry Andric // Seed the stack with imported modules. 1020139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(), 1021139f7f9bSDimitry Andric MEnd = ImportedModules.end(); 1022139f7f9bSDimitry Andric M != MEnd; ++M) { 102339d628a0SDimitry Andric if (Visited.insert(*M).second) 1024139f7f9bSDimitry Andric Stack.push_back(*M); 1025139f7f9bSDimitry Andric } 1026139f7f9bSDimitry Andric 1027139f7f9bSDimitry Andric // Find all of the modules to import, making a little effort to prune 1028139f7f9bSDimitry Andric // non-leaf modules. 1029139f7f9bSDimitry Andric while (!Stack.empty()) { 1030f785676fSDimitry Andric clang::Module *Mod = Stack.pop_back_val(); 1031139f7f9bSDimitry Andric 1032139f7f9bSDimitry Andric bool AnyChildren = false; 1033139f7f9bSDimitry Andric 1034139f7f9bSDimitry Andric // Visit the submodules of this module. 1035139f7f9bSDimitry Andric for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(), 1036139f7f9bSDimitry Andric SubEnd = Mod->submodule_end(); 1037139f7f9bSDimitry Andric Sub != SubEnd; ++Sub) { 1038139f7f9bSDimitry Andric // Skip explicit children; they need to be explicitly imported to be 1039139f7f9bSDimitry Andric // linked against. 1040139f7f9bSDimitry Andric if ((*Sub)->IsExplicit) 1041139f7f9bSDimitry Andric continue; 1042139f7f9bSDimitry Andric 104339d628a0SDimitry Andric if (Visited.insert(*Sub).second) { 1044139f7f9bSDimitry Andric Stack.push_back(*Sub); 1045139f7f9bSDimitry Andric AnyChildren = true; 1046139f7f9bSDimitry Andric } 1047139f7f9bSDimitry Andric } 1048139f7f9bSDimitry Andric 1049139f7f9bSDimitry Andric // We didn't find any children, so add this module to the list of 1050139f7f9bSDimitry Andric // modules to link against. 1051139f7f9bSDimitry Andric if (!AnyChildren) { 1052139f7f9bSDimitry Andric LinkModules.insert(Mod); 1053139f7f9bSDimitry Andric } 1054139f7f9bSDimitry Andric } 1055139f7f9bSDimitry Andric 1056139f7f9bSDimitry Andric // Add link options for all of the imported modules in reverse topological 1057f785676fSDimitry Andric // order. We don't do anything to try to order import link flags with respect 1058f785676fSDimitry Andric // to linker options inserted by things like #pragma comment(). 105939d628a0SDimitry Andric SmallVector<llvm::Metadata *, 16> MetadataArgs; 1060139f7f9bSDimitry Andric Visited.clear(); 1061139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(), 1062139f7f9bSDimitry Andric MEnd = LinkModules.end(); 1063139f7f9bSDimitry Andric M != MEnd; ++M) { 106439d628a0SDimitry Andric if (Visited.insert(*M).second) 1065f785676fSDimitry Andric addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited); 1066139f7f9bSDimitry Andric } 1067139f7f9bSDimitry Andric std::reverse(MetadataArgs.begin(), MetadataArgs.end()); 1068f785676fSDimitry Andric LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end()); 1069139f7f9bSDimitry Andric 1070139f7f9bSDimitry Andric // Add the linker options metadata flag. 1071139f7f9bSDimitry Andric getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options", 1072f785676fSDimitry Andric llvm::MDNode::get(getLLVMContext(), 1073f785676fSDimitry Andric LinkerOptionsMetadata)); 1074139f7f9bSDimitry Andric } 1075139f7f9bSDimitry Andric 1076f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() { 1077f22ef01cSRoman Divacky // Emit code for any potentially referenced deferred decls. Since a 1078f22ef01cSRoman Divacky // previously unused static decl may become used during the generation of code 1079f22ef01cSRoman Divacky // for a static function, iterate until no changes are made. 1080f22ef01cSRoman Divacky 1081f22ef01cSRoman Divacky if (!DeferredVTables.empty()) { 1082139f7f9bSDimitry Andric EmitDeferredVTables(); 1083139f7f9bSDimitry Andric 1084139f7f9bSDimitry Andric // Emitting a v-table doesn't directly cause more v-tables to 1085139f7f9bSDimitry Andric // become deferred, although it can cause functions to be 1086139f7f9bSDimitry Andric // emitted that then need those v-tables. 1087139f7f9bSDimitry Andric assert(DeferredVTables.empty()); 1088f22ef01cSRoman Divacky } 1089f22ef01cSRoman Divacky 1090139f7f9bSDimitry Andric // Stop if we're out of both deferred v-tables and deferred declarations. 109133956c43SDimitry Andric if (DeferredDeclsToEmit.empty()) 109233956c43SDimitry Andric return; 1093139f7f9bSDimitry Andric 109433956c43SDimitry Andric // Grab the list of decls to emit. If EmitGlobalDefinition schedules more 109533956c43SDimitry Andric // work, it will not interfere with this. 109633956c43SDimitry Andric std::vector<DeferredGlobal> CurDeclsToEmit; 109733956c43SDimitry Andric CurDeclsToEmit.swap(DeferredDeclsToEmit); 109833956c43SDimitry Andric 109933956c43SDimitry Andric for (DeferredGlobal &G : CurDeclsToEmit) { 110059d1ed5bSDimitry Andric GlobalDecl D = G.GD; 110159d1ed5bSDimitry Andric llvm::GlobalValue *GV = G.GV; 110233956c43SDimitry Andric G.GV = nullptr; 1103f22ef01cSRoman Divacky 110439d628a0SDimitry Andric assert(!GV || GV == GetGlobalValue(getMangledName(D))); 110539d628a0SDimitry Andric if (!GV) 110639d628a0SDimitry Andric GV = GetGlobalValue(getMangledName(D)); 110739d628a0SDimitry Andric 1108f22ef01cSRoman Divacky // Check to see if we've already emitted this. This is necessary 1109f22ef01cSRoman Divacky // for a couple of reasons: first, decls can end up in the 1110f22ef01cSRoman Divacky // deferred-decls queue multiple times, and second, decls can end 1111f22ef01cSRoman Divacky // up with definitions in unusual ways (e.g. by an extern inline 1112f22ef01cSRoman Divacky // function acquiring a strong function redefinition). Just 1113f22ef01cSRoman Divacky // ignore these cases. 111439d628a0SDimitry Andric if (GV && !GV->isDeclaration()) 1115f22ef01cSRoman Divacky continue; 1116f22ef01cSRoman Divacky 1117f22ef01cSRoman Divacky // Otherwise, emit the definition and move on to the next one. 111859d1ed5bSDimitry Andric EmitGlobalDefinition(D, GV); 111933956c43SDimitry Andric 112033956c43SDimitry Andric // If we found out that we need to emit more decls, do that recursively. 112133956c43SDimitry Andric // This has the advantage that the decls are emitted in a DFS and related 112233956c43SDimitry Andric // ones are close together, which is convenient for testing. 112333956c43SDimitry Andric if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) { 112433956c43SDimitry Andric EmitDeferred(); 112533956c43SDimitry Andric assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty()); 112633956c43SDimitry Andric } 1127f22ef01cSRoman Divacky } 1128f22ef01cSRoman Divacky } 1129f22ef01cSRoman Divacky 11306122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() { 11316122f3e6SDimitry Andric if (Annotations.empty()) 11326122f3e6SDimitry Andric return; 11336122f3e6SDimitry Andric 11346122f3e6SDimitry Andric // Create a new global variable for the ConstantStruct in the Module. 11356122f3e6SDimitry Andric llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get( 11366122f3e6SDimitry Andric Annotations[0]->getType(), Annotations.size()), Annotations); 113759d1ed5bSDimitry Andric auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false, 113859d1ed5bSDimitry Andric llvm::GlobalValue::AppendingLinkage, 113959d1ed5bSDimitry Andric Array, "llvm.global.annotations"); 11406122f3e6SDimitry Andric gv->setSection(AnnotationSection); 11416122f3e6SDimitry Andric } 11426122f3e6SDimitry Andric 1143139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) { 1144f785676fSDimitry Andric llvm::Constant *&AStr = AnnotationStrings[Str]; 1145f785676fSDimitry Andric if (AStr) 1146f785676fSDimitry Andric return AStr; 11476122f3e6SDimitry Andric 11486122f3e6SDimitry Andric // Not found yet, create a new global. 1149dff0c46cSDimitry Andric llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str); 115059d1ed5bSDimitry Andric auto *gv = 115159d1ed5bSDimitry Andric new llvm::GlobalVariable(getModule(), s->getType(), true, 115259d1ed5bSDimitry Andric llvm::GlobalValue::PrivateLinkage, s, ".str"); 11536122f3e6SDimitry Andric gv->setSection(AnnotationSection); 11546122f3e6SDimitry Andric gv->setUnnamedAddr(true); 1155f785676fSDimitry Andric AStr = gv; 11566122f3e6SDimitry Andric return gv; 11576122f3e6SDimitry Andric } 11586122f3e6SDimitry Andric 11596122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) { 11606122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 11616122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(Loc); 11626122f3e6SDimitry Andric if (PLoc.isValid()) 11636122f3e6SDimitry Andric return EmitAnnotationString(PLoc.getFilename()); 11646122f3e6SDimitry Andric return EmitAnnotationString(SM.getBufferName(Loc)); 11656122f3e6SDimitry Andric } 11666122f3e6SDimitry Andric 11676122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { 11686122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 11696122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(L); 11706122f3e6SDimitry Andric unsigned LineNo = PLoc.isValid() ? PLoc.getLine() : 11716122f3e6SDimitry Andric SM.getExpansionLineNumber(L); 11726122f3e6SDimitry Andric return llvm::ConstantInt::get(Int32Ty, LineNo); 11736122f3e6SDimitry Andric } 11746122f3e6SDimitry Andric 1175f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 1176f22ef01cSRoman Divacky const AnnotateAttr *AA, 11776122f3e6SDimitry Andric SourceLocation L) { 11786122f3e6SDimitry Andric // Get the globals for file name, annotation, and the line number. 11796122f3e6SDimitry Andric llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), 11806122f3e6SDimitry Andric *UnitGV = EmitAnnotationUnit(L), 11816122f3e6SDimitry Andric *LineNoCst = EmitAnnotationLineNo(L); 1182f22ef01cSRoman Divacky 1183f22ef01cSRoman Divacky // Create the ConstantStruct for the global annotation. 1184f22ef01cSRoman Divacky llvm::Constant *Fields[4] = { 11856122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), 11866122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), 11876122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), 11886122f3e6SDimitry Andric LineNoCst 1189f22ef01cSRoman Divacky }; 119017a519f9SDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 1191f22ef01cSRoman Divacky } 1192f22ef01cSRoman Divacky 11936122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D, 11946122f3e6SDimitry Andric llvm::GlobalValue *GV) { 11956122f3e6SDimitry Andric assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute"); 11966122f3e6SDimitry Andric // Get the struct elements for these annotations. 119759d1ed5bSDimitry Andric for (const auto *I : D->specific_attrs<AnnotateAttr>()) 119859d1ed5bSDimitry Andric Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation())); 11996122f3e6SDimitry Andric } 12006122f3e6SDimitry Andric 120139d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::Function *Fn, 120239d628a0SDimitry Andric SourceLocation Loc) const { 120339d628a0SDimitry Andric const auto &SanitizerBL = getContext().getSanitizerBlacklist(); 120439d628a0SDimitry Andric // Blacklist by function name. 120539d628a0SDimitry Andric if (SanitizerBL.isBlacklistedFunction(Fn->getName())) 120639d628a0SDimitry Andric return true; 120739d628a0SDimitry Andric // Blacklist by location. 120839d628a0SDimitry Andric if (!Loc.isInvalid()) 120939d628a0SDimitry Andric return SanitizerBL.isBlacklistedLocation(Loc); 121039d628a0SDimitry Andric // If location is unknown, this may be a compiler-generated function. Assume 121139d628a0SDimitry Andric // it's located in the main file. 121239d628a0SDimitry Andric auto &SM = Context.getSourceManager(); 121339d628a0SDimitry Andric if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 121439d628a0SDimitry Andric return SanitizerBL.isBlacklistedFile(MainFile->getName()); 121539d628a0SDimitry Andric } 121639d628a0SDimitry Andric return false; 121739d628a0SDimitry Andric } 121839d628a0SDimitry Andric 121939d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::GlobalVariable *GV, 122039d628a0SDimitry Andric SourceLocation Loc, QualType Ty, 122139d628a0SDimitry Andric StringRef Category) const { 122239d628a0SDimitry Andric // For now globals can be blacklisted only in ASan. 122339d628a0SDimitry Andric if (!LangOpts.Sanitize.has(SanitizerKind::Address)) 122439d628a0SDimitry Andric return false; 122539d628a0SDimitry Andric const auto &SanitizerBL = getContext().getSanitizerBlacklist(); 122639d628a0SDimitry Andric if (SanitizerBL.isBlacklistedGlobal(GV->getName(), Category)) 122739d628a0SDimitry Andric return true; 122839d628a0SDimitry Andric if (SanitizerBL.isBlacklistedLocation(Loc, Category)) 122939d628a0SDimitry Andric return true; 123039d628a0SDimitry Andric // Check global type. 123139d628a0SDimitry Andric if (!Ty.isNull()) { 123239d628a0SDimitry Andric // Drill down the array types: if global variable of a fixed type is 123339d628a0SDimitry Andric // blacklisted, we also don't instrument arrays of them. 123439d628a0SDimitry Andric while (auto AT = dyn_cast<ArrayType>(Ty.getTypePtr())) 123539d628a0SDimitry Andric Ty = AT->getElementType(); 123639d628a0SDimitry Andric Ty = Ty.getCanonicalType().getUnqualifiedType(); 123739d628a0SDimitry Andric // We allow to blacklist only record types (classes, structs etc.) 123839d628a0SDimitry Andric if (Ty->isRecordType()) { 123939d628a0SDimitry Andric std::string TypeStr = Ty.getAsString(getContext().getPrintingPolicy()); 124039d628a0SDimitry Andric if (SanitizerBL.isBlacklistedType(TypeStr, Category)) 124139d628a0SDimitry Andric return true; 124239d628a0SDimitry Andric } 124339d628a0SDimitry Andric } 124439d628a0SDimitry Andric return false; 124539d628a0SDimitry Andric } 124639d628a0SDimitry Andric 124739d628a0SDimitry Andric bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) { 1248e580952dSDimitry Andric // Never defer when EmitAllDecls is specified. 1249dff0c46cSDimitry Andric if (LangOpts.EmitAllDecls) 125039d628a0SDimitry Andric return true; 125139d628a0SDimitry Andric 125239d628a0SDimitry Andric return getContext().DeclMustBeEmitted(Global); 125339d628a0SDimitry Andric } 125439d628a0SDimitry Andric 125539d628a0SDimitry Andric bool CodeGenModule::MayBeEmittedEagerly(const ValueDecl *Global) { 125639d628a0SDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(Global)) 125739d628a0SDimitry Andric if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation) 125839d628a0SDimitry Andric // Implicit template instantiations may change linkage if they are later 125939d628a0SDimitry Andric // explicitly instantiated, so they should not be emitted eagerly. 1260f22ef01cSRoman Divacky return false; 1261f22ef01cSRoman Divacky 126239d628a0SDimitry Andric return true; 1263f22ef01cSRoman Divacky } 1264f22ef01cSRoman Divacky 12653861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( 12663861d79fSDimitry Andric const CXXUuidofExpr* E) { 12673861d79fSDimitry Andric // Sema has verified that IIDSource has a __declspec(uuid()), and that its 12683861d79fSDimitry Andric // well-formed. 1269f785676fSDimitry Andric StringRef Uuid = E->getUuidAsStringRef(Context); 1270f785676fSDimitry Andric std::string Name = "_GUID_" + Uuid.lower(); 1271f785676fSDimitry Andric std::replace(Name.begin(), Name.end(), '-', '_'); 12723861d79fSDimitry Andric 12733861d79fSDimitry Andric // Look for an existing global. 12743861d79fSDimitry Andric if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name)) 12753861d79fSDimitry Andric return GV; 12763861d79fSDimitry Andric 127739d628a0SDimitry Andric llvm::Constant *Init = EmitUuidofInitializer(Uuid); 12783861d79fSDimitry Andric assert(Init && "failed to initialize as constant"); 12793861d79fSDimitry Andric 128059d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 1281f785676fSDimitry Andric getModule(), Init->getType(), 1282f785676fSDimitry Andric /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name); 128333956c43SDimitry Andric if (supportsCOMDAT()) 128433956c43SDimitry Andric GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); 12853861d79fSDimitry Andric return GV; 12863861d79fSDimitry Andric } 12873861d79fSDimitry Andric 1288f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { 1289f22ef01cSRoman Divacky const AliasAttr *AA = VD->getAttr<AliasAttr>(); 1290f22ef01cSRoman Divacky assert(AA && "No alias?"); 1291f22ef01cSRoman Divacky 12926122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); 1293f22ef01cSRoman Divacky 1294f22ef01cSRoman Divacky // See if there is already something with the target's name in the module. 1295f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); 12963861d79fSDimitry Andric if (Entry) { 12973861d79fSDimitry Andric unsigned AS = getContext().getTargetAddressSpace(VD->getType()); 12983861d79fSDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); 12993861d79fSDimitry Andric } 1300f22ef01cSRoman Divacky 1301f22ef01cSRoman Divacky llvm::Constant *Aliasee; 1302f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 13033861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, 13043861d79fSDimitry Andric GlobalDecl(cast<FunctionDecl>(VD)), 13052754fe60SDimitry Andric /*ForVTable=*/false); 1306f22ef01cSRoman Divacky else 1307f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 130859d1ed5bSDimitry Andric llvm::PointerType::getUnqual(DeclTy), 130959d1ed5bSDimitry Andric nullptr); 13103861d79fSDimitry Andric 131159d1ed5bSDimitry Andric auto *F = cast<llvm::GlobalValue>(Aliasee); 1312f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 1313f22ef01cSRoman Divacky WeakRefReferences.insert(F); 1314f22ef01cSRoman Divacky 1315f22ef01cSRoman Divacky return Aliasee; 1316f22ef01cSRoman Divacky } 1317f22ef01cSRoman Divacky 1318f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) { 131959d1ed5bSDimitry Andric const auto *Global = cast<ValueDecl>(GD.getDecl()); 1320f22ef01cSRoman Divacky 1321f22ef01cSRoman Divacky // Weak references don't produce any output by themselves. 1322f22ef01cSRoman Divacky if (Global->hasAttr<WeakRefAttr>()) 1323f22ef01cSRoman Divacky return; 1324f22ef01cSRoman Divacky 1325f22ef01cSRoman Divacky // If this is an alias definition (which otherwise looks like a declaration) 1326f22ef01cSRoman Divacky // emit it now. 1327f22ef01cSRoman Divacky if (Global->hasAttr<AliasAttr>()) 1328f22ef01cSRoman Divacky return EmitAliasDefinition(GD); 1329f22ef01cSRoman Divacky 13306122f3e6SDimitry Andric // If this is CUDA, be selective about which declarations we emit. 1331dff0c46cSDimitry Andric if (LangOpts.CUDA) { 133233956c43SDimitry Andric if (LangOpts.CUDAIsDevice) { 13336122f3e6SDimitry Andric if (!Global->hasAttr<CUDADeviceAttr>() && 13346122f3e6SDimitry Andric !Global->hasAttr<CUDAGlobalAttr>() && 13356122f3e6SDimitry Andric !Global->hasAttr<CUDAConstantAttr>() && 13366122f3e6SDimitry Andric !Global->hasAttr<CUDASharedAttr>()) 13376122f3e6SDimitry Andric return; 13386122f3e6SDimitry Andric } else { 13396122f3e6SDimitry Andric if (!Global->hasAttr<CUDAHostAttr>() && ( 13406122f3e6SDimitry Andric Global->hasAttr<CUDADeviceAttr>() || 13416122f3e6SDimitry Andric Global->hasAttr<CUDAConstantAttr>() || 13426122f3e6SDimitry Andric Global->hasAttr<CUDASharedAttr>())) 13436122f3e6SDimitry Andric return; 1344e580952dSDimitry Andric } 1345e580952dSDimitry Andric } 1346e580952dSDimitry Andric 13476122f3e6SDimitry Andric // Ignore declarations, they will be emitted on their first use. 134859d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(Global)) { 1349f22ef01cSRoman Divacky // Forward declarations are emitted lazily on first use. 13506122f3e6SDimitry Andric if (!FD->doesThisDeclarationHaveABody()) { 13516122f3e6SDimitry Andric if (!FD->doesDeclarationForceExternallyVisibleDefinition()) 1352f22ef01cSRoman Divacky return; 13536122f3e6SDimitry Andric 13546122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 135559d1ed5bSDimitry Andric 135659d1ed5bSDimitry Andric // Compute the function info and LLVM type. 135759d1ed5bSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 135859d1ed5bSDimitry Andric llvm::Type *Ty = getTypes().GetFunctionType(FI); 135959d1ed5bSDimitry Andric 136059d1ed5bSDimitry Andric GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false, 136159d1ed5bSDimitry Andric /*DontDefer=*/false); 13626122f3e6SDimitry Andric return; 13636122f3e6SDimitry Andric } 1364f22ef01cSRoman Divacky } else { 136559d1ed5bSDimitry Andric const auto *VD = cast<VarDecl>(Global); 1366f22ef01cSRoman Divacky assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 1367f22ef01cSRoman Divacky 136859d1ed5bSDimitry Andric if (VD->isThisDeclarationADefinition() != VarDecl::Definition && 136959d1ed5bSDimitry Andric !Context.isMSStaticDataMemberInlineDefinition(VD)) 1370f22ef01cSRoman Divacky return; 1371f22ef01cSRoman Divacky } 1372f22ef01cSRoman Divacky 137339d628a0SDimitry Andric // Defer code generation to first use when possible, e.g. if this is an inline 137439d628a0SDimitry Andric // function. If the global must always be emitted, do it eagerly if possible 137539d628a0SDimitry Andric // to benefit from cache locality. 137639d628a0SDimitry Andric if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) { 1377f22ef01cSRoman Divacky // Emit the definition if it can't be deferred. 1378f22ef01cSRoman Divacky EmitGlobalDefinition(GD); 1379f22ef01cSRoman Divacky return; 1380f22ef01cSRoman Divacky } 1381f22ef01cSRoman Divacky 1382e580952dSDimitry Andric // If we're deferring emission of a C++ variable with an 1383e580952dSDimitry Andric // initializer, remember the order in which it appeared in the file. 1384dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) && 1385e580952dSDimitry Andric cast<VarDecl>(Global)->hasInit()) { 1386e580952dSDimitry Andric DelayedCXXInitPosition[Global] = CXXGlobalInits.size(); 138759d1ed5bSDimitry Andric CXXGlobalInits.push_back(nullptr); 1388e580952dSDimitry Andric } 1389e580952dSDimitry Andric 13906122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 139139d628a0SDimitry Andric if (llvm::GlobalValue *GV = GetGlobalValue(MangledName)) { 139239d628a0SDimitry Andric // The value has already been used and should therefore be emitted. 139359d1ed5bSDimitry Andric addDeferredDeclToEmit(GV, GD); 139439d628a0SDimitry Andric } else if (MustBeEmitted(Global)) { 139539d628a0SDimitry Andric // The value must be emitted, but cannot be emitted eagerly. 139639d628a0SDimitry Andric assert(!MayBeEmittedEagerly(Global)); 139739d628a0SDimitry Andric addDeferredDeclToEmit(/*GV=*/nullptr, GD); 139839d628a0SDimitry Andric } else { 1399f22ef01cSRoman Divacky // Otherwise, remember that we saw a deferred decl with this name. The 1400f22ef01cSRoman Divacky // first use of the mangled name will cause it to move into 1401f22ef01cSRoman Divacky // DeferredDeclsToEmit. 1402f22ef01cSRoman Divacky DeferredDecls[MangledName] = GD; 1403f22ef01cSRoman Divacky } 1404f22ef01cSRoman Divacky } 1405f22ef01cSRoman Divacky 1406f8254f43SDimitry Andric namespace { 1407f8254f43SDimitry Andric struct FunctionIsDirectlyRecursive : 1408f8254f43SDimitry Andric public RecursiveASTVisitor<FunctionIsDirectlyRecursive> { 1409f8254f43SDimitry Andric const StringRef Name; 1410dff0c46cSDimitry Andric const Builtin::Context &BI; 1411f8254f43SDimitry Andric bool Result; 1412dff0c46cSDimitry Andric FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) : 1413dff0c46cSDimitry Andric Name(N), BI(C), Result(false) { 1414f8254f43SDimitry Andric } 1415f8254f43SDimitry Andric typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base; 1416f8254f43SDimitry Andric 1417f8254f43SDimitry Andric bool TraverseCallExpr(CallExpr *E) { 1418dff0c46cSDimitry Andric const FunctionDecl *FD = E->getDirectCallee(); 1419dff0c46cSDimitry Andric if (!FD) 1420f8254f43SDimitry Andric return true; 1421dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1422dff0c46cSDimitry Andric if (Attr && Name == Attr->getLabel()) { 1423dff0c46cSDimitry Andric Result = true; 1424dff0c46cSDimitry Andric return false; 1425dff0c46cSDimitry Andric } 1426dff0c46cSDimitry Andric unsigned BuiltinID = FD->getBuiltinID(); 1427dff0c46cSDimitry Andric if (!BuiltinID) 1428f8254f43SDimitry Andric return true; 1429dff0c46cSDimitry Andric StringRef BuiltinName = BI.GetName(BuiltinID); 1430dff0c46cSDimitry Andric if (BuiltinName.startswith("__builtin_") && 1431dff0c46cSDimitry Andric Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) { 1432f8254f43SDimitry Andric Result = true; 1433f8254f43SDimitry Andric return false; 1434f8254f43SDimitry Andric } 1435f8254f43SDimitry Andric return true; 1436f8254f43SDimitry Andric } 1437f8254f43SDimitry Andric }; 1438f8254f43SDimitry Andric } 1439f8254f43SDimitry Andric 1440dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another 1441dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin, 1442dff0c46cSDimitry Andric // ends up pointing to itself. 1443f8254f43SDimitry Andric bool 1444dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { 1445dff0c46cSDimitry Andric StringRef Name; 1446dff0c46cSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) { 1447dff0c46cSDimitry Andric // asm labels are a special kind of mangling we have to support. 1448dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1449dff0c46cSDimitry Andric if (!Attr) 1450f8254f43SDimitry Andric return false; 1451dff0c46cSDimitry Andric Name = Attr->getLabel(); 1452dff0c46cSDimitry Andric } else { 1453dff0c46cSDimitry Andric Name = FD->getName(); 1454dff0c46cSDimitry Andric } 1455f8254f43SDimitry Andric 1456dff0c46cSDimitry Andric FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); 1457dff0c46cSDimitry Andric Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); 1458f8254f43SDimitry Andric return Walker.Result; 1459f8254f43SDimitry Andric } 1460f8254f43SDimitry Andric 1461f8254f43SDimitry Andric bool 1462f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) { 1463f785676fSDimitry Andric if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage) 1464f8254f43SDimitry Andric return true; 146559d1ed5bSDimitry Andric const auto *F = cast<FunctionDecl>(GD.getDecl()); 146659d1ed5bSDimitry Andric if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>()) 1467f8254f43SDimitry Andric return false; 1468f8254f43SDimitry Andric // PR9614. Avoid cases where the source code is lying to us. An available 1469f8254f43SDimitry Andric // externally function should have an equivalent function somewhere else, 1470f8254f43SDimitry Andric // but a function that calls itself is clearly not equivalent to the real 1471f8254f43SDimitry Andric // implementation. 1472f8254f43SDimitry Andric // This happens in glibc's btowc and in some configure checks. 1473dff0c46cSDimitry Andric return !isTriviallyRecursive(F); 1474f8254f43SDimitry Andric } 1475f8254f43SDimitry Andric 1476f785676fSDimitry Andric /// If the type for the method's class was generated by 1477f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a 1478f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart() 1479f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need 1480f785676fSDimitry Andric /// to construct the complete type prior to emitting the method. 1481f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) { 1482f785676fSDimitry Andric if (!D->isInstance()) 1483f785676fSDimitry Andric return; 1484f785676fSDimitry Andric 1485f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 1486f785676fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) { 148759d1ed5bSDimitry Andric const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext())); 1488f785676fSDimitry Andric DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation()); 1489f785676fSDimitry Andric } 1490f785676fSDimitry Andric } 1491f785676fSDimitry Andric 149259d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) { 149359d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 1494f22ef01cSRoman Divacky 1495f22ef01cSRoman Divacky PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(), 1496f22ef01cSRoman Divacky Context.getSourceManager(), 1497f22ef01cSRoman Divacky "Generating code for declaration"); 1498f22ef01cSRoman Divacky 1499f785676fSDimitry Andric if (isa<FunctionDecl>(D)) { 1500ffd1746dSEd Schouten // At -O0, don't generate IR for functions with available_externally 1501ffd1746dSEd Schouten // linkage. 1502f785676fSDimitry Andric if (!shouldEmitFunction(GD)) 1503ffd1746dSEd Schouten return; 1504ffd1746dSEd Schouten 150559d1ed5bSDimitry Andric if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) { 1506f785676fSDimitry Andric CompleteDIClassType(Method); 1507bd5abe19SDimitry Andric // Make sure to emit the definition(s) before we emit the thunks. 1508bd5abe19SDimitry Andric // This is necessary for the generation of certain thunks. 150959d1ed5bSDimitry Andric if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method)) 151039d628a0SDimitry Andric ABI->emitCXXStructor(CD, getFromCtorType(GD.getCtorType())); 151159d1ed5bSDimitry Andric else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method)) 151239d628a0SDimitry Andric ABI->emitCXXStructor(DD, getFromDtorType(GD.getDtorType())); 1513bd5abe19SDimitry Andric else 151459d1ed5bSDimitry Andric EmitGlobalFunctionDefinition(GD, GV); 1515bd5abe19SDimitry Andric 1516f22ef01cSRoman Divacky if (Method->isVirtual()) 1517f22ef01cSRoman Divacky getVTables().EmitThunks(GD); 1518f22ef01cSRoman Divacky 1519bd5abe19SDimitry Andric return; 1520ffd1746dSEd Schouten } 1521f22ef01cSRoman Divacky 152259d1ed5bSDimitry Andric return EmitGlobalFunctionDefinition(GD, GV); 1523ffd1746dSEd Schouten } 1524f22ef01cSRoman Divacky 152559d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(D)) 1526f22ef01cSRoman Divacky return EmitGlobalVarDefinition(VD); 1527f22ef01cSRoman Divacky 15286122f3e6SDimitry Andric llvm_unreachable("Invalid argument to EmitGlobalDefinition()"); 1529f22ef01cSRoman Divacky } 1530f22ef01cSRoman Divacky 1531f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the 1532f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there 1533f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1534f22ef01cSRoman Divacky /// bitcasted to the right type. 1535f22ef01cSRoman Divacky /// 1536f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1537f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created. 1538f22ef01cSRoman Divacky llvm::Constant * 15396122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 15406122f3e6SDimitry Andric llvm::Type *Ty, 1541f785676fSDimitry Andric GlobalDecl GD, bool ForVTable, 154239d628a0SDimitry Andric bool DontDefer, bool IsThunk, 1543139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1544f785676fSDimitry Andric const Decl *D = GD.getDecl(); 1545f785676fSDimitry Andric 1546f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1547f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1548f22ef01cSRoman Divacky if (Entry) { 15493861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1550f785676fSDimitry Andric const FunctionDecl *FD = cast_or_null<FunctionDecl>(D); 1551f22ef01cSRoman Divacky if (FD && !FD->hasAttr<WeakAttr>()) 1552f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1553f22ef01cSRoman Divacky } 1554f22ef01cSRoman Divacky 155539d628a0SDimitry Andric // Handle dropped DLL attributes. 155639d628a0SDimitry Andric if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>()) 155739d628a0SDimitry Andric Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); 155839d628a0SDimitry Andric 1559f22ef01cSRoman Divacky if (Entry->getType()->getElementType() == Ty) 1560f22ef01cSRoman Divacky return Entry; 1561f22ef01cSRoman Divacky 1562f22ef01cSRoman Divacky // Make sure the result is of the correct type. 156317a519f9SDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); 1564f22ef01cSRoman Divacky } 1565f22ef01cSRoman Divacky 1566f22ef01cSRoman Divacky // This function doesn't have a complete type (for example, the return 1567f22ef01cSRoman Divacky // type is an incomplete struct). Use a fake type instead, and make 1568f22ef01cSRoman Divacky // sure not to try to set attributes. 1569f22ef01cSRoman Divacky bool IsIncompleteFunction = false; 1570f22ef01cSRoman Divacky 15716122f3e6SDimitry Andric llvm::FunctionType *FTy; 1572f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(Ty)) { 1573f22ef01cSRoman Divacky FTy = cast<llvm::FunctionType>(Ty); 1574f22ef01cSRoman Divacky } else { 1575bd5abe19SDimitry Andric FTy = llvm::FunctionType::get(VoidTy, false); 1576f22ef01cSRoman Divacky IsIncompleteFunction = true; 1577f22ef01cSRoman Divacky } 1578ffd1746dSEd Schouten 1579f22ef01cSRoman Divacky llvm::Function *F = llvm::Function::Create(FTy, 1580f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 1581f22ef01cSRoman Divacky MangledName, &getModule()); 1582f22ef01cSRoman Divacky assert(F->getName() == MangledName && "name was uniqued!"); 1583f785676fSDimitry Andric if (D) 158439d628a0SDimitry Andric SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk); 1585139f7f9bSDimitry Andric if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) { 1586139f7f9bSDimitry Andric llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex); 1587139f7f9bSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 1588139f7f9bSDimitry Andric llvm::AttributeSet::get(VMContext, 1589139f7f9bSDimitry Andric llvm::AttributeSet::FunctionIndex, 1590139f7f9bSDimitry Andric B)); 1591139f7f9bSDimitry Andric } 1592f22ef01cSRoman Divacky 159359d1ed5bSDimitry Andric if (!DontDefer) { 159459d1ed5bSDimitry Andric // All MSVC dtors other than the base dtor are linkonce_odr and delegate to 159559d1ed5bSDimitry Andric // each other bottoming out with the base dtor. Therefore we emit non-base 159659d1ed5bSDimitry Andric // dtors on usage, even if there is no dtor definition in the TU. 159759d1ed5bSDimitry Andric if (D && isa<CXXDestructorDecl>(D) && 159859d1ed5bSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 159959d1ed5bSDimitry Andric GD.getDtorType())) 160059d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD); 160159d1ed5bSDimitry Andric 1602f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1603f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1604f22ef01cSRoman Divacky // of the file. 160559d1ed5bSDimitry Andric auto DDI = DeferredDecls.find(MangledName); 1606f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 160759d1ed5bSDimitry Andric // Move the potentially referenced deferred decl to the 160859d1ed5bSDimitry Andric // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we 160959d1ed5bSDimitry Andric // don't need it anymore). 161059d1ed5bSDimitry Andric addDeferredDeclToEmit(F, DDI->second); 1611f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 16122754fe60SDimitry Andric 16132754fe60SDimitry Andric // Otherwise, there are cases we have to worry about where we're 16142754fe60SDimitry Andric // using a declaration for which we must emit a definition but where 16152754fe60SDimitry Andric // we might not find a top-level definition: 16162754fe60SDimitry Andric // - member functions defined inline in their classes 16172754fe60SDimitry Andric // - friend functions defined inline in some class 16182754fe60SDimitry Andric // - special member functions with implicit definitions 16192754fe60SDimitry Andric // If we ever change our AST traversal to walk into class methods, 16202754fe60SDimitry Andric // this will be unnecessary. 16212754fe60SDimitry Andric // 162259d1ed5bSDimitry Andric // We also don't emit a definition for a function if it's going to be an 162339d628a0SDimitry Andric // entry in a vtable, unless it's already marked as used. 1624f785676fSDimitry Andric } else if (getLangOpts().CPlusPlus && D) { 16252754fe60SDimitry Andric // Look for a declaration that's lexically in a record. 162639d628a0SDimitry Andric for (const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD; 162739d628a0SDimitry Andric FD = FD->getPreviousDecl()) { 16282754fe60SDimitry Andric if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) { 162939d628a0SDimitry Andric if (FD->doesThisDeclarationHaveABody()) { 163059d1ed5bSDimitry Andric addDeferredDeclToEmit(F, GD.getWithDecl(FD)); 16312754fe60SDimitry Andric break; 1632f22ef01cSRoman Divacky } 1633f22ef01cSRoman Divacky } 163439d628a0SDimitry Andric } 1635f22ef01cSRoman Divacky } 163659d1ed5bSDimitry Andric } 1637f22ef01cSRoman Divacky 1638f22ef01cSRoman Divacky // Make sure the result is of the requested type. 1639f22ef01cSRoman Divacky if (!IsIncompleteFunction) { 1640f22ef01cSRoman Divacky assert(F->getType()->getElementType() == Ty); 1641f22ef01cSRoman Divacky return F; 1642f22ef01cSRoman Divacky } 1643f22ef01cSRoman Divacky 164417a519f9SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 1645f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(F, PTy); 1646f22ef01cSRoman Divacky } 1647f22ef01cSRoman Divacky 1648f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function. If Ty is 1649f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to 1650f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function). 1651f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, 16526122f3e6SDimitry Andric llvm::Type *Ty, 165359d1ed5bSDimitry Andric bool ForVTable, 165459d1ed5bSDimitry Andric bool DontDefer) { 1655f22ef01cSRoman Divacky // If there was no specific requested type, just convert it now. 1656f22ef01cSRoman Divacky if (!Ty) 1657f22ef01cSRoman Divacky Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType()); 1658ffd1746dSEd Schouten 16596122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 166059d1ed5bSDimitry Andric return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer); 1661f22ef01cSRoman Divacky } 1662f22ef01cSRoman Divacky 1663f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified 1664f22ef01cSRoman Divacky /// type and name. 1665f22ef01cSRoman Divacky llvm::Constant * 16666122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, 16676122f3e6SDimitry Andric StringRef Name, 1668139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 166959d1ed5bSDimitry Andric llvm::Constant *C = 167059d1ed5bSDimitry Andric GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 167139d628a0SDimitry Andric /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs); 167259d1ed5bSDimitry Andric if (auto *F = dyn_cast<llvm::Function>(C)) 1673139f7f9bSDimitry Andric if (F->empty()) 1674139f7f9bSDimitry Andric F->setCallingConv(getRuntimeCC()); 1675139f7f9bSDimitry Andric return C; 1676f22ef01cSRoman Divacky } 1677f22ef01cSRoman Divacky 167839d628a0SDimitry Andric /// CreateBuiltinFunction - Create a new builtin function with the specified 167939d628a0SDimitry Andric /// type and name. 168039d628a0SDimitry Andric llvm::Constant * 168139d628a0SDimitry Andric CodeGenModule::CreateBuiltinFunction(llvm::FunctionType *FTy, 168239d628a0SDimitry Andric StringRef Name, 168339d628a0SDimitry Andric llvm::AttributeSet ExtraAttrs) { 168439d628a0SDimitry Andric llvm::Constant *C = 168539d628a0SDimitry Andric GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 168639d628a0SDimitry Andric /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs); 168739d628a0SDimitry Andric if (auto *F = dyn_cast<llvm::Function>(C)) 168839d628a0SDimitry Andric if (F->empty()) 168939d628a0SDimitry Andric F->setCallingConv(getBuiltinCC()); 169039d628a0SDimitry Andric return C; 169139d628a0SDimitry Andric } 169239d628a0SDimitry Andric 1693dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted 1694dff0c46cSDimitry Andric /// as a constant. 1695dff0c46cSDimitry Andric /// 1696dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs 1697dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is 1698dff0c46cSDimitry Andric /// not written to during its construction. 1699dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) { 1700dff0c46cSDimitry Andric if (!Ty.isConstant(Context) && !Ty->isReferenceType()) 1701f22ef01cSRoman Divacky return false; 1702bd5abe19SDimitry Andric 1703dff0c46cSDimitry Andric if (Context.getLangOpts().CPlusPlus) { 1704dff0c46cSDimitry Andric if (const CXXRecordDecl *Record 1705dff0c46cSDimitry Andric = Context.getBaseElementType(Ty)->getAsCXXRecordDecl()) 1706dff0c46cSDimitry Andric return ExcludeCtor && !Record->hasMutableFields() && 1707dff0c46cSDimitry Andric Record->hasTrivialDestructor(); 1708f22ef01cSRoman Divacky } 1709bd5abe19SDimitry Andric 1710f22ef01cSRoman Divacky return true; 1711f22ef01cSRoman Divacky } 1712f22ef01cSRoman Divacky 1713f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, 1714f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type. If there 1715f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1716f22ef01cSRoman Divacky /// bitcasted to the right type. 1717f22ef01cSRoman Divacky /// 1718f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1719f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created. 1720f22ef01cSRoman Divacky llvm::Constant * 17216122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, 17226122f3e6SDimitry Andric llvm::PointerType *Ty, 172359d1ed5bSDimitry Andric const VarDecl *D) { 1724f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1725f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1726f22ef01cSRoman Divacky if (Entry) { 17273861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1728f22ef01cSRoman Divacky if (D && !D->hasAttr<WeakAttr>()) 1729f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1730f22ef01cSRoman Divacky } 1731f22ef01cSRoman Divacky 173239d628a0SDimitry Andric // Handle dropped DLL attributes. 173339d628a0SDimitry Andric if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>()) 173439d628a0SDimitry Andric Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); 173539d628a0SDimitry Andric 1736f22ef01cSRoman Divacky if (Entry->getType() == Ty) 1737f22ef01cSRoman Divacky return Entry; 1738f22ef01cSRoman Divacky 1739f22ef01cSRoman Divacky // Make sure the result is of the correct type. 1740f785676fSDimitry Andric if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace()) 1741f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty); 1742f785676fSDimitry Andric 1743f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(Entry, Ty); 1744f22ef01cSRoman Divacky } 1745f22ef01cSRoman Divacky 174659d1ed5bSDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace()); 174759d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 174859d1ed5bSDimitry Andric getModule(), Ty->getElementType(), false, 174959d1ed5bSDimitry Andric llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, nullptr, 175059d1ed5bSDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 175159d1ed5bSDimitry Andric 1752f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1753f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1754f22ef01cSRoman Divacky // of the file. 175559d1ed5bSDimitry Andric auto DDI = DeferredDecls.find(MangledName); 1756f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1757f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1758f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 175959d1ed5bSDimitry Andric addDeferredDeclToEmit(GV, DDI->second); 1760f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 1761f22ef01cSRoman Divacky } 1762f22ef01cSRoman Divacky 1763f22ef01cSRoman Divacky // Handle things which are present even on external declarations. 1764f22ef01cSRoman Divacky if (D) { 1765f22ef01cSRoman Divacky // FIXME: This code is overly simple and should be merged with other global 1766f22ef01cSRoman Divacky // handling. 1767dff0c46cSDimitry Andric GV->setConstant(isTypeConstant(D->getType(), false)); 1768f22ef01cSRoman Divacky 176933956c43SDimitry Andric GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 177033956c43SDimitry Andric 177159d1ed5bSDimitry Andric setLinkageAndVisibilityForGV(GV, D); 17722754fe60SDimitry Andric 1773284c1978SDimitry Andric if (D->getTLSKind()) { 1774284c1978SDimitry Andric if (D->getTLSKind() == VarDecl::TLS_Dynamic) 1775284c1978SDimitry Andric CXXThreadLocals.push_back(std::make_pair(D, GV)); 17767ae0e2c9SDimitry Andric setTLSMode(GV, *D); 1777f22ef01cSRoman Divacky } 1778f785676fSDimitry Andric 1779f785676fSDimitry Andric // If required by the ABI, treat declarations of static data members with 1780f785676fSDimitry Andric // inline initializers as definitions. 178159d1ed5bSDimitry Andric if (getContext().isMSStaticDataMemberInlineDefinition(D)) { 1782f785676fSDimitry Andric EmitGlobalVarDefinition(D); 1783284c1978SDimitry Andric } 1784f22ef01cSRoman Divacky 178559d1ed5bSDimitry Andric // Handle XCore specific ABI requirements. 178659d1ed5bSDimitry Andric if (getTarget().getTriple().getArch() == llvm::Triple::xcore && 178759d1ed5bSDimitry Andric D->getLanguageLinkage() == CLanguageLinkage && 178859d1ed5bSDimitry Andric D->getType().isConstant(Context) && 178959d1ed5bSDimitry Andric isExternallyVisible(D->getLinkageAndVisibility().getLinkage())) 179059d1ed5bSDimitry Andric GV->setSection(".cp.rodata"); 179159d1ed5bSDimitry Andric } 179259d1ed5bSDimitry Andric 17937ae0e2c9SDimitry Andric if (AddrSpace != Ty->getAddressSpace()) 1794f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty); 1795f785676fSDimitry Andric 1796f22ef01cSRoman Divacky return GV; 1797f22ef01cSRoman Divacky } 1798f22ef01cSRoman Divacky 1799f22ef01cSRoman Divacky 18002754fe60SDimitry Andric llvm::GlobalVariable * 18016122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, 18026122f3e6SDimitry Andric llvm::Type *Ty, 18032754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage) { 18042754fe60SDimitry Andric llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name); 180559d1ed5bSDimitry Andric llvm::GlobalVariable *OldGV = nullptr; 18062754fe60SDimitry Andric 18072754fe60SDimitry Andric if (GV) { 18082754fe60SDimitry Andric // Check if the variable has the right type. 18092754fe60SDimitry Andric if (GV->getType()->getElementType() == Ty) 18102754fe60SDimitry Andric return GV; 18112754fe60SDimitry Andric 18122754fe60SDimitry Andric // Because C++ name mangling, the only way we can end up with an already 18132754fe60SDimitry Andric // existing global with the same name is if it has been declared extern "C". 18142754fe60SDimitry Andric assert(GV->isDeclaration() && "Declaration has wrong type!"); 18152754fe60SDimitry Andric OldGV = GV; 18162754fe60SDimitry Andric } 18172754fe60SDimitry Andric 18182754fe60SDimitry Andric // Create a new variable. 18192754fe60SDimitry Andric GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true, 182059d1ed5bSDimitry Andric Linkage, nullptr, Name); 18212754fe60SDimitry Andric 18222754fe60SDimitry Andric if (OldGV) { 18232754fe60SDimitry Andric // Replace occurrences of the old variable if needed. 18242754fe60SDimitry Andric GV->takeName(OldGV); 18252754fe60SDimitry Andric 18262754fe60SDimitry Andric if (!OldGV->use_empty()) { 18272754fe60SDimitry Andric llvm::Constant *NewPtrForOldDecl = 18282754fe60SDimitry Andric llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 18292754fe60SDimitry Andric OldGV->replaceAllUsesWith(NewPtrForOldDecl); 18302754fe60SDimitry Andric } 18312754fe60SDimitry Andric 18322754fe60SDimitry Andric OldGV->eraseFromParent(); 18332754fe60SDimitry Andric } 18342754fe60SDimitry Andric 183533956c43SDimitry Andric if (supportsCOMDAT() && GV->isWeakForLinker() && 183633956c43SDimitry Andric !GV->hasAvailableExternallyLinkage()) 183733956c43SDimitry Andric GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); 183833956c43SDimitry Andric 18392754fe60SDimitry Andric return GV; 18402754fe60SDimitry Andric } 18412754fe60SDimitry Andric 1842f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the 1843f22ef01cSRoman Divacky /// given global variable. If Ty is non-null and if the global doesn't exist, 1844cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the 1845f22ef01cSRoman Divacky /// normal requested type would be. 1846f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, 18476122f3e6SDimitry Andric llvm::Type *Ty) { 1848f22ef01cSRoman Divacky assert(D->hasGlobalStorage() && "Not a global variable"); 1849f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 185059d1ed5bSDimitry Andric if (!Ty) 1851f22ef01cSRoman Divacky Ty = getTypes().ConvertTypeForMem(ASTTy); 1852f22ef01cSRoman Divacky 18536122f3e6SDimitry Andric llvm::PointerType *PTy = 18543b0f4066SDimitry Andric llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy)); 1855f22ef01cSRoman Divacky 18566122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1857f22ef01cSRoman Divacky return GetOrCreateLLVMGlobal(MangledName, PTy, D); 1858f22ef01cSRoman Divacky } 1859f22ef01cSRoman Divacky 1860f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the 1861f22ef01cSRoman Divacky /// specified type and name. 1862f22ef01cSRoman Divacky llvm::Constant * 18636122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, 18646122f3e6SDimitry Andric StringRef Name) { 186559d1ed5bSDimitry Andric return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr); 1866f22ef01cSRoman Divacky } 1867f22ef01cSRoman Divacky 1868f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { 1869f22ef01cSRoman Divacky assert(!D->getInit() && "Cannot emit definite definitions here!"); 1870f22ef01cSRoman Divacky 187139d628a0SDimitry Andric if (!MustBeEmitted(D)) { 1872f22ef01cSRoman Divacky // If we have not seen a reference to this variable yet, place it 1873f22ef01cSRoman Divacky // into the deferred declarations table to be emitted if needed 1874f22ef01cSRoman Divacky // later. 18756122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1876f22ef01cSRoman Divacky if (!GetGlobalValue(MangledName)) { 1877f22ef01cSRoman Divacky DeferredDecls[MangledName] = D; 1878f22ef01cSRoman Divacky return; 1879f22ef01cSRoman Divacky } 1880f22ef01cSRoman Divacky } 1881f22ef01cSRoman Divacky 1882f22ef01cSRoman Divacky // The tentative definition is the only definition. 1883f22ef01cSRoman Divacky EmitGlobalVarDefinition(D); 1884f22ef01cSRoman Divacky } 1885f22ef01cSRoman Divacky 18866122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const { 18872754fe60SDimitry Andric return Context.toCharUnitsFromBits( 18883861d79fSDimitry Andric TheDataLayout.getTypeStoreSizeInBits(Ty)); 1889f22ef01cSRoman Divacky } 1890f22ef01cSRoman Divacky 18917ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D, 18927ae0e2c9SDimitry Andric unsigned AddrSpace) { 189333956c43SDimitry Andric if (LangOpts.CUDA && LangOpts.CUDAIsDevice) { 18947ae0e2c9SDimitry Andric if (D->hasAttr<CUDAConstantAttr>()) 18957ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant); 18967ae0e2c9SDimitry Andric else if (D->hasAttr<CUDASharedAttr>()) 18977ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared); 18987ae0e2c9SDimitry Andric else 18997ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device); 19007ae0e2c9SDimitry Andric } 19017ae0e2c9SDimitry Andric 19027ae0e2c9SDimitry Andric return AddrSpace; 19037ae0e2c9SDimitry Andric } 19047ae0e2c9SDimitry Andric 1905284c1978SDimitry Andric template<typename SomeDecl> 1906284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D, 1907284c1978SDimitry Andric llvm::GlobalValue *GV) { 1908284c1978SDimitry Andric if (!getLangOpts().CPlusPlus) 1909284c1978SDimitry Andric return; 1910284c1978SDimitry Andric 1911284c1978SDimitry Andric // Must have 'used' attribute, or else inline assembly can't rely on 1912284c1978SDimitry Andric // the name existing. 1913284c1978SDimitry Andric if (!D->template hasAttr<UsedAttr>()) 1914284c1978SDimitry Andric return; 1915284c1978SDimitry Andric 1916284c1978SDimitry Andric // Must have internal linkage and an ordinary name. 1917f785676fSDimitry Andric if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage) 1918284c1978SDimitry Andric return; 1919284c1978SDimitry Andric 1920284c1978SDimitry Andric // Must be in an extern "C" context. Entities declared directly within 1921284c1978SDimitry Andric // a record are not extern "C" even if the record is in such a context. 1922f785676fSDimitry Andric const SomeDecl *First = D->getFirstDecl(); 1923284c1978SDimitry Andric if (First->getDeclContext()->isRecord() || !First->isInExternCContext()) 1924284c1978SDimitry Andric return; 1925284c1978SDimitry Andric 1926284c1978SDimitry Andric // OK, this is an internal linkage entity inside an extern "C" linkage 1927284c1978SDimitry Andric // specification. Make a note of that so we can give it the "expected" 1928284c1978SDimitry Andric // mangled name if nothing else is using that name. 1929284c1978SDimitry Andric std::pair<StaticExternCMap::iterator, bool> R = 1930284c1978SDimitry Andric StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV)); 1931284c1978SDimitry Andric 1932284c1978SDimitry Andric // If we have multiple internal linkage entities with the same name 1933284c1978SDimitry Andric // in extern "C" regions, none of them gets that name. 1934284c1978SDimitry Andric if (!R.second) 193559d1ed5bSDimitry Andric R.first->second = nullptr; 1936284c1978SDimitry Andric } 1937284c1978SDimitry Andric 193833956c43SDimitry Andric static bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D) { 193933956c43SDimitry Andric if (!CGM.supportsCOMDAT()) 194033956c43SDimitry Andric return false; 194133956c43SDimitry Andric 194233956c43SDimitry Andric if (D.hasAttr<SelectAnyAttr>()) 194333956c43SDimitry Andric return true; 194433956c43SDimitry Andric 194533956c43SDimitry Andric GVALinkage Linkage; 194633956c43SDimitry Andric if (auto *VD = dyn_cast<VarDecl>(&D)) 194733956c43SDimitry Andric Linkage = CGM.getContext().GetGVALinkageForVariable(VD); 194833956c43SDimitry Andric else 194933956c43SDimitry Andric Linkage = CGM.getContext().GetGVALinkageForFunction(cast<FunctionDecl>(&D)); 195033956c43SDimitry Andric 195133956c43SDimitry Andric switch (Linkage) { 195233956c43SDimitry Andric case GVA_Internal: 195333956c43SDimitry Andric case GVA_AvailableExternally: 195433956c43SDimitry Andric case GVA_StrongExternal: 195533956c43SDimitry Andric return false; 195633956c43SDimitry Andric case GVA_DiscardableODR: 195733956c43SDimitry Andric case GVA_StrongODR: 195833956c43SDimitry Andric return true; 195933956c43SDimitry Andric } 196033956c43SDimitry Andric llvm_unreachable("No such linkage"); 196133956c43SDimitry Andric } 196233956c43SDimitry Andric 196333956c43SDimitry Andric void CodeGenModule::maybeSetTrivialComdat(const Decl &D, 196433956c43SDimitry Andric llvm::GlobalObject &GO) { 196533956c43SDimitry Andric if (!shouldBeInCOMDAT(*this, D)) 196633956c43SDimitry Andric return; 196733956c43SDimitry Andric GO.setComdat(TheModule.getOrInsertComdat(GO.getName())); 196833956c43SDimitry Andric } 196933956c43SDimitry Andric 1970f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 197159d1ed5bSDimitry Andric llvm::Constant *Init = nullptr; 1972f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1973dff0c46cSDimitry Andric CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 1974dff0c46cSDimitry Andric bool NeedsGlobalCtor = false; 1975dff0c46cSDimitry Andric bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor(); 1976f22ef01cSRoman Divacky 1977dff0c46cSDimitry Andric const VarDecl *InitDecl; 1978dff0c46cSDimitry Andric const Expr *InitExpr = D->getAnyInitializer(InitDecl); 1979f22ef01cSRoman Divacky 1980f22ef01cSRoman Divacky if (!InitExpr) { 1981f22ef01cSRoman Divacky // This is a tentative definition; tentative definitions are 1982f22ef01cSRoman Divacky // implicitly initialized with { 0 }. 1983f22ef01cSRoman Divacky // 1984f22ef01cSRoman Divacky // Note that tentative definitions are only emitted at the end of 1985f22ef01cSRoman Divacky // a translation unit, so they should never have incomplete 1986f22ef01cSRoman Divacky // type. In addition, EmitTentativeDefinition makes sure that we 1987f22ef01cSRoman Divacky // never attempt to emit a tentative definition if a real one 1988f22ef01cSRoman Divacky // exists. A use may still exists, however, so we still may need 1989f22ef01cSRoman Divacky // to do a RAUW. 1990f22ef01cSRoman Divacky assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type"); 1991f22ef01cSRoman Divacky Init = EmitNullConstant(D->getType()); 1992f22ef01cSRoman Divacky } else { 19937ae0e2c9SDimitry Andric initializedGlobalDecl = GlobalDecl(D); 1994dff0c46cSDimitry Andric Init = EmitConstantInit(*InitDecl); 1995f785676fSDimitry Andric 1996f22ef01cSRoman Divacky if (!Init) { 1997f22ef01cSRoman Divacky QualType T = InitExpr->getType(); 1998f22ef01cSRoman Divacky if (D->getType()->isReferenceType()) 1999f22ef01cSRoman Divacky T = D->getType(); 2000f22ef01cSRoman Divacky 2001dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus) { 2002f22ef01cSRoman Divacky Init = EmitNullConstant(T); 2003dff0c46cSDimitry Andric NeedsGlobalCtor = true; 2004f22ef01cSRoman Divacky } else { 2005f22ef01cSRoman Divacky ErrorUnsupported(D, "static initializer"); 2006f22ef01cSRoman Divacky Init = llvm::UndefValue::get(getTypes().ConvertType(T)); 2007f22ef01cSRoman Divacky } 2008e580952dSDimitry Andric } else { 2009e580952dSDimitry Andric // We don't need an initializer, so remove the entry for the delayed 2010dff0c46cSDimitry Andric // initializer position (just in case this entry was delayed) if we 2011dff0c46cSDimitry Andric // also don't need to register a destructor. 2012dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && !NeedsGlobalDtor) 2013e580952dSDimitry Andric DelayedCXXInitPosition.erase(D); 2014f22ef01cSRoman Divacky } 2015f22ef01cSRoman Divacky } 2016f22ef01cSRoman Divacky 20176122f3e6SDimitry Andric llvm::Type* InitType = Init->getType(); 2018f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); 2019f22ef01cSRoman Divacky 2020f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 202159d1ed5bSDimitry Andric if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 2022f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast || 2023f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::AddrSpaceCast || 2024f785676fSDimitry Andric // All zero index gep. 2025f22ef01cSRoman Divacky CE->getOpcode() == llvm::Instruction::GetElementPtr); 2026f22ef01cSRoman Divacky Entry = CE->getOperand(0); 2027f22ef01cSRoman Divacky } 2028f22ef01cSRoman Divacky 2029f22ef01cSRoman Divacky // Entry is now either a Function or GlobalVariable. 203059d1ed5bSDimitry Andric auto *GV = dyn_cast<llvm::GlobalVariable>(Entry); 2031f22ef01cSRoman Divacky 2032f22ef01cSRoman Divacky // We have a definition after a declaration with the wrong type. 2033f22ef01cSRoman Divacky // We must make a new GlobalVariable* and update everything that used OldGV 2034f22ef01cSRoman Divacky // (a declaration or tentative definition) with the new GlobalVariable* 2035f22ef01cSRoman Divacky // (which will be a definition). 2036f22ef01cSRoman Divacky // 2037f22ef01cSRoman Divacky // This happens if there is a prototype for a global (e.g. 2038f22ef01cSRoman Divacky // "extern int x[];") and then a definition of a different type (e.g. 2039f22ef01cSRoman Divacky // "int x[10];"). This also happens when an initializer has a different type 2040f22ef01cSRoman Divacky // from the type of the global (this happens with unions). 204159d1ed5bSDimitry Andric if (!GV || 2042f22ef01cSRoman Divacky GV->getType()->getElementType() != InitType || 20433b0f4066SDimitry Andric GV->getType()->getAddressSpace() != 20447ae0e2c9SDimitry Andric GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) { 2045f22ef01cSRoman Divacky 2046f22ef01cSRoman Divacky // Move the old entry aside so that we'll create a new one. 20476122f3e6SDimitry Andric Entry->setName(StringRef()); 2048f22ef01cSRoman Divacky 2049f22ef01cSRoman Divacky // Make a new global with the correct type, this is now guaranteed to work. 2050f22ef01cSRoman Divacky GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType)); 2051f22ef01cSRoman Divacky 2052f22ef01cSRoman Divacky // Replace all uses of the old global with the new global 2053f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 2054f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(GV, Entry->getType()); 2055f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 2056f22ef01cSRoman Divacky 2057f22ef01cSRoman Divacky // Erase the old global, since it is no longer used. 2058f22ef01cSRoman Divacky cast<llvm::GlobalValue>(Entry)->eraseFromParent(); 2059f22ef01cSRoman Divacky } 2060f22ef01cSRoman Divacky 2061284c1978SDimitry Andric MaybeHandleStaticInExternC(D, GV); 2062284c1978SDimitry Andric 20636122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 20646122f3e6SDimitry Andric AddGlobalAnnotations(D, GV); 2065f22ef01cSRoman Divacky 2066f22ef01cSRoman Divacky GV->setInitializer(Init); 2067f22ef01cSRoman Divacky 2068f22ef01cSRoman Divacky // If it is safe to mark the global 'constant', do so now. 2069dff0c46cSDimitry Andric GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor && 2070dff0c46cSDimitry Andric isTypeConstant(D->getType(), true)); 2071f22ef01cSRoman Divacky 207239d628a0SDimitry Andric // If it is in a read-only section, mark it 'constant'. 207339d628a0SDimitry Andric if (const SectionAttr *SA = D->getAttr<SectionAttr>()) { 207439d628a0SDimitry Andric const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()]; 207539d628a0SDimitry Andric if ((SI.SectionFlags & ASTContext::PSF_Write) == 0) 207639d628a0SDimitry Andric GV->setConstant(true); 207739d628a0SDimitry Andric } 207839d628a0SDimitry Andric 2079f22ef01cSRoman Divacky GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 2080f22ef01cSRoman Divacky 2081f22ef01cSRoman Divacky // Set the llvm linkage type as appropriate. 20822754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 208359d1ed5bSDimitry Andric getLLVMLinkageVarDefinition(D, GV->isConstant()); 2084f785676fSDimitry Andric 208559d1ed5bSDimitry Andric // On Darwin, the backing variable for a C++11 thread_local variable always 208659d1ed5bSDimitry Andric // has internal linkage; all accesses should just be calls to the 208759d1ed5bSDimitry Andric // Itanium-specified entry point, which has the normal linkage of the 208859d1ed5bSDimitry Andric // variable. 208939d628a0SDimitry Andric if (!D->isStaticLocal() && D->getTLSKind() == VarDecl::TLS_Dynamic && 209059d1ed5bSDimitry Andric Context.getTargetInfo().getTriple().isMacOSX()) 209159d1ed5bSDimitry Andric Linkage = llvm::GlobalValue::InternalLinkage; 209259d1ed5bSDimitry Andric 209359d1ed5bSDimitry Andric GV->setLinkage(Linkage); 209459d1ed5bSDimitry Andric if (D->hasAttr<DLLImportAttr>()) 209559d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); 209659d1ed5bSDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 209759d1ed5bSDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass); 209839d628a0SDimitry Andric else 209939d628a0SDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass); 2100f785676fSDimitry Andric 21012754fe60SDimitry Andric if (Linkage == llvm::GlobalVariable::CommonLinkage) 2102f22ef01cSRoman Divacky // common vars aren't constant even if declared const. 2103f22ef01cSRoman Divacky GV->setConstant(false); 2104f22ef01cSRoman Divacky 210559d1ed5bSDimitry Andric setNonAliasAttributes(D, GV); 2106f22ef01cSRoman Divacky 210739d628a0SDimitry Andric if (D->getTLSKind() && !GV->isThreadLocal()) { 210839d628a0SDimitry Andric if (D->getTLSKind() == VarDecl::TLS_Dynamic) 210939d628a0SDimitry Andric CXXThreadLocals.push_back(std::make_pair(D, GV)); 211039d628a0SDimitry Andric setTLSMode(GV, *D); 211139d628a0SDimitry Andric } 211239d628a0SDimitry Andric 211333956c43SDimitry Andric maybeSetTrivialComdat(*D, *GV); 211433956c43SDimitry Andric 21152754fe60SDimitry Andric // Emit the initializer function if necessary. 2116dff0c46cSDimitry Andric if (NeedsGlobalCtor || NeedsGlobalDtor) 2117dff0c46cSDimitry Andric EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor); 21182754fe60SDimitry Andric 211939d628a0SDimitry Andric SanitizerMD->reportGlobalToASan(GV, *D, NeedsGlobalCtor); 21203861d79fSDimitry Andric 2121f22ef01cSRoman Divacky // Emit global variable debug information. 21226122f3e6SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 21233861d79fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 2124f22ef01cSRoman Divacky DI->EmitGlobalVariable(GV, D); 2125f22ef01cSRoman Divacky } 2126f22ef01cSRoman Divacky 212739d628a0SDimitry Andric static bool isVarDeclStrongDefinition(const ASTContext &Context, 212833956c43SDimitry Andric CodeGenModule &CGM, const VarDecl *D, 212933956c43SDimitry Andric bool NoCommon) { 213059d1ed5bSDimitry Andric // Don't give variables common linkage if -fno-common was specified unless it 213159d1ed5bSDimitry Andric // was overridden by a NoCommon attribute. 213259d1ed5bSDimitry Andric if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>()) 213359d1ed5bSDimitry Andric return true; 213459d1ed5bSDimitry Andric 213559d1ed5bSDimitry Andric // C11 6.9.2/2: 213659d1ed5bSDimitry Andric // A declaration of an identifier for an object that has file scope without 213759d1ed5bSDimitry Andric // an initializer, and without a storage-class specifier or with the 213859d1ed5bSDimitry Andric // storage-class specifier static, constitutes a tentative definition. 213959d1ed5bSDimitry Andric if (D->getInit() || D->hasExternalStorage()) 214059d1ed5bSDimitry Andric return true; 214159d1ed5bSDimitry Andric 214259d1ed5bSDimitry Andric // A variable cannot be both common and exist in a section. 214359d1ed5bSDimitry Andric if (D->hasAttr<SectionAttr>()) 214459d1ed5bSDimitry Andric return true; 214559d1ed5bSDimitry Andric 214659d1ed5bSDimitry Andric // Thread local vars aren't considered common linkage. 214759d1ed5bSDimitry Andric if (D->getTLSKind()) 214859d1ed5bSDimitry Andric return true; 214959d1ed5bSDimitry Andric 215059d1ed5bSDimitry Andric // Tentative definitions marked with WeakImportAttr are true definitions. 215159d1ed5bSDimitry Andric if (D->hasAttr<WeakImportAttr>()) 215259d1ed5bSDimitry Andric return true; 215359d1ed5bSDimitry Andric 215433956c43SDimitry Andric // A variable cannot be both common and exist in a comdat. 215533956c43SDimitry Andric if (shouldBeInCOMDAT(CGM, *D)) 215633956c43SDimitry Andric return true; 215733956c43SDimitry Andric 215839d628a0SDimitry Andric // Declarations with a required alignment do not have common linakge in MSVC 215939d628a0SDimitry Andric // mode. 216033956c43SDimitry Andric if (Context.getLangOpts().MSVCCompat) { 216133956c43SDimitry Andric if (D->hasAttr<AlignedAttr>()) 216239d628a0SDimitry Andric return true; 216333956c43SDimitry Andric QualType VarType = D->getType(); 216433956c43SDimitry Andric if (Context.isAlignmentRequired(VarType)) 216533956c43SDimitry Andric return true; 216633956c43SDimitry Andric 216733956c43SDimitry Andric if (const auto *RT = VarType->getAs<RecordType>()) { 216833956c43SDimitry Andric const RecordDecl *RD = RT->getDecl(); 216933956c43SDimitry Andric for (const FieldDecl *FD : RD->fields()) { 217033956c43SDimitry Andric if (FD->isBitField()) 217133956c43SDimitry Andric continue; 217233956c43SDimitry Andric if (FD->hasAttr<AlignedAttr>()) 217333956c43SDimitry Andric return true; 217433956c43SDimitry Andric if (Context.isAlignmentRequired(FD->getType())) 217533956c43SDimitry Andric return true; 217633956c43SDimitry Andric } 217733956c43SDimitry Andric } 217833956c43SDimitry Andric } 217939d628a0SDimitry Andric 218059d1ed5bSDimitry Andric return false; 218159d1ed5bSDimitry Andric } 218259d1ed5bSDimitry Andric 218359d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator( 218459d1ed5bSDimitry Andric const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) { 21852754fe60SDimitry Andric if (Linkage == GVA_Internal) 21862754fe60SDimitry Andric return llvm::Function::InternalLinkage; 218759d1ed5bSDimitry Andric 218859d1ed5bSDimitry Andric if (D->hasAttr<WeakAttr>()) { 218959d1ed5bSDimitry Andric if (IsConstantVariable) 219059d1ed5bSDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 219159d1ed5bSDimitry Andric else 219259d1ed5bSDimitry Andric return llvm::GlobalVariable::WeakAnyLinkage; 219359d1ed5bSDimitry Andric } 219459d1ed5bSDimitry Andric 219559d1ed5bSDimitry Andric // We are guaranteed to have a strong definition somewhere else, 219659d1ed5bSDimitry Andric // so we can use available_externally linkage. 219759d1ed5bSDimitry Andric if (Linkage == GVA_AvailableExternally) 219859d1ed5bSDimitry Andric return llvm::Function::AvailableExternallyLinkage; 219959d1ed5bSDimitry Andric 220059d1ed5bSDimitry Andric // Note that Apple's kernel linker doesn't support symbol 220159d1ed5bSDimitry Andric // coalescing, so we need to avoid linkonce and weak linkages there. 220259d1ed5bSDimitry Andric // Normally, this means we just map to internal, but for explicit 220359d1ed5bSDimitry Andric // instantiations we'll map to external. 220459d1ed5bSDimitry Andric 220559d1ed5bSDimitry Andric // In C++, the compiler has to emit a definition in every translation unit 220659d1ed5bSDimitry Andric // that references the function. We should use linkonce_odr because 220759d1ed5bSDimitry Andric // a) if all references in this translation unit are optimized away, we 220859d1ed5bSDimitry Andric // don't need to codegen it. b) if the function persists, it needs to be 220959d1ed5bSDimitry Andric // merged with other definitions. c) C++ has the ODR, so we know the 221059d1ed5bSDimitry Andric // definition is dependable. 221159d1ed5bSDimitry Andric if (Linkage == GVA_DiscardableODR) 221259d1ed5bSDimitry Andric return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage 221359d1ed5bSDimitry Andric : llvm::Function::InternalLinkage; 221459d1ed5bSDimitry Andric 221559d1ed5bSDimitry Andric // An explicit instantiation of a template has weak linkage, since 221659d1ed5bSDimitry Andric // explicit instantiations can occur in multiple translation units 221759d1ed5bSDimitry Andric // and must all be equivalent. However, we are not allowed to 221859d1ed5bSDimitry Andric // throw away these explicit instantiations. 221959d1ed5bSDimitry Andric if (Linkage == GVA_StrongODR) 222059d1ed5bSDimitry Andric return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage 222159d1ed5bSDimitry Andric : llvm::Function::ExternalLinkage; 222259d1ed5bSDimitry Andric 222359d1ed5bSDimitry Andric // C++ doesn't have tentative definitions and thus cannot have common 222459d1ed5bSDimitry Andric // linkage. 222559d1ed5bSDimitry Andric if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) && 222633956c43SDimitry Andric !isVarDeclStrongDefinition(Context, *this, cast<VarDecl>(D), 222739d628a0SDimitry Andric CodeGenOpts.NoCommon)) 222859d1ed5bSDimitry Andric return llvm::GlobalVariable::CommonLinkage; 222959d1ed5bSDimitry Andric 2230f785676fSDimitry Andric // selectany symbols are externally visible, so use weak instead of 2231f785676fSDimitry Andric // linkonce. MSVC optimizes away references to const selectany globals, so 2232f785676fSDimitry Andric // all definitions should be the same and ODR linkage should be used. 2233f785676fSDimitry Andric // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx 223459d1ed5bSDimitry Andric if (D->hasAttr<SelectAnyAttr>()) 2235f785676fSDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 223659d1ed5bSDimitry Andric 223759d1ed5bSDimitry Andric // Otherwise, we have strong external linkage. 223859d1ed5bSDimitry Andric assert(Linkage == GVA_StrongExternal); 22392754fe60SDimitry Andric return llvm::GlobalVariable::ExternalLinkage; 22402754fe60SDimitry Andric } 22412754fe60SDimitry Andric 224259d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition( 224359d1ed5bSDimitry Andric const VarDecl *VD, bool IsConstant) { 224459d1ed5bSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD); 224559d1ed5bSDimitry Andric return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant); 224659d1ed5bSDimitry Andric } 224759d1ed5bSDimitry Andric 2248139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type. 2249139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites 2250139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old, 2251139f7f9bSDimitry Andric llvm::Function *newFn) { 2252139f7f9bSDimitry Andric // Fast path. 2253139f7f9bSDimitry Andric if (old->use_empty()) return; 2254139f7f9bSDimitry Andric 2255139f7f9bSDimitry Andric llvm::Type *newRetTy = newFn->getReturnType(); 2256139f7f9bSDimitry Andric SmallVector<llvm::Value*, 4> newArgs; 2257139f7f9bSDimitry Andric 2258139f7f9bSDimitry Andric for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end(); 2259139f7f9bSDimitry Andric ui != ue; ) { 2260139f7f9bSDimitry Andric llvm::Value::use_iterator use = ui++; // Increment before the use is erased. 226159d1ed5bSDimitry Andric llvm::User *user = use->getUser(); 2262139f7f9bSDimitry Andric 2263139f7f9bSDimitry Andric // Recognize and replace uses of bitcasts. Most calls to 2264139f7f9bSDimitry Andric // unprototyped functions will use bitcasts. 226559d1ed5bSDimitry Andric if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) { 2266139f7f9bSDimitry Andric if (bitcast->getOpcode() == llvm::Instruction::BitCast) 2267139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(bitcast, newFn); 2268139f7f9bSDimitry Andric continue; 2269139f7f9bSDimitry Andric } 2270139f7f9bSDimitry Andric 2271139f7f9bSDimitry Andric // Recognize calls to the function. 2272139f7f9bSDimitry Andric llvm::CallSite callSite(user); 2273139f7f9bSDimitry Andric if (!callSite) continue; 227459d1ed5bSDimitry Andric if (!callSite.isCallee(&*use)) continue; 2275139f7f9bSDimitry Andric 2276139f7f9bSDimitry Andric // If the return types don't match exactly, then we can't 2277139f7f9bSDimitry Andric // transform this call unless it's dead. 2278139f7f9bSDimitry Andric if (callSite->getType() != newRetTy && !callSite->use_empty()) 2279139f7f9bSDimitry Andric continue; 2280139f7f9bSDimitry Andric 2281139f7f9bSDimitry Andric // Get the call site's attribute list. 2282139f7f9bSDimitry Andric SmallVector<llvm::AttributeSet, 8> newAttrs; 2283139f7f9bSDimitry Andric llvm::AttributeSet oldAttrs = callSite.getAttributes(); 2284139f7f9bSDimitry Andric 2285139f7f9bSDimitry Andric // Collect any return attributes from the call. 2286139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex)) 2287139f7f9bSDimitry Andric newAttrs.push_back( 2288139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), 2289139f7f9bSDimitry Andric oldAttrs.getRetAttributes())); 2290139f7f9bSDimitry Andric 2291139f7f9bSDimitry Andric // If the function was passed too few arguments, don't transform. 2292139f7f9bSDimitry Andric unsigned newNumArgs = newFn->arg_size(); 2293139f7f9bSDimitry Andric if (callSite.arg_size() < newNumArgs) continue; 2294139f7f9bSDimitry Andric 2295139f7f9bSDimitry Andric // If extra arguments were passed, we silently drop them. 2296139f7f9bSDimitry Andric // If any of the types mismatch, we don't transform. 2297139f7f9bSDimitry Andric unsigned argNo = 0; 2298139f7f9bSDimitry Andric bool dontTransform = false; 2299139f7f9bSDimitry Andric for (llvm::Function::arg_iterator ai = newFn->arg_begin(), 2300139f7f9bSDimitry Andric ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) { 2301139f7f9bSDimitry Andric if (callSite.getArgument(argNo)->getType() != ai->getType()) { 2302139f7f9bSDimitry Andric dontTransform = true; 2303139f7f9bSDimitry Andric break; 2304139f7f9bSDimitry Andric } 2305139f7f9bSDimitry Andric 2306139f7f9bSDimitry Andric // Add any parameter attributes. 2307139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(argNo + 1)) 2308139f7f9bSDimitry Andric newAttrs. 2309139f7f9bSDimitry Andric push_back(llvm:: 2310139f7f9bSDimitry Andric AttributeSet::get(newFn->getContext(), 2311139f7f9bSDimitry Andric oldAttrs.getParamAttributes(argNo + 1))); 2312139f7f9bSDimitry Andric } 2313139f7f9bSDimitry Andric if (dontTransform) 2314139f7f9bSDimitry Andric continue; 2315139f7f9bSDimitry Andric 2316139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) 2317139f7f9bSDimitry Andric newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(), 2318139f7f9bSDimitry Andric oldAttrs.getFnAttributes())); 2319139f7f9bSDimitry Andric 2320139f7f9bSDimitry Andric // Okay, we can transform this. Create the new call instruction and copy 2321139f7f9bSDimitry Andric // over the required information. 2322139f7f9bSDimitry Andric newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo); 2323139f7f9bSDimitry Andric 2324139f7f9bSDimitry Andric llvm::CallSite newCall; 2325139f7f9bSDimitry Andric if (callSite.isCall()) { 2326139f7f9bSDimitry Andric newCall = llvm::CallInst::Create(newFn, newArgs, "", 2327139f7f9bSDimitry Andric callSite.getInstruction()); 2328139f7f9bSDimitry Andric } else { 232959d1ed5bSDimitry Andric auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction()); 2330139f7f9bSDimitry Andric newCall = llvm::InvokeInst::Create(newFn, 2331139f7f9bSDimitry Andric oldInvoke->getNormalDest(), 2332139f7f9bSDimitry Andric oldInvoke->getUnwindDest(), 2333139f7f9bSDimitry Andric newArgs, "", 2334139f7f9bSDimitry Andric callSite.getInstruction()); 2335139f7f9bSDimitry Andric } 2336139f7f9bSDimitry Andric newArgs.clear(); // for the next iteration 2337139f7f9bSDimitry Andric 2338139f7f9bSDimitry Andric if (!newCall->getType()->isVoidTy()) 2339139f7f9bSDimitry Andric newCall->takeName(callSite.getInstruction()); 2340139f7f9bSDimitry Andric newCall.setAttributes( 2341139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), newAttrs)); 2342139f7f9bSDimitry Andric newCall.setCallingConv(callSite.getCallingConv()); 2343139f7f9bSDimitry Andric 2344139f7f9bSDimitry Andric // Finally, remove the old call, replacing any uses with the new one. 2345139f7f9bSDimitry Andric if (!callSite->use_empty()) 2346139f7f9bSDimitry Andric callSite->replaceAllUsesWith(newCall.getInstruction()); 2347139f7f9bSDimitry Andric 2348139f7f9bSDimitry Andric // Copy debug location attached to CI. 234933956c43SDimitry Andric if (callSite->getDebugLoc()) 2350139f7f9bSDimitry Andric newCall->setDebugLoc(callSite->getDebugLoc()); 2351139f7f9bSDimitry Andric callSite->eraseFromParent(); 2352139f7f9bSDimitry Andric } 2353139f7f9bSDimitry Andric } 2354139f7f9bSDimitry Andric 2355f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we 2356f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}". If there are 2357f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to 2358f22ef01cSRoman Divacky /// call the new function directly. 2359f22ef01cSRoman Divacky /// 2360f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to 2361f22ef01cSRoman Divacky /// functions to be able to inline them. If there is a bitcast in the way, it 2362f22ef01cSRoman Divacky /// won't inline them. Instcombine normally deletes these calls, but it isn't 2363f22ef01cSRoman Divacky /// run at -O0. 2364f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, 2365f22ef01cSRoman Divacky llvm::Function *NewFn) { 2366f22ef01cSRoman Divacky // If we're redefining a global as a function, don't transform it. 2367139f7f9bSDimitry Andric if (!isa<llvm::Function>(Old)) return; 2368f22ef01cSRoman Divacky 2369139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(Old, NewFn); 2370f22ef01cSRoman Divacky } 2371f22ef01cSRoman Divacky 2372dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 2373dff0c46cSDimitry Andric TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind(); 2374dff0c46cSDimitry Andric // If we have a definition, this might be a deferred decl. If the 2375dff0c46cSDimitry Andric // instantiation is explicit, make sure we emit it at the end. 2376dff0c46cSDimitry Andric if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition) 2377dff0c46cSDimitry Andric GetAddrOfGlobalVar(VD); 2378139f7f9bSDimitry Andric 2379139f7f9bSDimitry Andric EmitTopLevelDecl(VD); 2380dff0c46cSDimitry Andric } 2381f22ef01cSRoman Divacky 238259d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD, 238359d1ed5bSDimitry Andric llvm::GlobalValue *GV) { 238459d1ed5bSDimitry Andric const auto *D = cast<FunctionDecl>(GD.getDecl()); 23853b0f4066SDimitry Andric 23863b0f4066SDimitry Andric // Compute the function info and LLVM type. 2387dff0c46cSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 2388dff0c46cSDimitry Andric llvm::FunctionType *Ty = getTypes().GetFunctionType(FI); 23893b0f4066SDimitry Andric 2390f22ef01cSRoman Divacky // Get or create the prototype for the function. 239159d1ed5bSDimitry Andric if (!GV) { 239259d1ed5bSDimitry Andric llvm::Constant *C = 239359d1ed5bSDimitry Andric GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true); 2394f22ef01cSRoman Divacky 2395f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 239659d1ed5bSDimitry Andric if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) { 2397f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast); 239859d1ed5bSDimitry Andric GV = cast<llvm::GlobalValue>(CE->getOperand(0)); 239959d1ed5bSDimitry Andric } else { 240059d1ed5bSDimitry Andric GV = cast<llvm::GlobalValue>(C); 240159d1ed5bSDimitry Andric } 2402f22ef01cSRoman Divacky } 2403f22ef01cSRoman Divacky 240459d1ed5bSDimitry Andric if (!GV->isDeclaration()) { 2405f785676fSDimitry Andric getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name); 240639d628a0SDimitry Andric GlobalDecl OldGD = Manglings.lookup(GV->getName()); 240739d628a0SDimitry Andric if (auto *Prev = OldGD.getDecl()) 240839d628a0SDimitry Andric getDiags().Report(Prev->getLocation(), diag::note_previous_definition); 2409f785676fSDimitry Andric return; 2410f785676fSDimitry Andric } 2411f22ef01cSRoman Divacky 241259d1ed5bSDimitry Andric if (GV->getType()->getElementType() != Ty) { 2413f22ef01cSRoman Divacky // If the types mismatch then we have to rewrite the definition. 241459d1ed5bSDimitry Andric assert(GV->isDeclaration() && "Shouldn't replace non-declaration"); 2415f22ef01cSRoman Divacky 2416f22ef01cSRoman Divacky // F is the Function* for the one with the wrong type, we must make a new 2417f22ef01cSRoman Divacky // Function* and update everything that used F (a declaration) with the new 2418f22ef01cSRoman Divacky // Function* (which will be a definition). 2419f22ef01cSRoman Divacky // 2420f22ef01cSRoman Divacky // This happens if there is a prototype for a function 2421f22ef01cSRoman Divacky // (e.g. "int f()") and then a definition of a different type 2422f22ef01cSRoman Divacky // (e.g. "int f(int x)"). Move the old function aside so that it 2423f22ef01cSRoman Divacky // doesn't interfere with GetAddrOfFunction. 242459d1ed5bSDimitry Andric GV->setName(StringRef()); 242559d1ed5bSDimitry Andric auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty)); 2426f22ef01cSRoman Divacky 2427139f7f9bSDimitry Andric // This might be an implementation of a function without a 2428139f7f9bSDimitry Andric // prototype, in which case, try to do special replacement of 2429139f7f9bSDimitry Andric // calls which match the new prototype. The really key thing here 2430139f7f9bSDimitry Andric // is that we also potentially drop arguments from the call site 2431139f7f9bSDimitry Andric // so as to make a direct call, which makes the inliner happier 2432139f7f9bSDimitry Andric // and suppresses a number of optimizer warnings (!) about 2433139f7f9bSDimitry Andric // dropping arguments. 243459d1ed5bSDimitry Andric if (!GV->use_empty()) { 243559d1ed5bSDimitry Andric ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn); 243659d1ed5bSDimitry Andric GV->removeDeadConstantUsers(); 2437f22ef01cSRoman Divacky } 2438f22ef01cSRoman Divacky 2439f22ef01cSRoman Divacky // Replace uses of F with the Function we will endow with a body. 244059d1ed5bSDimitry Andric if (!GV->use_empty()) { 2441f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 244259d1ed5bSDimitry Andric llvm::ConstantExpr::getBitCast(NewFn, GV->getType()); 244359d1ed5bSDimitry Andric GV->replaceAllUsesWith(NewPtrForOldDecl); 2444f22ef01cSRoman Divacky } 2445f22ef01cSRoman Divacky 2446f22ef01cSRoman Divacky // Ok, delete the old function now, which is dead. 244759d1ed5bSDimitry Andric GV->eraseFromParent(); 2448f22ef01cSRoman Divacky 244959d1ed5bSDimitry Andric GV = NewFn; 2450f22ef01cSRoman Divacky } 2451f22ef01cSRoman Divacky 24522754fe60SDimitry Andric // We need to set linkage and visibility on the function before 24532754fe60SDimitry Andric // generating code for it because various parts of IR generation 24542754fe60SDimitry Andric // want to propagate this information down (e.g. to local static 24552754fe60SDimitry Andric // declarations). 245659d1ed5bSDimitry Andric auto *Fn = cast<llvm::Function>(GV); 2457f785676fSDimitry Andric setFunctionLinkage(GD, Fn); 245839d628a0SDimitry Andric if (D->hasAttr<DLLImportAttr>()) 245939d628a0SDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); 246039d628a0SDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 246139d628a0SDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass); 246239d628a0SDimitry Andric else 246339d628a0SDimitry Andric GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass); 2464f22ef01cSRoman Divacky 246559d1ed5bSDimitry Andric // FIXME: this is redundant with part of setFunctionDefinitionAttributes 24662754fe60SDimitry Andric setGlobalVisibility(Fn, D); 24672754fe60SDimitry Andric 2468284c1978SDimitry Andric MaybeHandleStaticInExternC(D, Fn); 2469284c1978SDimitry Andric 247033956c43SDimitry Andric maybeSetTrivialComdat(*D, *Fn); 247133956c43SDimitry Andric 24723b0f4066SDimitry Andric CodeGenFunction(*this).GenerateCode(D, Fn, FI); 2473f22ef01cSRoman Divacky 247459d1ed5bSDimitry Andric setFunctionDefinitionAttributes(D, Fn); 2475f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, Fn); 2476f22ef01cSRoman Divacky 2477f22ef01cSRoman Divacky if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) 2478f22ef01cSRoman Divacky AddGlobalCtor(Fn, CA->getPriority()); 2479f22ef01cSRoman Divacky if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) 2480f22ef01cSRoman Divacky AddGlobalDtor(Fn, DA->getPriority()); 24816122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 24826122f3e6SDimitry Andric AddGlobalAnnotations(D, Fn); 2483f22ef01cSRoman Divacky } 2484f22ef01cSRoman Divacky 2485f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { 248659d1ed5bSDimitry Andric const auto *D = cast<ValueDecl>(GD.getDecl()); 2487f22ef01cSRoman Divacky const AliasAttr *AA = D->getAttr<AliasAttr>(); 2488f22ef01cSRoman Divacky assert(AA && "Not an alias?"); 2489f22ef01cSRoman Divacky 24906122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 2491f22ef01cSRoman Divacky 2492f22ef01cSRoman Divacky // If there is a definition in the module, then it wins over the alias. 2493f22ef01cSRoman Divacky // This is dubious, but allow it to be safe. Just ignore the alias. 2494f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 2495f22ef01cSRoman Divacky if (Entry && !Entry->isDeclaration()) 2496f22ef01cSRoman Divacky return; 2497f22ef01cSRoman Divacky 2498f785676fSDimitry Andric Aliases.push_back(GD); 2499f785676fSDimitry Andric 25006122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); 2501f22ef01cSRoman Divacky 2502f22ef01cSRoman Divacky // Create a reference to the named value. This ensures that it is emitted 2503f22ef01cSRoman Divacky // if a deferred decl. 2504f22ef01cSRoman Divacky llvm::Constant *Aliasee; 2505f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 25063861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, 25072754fe60SDimitry Andric /*ForVTable=*/false); 2508f22ef01cSRoman Divacky else 2509f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 251059d1ed5bSDimitry Andric llvm::PointerType::getUnqual(DeclTy), 251139d628a0SDimitry Andric /*D=*/nullptr); 2512f22ef01cSRoman Divacky 2513f22ef01cSRoman Divacky // Create the new alias itself, but don't set a name yet. 251459d1ed5bSDimitry Andric auto *GA = llvm::GlobalAlias::create( 251533956c43SDimitry Andric cast<llvm::PointerType>(Aliasee->getType()), 251659d1ed5bSDimitry Andric llvm::Function::ExternalLinkage, "", Aliasee, &getModule()); 2517f22ef01cSRoman Divacky 2518f22ef01cSRoman Divacky if (Entry) { 251959d1ed5bSDimitry Andric if (GA->getAliasee() == Entry) { 252059d1ed5bSDimitry Andric Diags.Report(AA->getLocation(), diag::err_cyclic_alias); 252159d1ed5bSDimitry Andric return; 252259d1ed5bSDimitry Andric } 252359d1ed5bSDimitry Andric 2524f22ef01cSRoman Divacky assert(Entry->isDeclaration()); 2525f22ef01cSRoman Divacky 2526f22ef01cSRoman Divacky // If there is a declaration in the module, then we had an extern followed 2527f22ef01cSRoman Divacky // by the alias, as in: 2528f22ef01cSRoman Divacky // extern int test6(); 2529f22ef01cSRoman Divacky // ... 2530f22ef01cSRoman Divacky // int test6() __attribute__((alias("test7"))); 2531f22ef01cSRoman Divacky // 2532f22ef01cSRoman Divacky // Remove it and replace uses of it with the alias. 2533f22ef01cSRoman Divacky GA->takeName(Entry); 2534f22ef01cSRoman Divacky 2535f22ef01cSRoman Divacky Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, 2536f22ef01cSRoman Divacky Entry->getType())); 2537f22ef01cSRoman Divacky Entry->eraseFromParent(); 2538f22ef01cSRoman Divacky } else { 2539ffd1746dSEd Schouten GA->setName(MangledName); 2540f22ef01cSRoman Divacky } 2541f22ef01cSRoman Divacky 2542f22ef01cSRoman Divacky // Set attributes which are particular to an alias; this is a 2543f22ef01cSRoman Divacky // specialization of the attributes which may be set on a global 2544f22ef01cSRoman Divacky // variable/function. 254539d628a0SDimitry Andric if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakRefAttr>() || 25463b0f4066SDimitry Andric D->isWeakImported()) { 2547f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::WeakAnyLinkage); 2548f22ef01cSRoman Divacky } 2549f22ef01cSRoman Divacky 255039d628a0SDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(D)) 255139d628a0SDimitry Andric if (VD->getTLSKind()) 255239d628a0SDimitry Andric setTLSMode(GA, *VD); 255339d628a0SDimitry Andric 255439d628a0SDimitry Andric setAliasAttributes(D, GA); 2555f22ef01cSRoman Divacky } 2556f22ef01cSRoman Divacky 255717a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID, 25586122f3e6SDimitry Andric ArrayRef<llvm::Type*> Tys) { 255917a519f9SDimitry Andric return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID, 256017a519f9SDimitry Andric Tys); 2561f22ef01cSRoman Divacky } 2562f22ef01cSRoman Divacky 256333956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> & 256433956c43SDimitry Andric GetConstantCFStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map, 256533956c43SDimitry Andric const StringLiteral *Literal, bool TargetIsLSB, 256633956c43SDimitry Andric bool &IsUTF16, unsigned &StringLength) { 25676122f3e6SDimitry Andric StringRef String = Literal->getString(); 2568e580952dSDimitry Andric unsigned NumBytes = String.size(); 2569f22ef01cSRoman Divacky 2570f22ef01cSRoman Divacky // Check for simple case. 2571f22ef01cSRoman Divacky if (!Literal->containsNonAsciiOrNull()) { 2572f22ef01cSRoman Divacky StringLength = NumBytes; 257339d628a0SDimitry Andric return *Map.insert(std::make_pair(String, nullptr)).first; 2574f22ef01cSRoman Divacky } 2575f22ef01cSRoman Divacky 2576dff0c46cSDimitry Andric // Otherwise, convert the UTF8 literals into a string of shorts. 2577dff0c46cSDimitry Andric IsUTF16 = true; 2578dff0c46cSDimitry Andric 2579dff0c46cSDimitry Andric SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls. 25803861d79fSDimitry Andric const UTF8 *FromPtr = (const UTF8 *)String.data(); 2581f22ef01cSRoman Divacky UTF16 *ToPtr = &ToBuf[0]; 2582f22ef01cSRoman Divacky 25832754fe60SDimitry Andric (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, 2584f22ef01cSRoman Divacky &ToPtr, ToPtr + NumBytes, 2585f22ef01cSRoman Divacky strictConversion); 2586f22ef01cSRoman Divacky 2587f22ef01cSRoman Divacky // ConvertUTF8toUTF16 returns the length in ToPtr. 2588f22ef01cSRoman Divacky StringLength = ToPtr - &ToBuf[0]; 2589f22ef01cSRoman Divacky 2590dff0c46cSDimitry Andric // Add an explicit null. 2591dff0c46cSDimitry Andric *ToPtr = 0; 259239d628a0SDimitry Andric return *Map.insert(std::make_pair( 259339d628a0SDimitry Andric StringRef(reinterpret_cast<const char *>(ToBuf.data()), 259439d628a0SDimitry Andric (StringLength + 1) * 2), 259539d628a0SDimitry Andric nullptr)).first; 2596f22ef01cSRoman Divacky } 2597f22ef01cSRoman Divacky 259833956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> & 259933956c43SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map, 260033956c43SDimitry Andric const StringLiteral *Literal, unsigned &StringLength) { 26016122f3e6SDimitry Andric StringRef String = Literal->getString(); 2602bd5abe19SDimitry Andric StringLength = String.size(); 260339d628a0SDimitry Andric return *Map.insert(std::make_pair(String, nullptr)).first; 2604bd5abe19SDimitry Andric } 2605bd5abe19SDimitry Andric 2606f22ef01cSRoman Divacky llvm::Constant * 2607f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { 2608f22ef01cSRoman Divacky unsigned StringLength = 0; 2609f22ef01cSRoman Divacky bool isUTF16 = false; 261033956c43SDimitry Andric llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = 2611f22ef01cSRoman Divacky GetConstantCFStringEntry(CFConstantStringMap, Literal, 261233956c43SDimitry Andric getDataLayout().isLittleEndian(), isUTF16, 261333956c43SDimitry Andric StringLength); 2614f22ef01cSRoman Divacky 261539d628a0SDimitry Andric if (auto *C = Entry.second) 2616f22ef01cSRoman Divacky return C; 2617f22ef01cSRoman Divacky 2618dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2619f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2620284c1978SDimitry Andric llvm::Value *V; 2621f22ef01cSRoman Divacky 2622f22ef01cSRoman Divacky // If we don't already have it, get __CFConstantStringClassReference. 2623f22ef01cSRoman Divacky if (!CFConstantStringClassRef) { 26246122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 2625f22ef01cSRoman Divacky Ty = llvm::ArrayType::get(Ty, 0); 2626f22ef01cSRoman Divacky llvm::Constant *GV = CreateRuntimeVariable(Ty, 2627f22ef01cSRoman Divacky "__CFConstantStringClassReference"); 2628f22ef01cSRoman Divacky // Decay array -> ptr 262933956c43SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros); 2630284c1978SDimitry Andric CFConstantStringClassRef = V; 2631f22ef01cSRoman Divacky } 2632284c1978SDimitry Andric else 2633284c1978SDimitry Andric V = CFConstantStringClassRef; 2634f22ef01cSRoman Divacky 2635f22ef01cSRoman Divacky QualType CFTy = getContext().getCFConstantStringType(); 2636f22ef01cSRoman Divacky 263759d1ed5bSDimitry Andric auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 2638f22ef01cSRoman Divacky 2639dff0c46cSDimitry Andric llvm::Constant *Fields[4]; 2640f22ef01cSRoman Divacky 2641f22ef01cSRoman Divacky // Class pointer. 2642284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2643f22ef01cSRoman Divacky 2644f22ef01cSRoman Divacky // Flags. 26456122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2646f22ef01cSRoman Divacky Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) : 2647f22ef01cSRoman Divacky llvm::ConstantInt::get(Ty, 0x07C8); 2648f22ef01cSRoman Divacky 2649f22ef01cSRoman Divacky // String pointer. 265059d1ed5bSDimitry Andric llvm::Constant *C = nullptr; 2651dff0c46cSDimitry Andric if (isUTF16) { 265239d628a0SDimitry Andric ArrayRef<uint16_t> Arr = llvm::makeArrayRef<uint16_t>( 265339d628a0SDimitry Andric reinterpret_cast<uint16_t *>(const_cast<char *>(Entry.first().data())), 265439d628a0SDimitry Andric Entry.first().size() / 2); 2655dff0c46cSDimitry Andric C = llvm::ConstantDataArray::get(VMContext, Arr); 2656dff0c46cSDimitry Andric } else { 265739d628a0SDimitry Andric C = llvm::ConstantDataArray::getString(VMContext, Entry.first()); 2658dff0c46cSDimitry Andric } 2659f22ef01cSRoman Divacky 2660dff0c46cSDimitry Andric // Note: -fwritable-strings doesn't make the backing store strings of 2661dff0c46cSDimitry Andric // CFStrings writable. (See <rdar://problem/10657500>) 266259d1ed5bSDimitry Andric auto *GV = 2663dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true, 266459d1ed5bSDimitry Andric llvm::GlobalValue::PrivateLinkage, C, ".str"); 26652754fe60SDimitry Andric GV->setUnnamedAddr(true); 2666284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2667284c1978SDimitry Andric // of the string is via this class initializer. 266859d1ed5bSDimitry Andric // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without 266959d1ed5bSDimitry Andric // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing 267059d1ed5bSDimitry Andric // that changes the section it ends in, which surprises ld64. 2671f22ef01cSRoman Divacky if (isUTF16) { 2672f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy); 2673f22ef01cSRoman Divacky GV->setAlignment(Align.getQuantity()); 267459d1ed5bSDimitry Andric GV->setSection("__TEXT,__ustring"); 26753b0f4066SDimitry Andric } else { 26763b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 26773b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 267859d1ed5bSDimitry Andric GV->setSection("__TEXT,__cstring,cstring_literals"); 2679f22ef01cSRoman Divacky } 2680dff0c46cSDimitry Andric 2681dff0c46cSDimitry Andric // String. 268233956c43SDimitry Andric Fields[2] = 268333956c43SDimitry Andric llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros); 2684f22ef01cSRoman Divacky 2685dff0c46cSDimitry Andric if (isUTF16) 2686dff0c46cSDimitry Andric // Cast the UTF16 string to the correct type. 2687dff0c46cSDimitry Andric Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy); 2688dff0c46cSDimitry Andric 2689f22ef01cSRoman Divacky // String length. 2690f22ef01cSRoman Divacky Ty = getTypes().ConvertType(getContext().LongTy); 2691f22ef01cSRoman Divacky Fields[3] = llvm::ConstantInt::get(Ty, StringLength); 2692f22ef01cSRoman Divacky 2693f22ef01cSRoman Divacky // The struct. 2694f22ef01cSRoman Divacky C = llvm::ConstantStruct::get(STy, Fields); 2695f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2696f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2697f22ef01cSRoman Divacky "_unnamed_cfstring_"); 269859d1ed5bSDimitry Andric GV->setSection("__DATA,__cfstring"); 269939d628a0SDimitry Andric Entry.second = GV; 2700f22ef01cSRoman Divacky 2701f22ef01cSRoman Divacky return GV; 2702f22ef01cSRoman Divacky } 2703f22ef01cSRoman Divacky 270433956c43SDimitry Andric llvm::GlobalVariable * 27052754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) { 2706f22ef01cSRoman Divacky unsigned StringLength = 0; 270733956c43SDimitry Andric llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = 2708bd5abe19SDimitry Andric GetConstantStringEntry(CFConstantStringMap, Literal, StringLength); 2709f22ef01cSRoman Divacky 271039d628a0SDimitry Andric if (auto *C = Entry.second) 2711f22ef01cSRoman Divacky return C; 2712f22ef01cSRoman Divacky 2713dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2714f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2715284c1978SDimitry Andric llvm::Value *V; 2716f22ef01cSRoman Divacky // If we don't already have it, get _NSConstantStringClassReference. 27172754fe60SDimitry Andric if (!ConstantStringClassRef) { 2718dff0c46cSDimitry Andric std::string StringClass(getLangOpts().ObjCConstantStringClass); 27196122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 27202754fe60SDimitry Andric llvm::Constant *GV; 27217ae0e2c9SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 2722bd5abe19SDimitry Andric std::string str = 2723bd5abe19SDimitry Andric StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" 2724bd5abe19SDimitry Andric : "OBJC_CLASS_$_" + StringClass; 2725bd5abe19SDimitry Andric GV = getObjCRuntime().GetClassGlobal(str); 2726bd5abe19SDimitry Andric // Make sure the result is of the correct type. 27276122f3e6SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 2728284c1978SDimitry Andric V = llvm::ConstantExpr::getBitCast(GV, PTy); 2729284c1978SDimitry Andric ConstantStringClassRef = V; 2730bd5abe19SDimitry Andric } else { 2731bd5abe19SDimitry Andric std::string str = 2732bd5abe19SDimitry Andric StringClass.empty() ? "_NSConstantStringClassReference" 2733bd5abe19SDimitry Andric : "_" + StringClass + "ClassReference"; 27346122f3e6SDimitry Andric llvm::Type *PTy = llvm::ArrayType::get(Ty, 0); 2735bd5abe19SDimitry Andric GV = CreateRuntimeVariable(PTy, str); 2736f22ef01cSRoman Divacky // Decay array -> ptr 273733956c43SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(PTy, GV, Zeros); 2738284c1978SDimitry Andric ConstantStringClassRef = V; 2739f22ef01cSRoman Divacky } 274033956c43SDimitry Andric } else 2741284c1978SDimitry Andric V = ConstantStringClassRef; 2742f22ef01cSRoman Divacky 27436122f3e6SDimitry Andric if (!NSConstantStringType) { 27446122f3e6SDimitry Andric // Construct the type for a constant NSString. 274559d1ed5bSDimitry Andric RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString"); 27466122f3e6SDimitry Andric D->startDefinition(); 2747f22ef01cSRoman Divacky 27486122f3e6SDimitry Andric QualType FieldTypes[3]; 27496122f3e6SDimitry Andric 27506122f3e6SDimitry Andric // const int *isa; 27516122f3e6SDimitry Andric FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst()); 27526122f3e6SDimitry Andric // const char *str; 27536122f3e6SDimitry Andric FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst()); 27546122f3e6SDimitry Andric // unsigned int length; 27556122f3e6SDimitry Andric FieldTypes[2] = Context.UnsignedIntTy; 27566122f3e6SDimitry Andric 27576122f3e6SDimitry Andric // Create fields 27586122f3e6SDimitry Andric for (unsigned i = 0; i < 3; ++i) { 27596122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, D, 27606122f3e6SDimitry Andric SourceLocation(), 276159d1ed5bSDimitry Andric SourceLocation(), nullptr, 276259d1ed5bSDimitry Andric FieldTypes[i], /*TInfo=*/nullptr, 276359d1ed5bSDimitry Andric /*BitWidth=*/nullptr, 27646122f3e6SDimitry Andric /*Mutable=*/false, 27657ae0e2c9SDimitry Andric ICIS_NoInit); 27666122f3e6SDimitry Andric Field->setAccess(AS_public); 27676122f3e6SDimitry Andric D->addDecl(Field); 27686122f3e6SDimitry Andric } 27696122f3e6SDimitry Andric 27706122f3e6SDimitry Andric D->completeDefinition(); 27716122f3e6SDimitry Andric QualType NSTy = Context.getTagDeclType(D); 27726122f3e6SDimitry Andric NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy)); 27736122f3e6SDimitry Andric } 2774f22ef01cSRoman Divacky 2775dff0c46cSDimitry Andric llvm::Constant *Fields[3]; 2776f22ef01cSRoman Divacky 2777f22ef01cSRoman Divacky // Class pointer. 2778284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2779f22ef01cSRoman Divacky 2780f22ef01cSRoman Divacky // String pointer. 2781dff0c46cSDimitry Andric llvm::Constant *C = 278239d628a0SDimitry Andric llvm::ConstantDataArray::getString(VMContext, Entry.first()); 2783f22ef01cSRoman Divacky 2784f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2785f22ef01cSRoman Divacky bool isConstant; 2786f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::PrivateLinkage; 2787dff0c46cSDimitry Andric isConstant = !LangOpts.WritableStrings; 2788f22ef01cSRoman Divacky 278959d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant, 279059d1ed5bSDimitry Andric Linkage, C, ".str"); 27912754fe60SDimitry Andric GV->setUnnamedAddr(true); 2792284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2793284c1978SDimitry Andric // of the string is via this class initializer. 27943b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 27953b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 279633956c43SDimitry Andric Fields[1] = 279733956c43SDimitry Andric llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros); 2798f22ef01cSRoman Divacky 2799f22ef01cSRoman Divacky // String length. 28006122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2801f22ef01cSRoman Divacky Fields[2] = llvm::ConstantInt::get(Ty, StringLength); 2802f22ef01cSRoman Divacky 2803f22ef01cSRoman Divacky // The struct. 28046122f3e6SDimitry Andric C = llvm::ConstantStruct::get(NSConstantStringType, Fields); 2805f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2806f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2807f22ef01cSRoman Divacky "_unnamed_nsstring_"); 280859d1ed5bSDimitry Andric const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip"; 280959d1ed5bSDimitry Andric const char *NSStringNonFragileABISection = 281059d1ed5bSDimitry Andric "__DATA,__objc_stringobj,regular,no_dead_strip"; 2811f22ef01cSRoman Divacky // FIXME. Fix section. 281259d1ed5bSDimitry Andric GV->setSection(LangOpts.ObjCRuntime.isNonFragile() 281359d1ed5bSDimitry Andric ? NSStringNonFragileABISection 281459d1ed5bSDimitry Andric : NSStringSection); 281539d628a0SDimitry Andric Entry.second = GV; 2816f22ef01cSRoman Divacky 2817f22ef01cSRoman Divacky return GV; 2818f22ef01cSRoman Divacky } 2819f22ef01cSRoman Divacky 28206122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() { 28216122f3e6SDimitry Andric if (ObjCFastEnumerationStateType.isNull()) { 282259d1ed5bSDimitry Andric RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState"); 28236122f3e6SDimitry Andric D->startDefinition(); 28246122f3e6SDimitry Andric 28256122f3e6SDimitry Andric QualType FieldTypes[] = { 28266122f3e6SDimitry Andric Context.UnsignedLongTy, 28276122f3e6SDimitry Andric Context.getPointerType(Context.getObjCIdType()), 28286122f3e6SDimitry Andric Context.getPointerType(Context.UnsignedLongTy), 28296122f3e6SDimitry Andric Context.getConstantArrayType(Context.UnsignedLongTy, 28306122f3e6SDimitry Andric llvm::APInt(32, 5), ArrayType::Normal, 0) 28316122f3e6SDimitry Andric }; 28326122f3e6SDimitry Andric 28336122f3e6SDimitry Andric for (size_t i = 0; i < 4; ++i) { 28346122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, 28356122f3e6SDimitry Andric D, 28366122f3e6SDimitry Andric SourceLocation(), 283759d1ed5bSDimitry Andric SourceLocation(), nullptr, 283859d1ed5bSDimitry Andric FieldTypes[i], /*TInfo=*/nullptr, 283959d1ed5bSDimitry Andric /*BitWidth=*/nullptr, 28406122f3e6SDimitry Andric /*Mutable=*/false, 28417ae0e2c9SDimitry Andric ICIS_NoInit); 28426122f3e6SDimitry Andric Field->setAccess(AS_public); 28436122f3e6SDimitry Andric D->addDecl(Field); 28446122f3e6SDimitry Andric } 28456122f3e6SDimitry Andric 28466122f3e6SDimitry Andric D->completeDefinition(); 28476122f3e6SDimitry Andric ObjCFastEnumerationStateType = Context.getTagDeclType(D); 28486122f3e6SDimitry Andric } 28496122f3e6SDimitry Andric 28506122f3e6SDimitry Andric return ObjCFastEnumerationStateType; 28516122f3e6SDimitry Andric } 28526122f3e6SDimitry Andric 2853dff0c46cSDimitry Andric llvm::Constant * 2854dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { 2855dff0c46cSDimitry Andric assert(!E->getType()->isPointerType() && "Strings are always arrays"); 2856f22ef01cSRoman Divacky 2857dff0c46cSDimitry Andric // Don't emit it as the address of the string, emit the string data itself 2858dff0c46cSDimitry Andric // as an inline array. 2859dff0c46cSDimitry Andric if (E->getCharByteWidth() == 1) { 2860dff0c46cSDimitry Andric SmallString<64> Str(E->getString()); 2861f22ef01cSRoman Divacky 2862dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2863dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType()); 2864dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2865dff0c46cSDimitry Andric return llvm::ConstantDataArray::getString(VMContext, Str, false); 28666122f3e6SDimitry Andric } 2867f22ef01cSRoman Divacky 286859d1ed5bSDimitry Andric auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType())); 2869dff0c46cSDimitry Andric llvm::Type *ElemTy = AType->getElementType(); 2870dff0c46cSDimitry Andric unsigned NumElements = AType->getNumElements(); 2871f22ef01cSRoman Divacky 2872dff0c46cSDimitry Andric // Wide strings have either 2-byte or 4-byte elements. 2873dff0c46cSDimitry Andric if (ElemTy->getPrimitiveSizeInBits() == 16) { 2874dff0c46cSDimitry Andric SmallVector<uint16_t, 32> Elements; 2875dff0c46cSDimitry Andric Elements.reserve(NumElements); 2876dff0c46cSDimitry Andric 2877dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2878dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2879dff0c46cSDimitry Andric Elements.resize(NumElements); 2880dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2881dff0c46cSDimitry Andric } 2882dff0c46cSDimitry Andric 2883dff0c46cSDimitry Andric assert(ElemTy->getPrimitiveSizeInBits() == 32); 2884dff0c46cSDimitry Andric SmallVector<uint32_t, 32> Elements; 2885dff0c46cSDimitry Andric Elements.reserve(NumElements); 2886dff0c46cSDimitry Andric 2887dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2888dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2889dff0c46cSDimitry Andric Elements.resize(NumElements); 2890dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2891f22ef01cSRoman Divacky } 2892f22ef01cSRoman Divacky 289359d1ed5bSDimitry Andric static llvm::GlobalVariable * 289459d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, 289559d1ed5bSDimitry Andric CodeGenModule &CGM, StringRef GlobalName, 289659d1ed5bSDimitry Andric unsigned Alignment) { 289759d1ed5bSDimitry Andric // OpenCL v1.2 s6.5.3: a string literal is in the constant address space. 289859d1ed5bSDimitry Andric unsigned AddrSpace = 0; 289959d1ed5bSDimitry Andric if (CGM.getLangOpts().OpenCL) 290059d1ed5bSDimitry Andric AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant); 2901dff0c46cSDimitry Andric 290233956c43SDimitry Andric llvm::Module &M = CGM.getModule(); 290359d1ed5bSDimitry Andric // Create a global variable for this string 290459d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 290533956c43SDimitry Andric M, C->getType(), !CGM.getLangOpts().WritableStrings, LT, C, GlobalName, 290633956c43SDimitry Andric nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace); 290759d1ed5bSDimitry Andric GV->setAlignment(Alignment); 290859d1ed5bSDimitry Andric GV->setUnnamedAddr(true); 290933956c43SDimitry Andric if (GV->isWeakForLinker()) { 291033956c43SDimitry Andric assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals"); 291133956c43SDimitry Andric GV->setComdat(M.getOrInsertComdat(GV->getName())); 291233956c43SDimitry Andric } 291333956c43SDimitry Andric 291459d1ed5bSDimitry Andric return GV; 2915f22ef01cSRoman Divacky } 2916dff0c46cSDimitry Andric 291759d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a 291859d1ed5bSDimitry Andric /// constant array for the given string literal. 291959d1ed5bSDimitry Andric llvm::GlobalVariable * 292039d628a0SDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S, 292139d628a0SDimitry Andric StringRef Name) { 292259d1ed5bSDimitry Andric auto Alignment = 292359d1ed5bSDimitry Andric getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity(); 2924dff0c46cSDimitry Andric 292559d1ed5bSDimitry Andric llvm::Constant *C = GetConstantArrayFromStringLiteral(S); 292659d1ed5bSDimitry Andric llvm::GlobalVariable **Entry = nullptr; 292759d1ed5bSDimitry Andric if (!LangOpts.WritableStrings) { 292859d1ed5bSDimitry Andric Entry = &ConstantStringMap[C]; 292959d1ed5bSDimitry Andric if (auto GV = *Entry) { 293059d1ed5bSDimitry Andric if (Alignment > GV->getAlignment()) 293159d1ed5bSDimitry Andric GV->setAlignment(Alignment); 293259d1ed5bSDimitry Andric return GV; 293359d1ed5bSDimitry Andric } 293459d1ed5bSDimitry Andric } 293559d1ed5bSDimitry Andric 293659d1ed5bSDimitry Andric SmallString<256> MangledNameBuffer; 293759d1ed5bSDimitry Andric StringRef GlobalVariableName; 293859d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes LT; 293959d1ed5bSDimitry Andric 294059d1ed5bSDimitry Andric // Mangle the string literal if the ABI allows for it. However, we cannot 294159d1ed5bSDimitry Andric // do this if we are compiling with ASan or -fwritable-strings because they 294259d1ed5bSDimitry Andric // rely on strings having normal linkage. 294339d628a0SDimitry Andric if (!LangOpts.WritableStrings && 294439d628a0SDimitry Andric !LangOpts.Sanitize.has(SanitizerKind::Address) && 294559d1ed5bSDimitry Andric getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) { 294659d1ed5bSDimitry Andric llvm::raw_svector_ostream Out(MangledNameBuffer); 294759d1ed5bSDimitry Andric getCXXABI().getMangleContext().mangleStringLiteral(S, Out); 294859d1ed5bSDimitry Andric Out.flush(); 294959d1ed5bSDimitry Andric 295059d1ed5bSDimitry Andric LT = llvm::GlobalValue::LinkOnceODRLinkage; 295159d1ed5bSDimitry Andric GlobalVariableName = MangledNameBuffer; 295259d1ed5bSDimitry Andric } else { 295359d1ed5bSDimitry Andric LT = llvm::GlobalValue::PrivateLinkage; 295439d628a0SDimitry Andric GlobalVariableName = Name; 295559d1ed5bSDimitry Andric } 295659d1ed5bSDimitry Andric 295759d1ed5bSDimitry Andric auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment); 295859d1ed5bSDimitry Andric if (Entry) 295959d1ed5bSDimitry Andric *Entry = GV; 296059d1ed5bSDimitry Andric 296139d628a0SDimitry Andric SanitizerMD->reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>", 296239d628a0SDimitry Andric QualType()); 2963dff0c46cSDimitry Andric return GV; 2964f22ef01cSRoman Divacky } 2965f22ef01cSRoman Divacky 2966f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant 2967f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node. 296859d1ed5bSDimitry Andric llvm::GlobalVariable * 2969f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { 2970f22ef01cSRoman Divacky std::string Str; 2971f22ef01cSRoman Divacky getContext().getObjCEncodingForType(E->getEncodedType(), Str); 2972f22ef01cSRoman Divacky 2973f22ef01cSRoman Divacky return GetAddrOfConstantCString(Str); 2974f22ef01cSRoman Divacky } 2975f22ef01cSRoman Divacky 297659d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing 297759d1ed5bSDimitry Andric /// the literal and a terminating '\0' character. 297859d1ed5bSDimitry Andric /// The result has pointer to array type. 297959d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString( 298059d1ed5bSDimitry Andric const std::string &Str, const char *GlobalName, unsigned Alignment) { 298159d1ed5bSDimitry Andric StringRef StrWithNull(Str.c_str(), Str.size() + 1); 298259d1ed5bSDimitry Andric if (Alignment == 0) { 298359d1ed5bSDimitry Andric Alignment = getContext() 298459d1ed5bSDimitry Andric .getAlignOfGlobalVarInChars(getContext().CharTy) 298559d1ed5bSDimitry Andric .getQuantity(); 2986f22ef01cSRoman Divacky } 2987f22ef01cSRoman Divacky 298859d1ed5bSDimitry Andric llvm::Constant *C = 298959d1ed5bSDimitry Andric llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false); 299059d1ed5bSDimitry Andric 299159d1ed5bSDimitry Andric // Don't share any string literals if strings aren't constant. 299259d1ed5bSDimitry Andric llvm::GlobalVariable **Entry = nullptr; 299359d1ed5bSDimitry Andric if (!LangOpts.WritableStrings) { 299459d1ed5bSDimitry Andric Entry = &ConstantStringMap[C]; 299559d1ed5bSDimitry Andric if (auto GV = *Entry) { 299659d1ed5bSDimitry Andric if (Alignment > GV->getAlignment()) 299759d1ed5bSDimitry Andric GV->setAlignment(Alignment); 299859d1ed5bSDimitry Andric return GV; 299959d1ed5bSDimitry Andric } 300059d1ed5bSDimitry Andric } 300159d1ed5bSDimitry Andric 3002f22ef01cSRoman Divacky // Get the default prefix if a name wasn't specified. 3003f22ef01cSRoman Divacky if (!GlobalName) 3004f22ef01cSRoman Divacky GlobalName = ".str"; 3005f22ef01cSRoman Divacky // Create a global variable for this. 300659d1ed5bSDimitry Andric auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this, 300759d1ed5bSDimitry Andric GlobalName, Alignment); 300859d1ed5bSDimitry Andric if (Entry) 300959d1ed5bSDimitry Andric *Entry = GV; 30106122f3e6SDimitry Andric return GV; 3011f22ef01cSRoman Divacky } 3012f22ef01cSRoman Divacky 3013f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary( 3014f785676fSDimitry Andric const MaterializeTemporaryExpr *E, const Expr *Init) { 3015f785676fSDimitry Andric assert((E->getStorageDuration() == SD_Static || 3016f785676fSDimitry Andric E->getStorageDuration() == SD_Thread) && "not a global temporary"); 301759d1ed5bSDimitry Andric const auto *VD = cast<VarDecl>(E->getExtendingDecl()); 3018f785676fSDimitry Andric 3019f785676fSDimitry Andric // If we're not materializing a subobject of the temporary, keep the 3020f785676fSDimitry Andric // cv-qualifiers from the type of the MaterializeTemporaryExpr. 3021f785676fSDimitry Andric QualType MaterializedType = Init->getType(); 3022f785676fSDimitry Andric if (Init == E->GetTemporaryExpr()) 3023f785676fSDimitry Andric MaterializedType = E->getType(); 3024f785676fSDimitry Andric 3025f785676fSDimitry Andric llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E]; 3026f785676fSDimitry Andric if (Slot) 3027f785676fSDimitry Andric return Slot; 3028f785676fSDimitry Andric 3029f785676fSDimitry Andric // FIXME: If an externally-visible declaration extends multiple temporaries, 3030f785676fSDimitry Andric // we need to give each temporary the same name in every translation unit (and 3031f785676fSDimitry Andric // we also need to make the temporaries externally-visible). 3032f785676fSDimitry Andric SmallString<256> Name; 3033f785676fSDimitry Andric llvm::raw_svector_ostream Out(Name); 303459d1ed5bSDimitry Andric getCXXABI().getMangleContext().mangleReferenceTemporary( 303559d1ed5bSDimitry Andric VD, E->getManglingNumber(), Out); 3036f785676fSDimitry Andric Out.flush(); 3037f785676fSDimitry Andric 303859d1ed5bSDimitry Andric APValue *Value = nullptr; 3039f785676fSDimitry Andric if (E->getStorageDuration() == SD_Static) { 3040f785676fSDimitry Andric // We might have a cached constant initializer for this temporary. Note 3041f785676fSDimitry Andric // that this might have a different value from the value computed by 3042f785676fSDimitry Andric // evaluating the initializer if the surrounding constant expression 3043f785676fSDimitry Andric // modifies the temporary. 3044f785676fSDimitry Andric Value = getContext().getMaterializedTemporaryValue(E, false); 3045f785676fSDimitry Andric if (Value && Value->isUninit()) 304659d1ed5bSDimitry Andric Value = nullptr; 3047f785676fSDimitry Andric } 3048f785676fSDimitry Andric 3049f785676fSDimitry Andric // Try evaluating it now, it might have a constant initializer. 3050f785676fSDimitry Andric Expr::EvalResult EvalResult; 3051f785676fSDimitry Andric if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) && 3052f785676fSDimitry Andric !EvalResult.hasSideEffects()) 3053f785676fSDimitry Andric Value = &EvalResult.Val; 3054f785676fSDimitry Andric 305559d1ed5bSDimitry Andric llvm::Constant *InitialValue = nullptr; 3056f785676fSDimitry Andric bool Constant = false; 3057f785676fSDimitry Andric llvm::Type *Type; 3058f785676fSDimitry Andric if (Value) { 3059f785676fSDimitry Andric // The temporary has a constant initializer, use it. 306059d1ed5bSDimitry Andric InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr); 3061f785676fSDimitry Andric Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value); 3062f785676fSDimitry Andric Type = InitialValue->getType(); 3063f785676fSDimitry Andric } else { 3064f785676fSDimitry Andric // No initializer, the initialization will be provided when we 3065f785676fSDimitry Andric // initialize the declaration which performed lifetime extension. 3066f785676fSDimitry Andric Type = getTypes().ConvertTypeForMem(MaterializedType); 3067f785676fSDimitry Andric } 3068f785676fSDimitry Andric 3069f785676fSDimitry Andric // Create a global variable for this lifetime-extended temporary. 307059d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 307159d1ed5bSDimitry Andric getLLVMLinkageVarDefinition(VD, Constant); 307233956c43SDimitry Andric if (Linkage == llvm::GlobalVariable::ExternalLinkage) { 307333956c43SDimitry Andric const VarDecl *InitVD; 307433956c43SDimitry Andric if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) && 307533956c43SDimitry Andric isa<CXXRecordDecl>(InitVD->getLexicalDeclContext())) { 307633956c43SDimitry Andric // Temporaries defined inside a class get linkonce_odr linkage because the 307733956c43SDimitry Andric // class can be defined in multipe translation units. 307833956c43SDimitry Andric Linkage = llvm::GlobalVariable::LinkOnceODRLinkage; 307933956c43SDimitry Andric } else { 308033956c43SDimitry Andric // There is no need for this temporary to have external linkage if the 308133956c43SDimitry Andric // VarDecl has external linkage. 308233956c43SDimitry Andric Linkage = llvm::GlobalVariable::InternalLinkage; 308333956c43SDimitry Andric } 308433956c43SDimitry Andric } 308559d1ed5bSDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace( 308659d1ed5bSDimitry Andric VD, getContext().getTargetAddressSpace(MaterializedType)); 308759d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable( 308859d1ed5bSDimitry Andric getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(), 308959d1ed5bSDimitry Andric /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, 309059d1ed5bSDimitry Andric AddrSpace); 309159d1ed5bSDimitry Andric setGlobalVisibility(GV, VD); 3092f785676fSDimitry Andric GV->setAlignment( 3093f785676fSDimitry Andric getContext().getTypeAlignInChars(MaterializedType).getQuantity()); 309433956c43SDimitry Andric if (supportsCOMDAT() && GV->isWeakForLinker()) 309533956c43SDimitry Andric GV->setComdat(TheModule.getOrInsertComdat(GV->getName())); 3096f785676fSDimitry Andric if (VD->getTLSKind()) 3097f785676fSDimitry Andric setTLSMode(GV, *VD); 3098f785676fSDimitry Andric Slot = GV; 3099f785676fSDimitry Andric return GV; 3100f785676fSDimitry Andric } 3101f785676fSDimitry Andric 3102f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized 3103f22ef01cSRoman Divacky /// properties for an implementation. 3104f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const 3105f22ef01cSRoman Divacky ObjCImplementationDecl *D) { 310659d1ed5bSDimitry Andric for (const auto *PID : D->property_impls()) { 3107f22ef01cSRoman Divacky // Dynamic is just for type-checking. 3108f22ef01cSRoman Divacky if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 3109f22ef01cSRoman Divacky ObjCPropertyDecl *PD = PID->getPropertyDecl(); 3110f22ef01cSRoman Divacky 3111f22ef01cSRoman Divacky // Determine which methods need to be implemented, some may have 31123861d79fSDimitry Andric // been overridden. Note that ::isPropertyAccessor is not the method 3113f22ef01cSRoman Divacky // we want, that just indicates if the decl came from a 3114f22ef01cSRoman Divacky // property. What we want to know is if the method is defined in 3115f22ef01cSRoman Divacky // this implementation. 3116f22ef01cSRoman Divacky if (!D->getInstanceMethod(PD->getGetterName())) 3117f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCGetter( 3118f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 3119f22ef01cSRoman Divacky if (!PD->isReadOnly() && 3120f22ef01cSRoman Divacky !D->getInstanceMethod(PD->getSetterName())) 3121f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCSetter( 3122f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 3123f22ef01cSRoman Divacky } 3124f22ef01cSRoman Divacky } 3125f22ef01cSRoman Divacky } 3126f22ef01cSRoman Divacky 31273b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) { 31286122f3e6SDimitry Andric const ObjCInterfaceDecl *iface = impl->getClassInterface(); 31296122f3e6SDimitry Andric for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin(); 31303b0f4066SDimitry Andric ivar; ivar = ivar->getNextIvar()) 31313b0f4066SDimitry Andric if (ivar->getType().isDestructedType()) 31323b0f4066SDimitry Andric return true; 31333b0f4066SDimitry Andric 31343b0f4066SDimitry Andric return false; 31353b0f4066SDimitry Andric } 31363b0f4066SDimitry Andric 313739d628a0SDimitry Andric static bool AllTrivialInitializers(CodeGenModule &CGM, 313839d628a0SDimitry Andric ObjCImplementationDecl *D) { 313939d628a0SDimitry Andric CodeGenFunction CGF(CGM); 314039d628a0SDimitry Andric for (ObjCImplementationDecl::init_iterator B = D->init_begin(), 314139d628a0SDimitry Andric E = D->init_end(); B != E; ++B) { 314239d628a0SDimitry Andric CXXCtorInitializer *CtorInitExp = *B; 314339d628a0SDimitry Andric Expr *Init = CtorInitExp->getInit(); 314439d628a0SDimitry Andric if (!CGF.isTrivialInitializer(Init)) 314539d628a0SDimitry Andric return false; 314639d628a0SDimitry Andric } 314739d628a0SDimitry Andric return true; 314839d628a0SDimitry Andric } 314939d628a0SDimitry Andric 3150f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization 3151f22ef01cSRoman Divacky /// for an implementation. 3152f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) { 31533b0f4066SDimitry Andric // We might need a .cxx_destruct even if we don't have any ivar initializers. 31543b0f4066SDimitry Andric if (needsDestructMethod(D)) { 3155f22ef01cSRoman Divacky IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct"); 3156f22ef01cSRoman Divacky Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 31573b0f4066SDimitry Andric ObjCMethodDecl *DTORMethod = 31583b0f4066SDimitry Andric ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(), 315959d1ed5bSDimitry Andric cxxSelector, getContext().VoidTy, nullptr, D, 31606122f3e6SDimitry Andric /*isInstance=*/true, /*isVariadic=*/false, 31613861d79fSDimitry Andric /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true, 31626122f3e6SDimitry Andric /*isDefined=*/false, ObjCMethodDecl::Required); 3163f22ef01cSRoman Divacky D->addInstanceMethod(DTORMethod); 3164f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false); 31653861d79fSDimitry Andric D->setHasDestructors(true); 31663b0f4066SDimitry Andric } 3167f22ef01cSRoman Divacky 31683b0f4066SDimitry Andric // If the implementation doesn't have any ivar initializers, we don't need 31693b0f4066SDimitry Andric // a .cxx_construct. 317039d628a0SDimitry Andric if (D->getNumIvarInitializers() == 0 || 317139d628a0SDimitry Andric AllTrivialInitializers(*this, D)) 31723b0f4066SDimitry Andric return; 31733b0f4066SDimitry Andric 31743b0f4066SDimitry Andric IdentifierInfo *II = &getContext().Idents.get(".cxx_construct"); 31753b0f4066SDimitry Andric Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 3176f22ef01cSRoman Divacky // The constructor returns 'self'. 3177f22ef01cSRoman Divacky ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(), 3178f22ef01cSRoman Divacky D->getLocation(), 31796122f3e6SDimitry Andric D->getLocation(), 31806122f3e6SDimitry Andric cxxSelector, 318159d1ed5bSDimitry Andric getContext().getObjCIdType(), 318259d1ed5bSDimitry Andric nullptr, D, /*isInstance=*/true, 31836122f3e6SDimitry Andric /*isVariadic=*/false, 31843861d79fSDimitry Andric /*isPropertyAccessor=*/true, 31856122f3e6SDimitry Andric /*isImplicitlyDeclared=*/true, 31866122f3e6SDimitry Andric /*isDefined=*/false, 3187f22ef01cSRoman Divacky ObjCMethodDecl::Required); 3188f22ef01cSRoman Divacky D->addInstanceMethod(CTORMethod); 3189f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true); 31903861d79fSDimitry Andric D->setHasNonZeroConstructors(true); 3191f22ef01cSRoman Divacky } 3192f22ef01cSRoman Divacky 3193f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace. 3194f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) { 319559d1ed5bSDimitry Andric for (auto *I : ND->decls()) { 319659d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(I)) 3197f785676fSDimitry Andric if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization && 3198f785676fSDimitry Andric VD->getTemplateSpecializationKind() != TSK_Undeclared) 3199f785676fSDimitry Andric continue; 320059d1ed5bSDimitry Andric EmitTopLevelDecl(I); 3201f22ef01cSRoman Divacky } 3202f785676fSDimitry Andric } 3203f22ef01cSRoman Divacky 3204f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec. 3205f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { 3206f22ef01cSRoman Divacky if (LSD->getLanguage() != LinkageSpecDecl::lang_c && 3207f22ef01cSRoman Divacky LSD->getLanguage() != LinkageSpecDecl::lang_cxx) { 3208f22ef01cSRoman Divacky ErrorUnsupported(LSD, "linkage spec"); 3209f22ef01cSRoman Divacky return; 3210f22ef01cSRoman Divacky } 3211f22ef01cSRoman Divacky 321259d1ed5bSDimitry Andric for (auto *I : LSD->decls()) { 32133861d79fSDimitry Andric // Meta-data for ObjC class includes references to implemented methods. 32143861d79fSDimitry Andric // Generate class's method definitions first. 321559d1ed5bSDimitry Andric if (auto *OID = dyn_cast<ObjCImplDecl>(I)) { 321659d1ed5bSDimitry Andric for (auto *M : OID->methods()) 321759d1ed5bSDimitry Andric EmitTopLevelDecl(M); 32183861d79fSDimitry Andric } 321959d1ed5bSDimitry Andric EmitTopLevelDecl(I); 3220f22ef01cSRoman Divacky } 32213861d79fSDimitry Andric } 3222f22ef01cSRoman Divacky 3223f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration. 3224f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) { 3225f22ef01cSRoman Divacky // Ignore dependent declarations. 3226f22ef01cSRoman Divacky if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) 3227f22ef01cSRoman Divacky return; 3228f22ef01cSRoman Divacky 3229f22ef01cSRoman Divacky switch (D->getKind()) { 3230f22ef01cSRoman Divacky case Decl::CXXConversion: 3231f22ef01cSRoman Divacky case Decl::CXXMethod: 3232f22ef01cSRoman Divacky case Decl::Function: 3233f22ef01cSRoman Divacky // Skip function templates 32343b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 32353b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 3236f22ef01cSRoman Divacky return; 3237f22ef01cSRoman Divacky 3238f22ef01cSRoman Divacky EmitGlobal(cast<FunctionDecl>(D)); 323939d628a0SDimitry Andric // Always provide some coverage mapping 324039d628a0SDimitry Andric // even for the functions that aren't emitted. 324139d628a0SDimitry Andric AddDeferredUnusedCoverageMapping(D); 3242f22ef01cSRoman Divacky break; 3243f22ef01cSRoman Divacky 3244f22ef01cSRoman Divacky case Decl::Var: 3245f785676fSDimitry Andric // Skip variable templates 3246f785676fSDimitry Andric if (cast<VarDecl>(D)->getDescribedVarTemplate()) 3247f785676fSDimitry Andric return; 3248f785676fSDimitry Andric case Decl::VarTemplateSpecialization: 3249f22ef01cSRoman Divacky EmitGlobal(cast<VarDecl>(D)); 3250f22ef01cSRoman Divacky break; 3251f22ef01cSRoman Divacky 32523b0f4066SDimitry Andric // Indirect fields from global anonymous structs and unions can be 32533b0f4066SDimitry Andric // ignored; only the actual variable requires IR gen support. 32543b0f4066SDimitry Andric case Decl::IndirectField: 32553b0f4066SDimitry Andric break; 32563b0f4066SDimitry Andric 3257f22ef01cSRoman Divacky // C++ Decls 3258f22ef01cSRoman Divacky case Decl::Namespace: 3259f22ef01cSRoman Divacky EmitNamespace(cast<NamespaceDecl>(D)); 3260f22ef01cSRoman Divacky break; 3261f22ef01cSRoman Divacky // No code generation needed. 3262f22ef01cSRoman Divacky case Decl::UsingShadow: 3263f22ef01cSRoman Divacky case Decl::ClassTemplate: 3264f785676fSDimitry Andric case Decl::VarTemplate: 3265f785676fSDimitry Andric case Decl::VarTemplatePartialSpecialization: 3266f22ef01cSRoman Divacky case Decl::FunctionTemplate: 3267bd5abe19SDimitry Andric case Decl::TypeAliasTemplate: 3268bd5abe19SDimitry Andric case Decl::Block: 3269139f7f9bSDimitry Andric case Decl::Empty: 3270f22ef01cSRoman Divacky break; 327159d1ed5bSDimitry Andric case Decl::Using: // using X; [C++] 327259d1ed5bSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 327359d1ed5bSDimitry Andric DI->EmitUsingDecl(cast<UsingDecl>(*D)); 327459d1ed5bSDimitry Andric return; 3275f785676fSDimitry Andric case Decl::NamespaceAlias: 3276f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3277f785676fSDimitry Andric DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D)); 3278f785676fSDimitry Andric return; 3279284c1978SDimitry Andric case Decl::UsingDirective: // using namespace X; [C++] 3280284c1978SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3281284c1978SDimitry Andric DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D)); 3282284c1978SDimitry Andric return; 3283f22ef01cSRoman Divacky case Decl::CXXConstructor: 3284f22ef01cSRoman Divacky // Skip function templates 32853b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 32863b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 3287f22ef01cSRoman Divacky return; 3288f22ef01cSRoman Divacky 3289f785676fSDimitry Andric getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D)); 3290f22ef01cSRoman Divacky break; 3291f22ef01cSRoman Divacky case Decl::CXXDestructor: 32923b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->isLateTemplateParsed()) 32933b0f4066SDimitry Andric return; 3294f785676fSDimitry Andric getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D)); 3295f22ef01cSRoman Divacky break; 3296f22ef01cSRoman Divacky 3297f22ef01cSRoman Divacky case Decl::StaticAssert: 3298f22ef01cSRoman Divacky // Nothing to do. 3299f22ef01cSRoman Divacky break; 3300f22ef01cSRoman Divacky 3301f22ef01cSRoman Divacky // Objective-C Decls 3302f22ef01cSRoman Divacky 3303f22ef01cSRoman Divacky // Forward declarations, no (immediate) code generation. 3304f22ef01cSRoman Divacky case Decl::ObjCInterface: 33057ae0e2c9SDimitry Andric case Decl::ObjCCategory: 3306f22ef01cSRoman Divacky break; 3307f22ef01cSRoman Divacky 3308dff0c46cSDimitry Andric case Decl::ObjCProtocol: { 330959d1ed5bSDimitry Andric auto *Proto = cast<ObjCProtocolDecl>(D); 3310dff0c46cSDimitry Andric if (Proto->isThisDeclarationADefinition()) 3311dff0c46cSDimitry Andric ObjCRuntime->GenerateProtocol(Proto); 3312f22ef01cSRoman Divacky break; 3313dff0c46cSDimitry Andric } 3314f22ef01cSRoman Divacky 3315f22ef01cSRoman Divacky case Decl::ObjCCategoryImpl: 3316f22ef01cSRoman Divacky // Categories have properties but don't support synthesize so we 3317f22ef01cSRoman Divacky // can ignore them here. 33186122f3e6SDimitry Andric ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 3319f22ef01cSRoman Divacky break; 3320f22ef01cSRoman Divacky 3321f22ef01cSRoman Divacky case Decl::ObjCImplementation: { 332259d1ed5bSDimitry Andric auto *OMD = cast<ObjCImplementationDecl>(D); 3323f22ef01cSRoman Divacky EmitObjCPropertyImplementations(OMD); 3324f22ef01cSRoman Divacky EmitObjCIvarInitializations(OMD); 33256122f3e6SDimitry Andric ObjCRuntime->GenerateClass(OMD); 3326dff0c46cSDimitry Andric // Emit global variable debug information. 3327dff0c46cSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3328139f7f9bSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 3329139f7f9bSDimitry Andric DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( 3330139f7f9bSDimitry Andric OMD->getClassInterface()), OMD->getLocation()); 3331f22ef01cSRoman Divacky break; 3332f22ef01cSRoman Divacky } 3333f22ef01cSRoman Divacky case Decl::ObjCMethod: { 333459d1ed5bSDimitry Andric auto *OMD = cast<ObjCMethodDecl>(D); 3335f22ef01cSRoman Divacky // If this is not a prototype, emit the body. 3336f22ef01cSRoman Divacky if (OMD->getBody()) 3337f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCMethod(OMD); 3338f22ef01cSRoman Divacky break; 3339f22ef01cSRoman Divacky } 3340f22ef01cSRoman Divacky case Decl::ObjCCompatibleAlias: 3341dff0c46cSDimitry Andric ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D)); 3342f22ef01cSRoman Divacky break; 3343f22ef01cSRoman Divacky 3344f22ef01cSRoman Divacky case Decl::LinkageSpec: 3345f22ef01cSRoman Divacky EmitLinkageSpec(cast<LinkageSpecDecl>(D)); 3346f22ef01cSRoman Divacky break; 3347f22ef01cSRoman Divacky 3348f22ef01cSRoman Divacky case Decl::FileScopeAsm: { 334933956c43SDimitry Andric // File-scope asm is ignored during device-side CUDA compilation. 335033956c43SDimitry Andric if (LangOpts.CUDA && LangOpts.CUDAIsDevice) 335133956c43SDimitry Andric break; 335259d1ed5bSDimitry Andric auto *AD = cast<FileScopeAsmDecl>(D); 335333956c43SDimitry Andric getModule().appendModuleInlineAsm(AD->getAsmString()->getString()); 3354f22ef01cSRoman Divacky break; 3355f22ef01cSRoman Divacky } 3356f22ef01cSRoman Divacky 3357139f7f9bSDimitry Andric case Decl::Import: { 335859d1ed5bSDimitry Andric auto *Import = cast<ImportDecl>(D); 3359139f7f9bSDimitry Andric 3360139f7f9bSDimitry Andric // Ignore import declarations that come from imported modules. 336133956c43SDimitry Andric if (clang::Module *Owner = Import->getImportedOwningModule()) { 3362139f7f9bSDimitry Andric if (getLangOpts().CurrentModule.empty() || 3363139f7f9bSDimitry Andric Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) 3364139f7f9bSDimitry Andric break; 3365139f7f9bSDimitry Andric } 3366139f7f9bSDimitry Andric 3367139f7f9bSDimitry Andric ImportedModules.insert(Import->getImportedModule()); 3368139f7f9bSDimitry Andric break; 3369139f7f9bSDimitry Andric } 3370139f7f9bSDimitry Andric 337139d628a0SDimitry Andric case Decl::OMPThreadPrivate: 337239d628a0SDimitry Andric EmitOMPThreadPrivateDecl(cast<OMPThreadPrivateDecl>(D)); 337339d628a0SDimitry Andric break; 337439d628a0SDimitry Andric 337559d1ed5bSDimitry Andric case Decl::ClassTemplateSpecialization: { 337659d1ed5bSDimitry Andric const auto *Spec = cast<ClassTemplateSpecializationDecl>(D); 337759d1ed5bSDimitry Andric if (DebugInfo && 337839d628a0SDimitry Andric Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition && 337939d628a0SDimitry Andric Spec->hasDefinition()) 338059d1ed5bSDimitry Andric DebugInfo->completeTemplateDefinition(*Spec); 338139d628a0SDimitry Andric break; 338259d1ed5bSDimitry Andric } 338359d1ed5bSDimitry Andric 3384f22ef01cSRoman Divacky default: 3385f22ef01cSRoman Divacky // Make sure we handled everything we should, every other kind is a 3386f22ef01cSRoman Divacky // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind 3387f22ef01cSRoman Divacky // function. Need to recode Decl::Kind to do that easily. 3388f22ef01cSRoman Divacky assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 338939d628a0SDimitry Andric break; 339039d628a0SDimitry Andric } 339139d628a0SDimitry Andric } 339239d628a0SDimitry Andric 339339d628a0SDimitry Andric void CodeGenModule::AddDeferredUnusedCoverageMapping(Decl *D) { 339439d628a0SDimitry Andric // Do we need to generate coverage mapping? 339539d628a0SDimitry Andric if (!CodeGenOpts.CoverageMapping) 339639d628a0SDimitry Andric return; 339739d628a0SDimitry Andric switch (D->getKind()) { 339839d628a0SDimitry Andric case Decl::CXXConversion: 339939d628a0SDimitry Andric case Decl::CXXMethod: 340039d628a0SDimitry Andric case Decl::Function: 340139d628a0SDimitry Andric case Decl::ObjCMethod: 340239d628a0SDimitry Andric case Decl::CXXConstructor: 340339d628a0SDimitry Andric case Decl::CXXDestructor: { 340439d628a0SDimitry Andric if (!cast<FunctionDecl>(D)->hasBody()) 340539d628a0SDimitry Andric return; 340639d628a0SDimitry Andric auto I = DeferredEmptyCoverageMappingDecls.find(D); 340739d628a0SDimitry Andric if (I == DeferredEmptyCoverageMappingDecls.end()) 340839d628a0SDimitry Andric DeferredEmptyCoverageMappingDecls[D] = true; 340939d628a0SDimitry Andric break; 341039d628a0SDimitry Andric } 341139d628a0SDimitry Andric default: 341239d628a0SDimitry Andric break; 341339d628a0SDimitry Andric }; 341439d628a0SDimitry Andric } 341539d628a0SDimitry Andric 341639d628a0SDimitry Andric void CodeGenModule::ClearUnusedCoverageMapping(const Decl *D) { 341739d628a0SDimitry Andric // Do we need to generate coverage mapping? 341839d628a0SDimitry Andric if (!CodeGenOpts.CoverageMapping) 341939d628a0SDimitry Andric return; 342039d628a0SDimitry Andric if (const auto *Fn = dyn_cast<FunctionDecl>(D)) { 342139d628a0SDimitry Andric if (Fn->isTemplateInstantiation()) 342239d628a0SDimitry Andric ClearUnusedCoverageMapping(Fn->getTemplateInstantiationPattern()); 342339d628a0SDimitry Andric } 342439d628a0SDimitry Andric auto I = DeferredEmptyCoverageMappingDecls.find(D); 342539d628a0SDimitry Andric if (I == DeferredEmptyCoverageMappingDecls.end()) 342639d628a0SDimitry Andric DeferredEmptyCoverageMappingDecls[D] = false; 342739d628a0SDimitry Andric else 342839d628a0SDimitry Andric I->second = false; 342939d628a0SDimitry Andric } 343039d628a0SDimitry Andric 343139d628a0SDimitry Andric void CodeGenModule::EmitDeferredUnusedCoverageMappings() { 343239d628a0SDimitry Andric std::vector<const Decl *> DeferredDecls; 343333956c43SDimitry Andric for (const auto &I : DeferredEmptyCoverageMappingDecls) { 343439d628a0SDimitry Andric if (!I.second) 343539d628a0SDimitry Andric continue; 343639d628a0SDimitry Andric DeferredDecls.push_back(I.first); 343739d628a0SDimitry Andric } 343839d628a0SDimitry Andric // Sort the declarations by their location to make sure that the tests get a 343939d628a0SDimitry Andric // predictable order for the coverage mapping for the unused declarations. 344039d628a0SDimitry Andric if (CodeGenOpts.DumpCoverageMapping) 344139d628a0SDimitry Andric std::sort(DeferredDecls.begin(), DeferredDecls.end(), 344239d628a0SDimitry Andric [] (const Decl *LHS, const Decl *RHS) { 344339d628a0SDimitry Andric return LHS->getLocStart() < RHS->getLocStart(); 344439d628a0SDimitry Andric }); 344539d628a0SDimitry Andric for (const auto *D : DeferredDecls) { 344639d628a0SDimitry Andric switch (D->getKind()) { 344739d628a0SDimitry Andric case Decl::CXXConversion: 344839d628a0SDimitry Andric case Decl::CXXMethod: 344939d628a0SDimitry Andric case Decl::Function: 345039d628a0SDimitry Andric case Decl::ObjCMethod: { 345139d628a0SDimitry Andric CodeGenPGO PGO(*this); 345239d628a0SDimitry Andric GlobalDecl GD(cast<FunctionDecl>(D)); 345339d628a0SDimitry Andric PGO.emitEmptyCounterMapping(D, getMangledName(GD), 345439d628a0SDimitry Andric getFunctionLinkage(GD)); 345539d628a0SDimitry Andric break; 345639d628a0SDimitry Andric } 345739d628a0SDimitry Andric case Decl::CXXConstructor: { 345839d628a0SDimitry Andric CodeGenPGO PGO(*this); 345939d628a0SDimitry Andric GlobalDecl GD(cast<CXXConstructorDecl>(D), Ctor_Base); 346039d628a0SDimitry Andric PGO.emitEmptyCounterMapping(D, getMangledName(GD), 346139d628a0SDimitry Andric getFunctionLinkage(GD)); 346239d628a0SDimitry Andric break; 346339d628a0SDimitry Andric } 346439d628a0SDimitry Andric case Decl::CXXDestructor: { 346539d628a0SDimitry Andric CodeGenPGO PGO(*this); 346639d628a0SDimitry Andric GlobalDecl GD(cast<CXXDestructorDecl>(D), Dtor_Base); 346739d628a0SDimitry Andric PGO.emitEmptyCounterMapping(D, getMangledName(GD), 346839d628a0SDimitry Andric getFunctionLinkage(GD)); 346939d628a0SDimitry Andric break; 347039d628a0SDimitry Andric } 347139d628a0SDimitry Andric default: 347239d628a0SDimitry Andric break; 347339d628a0SDimitry Andric }; 3474f22ef01cSRoman Divacky } 3475f22ef01cSRoman Divacky } 3476ffd1746dSEd Schouten 3477ffd1746dSEd Schouten /// Turns the given pointer into a constant. 3478ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context, 3479ffd1746dSEd Schouten const void *Ptr) { 3480ffd1746dSEd Schouten uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr); 34816122f3e6SDimitry Andric llvm::Type *i64 = llvm::Type::getInt64Ty(Context); 3482ffd1746dSEd Schouten return llvm::ConstantInt::get(i64, PtrInt); 3483ffd1746dSEd Schouten } 3484ffd1746dSEd Schouten 3485ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM, 3486ffd1746dSEd Schouten llvm::NamedMDNode *&GlobalMetadata, 3487ffd1746dSEd Schouten GlobalDecl D, 3488ffd1746dSEd Schouten llvm::GlobalValue *Addr) { 3489ffd1746dSEd Schouten if (!GlobalMetadata) 3490ffd1746dSEd Schouten GlobalMetadata = 3491ffd1746dSEd Schouten CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs"); 3492ffd1746dSEd Schouten 3493ffd1746dSEd Schouten // TODO: should we report variant information for ctors/dtors? 349439d628a0SDimitry Andric llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr), 349539d628a0SDimitry Andric llvm::ConstantAsMetadata::get(GetPointerConstant( 349639d628a0SDimitry Andric CGM.getLLVMContext(), D.getDecl()))}; 34973b0f4066SDimitry Andric GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 3498ffd1746dSEd Schouten } 3499ffd1746dSEd Schouten 3500284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked 3501284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled 3502284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer 3503284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the 3504284c1978SDimitry Andric /// same translation unit. 3505284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() { 3506284c1978SDimitry Andric for (StaticExternCMap::iterator I = StaticExternCValues.begin(), 3507284c1978SDimitry Andric E = StaticExternCValues.end(); 3508284c1978SDimitry Andric I != E; ++I) { 3509284c1978SDimitry Andric IdentifierInfo *Name = I->first; 3510284c1978SDimitry Andric llvm::GlobalValue *Val = I->second; 3511284c1978SDimitry Andric if (Val && !getModule().getNamedValue(Name->getName())) 351259d1ed5bSDimitry Andric addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val)); 3513284c1978SDimitry Andric } 3514284c1978SDimitry Andric } 3515284c1978SDimitry Andric 351659d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName, 351759d1ed5bSDimitry Andric GlobalDecl &Result) const { 351859d1ed5bSDimitry Andric auto Res = Manglings.find(MangledName); 351959d1ed5bSDimitry Andric if (Res == Manglings.end()) 352059d1ed5bSDimitry Andric return false; 352159d1ed5bSDimitry Andric Result = Res->getValue(); 352259d1ed5bSDimitry Andric return true; 352359d1ed5bSDimitry Andric } 352459d1ed5bSDimitry Andric 3525ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the 3526ffd1746dSEd Schouten /// current module with the Decls they came from. This is useful for 3527ffd1746dSEd Schouten /// projects using IR gen as a subroutine. 3528ffd1746dSEd Schouten /// 3529ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly 3530ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata 3531ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'. 3532ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() { 353359d1ed5bSDimitry Andric llvm::NamedMDNode *GlobalMetadata = nullptr; 3534ffd1746dSEd Schouten 3535ffd1746dSEd Schouten // StaticLocalDeclMap 353659d1ed5bSDimitry Andric for (auto &I : MangledDeclNames) { 353759d1ed5bSDimitry Andric llvm::GlobalValue *Addr = getModule().getNamedValue(I.second); 353859d1ed5bSDimitry Andric EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr); 3539ffd1746dSEd Schouten } 3540ffd1746dSEd Schouten } 3541ffd1746dSEd Schouten 3542ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current 3543ffd1746dSEd Schouten /// function. 3544ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() { 3545ffd1746dSEd Schouten if (LocalDeclMap.empty()) return; 3546ffd1746dSEd Schouten 3547ffd1746dSEd Schouten llvm::LLVMContext &Context = getLLVMContext(); 3548ffd1746dSEd Schouten 3549ffd1746dSEd Schouten // Find the unique metadata ID for this name. 3550ffd1746dSEd Schouten unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr"); 3551ffd1746dSEd Schouten 355259d1ed5bSDimitry Andric llvm::NamedMDNode *GlobalMetadata = nullptr; 3553ffd1746dSEd Schouten 355459d1ed5bSDimitry Andric for (auto &I : LocalDeclMap) { 355559d1ed5bSDimitry Andric const Decl *D = I.first; 355659d1ed5bSDimitry Andric llvm::Value *Addr = I.second; 355759d1ed5bSDimitry Andric if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) { 3558ffd1746dSEd Schouten llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D); 355939d628a0SDimitry Andric Alloca->setMetadata( 356039d628a0SDimitry Andric DeclPtrKind, llvm::MDNode::get( 356139d628a0SDimitry Andric Context, llvm::ValueAsMetadata::getConstant(DAddr))); 356259d1ed5bSDimitry Andric } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) { 3563ffd1746dSEd Schouten GlobalDecl GD = GlobalDecl(cast<VarDecl>(D)); 3564ffd1746dSEd Schouten EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV); 3565ffd1746dSEd Schouten } 3566ffd1746dSEd Schouten } 3567ffd1746dSEd Schouten } 3568e580952dSDimitry Andric 3569f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() { 3570f785676fSDimitry Andric llvm::NamedMDNode *IdentMetadata = 3571f785676fSDimitry Andric TheModule.getOrInsertNamedMetadata("llvm.ident"); 3572f785676fSDimitry Andric std::string Version = getClangFullVersion(); 3573f785676fSDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3574f785676fSDimitry Andric 357539d628a0SDimitry Andric llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)}; 3576f785676fSDimitry Andric IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode)); 3577f785676fSDimitry Andric } 3578f785676fSDimitry Andric 357959d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() { 358039d628a0SDimitry Andric // Warning, new MangledDeclNames may be appended within this loop. 358139d628a0SDimitry Andric // We rely on MapVector insertions adding new elements to the end 358239d628a0SDimitry Andric // of the container. 358339d628a0SDimitry Andric // FIXME: Move this loop into the one target that needs it, and only 358439d628a0SDimitry Andric // loop over those declarations for which we couldn't emit the target 358539d628a0SDimitry Andric // metadata when we emitted the declaration. 358639d628a0SDimitry Andric for (unsigned I = 0; I != MangledDeclNames.size(); ++I) { 358739d628a0SDimitry Andric auto Val = *(MangledDeclNames.begin() + I); 358839d628a0SDimitry Andric const Decl *D = Val.first.getDecl()->getMostRecentDecl(); 358939d628a0SDimitry Andric llvm::GlobalValue *GV = GetGlobalValue(Val.second); 359059d1ed5bSDimitry Andric getTargetCodeGenInfo().emitTargetMD(D, GV, *this); 359159d1ed5bSDimitry Andric } 359259d1ed5bSDimitry Andric } 359359d1ed5bSDimitry Andric 3594bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() { 3595bd5abe19SDimitry Andric if (!getCodeGenOpts().CoverageFile.empty()) { 3596bd5abe19SDimitry Andric if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { 3597bd5abe19SDimitry Andric llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); 3598bd5abe19SDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3599bd5abe19SDimitry Andric llvm::MDString *CoverageFile = 3600bd5abe19SDimitry Andric llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); 3601bd5abe19SDimitry Andric for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { 3602bd5abe19SDimitry Andric llvm::MDNode *CU = CUNode->getOperand(i); 360339d628a0SDimitry Andric llvm::Metadata *Elts[] = {CoverageFile, CU}; 360439d628a0SDimitry Andric GCov->addOperand(llvm::MDNode::get(Ctx, Elts)); 3605bd5abe19SDimitry Andric } 3606bd5abe19SDimitry Andric } 3607bd5abe19SDimitry Andric } 3608bd5abe19SDimitry Andric } 36093861d79fSDimitry Andric 361039d628a0SDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) { 36113861d79fSDimitry Andric // Sema has checked that all uuid strings are of the form 36123861d79fSDimitry Andric // "12345678-1234-1234-1234-1234567890ab". 36133861d79fSDimitry Andric assert(Uuid.size() == 36); 3614f785676fSDimitry Andric for (unsigned i = 0; i < 36; ++i) { 3615f785676fSDimitry Andric if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-'); 3616f785676fSDimitry Andric else assert(isHexDigit(Uuid[i])); 36173861d79fSDimitry Andric } 36183861d79fSDimitry Andric 361939d628a0SDimitry Andric // The starts of all bytes of Field3 in Uuid. Field 3 is "1234-1234567890ab". 3620f785676fSDimitry Andric const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 }; 36213861d79fSDimitry Andric 3622f785676fSDimitry Andric llvm::Constant *Field3[8]; 3623f785676fSDimitry Andric for (unsigned Idx = 0; Idx < 8; ++Idx) 3624f785676fSDimitry Andric Field3[Idx] = llvm::ConstantInt::get( 3625f785676fSDimitry Andric Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16); 36263861d79fSDimitry Andric 3627f785676fSDimitry Andric llvm::Constant *Fields[4] = { 3628f785676fSDimitry Andric llvm::ConstantInt::get(Int32Ty, Uuid.substr(0, 8), 16), 3629f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(9, 4), 16), 3630f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16), 3631f785676fSDimitry Andric llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3) 3632f785676fSDimitry Andric }; 3633f785676fSDimitry Andric 3634f785676fSDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 36353861d79fSDimitry Andric } 363659d1ed5bSDimitry Andric 363733956c43SDimitry Andric llvm::Constant * 363833956c43SDimitry Andric CodeGenModule::getAddrOfCXXCatchHandlerType(QualType Ty, 363933956c43SDimitry Andric QualType CatchHandlerType) { 364033956c43SDimitry Andric return getCXXABI().getAddrOfCXXCatchHandlerType(Ty, CatchHandlerType); 364133956c43SDimitry Andric } 364233956c43SDimitry Andric 364359d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, 364459d1ed5bSDimitry Andric bool ForEH) { 364559d1ed5bSDimitry Andric // Return a bogus pointer if RTTI is disabled, unless it's for EH. 364659d1ed5bSDimitry Andric // FIXME: should we even be calling this method if RTTI is disabled 364759d1ed5bSDimitry Andric // and it's not for EH? 364859d1ed5bSDimitry Andric if (!ForEH && !getLangOpts().RTTI) 364959d1ed5bSDimitry Andric return llvm::Constant::getNullValue(Int8PtrTy); 365059d1ed5bSDimitry Andric 365159d1ed5bSDimitry Andric if (ForEH && Ty->isObjCObjectPointerType() && 365259d1ed5bSDimitry Andric LangOpts.ObjCRuntime.isGNUFamily()) 365359d1ed5bSDimitry Andric return ObjCRuntime->GetEHType(Ty); 365459d1ed5bSDimitry Andric 365559d1ed5bSDimitry Andric return getCXXABI().getAddrOfRTTIDescriptor(Ty); 365659d1ed5bSDimitry Andric } 365759d1ed5bSDimitry Andric 365839d628a0SDimitry Andric void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) { 365939d628a0SDimitry Andric for (auto RefExpr : D->varlists()) { 366039d628a0SDimitry Andric auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl()); 366139d628a0SDimitry Andric bool PerformInit = 366239d628a0SDimitry Andric VD->getAnyInitializer() && 366339d628a0SDimitry Andric !VD->getAnyInitializer()->isConstantInitializer(getContext(), 366439d628a0SDimitry Andric /*ForRef=*/false); 366533956c43SDimitry Andric if (auto InitFunction = getOpenMPRuntime().emitThreadPrivateVarDefinition( 366633956c43SDimitry Andric VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(), PerformInit)) 366739d628a0SDimitry Andric CXXGlobalInits.push_back(InitFunction); 366839d628a0SDimitry Andric } 366939d628a0SDimitry Andric } 3670