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" 21139f7f9bSDimitry Andric #include "CodeGenFunction.h" 22139f7f9bSDimitry Andric #include "CodeGenTBAA.h" 23f22ef01cSRoman Divacky #include "TargetInfo.h" 24f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h" 25f22ef01cSRoman Divacky #include "clang/AST/CharUnits.h" 26f22ef01cSRoman Divacky #include "clang/AST/DeclCXX.h" 27139f7f9bSDimitry Andric #include "clang/AST/DeclObjC.h" 28ffd1746dSEd Schouten #include "clang/AST/DeclTemplate.h" 292754fe60SDimitry Andric #include "clang/AST/Mangle.h" 30f22ef01cSRoman Divacky #include "clang/AST/RecordLayout.h" 31f8254f43SDimitry Andric #include "clang/AST/RecursiveASTVisitor.h" 32dff0c46cSDimitry Andric #include "clang/Basic/Builtins.h" 33139f7f9bSDimitry Andric #include "clang/Basic/CharInfo.h" 34f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h" 35139f7f9bSDimitry Andric #include "clang/Basic/Module.h" 36f22ef01cSRoman Divacky #include "clang/Basic/SourceManager.h" 37f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h" 38f785676fSDimitry Andric #include "clang/Basic/Version.h" 39139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h" 40f785676fSDimitry Andric #include "clang/Sema/SemaDiagnostic.h" 41dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h" 42f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h" 43139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h" 44139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 45139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h" 46139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h" 47139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 48f22ef01cSRoman Divacky #include "llvm/Support/CallSite.h" 49139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h" 50f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 51139f7f9bSDimitry Andric #include "llvm/Target/Mangler.h" 52139f7f9bSDimitry Andric 53f22ef01cSRoman Divacky using namespace clang; 54f22ef01cSRoman Divacky using namespace CodeGen; 55f22ef01cSRoman Divacky 566122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata"; 576122f3e6SDimitry Andric 58e580952dSDimitry Andric static CGCXXABI &createCXXABI(CodeGenModule &CGM) { 59284c1978SDimitry Andric switch (CGM.getTarget().getCXXABI().getKind()) { 60139f7f9bSDimitry Andric case TargetCXXABI::GenericAArch64: 61139f7f9bSDimitry Andric case TargetCXXABI::GenericARM: 62139f7f9bSDimitry Andric case TargetCXXABI::iOS: 63139f7f9bSDimitry Andric case TargetCXXABI::GenericItanium: 64139f7f9bSDimitry Andric return *CreateItaniumCXXABI(CGM); 65139f7f9bSDimitry Andric case TargetCXXABI::Microsoft: 66139f7f9bSDimitry Andric return *CreateMicrosoftCXXABI(CGM); 67e580952dSDimitry Andric } 68e580952dSDimitry Andric 69e580952dSDimitry Andric llvm_unreachable("invalid C++ ABI kind"); 70e580952dSDimitry Andric } 71e580952dSDimitry Andric 72f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 73284c1978SDimitry Andric llvm::Module &M, const llvm::DataLayout &TD, 746122f3e6SDimitry Andric DiagnosticsEngine &diags) 75284c1978SDimitry Andric : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M), 76284c1978SDimitry Andric Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()), 77284c1978SDimitry Andric ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(0), 78f785676fSDimitry Andric TheTargetCodeGenInfo(0), Types(*this), VTables(*this), ObjCRuntime(0), 79f785676fSDimitry Andric OpenCLRuntime(0), CUDARuntime(0), DebugInfo(0), ARCData(0), 80f785676fSDimitry Andric NoObjCARCExceptionsMetadata(0), RRData(0), CFConstantStringClassRef(0), 816122f3e6SDimitry Andric ConstantStringClassRef(0), NSConstantStringType(0), 82f785676fSDimitry Andric NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), BlockObjectAssign(0), 83f785676fSDimitry Andric BlockObjectDispose(0), BlockDescriptorType(0), GenericBlockLiteralType(0), 84139f7f9bSDimitry Andric LifetimeStartFn(0), LifetimeEndFn(0), 85f785676fSDimitry Andric SanitizerBlacklist( 86f785676fSDimitry Andric llvm::SpecialCaseList::createOrDie(CGO.SanitizerBlacklistFile)), 87f785676fSDimitry Andric SanOpts(SanitizerBlacklist->isIn(M) ? SanitizerOptions::Disabled 88f785676fSDimitry Andric : LangOpts.Sanitize) { 89dff0c46cSDimitry Andric 90dff0c46cSDimitry Andric // Initialize the type cache. 91dff0c46cSDimitry Andric llvm::LLVMContext &LLVMContext = M.getContext(); 92dff0c46cSDimitry Andric VoidTy = llvm::Type::getVoidTy(LLVMContext); 93dff0c46cSDimitry Andric Int8Ty = llvm::Type::getInt8Ty(LLVMContext); 94dff0c46cSDimitry Andric Int16Ty = llvm::Type::getInt16Ty(LLVMContext); 95dff0c46cSDimitry Andric Int32Ty = llvm::Type::getInt32Ty(LLVMContext); 96dff0c46cSDimitry Andric Int64Ty = llvm::Type::getInt64Ty(LLVMContext); 97dff0c46cSDimitry Andric FloatTy = llvm::Type::getFloatTy(LLVMContext); 98dff0c46cSDimitry Andric DoubleTy = llvm::Type::getDoubleTy(LLVMContext); 99dff0c46cSDimitry Andric PointerWidthInBits = C.getTargetInfo().getPointerWidth(0); 100dff0c46cSDimitry Andric PointerAlignInBytes = 101dff0c46cSDimitry Andric C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity(); 102dff0c46cSDimitry Andric IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth()); 103dff0c46cSDimitry Andric IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits); 104dff0c46cSDimitry Andric Int8PtrTy = Int8Ty->getPointerTo(0); 105dff0c46cSDimitry Andric Int8PtrPtrTy = Int8PtrTy->getPointerTo(0); 106dff0c46cSDimitry Andric 107139f7f9bSDimitry Andric RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC(); 108139f7f9bSDimitry Andric 109dff0c46cSDimitry Andric if (LangOpts.ObjC1) 1103b0f4066SDimitry Andric createObjCRuntime(); 111dff0c46cSDimitry Andric if (LangOpts.OpenCL) 1126122f3e6SDimitry Andric createOpenCLRuntime(); 113dff0c46cSDimitry Andric if (LangOpts.CUDA) 1146122f3e6SDimitry Andric createCUDARuntime(); 115f22ef01cSRoman Divacky 1167ae0e2c9SDimitry Andric // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0. 117139f7f9bSDimitry Andric if (SanOpts.Thread || 1187ae0e2c9SDimitry Andric (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)) 1197ae0e2c9SDimitry Andric TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(), 1202754fe60SDimitry Andric ABI.getMangleContext()); 1212754fe60SDimitry Andric 1223b0f4066SDimitry Andric // If debug info or coverage generation is enabled, create the CGDebugInfo 1233b0f4066SDimitry Andric // object. 1243861d79fSDimitry Andric if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo || 1257ae0e2c9SDimitry Andric CodeGenOpts.EmitGcovArcs || 1263b0f4066SDimitry Andric CodeGenOpts.EmitGcovNotes) 1273b0f4066SDimitry Andric DebugInfo = new CGDebugInfo(*this); 1282754fe60SDimitry Andric 1292754fe60SDimitry Andric Block.GlobalUniqueCount = 0; 1302754fe60SDimitry Andric 131dff0c46cSDimitry Andric if (C.getLangOpts().ObjCAutoRefCount) 13217a519f9SDimitry Andric ARCData = new ARCEntrypoints(); 13317a519f9SDimitry Andric RRData = new RREntrypoints(); 134f22ef01cSRoman Divacky } 135f22ef01cSRoman Divacky 136f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() { 1376122f3e6SDimitry Andric delete ObjCRuntime; 1386122f3e6SDimitry Andric delete OpenCLRuntime; 1396122f3e6SDimitry Andric delete CUDARuntime; 1406122f3e6SDimitry Andric delete TheTargetCodeGenInfo; 141e580952dSDimitry Andric delete &ABI; 1422754fe60SDimitry Andric delete TBAA; 143f22ef01cSRoman Divacky delete DebugInfo; 14417a519f9SDimitry Andric delete ARCData; 14517a519f9SDimitry Andric delete RRData; 146f22ef01cSRoman Divacky } 147f22ef01cSRoman Divacky 148f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() { 1497ae0e2c9SDimitry Andric // This is just isGNUFamily(), but we want to force implementors of 1507ae0e2c9SDimitry Andric // new ABIs to decide how best to do this. 1517ae0e2c9SDimitry Andric switch (LangOpts.ObjCRuntime.getKind()) { 1527ae0e2c9SDimitry Andric case ObjCRuntime::GNUstep: 1537ae0e2c9SDimitry Andric case ObjCRuntime::GCC: 1547ae0e2c9SDimitry Andric case ObjCRuntime::ObjFW: 1556122f3e6SDimitry Andric ObjCRuntime = CreateGNUObjCRuntime(*this); 1567ae0e2c9SDimitry Andric return; 1577ae0e2c9SDimitry Andric 1587ae0e2c9SDimitry Andric case ObjCRuntime::FragileMacOSX: 1597ae0e2c9SDimitry Andric case ObjCRuntime::MacOSX: 1607ae0e2c9SDimitry Andric case ObjCRuntime::iOS: 1616122f3e6SDimitry Andric ObjCRuntime = CreateMacObjCRuntime(*this); 1627ae0e2c9SDimitry Andric return; 1637ae0e2c9SDimitry Andric } 1647ae0e2c9SDimitry Andric llvm_unreachable("bad runtime kind"); 1656122f3e6SDimitry Andric } 1666122f3e6SDimitry Andric 1676122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() { 1686122f3e6SDimitry Andric OpenCLRuntime = new CGOpenCLRuntime(*this); 1696122f3e6SDimitry Andric } 1706122f3e6SDimitry Andric 1716122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() { 1726122f3e6SDimitry Andric CUDARuntime = CreateNVCUDARuntime(*this); 173f22ef01cSRoman Divacky } 174f22ef01cSRoman Divacky 175f785676fSDimitry Andric void CodeGenModule::applyReplacements() { 176f785676fSDimitry Andric for (ReplacementsTy::iterator I = Replacements.begin(), 177f785676fSDimitry Andric E = Replacements.end(); 178f785676fSDimitry Andric I != E; ++I) { 179f785676fSDimitry Andric StringRef MangledName = I->first(); 180f785676fSDimitry Andric llvm::Constant *Replacement = I->second; 181f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 182f785676fSDimitry Andric if (!Entry) 183f785676fSDimitry Andric continue; 184f785676fSDimitry Andric llvm::Function *OldF = cast<llvm::Function>(Entry); 185f785676fSDimitry Andric llvm::Function *NewF = dyn_cast<llvm::Function>(Replacement); 186f785676fSDimitry Andric if (!NewF) { 187f785676fSDimitry Andric llvm::ConstantExpr *CE = cast<llvm::ConstantExpr>(Replacement); 188f785676fSDimitry Andric assert(CE->getOpcode() == llvm::Instruction::BitCast || 189f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::GetElementPtr); 190f785676fSDimitry Andric NewF = dyn_cast<llvm::Function>(CE->getOperand(0)); 191f785676fSDimitry Andric } 192f785676fSDimitry Andric 193f785676fSDimitry Andric // Replace old with new, but keep the old order. 194f785676fSDimitry Andric OldF->replaceAllUsesWith(Replacement); 195f785676fSDimitry Andric if (NewF) { 196f785676fSDimitry Andric NewF->removeFromParent(); 197f785676fSDimitry Andric OldF->getParent()->getFunctionList().insertAfter(OldF, NewF); 198f785676fSDimitry Andric } 199f785676fSDimitry Andric OldF->eraseFromParent(); 200f785676fSDimitry Andric } 201f785676fSDimitry Andric } 202f785676fSDimitry Andric 203f785676fSDimitry Andric void CodeGenModule::checkAliases() { 204f785676fSDimitry Andric bool Error = false; 205f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 206f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 207f785676fSDimitry Andric const GlobalDecl &GD = *I; 208f785676fSDimitry Andric const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 209f785676fSDimitry Andric const AliasAttr *AA = D->getAttr<AliasAttr>(); 210f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 211f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 212f785676fSDimitry Andric llvm::GlobalAlias *Alias = cast<llvm::GlobalAlias>(Entry); 213f785676fSDimitry Andric llvm::GlobalValue *GV = Alias->getAliasedGlobal(); 214f785676fSDimitry Andric if (GV->isDeclaration()) { 215f785676fSDimitry Andric Error = true; 216f785676fSDimitry Andric getDiags().Report(AA->getLocation(), diag::err_alias_to_undefined); 217f785676fSDimitry Andric } else if (!Alias->resolveAliasedGlobal(/*stopOnWeak*/ false)) { 218f785676fSDimitry Andric Error = true; 219f785676fSDimitry Andric getDiags().Report(AA->getLocation(), diag::err_cyclic_alias); 220f785676fSDimitry Andric } 221f785676fSDimitry Andric } 222f785676fSDimitry Andric if (!Error) 223f785676fSDimitry Andric return; 224f785676fSDimitry Andric 225f785676fSDimitry Andric for (std::vector<GlobalDecl>::iterator I = Aliases.begin(), 226f785676fSDimitry Andric E = Aliases.end(); I != E; ++I) { 227f785676fSDimitry Andric const GlobalDecl &GD = *I; 228f785676fSDimitry Andric StringRef MangledName = getMangledName(GD); 229f785676fSDimitry Andric llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 230f785676fSDimitry Andric llvm::GlobalAlias *Alias = cast<llvm::GlobalAlias>(Entry); 231f785676fSDimitry Andric Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType())); 232f785676fSDimitry Andric Alias->eraseFromParent(); 233f785676fSDimitry Andric } 234f785676fSDimitry Andric } 235f785676fSDimitry Andric 236f22ef01cSRoman Divacky void CodeGenModule::Release() { 237f22ef01cSRoman Divacky EmitDeferred(); 238f785676fSDimitry Andric applyReplacements(); 239f785676fSDimitry Andric checkAliases(); 240f22ef01cSRoman Divacky EmitCXXGlobalInitFunc(); 241f22ef01cSRoman Divacky EmitCXXGlobalDtorFunc(); 242284c1978SDimitry Andric EmitCXXThreadLocalInitFunc(); 2436122f3e6SDimitry Andric if (ObjCRuntime) 2446122f3e6SDimitry Andric if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction()) 245f22ef01cSRoman Divacky AddGlobalCtor(ObjCInitFunction); 246f22ef01cSRoman Divacky EmitCtorList(GlobalCtors, "llvm.global_ctors"); 247f22ef01cSRoman Divacky EmitCtorList(GlobalDtors, "llvm.global_dtors"); 2486122f3e6SDimitry Andric EmitGlobalAnnotations(); 249284c1978SDimitry Andric EmitStaticExternCAliases(); 250f22ef01cSRoman Divacky EmitLLVMUsed(); 251ffd1746dSEd Schouten 252f785676fSDimitry Andric if (CodeGenOpts.Autolink && 253f785676fSDimitry Andric (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) { 254139f7f9bSDimitry Andric EmitModuleLinkOptions(); 255139f7f9bSDimitry Andric } 256f785676fSDimitry Andric if (CodeGenOpts.DwarfVersion) 257f785676fSDimitry Andric // We actually want the latest version when there are conflicts. 258f785676fSDimitry Andric // We can change from Warning to Latest if such mode is supported. 259f785676fSDimitry Andric getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version", 260f785676fSDimitry Andric CodeGenOpts.DwarfVersion); 261f785676fSDimitry Andric if (DebugInfo) 262f785676fSDimitry Andric // We support a single version in the linked module: error out when 263f785676fSDimitry Andric // modules do not have the same version. We are going to implement dropping 264f785676fSDimitry Andric // debug info when the version number is not up-to-date. Once that is 265f785676fSDimitry Andric // done, the bitcode linker is not going to see modules with different 266f785676fSDimitry Andric // version numbers. 267f785676fSDimitry Andric getModule().addModuleFlag(llvm::Module::Error, "Debug Info Version", 268f785676fSDimitry Andric llvm::DEBUG_METADATA_VERSION); 269139f7f9bSDimitry Andric 2702754fe60SDimitry Andric SimplifyPersonality(); 2712754fe60SDimitry Andric 272ffd1746dSEd Schouten if (getCodeGenOpts().EmitDeclMetadata) 273ffd1746dSEd Schouten EmitDeclMetadata(); 274bd5abe19SDimitry Andric 275bd5abe19SDimitry Andric if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) 276bd5abe19SDimitry Andric EmitCoverageFile(); 2776122f3e6SDimitry Andric 2786122f3e6SDimitry Andric if (DebugInfo) 2796122f3e6SDimitry Andric DebugInfo->finalize(); 280f785676fSDimitry Andric 281f785676fSDimitry Andric EmitVersionIdentMetadata(); 282f22ef01cSRoman Divacky } 283f22ef01cSRoman Divacky 2843b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 2853b0f4066SDimitry Andric // Make sure that this type is translated. 2863b0f4066SDimitry Andric Types.UpdateCompletedType(TD); 2873b0f4066SDimitry Andric } 2883b0f4066SDimitry Andric 2892754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) { 2902754fe60SDimitry Andric if (!TBAA) 2912754fe60SDimitry Andric return 0; 2922754fe60SDimitry Andric return TBAA->getTBAAInfo(QTy); 2932754fe60SDimitry Andric } 2942754fe60SDimitry Andric 295dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() { 296dff0c46cSDimitry Andric if (!TBAA) 297dff0c46cSDimitry Andric return 0; 298dff0c46cSDimitry Andric return TBAA->getTBAAInfoForVTablePtr(); 299dff0c46cSDimitry Andric } 300dff0c46cSDimitry Andric 3013861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) { 3023861d79fSDimitry Andric if (!TBAA) 3033861d79fSDimitry Andric return 0; 3043861d79fSDimitry Andric return TBAA->getTBAAStructInfo(QTy); 3053861d79fSDimitry Andric } 3063861d79fSDimitry Andric 307139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) { 308139f7f9bSDimitry Andric if (!TBAA) 309139f7f9bSDimitry Andric return 0; 310139f7f9bSDimitry Andric return TBAA->getTBAAStructTypeInfo(QTy); 311139f7f9bSDimitry Andric } 312139f7f9bSDimitry Andric 313139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy, 314139f7f9bSDimitry Andric llvm::MDNode *AccessN, 315139f7f9bSDimitry Andric uint64_t O) { 316139f7f9bSDimitry Andric if (!TBAA) 317139f7f9bSDimitry Andric return 0; 318139f7f9bSDimitry Andric return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O); 319139f7f9bSDimitry Andric } 320139f7f9bSDimitry Andric 321f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA 322f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format: 323f785676fSDimitry Andric /// base type, access type and offset. 324284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type. 3252754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst, 326284c1978SDimitry Andric llvm::MDNode *TBAAInfo, 327284c1978SDimitry Andric bool ConvertTypeToTag) { 328f785676fSDimitry Andric if (ConvertTypeToTag && TBAA) 329284c1978SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, 330284c1978SDimitry Andric TBAA->getTBAAScalarTagInfo(TBAAInfo)); 331284c1978SDimitry Andric else 3322754fe60SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo); 3332754fe60SDimitry Andric } 3342754fe60SDimitry Andric 3356122f3e6SDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef error) { 3366122f3e6SDimitry Andric unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, error); 3373b0f4066SDimitry Andric getDiags().Report(Context.getFullLoc(loc), diagID); 338f22ef01cSRoman Divacky } 339f22ef01cSRoman Divacky 340f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 341f22ef01cSRoman Divacky /// specified stmt yet. 342f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) { 3436122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 344f22ef01cSRoman Divacky "cannot compile this %0 yet"); 345f22ef01cSRoman Divacky std::string Msg = Type; 346f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 347f22ef01cSRoman Divacky << Msg << S->getSourceRange(); 348f22ef01cSRoman Divacky } 349f22ef01cSRoman Divacky 350f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 351f22ef01cSRoman Divacky /// specified decl yet. 352f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) { 3536122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 354f22ef01cSRoman Divacky "cannot compile this %0 yet"); 355f22ef01cSRoman Divacky std::string Msg = Type; 356f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 357f22ef01cSRoman Divacky } 358f22ef01cSRoman Divacky 35917a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { 36017a519f9SDimitry Andric return llvm::ConstantInt::get(SizeTy, size.getQuantity()); 36117a519f9SDimitry Andric } 36217a519f9SDimitry Andric 363f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, 3642754fe60SDimitry Andric const NamedDecl *D) const { 365f22ef01cSRoman Divacky // Internal definitions always have default visibility. 366f22ef01cSRoman Divacky if (GV->hasLocalLinkage()) { 367f22ef01cSRoman Divacky GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 368f22ef01cSRoman Divacky return; 369f22ef01cSRoman Divacky } 370f22ef01cSRoman Divacky 3712754fe60SDimitry Andric // Set visibility for definitions. 372139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 373139f7f9bSDimitry Andric if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage()) 374139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 375f22ef01cSRoman Divacky } 376f22ef01cSRoman Divacky 3777ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { 3787ae0e2c9SDimitry Andric return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) 3797ae0e2c9SDimitry Andric .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) 3807ae0e2c9SDimitry Andric .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) 3817ae0e2c9SDimitry Andric .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) 3827ae0e2c9SDimitry Andric .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); 3837ae0e2c9SDimitry Andric } 3847ae0e2c9SDimitry Andric 3857ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( 3867ae0e2c9SDimitry Andric CodeGenOptions::TLSModel M) { 3877ae0e2c9SDimitry Andric switch (M) { 3887ae0e2c9SDimitry Andric case CodeGenOptions::GeneralDynamicTLSModel: 3897ae0e2c9SDimitry Andric return llvm::GlobalVariable::GeneralDynamicTLSModel; 3907ae0e2c9SDimitry Andric case CodeGenOptions::LocalDynamicTLSModel: 3917ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalDynamicTLSModel; 3927ae0e2c9SDimitry Andric case CodeGenOptions::InitialExecTLSModel: 3937ae0e2c9SDimitry Andric return llvm::GlobalVariable::InitialExecTLSModel; 3947ae0e2c9SDimitry Andric case CodeGenOptions::LocalExecTLSModel: 3957ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalExecTLSModel; 3967ae0e2c9SDimitry Andric } 3977ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model!"); 3987ae0e2c9SDimitry Andric } 3997ae0e2c9SDimitry Andric 4007ae0e2c9SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, 4017ae0e2c9SDimitry Andric const VarDecl &D) const { 402284c1978SDimitry Andric assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); 4037ae0e2c9SDimitry Andric 4047ae0e2c9SDimitry Andric llvm::GlobalVariable::ThreadLocalMode TLM; 4053861d79fSDimitry Andric TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); 4067ae0e2c9SDimitry Andric 4077ae0e2c9SDimitry Andric // Override the TLS model if it is explicitly specified. 4087ae0e2c9SDimitry Andric if (D.hasAttr<TLSModelAttr>()) { 4097ae0e2c9SDimitry Andric const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>(); 4107ae0e2c9SDimitry Andric TLM = GetLLVMTLSModel(Attr->getModel()); 4117ae0e2c9SDimitry Andric } 4127ae0e2c9SDimitry Andric 4137ae0e2c9SDimitry Andric GV->setThreadLocalMode(TLM); 4147ae0e2c9SDimitry Andric } 4157ae0e2c9SDimitry Andric 416e580952dSDimitry Andric /// Set the symbol visibility of type information (vtable and RTTI) 417e580952dSDimitry Andric /// associated with the given type. 418e580952dSDimitry Andric void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, 419e580952dSDimitry Andric const CXXRecordDecl *RD, 4202754fe60SDimitry Andric TypeVisibilityKind TVK) const { 421e580952dSDimitry Andric setGlobalVisibility(GV, RD); 422e580952dSDimitry Andric 423e580952dSDimitry Andric if (!CodeGenOpts.HiddenWeakVTables) 424e580952dSDimitry Andric return; 425e580952dSDimitry Andric 4262754fe60SDimitry Andric // We never want to drop the visibility for RTTI names. 4272754fe60SDimitry Andric if (TVK == TVK_ForRTTIName) 4282754fe60SDimitry Andric return; 4292754fe60SDimitry Andric 430e580952dSDimitry Andric // We want to drop the visibility to hidden for weak type symbols. 431e580952dSDimitry Andric // This isn't possible if there might be unresolved references 432e580952dSDimitry Andric // elsewhere that rely on this symbol being visible. 433e580952dSDimitry Andric 434e580952dSDimitry Andric // This should be kept roughly in sync with setThunkVisibility 435e580952dSDimitry Andric // in CGVTables.cpp. 436e580952dSDimitry Andric 437e580952dSDimitry Andric // Preconditions. 4382754fe60SDimitry Andric if (GV->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage || 439e580952dSDimitry Andric GV->getVisibility() != llvm::GlobalVariable::DefaultVisibility) 440e580952dSDimitry Andric return; 441e580952dSDimitry Andric 442e580952dSDimitry Andric // Don't override an explicit visibility attribute. 443139f7f9bSDimitry Andric if (RD->getExplicitVisibility(NamedDecl::VisibilityForType)) 444e580952dSDimitry Andric return; 445e580952dSDimitry Andric 446e580952dSDimitry Andric switch (RD->getTemplateSpecializationKind()) { 447e580952dSDimitry Andric // We have to disable the optimization if this is an EI definition 448e580952dSDimitry Andric // because there might be EI declarations in other shared objects. 449e580952dSDimitry Andric case TSK_ExplicitInstantiationDefinition: 450e580952dSDimitry Andric case TSK_ExplicitInstantiationDeclaration: 451e580952dSDimitry Andric return; 452e580952dSDimitry Andric 453e580952dSDimitry Andric // Every use of a non-template class's type information has to emit it. 454e580952dSDimitry Andric case TSK_Undeclared: 455e580952dSDimitry Andric break; 456e580952dSDimitry Andric 457e580952dSDimitry Andric // In theory, implicit instantiations can ignore the possibility of 458e580952dSDimitry Andric // an explicit instantiation declaration because there necessarily 459e580952dSDimitry Andric // must be an EI definition somewhere with default visibility. In 460e580952dSDimitry Andric // practice, it's possible to have an explicit instantiation for 461e580952dSDimitry Andric // an arbitrary template class, and linkers aren't necessarily able 462e580952dSDimitry Andric // to deal with mixed-visibility symbols. 463e580952dSDimitry Andric case TSK_ExplicitSpecialization: 464e580952dSDimitry Andric case TSK_ImplicitInstantiation: 465e580952dSDimitry Andric return; 466e580952dSDimitry Andric } 467e580952dSDimitry Andric 468e580952dSDimitry Andric // If there's a key function, there may be translation units 469e580952dSDimitry Andric // that don't have the key function's definition. But ignore 470e580952dSDimitry Andric // this if we're emitting RTTI under -fno-rtti. 471dff0c46cSDimitry Andric if (!(TVK != TVK_ForRTTI) || LangOpts.RTTI) { 472139f7f9bSDimitry Andric // FIXME: what should we do if we "lose" the key function during 473139f7f9bSDimitry Andric // the emission of the file? 474139f7f9bSDimitry Andric if (Context.getCurrentKeyFunction(RD)) 475e580952dSDimitry Andric return; 4762754fe60SDimitry Andric } 477e580952dSDimitry Andric 478e580952dSDimitry Andric // Otherwise, drop the visibility to hidden. 479e580952dSDimitry Andric GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 4802754fe60SDimitry Andric GV->setUnnamedAddr(true); 481e580952dSDimitry Andric } 482e580952dSDimitry Andric 4836122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) { 484f22ef01cSRoman Divacky const NamedDecl *ND = cast<NamedDecl>(GD.getDecl()); 485f22ef01cSRoman Divacky 4866122f3e6SDimitry Andric StringRef &Str = MangledDeclNames[GD.getCanonicalDecl()]; 487ffd1746dSEd Schouten if (!Str.empty()) 488ffd1746dSEd Schouten return Str; 489f22ef01cSRoman Divacky 490e580952dSDimitry Andric if (!getCXXABI().getMangleContext().shouldMangleDeclName(ND)) { 491ffd1746dSEd Schouten IdentifierInfo *II = ND->getIdentifier(); 492ffd1746dSEd Schouten assert(II && "Attempt to mangle unnamed decl."); 493ffd1746dSEd Schouten 494ffd1746dSEd Schouten Str = II->getName(); 495ffd1746dSEd Schouten return Str; 496f22ef01cSRoman Divacky } 497f22ef01cSRoman Divacky 498dff0c46cSDimitry Andric SmallString<256> Buffer; 4992754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer); 500ffd1746dSEd Schouten if (const CXXConstructorDecl *D = dyn_cast<CXXConstructorDecl>(ND)) 5012754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out); 502ffd1746dSEd Schouten else if (const CXXDestructorDecl *D = dyn_cast<CXXDestructorDecl>(ND)) 5032754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out); 504ffd1746dSEd Schouten else 5052754fe60SDimitry Andric getCXXABI().getMangleContext().mangleName(ND, Out); 506ffd1746dSEd Schouten 507ffd1746dSEd Schouten // Allocate space for the mangled name. 5082754fe60SDimitry Andric Out.flush(); 509ffd1746dSEd Schouten size_t Length = Buffer.size(); 510ffd1746dSEd Schouten char *Name = MangledNamesAllocator.Allocate<char>(Length); 511ffd1746dSEd Schouten std::copy(Buffer.begin(), Buffer.end(), Name); 512ffd1746dSEd Schouten 5136122f3e6SDimitry Andric Str = StringRef(Name, Length); 514ffd1746dSEd Schouten 515ffd1746dSEd Schouten return Str; 516ffd1746dSEd Schouten } 517ffd1746dSEd Schouten 5182754fe60SDimitry Andric void CodeGenModule::getBlockMangledName(GlobalDecl GD, MangleBuffer &Buffer, 519ffd1746dSEd Schouten const BlockDecl *BD) { 5202754fe60SDimitry Andric MangleContext &MangleCtx = getCXXABI().getMangleContext(); 5212754fe60SDimitry Andric const Decl *D = GD.getDecl(); 5222754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer.getBuffer()); 5232754fe60SDimitry Andric if (D == 0) 5247ae0e2c9SDimitry Andric MangleCtx.mangleGlobalBlock(BD, 5257ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out); 5262754fe60SDimitry Andric else if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D)) 5272754fe60SDimitry Andric MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out); 5282754fe60SDimitry Andric else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) 5292754fe60SDimitry Andric MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out); 5302754fe60SDimitry Andric else 5312754fe60SDimitry Andric MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out); 532f22ef01cSRoman Divacky } 533f22ef01cSRoman Divacky 5346122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) { 535f22ef01cSRoman Divacky return getModule().getNamedValue(Name); 536f22ef01cSRoman Divacky } 537f22ef01cSRoman Divacky 538f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before 539f22ef01cSRoman Divacky /// main() runs. 540f22ef01cSRoman Divacky void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 541f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 542f22ef01cSRoman Divacky GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 543f22ef01cSRoman Divacky } 544f22ef01cSRoman Divacky 545f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called 546f22ef01cSRoman Divacky /// when the module is unloaded. 547f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 548f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 549f22ef01cSRoman Divacky GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 550f22ef01cSRoman Divacky } 551f22ef01cSRoman Divacky 552f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 553f22ef01cSRoman Divacky // Ctor function type is void()*. 554bd5abe19SDimitry Andric llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); 555f22ef01cSRoman Divacky llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 556f22ef01cSRoman Divacky 557f22ef01cSRoman Divacky // Get the type of a ctor entry, { i32, void ()* }. 558f22ef01cSRoman Divacky llvm::StructType *CtorStructTy = 559dff0c46cSDimitry Andric llvm::StructType::get(Int32Ty, llvm::PointerType::getUnqual(CtorFTy), NULL); 560f22ef01cSRoman Divacky 561f22ef01cSRoman Divacky // Construct the constructor and destructor arrays. 562dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> Ctors; 563f22ef01cSRoman Divacky for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 564dff0c46cSDimitry Andric llvm::Constant *S[] = { 565dff0c46cSDimitry Andric llvm::ConstantInt::get(Int32Ty, I->second, false), 566dff0c46cSDimitry Andric llvm::ConstantExpr::getBitCast(I->first, CtorPFTy) 567dff0c46cSDimitry Andric }; 568f22ef01cSRoman Divacky Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 569f22ef01cSRoman Divacky } 570f22ef01cSRoman Divacky 571f22ef01cSRoman Divacky if (!Ctors.empty()) { 572f22ef01cSRoman Divacky llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 573f22ef01cSRoman Divacky new llvm::GlobalVariable(TheModule, AT, false, 574f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 575f22ef01cSRoman Divacky llvm::ConstantArray::get(AT, Ctors), 576f22ef01cSRoman Divacky GlobalName); 577f22ef01cSRoman Divacky } 578f22ef01cSRoman Divacky } 579f22ef01cSRoman Divacky 580f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes 581f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) { 582f785676fSDimitry Andric const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl()); 583f785676fSDimitry Andric 584f785676fSDimitry Andric if (isa<CXXDestructorDecl>(D) && 585f785676fSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 586f785676fSDimitry Andric GD.getDtorType())) 587f785676fSDimitry Andric return llvm::Function::LinkOnceODRLinkage; 588f785676fSDimitry Andric 589e580952dSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); 590f22ef01cSRoman Divacky 591ffd1746dSEd Schouten if (Linkage == GVA_Internal) 592f22ef01cSRoman Divacky return llvm::Function::InternalLinkage; 593ffd1746dSEd Schouten 594ffd1746dSEd Schouten if (D->hasAttr<DLLExportAttr>()) 595f22ef01cSRoman Divacky return llvm::Function::DLLExportLinkage; 596ffd1746dSEd Schouten 597ffd1746dSEd Schouten if (D->hasAttr<WeakAttr>()) 598f22ef01cSRoman Divacky return llvm::Function::WeakAnyLinkage; 599ffd1746dSEd Schouten 600f22ef01cSRoman Divacky // In C99 mode, 'inline' functions are guaranteed to have a strong 601f22ef01cSRoman Divacky // definition somewhere else, so we can use available_externally linkage. 602ffd1746dSEd Schouten if (Linkage == GVA_C99Inline) 603f22ef01cSRoman Divacky return llvm::Function::AvailableExternallyLinkage; 604ffd1746dSEd Schouten 6056122f3e6SDimitry Andric // Note that Apple's kernel linker doesn't support symbol 6066122f3e6SDimitry Andric // coalescing, so we need to avoid linkonce and weak linkages there. 6076122f3e6SDimitry Andric // Normally, this means we just map to internal, but for explicit 6086122f3e6SDimitry Andric // instantiations we'll map to external. 6096122f3e6SDimitry Andric 610f22ef01cSRoman Divacky // In C++, the compiler has to emit a definition in every translation unit 611f22ef01cSRoman Divacky // that references the function. We should use linkonce_odr because 612f22ef01cSRoman Divacky // a) if all references in this translation unit are optimized away, we 613f22ef01cSRoman Divacky // don't need to codegen it. b) if the function persists, it needs to be 614f22ef01cSRoman Divacky // merged with other definitions. c) C++ has the ODR, so we know the 615f22ef01cSRoman Divacky // definition is dependable. 616ffd1746dSEd Schouten if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 617dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 6182754fe60SDimitry Andric ? llvm::Function::LinkOnceODRLinkage 6192754fe60SDimitry Andric : llvm::Function::InternalLinkage; 620ffd1746dSEd Schouten 621f22ef01cSRoman Divacky // An explicit instantiation of a template has weak linkage, since 622f22ef01cSRoman Divacky // explicit instantiations can occur in multiple translation units 623f22ef01cSRoman Divacky // and must all be equivalent. However, we are not allowed to 624f22ef01cSRoman Divacky // throw away these explicit instantiations. 625ffd1746dSEd Schouten if (Linkage == GVA_ExplicitTemplateInstantiation) 626dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 6272754fe60SDimitry Andric ? llvm::Function::WeakODRLinkage 6286122f3e6SDimitry Andric : llvm::Function::ExternalLinkage; 629ffd1746dSEd Schouten 630f22ef01cSRoman Divacky // Otherwise, we have strong external linkage. 631ffd1746dSEd Schouten assert(Linkage == GVA_StrongExternal); 632f22ef01cSRoman Divacky return llvm::Function::ExternalLinkage; 633f22ef01cSRoman Divacky } 634f22ef01cSRoman Divacky 635f22ef01cSRoman Divacky 636f22ef01cSRoman Divacky /// SetFunctionDefinitionAttributes - Set attributes for a global. 637f22ef01cSRoman Divacky /// 638f22ef01cSRoman Divacky /// FIXME: This is currently only done for aliases and functions, but not for 639f22ef01cSRoman Divacky /// variables (these details are set in EmitGlobalVarDefinition for variables). 640f22ef01cSRoman Divacky void CodeGenModule::SetFunctionDefinitionAttributes(const FunctionDecl *D, 641f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 642f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 643f22ef01cSRoman Divacky } 644f22ef01cSRoman Divacky 645f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D, 646f22ef01cSRoman Divacky const CGFunctionInfo &Info, 647f22ef01cSRoman Divacky llvm::Function *F) { 648f22ef01cSRoman Divacky unsigned CallingConv; 649f22ef01cSRoman Divacky AttributeListType AttributeList; 650139f7f9bSDimitry Andric ConstructAttributeList(Info, D, AttributeList, CallingConv, false); 651139f7f9bSDimitry Andric F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList)); 652f22ef01cSRoman Divacky F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); 653f22ef01cSRoman Divacky } 654f22ef01cSRoman Divacky 6556122f3e6SDimitry Andric /// Determines whether the language options require us to model 6566122f3e6SDimitry Andric /// unwind exceptions. We treat -fexceptions as mandating this 6576122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions 6586122f3e6SDimitry Andric /// enabled. This means, for example, that C with -fexceptions 6596122f3e6SDimitry Andric /// enables this. 660dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) { 6616122f3e6SDimitry Andric // If exceptions are completely disabled, obviously this is false. 662dff0c46cSDimitry Andric if (!LangOpts.Exceptions) return false; 6636122f3e6SDimitry Andric 6646122f3e6SDimitry Andric // If C++ exceptions are enabled, this is true. 665dff0c46cSDimitry Andric if (LangOpts.CXXExceptions) return true; 6666122f3e6SDimitry Andric 6676122f3e6SDimitry Andric // If ObjC exceptions are enabled, this depends on the ABI. 668dff0c46cSDimitry Andric if (LangOpts.ObjCExceptions) { 6697ae0e2c9SDimitry Andric return LangOpts.ObjCRuntime.hasUnwindExceptions(); 6706122f3e6SDimitry Andric } 6716122f3e6SDimitry Andric 6726122f3e6SDimitry Andric return true; 6736122f3e6SDimitry Andric } 6746122f3e6SDimitry Andric 675f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, 676f22ef01cSRoman Divacky llvm::Function *F) { 677f785676fSDimitry Andric llvm::AttrBuilder B; 678f785676fSDimitry Andric 679bd5abe19SDimitry Andric if (CodeGenOpts.UnwindTables) 680f785676fSDimitry Andric B.addAttribute(llvm::Attribute::UWTable); 681bd5abe19SDimitry Andric 682dff0c46cSDimitry Andric if (!hasUnwindExceptions(LangOpts)) 683f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoUnwind); 684f22ef01cSRoman Divacky 6856122f3e6SDimitry Andric if (D->hasAttr<NakedAttr>()) { 6866122f3e6SDimitry Andric // Naked implies noinline: we should not be inlining such functions. 687f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Naked); 688f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 689f785676fSDimitry Andric } else if (D->hasAttr<NoInlineAttr>()) { 690f785676fSDimitry Andric B.addAttribute(llvm::Attribute::NoInline); 691f785676fSDimitry Andric } else if ((D->hasAttr<AlwaysInlineAttr>() || 692f785676fSDimitry Andric D->hasAttr<ForceInlineAttr>()) && 693f785676fSDimitry Andric !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex, 694f785676fSDimitry Andric llvm::Attribute::NoInline)) { 695f785676fSDimitry Andric // (noinline wins over always_inline, and we can't specify both in IR) 696f785676fSDimitry Andric B.addAttribute(llvm::Attribute::AlwaysInline); 6976122f3e6SDimitry Andric } 6982754fe60SDimitry Andric 699f785676fSDimitry Andric if (D->hasAttr<ColdAttr>()) { 700f785676fSDimitry Andric B.addAttribute(llvm::Attribute::OptimizeForSize); 701f785676fSDimitry Andric B.addAttribute(llvm::Attribute::Cold); 702f785676fSDimitry Andric } 7033861d79fSDimitry Andric 7043861d79fSDimitry Andric if (D->hasAttr<MinSizeAttr>()) 705f785676fSDimitry Andric B.addAttribute(llvm::Attribute::MinSize); 706f22ef01cSRoman Divacky 7073861d79fSDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 708f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtect); 7093861d79fSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 710f785676fSDimitry Andric B.addAttribute(llvm::Attribute::StackProtectReq); 7113861d79fSDimitry Andric 712139f7f9bSDimitry Andric // Add sanitizer attributes if function is not blacklisted. 713f785676fSDimitry Andric if (!SanitizerBlacklist->isIn(*F)) { 714139f7f9bSDimitry Andric // When AddressSanitizer is enabled, set SanitizeAddress attribute 715139f7f9bSDimitry Andric // unless __attribute__((no_sanitize_address)) is used. 716139f7f9bSDimitry Andric if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>()) 717f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeAddress); 718139f7f9bSDimitry Andric // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) 719139f7f9bSDimitry Andric if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) { 720f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeThread); 721139f7f9bSDimitry Andric } 722139f7f9bSDimitry Andric // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) 723139f7f9bSDimitry Andric if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>()) 724f785676fSDimitry Andric B.addAttribute(llvm::Attribute::SanitizeMemory); 725dff0c46cSDimitry Andric } 726dff0c46cSDimitry Andric 727f785676fSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 728f785676fSDimitry Andric llvm::AttributeSet::get( 729f785676fSDimitry Andric F->getContext(), llvm::AttributeSet::FunctionIndex, B)); 730f785676fSDimitry Andric 731f785676fSDimitry Andric if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D)) 732f785676fSDimitry Andric F->setUnnamedAddr(true); 733f785676fSDimitry Andric else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) 734f785676fSDimitry Andric if (MD->isVirtual()) 735f785676fSDimitry Andric F->setUnnamedAddr(true); 736f785676fSDimitry Andric 737e580952dSDimitry Andric unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); 738e580952dSDimitry Andric if (alignment) 739e580952dSDimitry Andric F->setAlignment(alignment); 740e580952dSDimitry Andric 741f22ef01cSRoman Divacky // C++ ABI requires 2-byte alignment for member functions. 742f22ef01cSRoman Divacky if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) 743f22ef01cSRoman Divacky F->setAlignment(2); 744f22ef01cSRoman Divacky } 745f22ef01cSRoman Divacky 746f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D, 747f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 7482754fe60SDimitry Andric if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 7492754fe60SDimitry Andric setGlobalVisibility(GV, ND); 7502754fe60SDimitry Andric else 7512754fe60SDimitry Andric GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 752f22ef01cSRoman Divacky 753f22ef01cSRoman Divacky if (D->hasAttr<UsedAttr>()) 754f22ef01cSRoman Divacky AddUsedGlobal(GV); 755f22ef01cSRoman Divacky 756f22ef01cSRoman Divacky if (const SectionAttr *SA = D->getAttr<SectionAttr>()) 757f22ef01cSRoman Divacky GV->setSection(SA->getName()); 758f22ef01cSRoman Divacky 759139f7f9bSDimitry Andric // Alias cannot have attributes. Filter them here. 760139f7f9bSDimitry Andric if (!isa<llvm::GlobalAlias>(GV)) 761f22ef01cSRoman Divacky getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this); 762f22ef01cSRoman Divacky } 763f22ef01cSRoman Divacky 764f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D, 765f22ef01cSRoman Divacky llvm::Function *F, 766f22ef01cSRoman Divacky const CGFunctionInfo &FI) { 767f22ef01cSRoman Divacky SetLLVMFunctionAttributes(D, FI, F); 768f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, F); 769f22ef01cSRoman Divacky 770f22ef01cSRoman Divacky F->setLinkage(llvm::Function::InternalLinkage); 771f22ef01cSRoman Divacky 772f22ef01cSRoman Divacky SetCommonAttributes(D, F); 773f22ef01cSRoman Divacky } 774f22ef01cSRoman Divacky 775f22ef01cSRoman Divacky void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, 776f22ef01cSRoman Divacky llvm::Function *F, 777f22ef01cSRoman Divacky bool IsIncompleteFunction) { 7783b0f4066SDimitry Andric if (unsigned IID = F->getIntrinsicID()) { 7793b0f4066SDimitry Andric // If this is an intrinsic function, set the function's attributes 7803b0f4066SDimitry Andric // to the intrinsic's attributes. 7813861d79fSDimitry Andric F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), 7823861d79fSDimitry Andric (llvm::Intrinsic::ID)IID)); 7833b0f4066SDimitry Andric return; 7843b0f4066SDimitry Andric } 7853b0f4066SDimitry Andric 786f22ef01cSRoman Divacky const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl()); 787f22ef01cSRoman Divacky 788f22ef01cSRoman Divacky if (!IsIncompleteFunction) 789dff0c46cSDimitry Andric SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F); 790f22ef01cSRoman Divacky 791f785676fSDimitry Andric if (getCXXABI().HasThisReturn(GD)) { 792f785676fSDimitry Andric assert(!F->arg_empty() && 793f785676fSDimitry Andric F->arg_begin()->getType() 794f785676fSDimitry Andric ->canLosslesslyBitCastTo(F->getReturnType()) && 795f785676fSDimitry Andric "unexpected this return"); 796f785676fSDimitry Andric F->addAttribute(1, llvm::Attribute::Returned); 797f785676fSDimitry Andric } 798f785676fSDimitry Andric 799f22ef01cSRoman Divacky // Only a few attributes are set on declarations; these may later be 800f22ef01cSRoman Divacky // overridden by a definition. 801f22ef01cSRoman Divacky 802f22ef01cSRoman Divacky if (FD->hasAttr<DLLImportAttr>()) { 803f22ef01cSRoman Divacky F->setLinkage(llvm::Function::DLLImportLinkage); 804f22ef01cSRoman Divacky } else if (FD->hasAttr<WeakAttr>() || 8053b0f4066SDimitry Andric FD->isWeakImported()) { 806f22ef01cSRoman Divacky // "extern_weak" is overloaded in LLVM; we probably should have 807f22ef01cSRoman Divacky // separate linkage types for this. 808f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 809f22ef01cSRoman Divacky } else { 810f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalLinkage); 8112754fe60SDimitry Andric 812139f7f9bSDimitry Andric LinkageInfo LV = FD->getLinkageAndVisibility(); 813139f7f9bSDimitry Andric if (LV.getLinkage() == ExternalLinkage && LV.isVisibilityExplicit()) { 814139f7f9bSDimitry Andric F->setVisibility(GetLLVMVisibility(LV.getVisibility())); 8152754fe60SDimitry Andric } 816f22ef01cSRoman Divacky } 817f22ef01cSRoman Divacky 818f22ef01cSRoman Divacky if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) 819f22ef01cSRoman Divacky F->setSection(SA->getName()); 820f785676fSDimitry Andric 821f785676fSDimitry Andric // A replaceable global allocation function does not act like a builtin by 822f785676fSDimitry Andric // default, only if it is invoked by a new-expression or delete-expression. 823f785676fSDimitry Andric if (FD->isReplaceableGlobalAllocationFunction()) 824f785676fSDimitry Andric F->addAttribute(llvm::AttributeSet::FunctionIndex, 825f785676fSDimitry Andric llvm::Attribute::NoBuiltin); 826f22ef01cSRoman Divacky } 827f22ef01cSRoman Divacky 828f22ef01cSRoman Divacky void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) { 829f22ef01cSRoman Divacky assert(!GV->isDeclaration() && 830f22ef01cSRoman Divacky "Only globals with definition can force usage."); 831f22ef01cSRoman Divacky LLVMUsed.push_back(GV); 832f22ef01cSRoman Divacky } 833f22ef01cSRoman Divacky 834f22ef01cSRoman Divacky void CodeGenModule::EmitLLVMUsed() { 835f22ef01cSRoman Divacky // Don't create llvm.used if there is no need. 836f22ef01cSRoman Divacky if (LLVMUsed.empty()) 837f22ef01cSRoman Divacky return; 838f22ef01cSRoman Divacky 839f22ef01cSRoman Divacky // Convert LLVMUsed to what ConstantArray needs. 840dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> UsedArray; 841f22ef01cSRoman Divacky UsedArray.resize(LLVMUsed.size()); 842f22ef01cSRoman Divacky for (unsigned i = 0, e = LLVMUsed.size(); i != e; ++i) { 843f22ef01cSRoman Divacky UsedArray[i] = 844f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]), 845dff0c46cSDimitry Andric Int8PtrTy); 846f22ef01cSRoman Divacky } 847f22ef01cSRoman Divacky 848f22ef01cSRoman Divacky if (UsedArray.empty()) 849f22ef01cSRoman Divacky return; 850dff0c46cSDimitry Andric llvm::ArrayType *ATy = llvm::ArrayType::get(Int8PtrTy, UsedArray.size()); 851f22ef01cSRoman Divacky 852f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 853f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), ATy, false, 854f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 855f22ef01cSRoman Divacky llvm::ConstantArray::get(ATy, UsedArray), 856f22ef01cSRoman Divacky "llvm.used"); 857f22ef01cSRoman Divacky 858f22ef01cSRoman Divacky GV->setSection("llvm.metadata"); 859f22ef01cSRoman Divacky } 860f22ef01cSRoman Divacky 861f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) { 862f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opts); 863f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 864f785676fSDimitry Andric } 865f785676fSDimitry Andric 866f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) { 867f785676fSDimitry Andric llvm::SmallString<32> Opt; 868f785676fSDimitry Andric getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt); 869f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 870f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 871f785676fSDimitry Andric } 872f785676fSDimitry Andric 873f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) { 874f785676fSDimitry Andric llvm::SmallString<24> Opt; 875f785676fSDimitry Andric getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt); 876f785676fSDimitry Andric llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt); 877f785676fSDimitry Andric LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts)); 878f785676fSDimitry Andric } 879f785676fSDimitry Andric 880139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules 881139f7f9bSDimitry Andric /// it depends on, using a postorder walk. 882f785676fSDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, 883139f7f9bSDimitry Andric Module *Mod, 884139f7f9bSDimitry Andric SmallVectorImpl<llvm::Value *> &Metadata, 885139f7f9bSDimitry Andric llvm::SmallPtrSet<Module *, 16> &Visited) { 886139f7f9bSDimitry Andric // Import this module's parent. 887139f7f9bSDimitry Andric if (Mod->Parent && Visited.insert(Mod->Parent)) { 888f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited); 889139f7f9bSDimitry Andric } 890139f7f9bSDimitry Andric 891139f7f9bSDimitry Andric // Import this module's dependencies. 892139f7f9bSDimitry Andric for (unsigned I = Mod->Imports.size(); I > 0; --I) { 893139f7f9bSDimitry Andric if (Visited.insert(Mod->Imports[I-1])) 894f785676fSDimitry Andric addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited); 895139f7f9bSDimitry Andric } 896139f7f9bSDimitry Andric 897139f7f9bSDimitry Andric // Add linker options to link against the libraries/frameworks 898139f7f9bSDimitry Andric // described by this module. 899f785676fSDimitry Andric llvm::LLVMContext &Context = CGM.getLLVMContext(); 900139f7f9bSDimitry Andric for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) { 901f785676fSDimitry Andric // Link against a framework. Frameworks are currently Darwin only, so we 902f785676fSDimitry Andric // don't to ask TargetCodeGenInfo for the spelling of the linker option. 903139f7f9bSDimitry Andric if (Mod->LinkLibraries[I-1].IsFramework) { 904139f7f9bSDimitry Andric llvm::Value *Args[2] = { 905139f7f9bSDimitry Andric llvm::MDString::get(Context, "-framework"), 906139f7f9bSDimitry Andric llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library) 907139f7f9bSDimitry Andric }; 908139f7f9bSDimitry Andric 909139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, Args)); 910139f7f9bSDimitry Andric continue; 911139f7f9bSDimitry Andric } 912139f7f9bSDimitry Andric 913139f7f9bSDimitry Andric // Link against a library. 914f785676fSDimitry Andric llvm::SmallString<24> Opt; 915f785676fSDimitry Andric CGM.getTargetCodeGenInfo().getDependentLibraryOption( 916f785676fSDimitry Andric Mod->LinkLibraries[I-1].Library, Opt); 917f785676fSDimitry Andric llvm::Value *OptString = llvm::MDString::get(Context, Opt); 918139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, OptString)); 919139f7f9bSDimitry Andric } 920139f7f9bSDimitry Andric } 921139f7f9bSDimitry Andric 922139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() { 923139f7f9bSDimitry Andric // Collect the set of all of the modules we want to visit to emit link 924139f7f9bSDimitry Andric // options, which is essentially the imported modules and all of their 925139f7f9bSDimitry Andric // non-explicit child modules. 926139f7f9bSDimitry Andric llvm::SetVector<clang::Module *> LinkModules; 927139f7f9bSDimitry Andric llvm::SmallPtrSet<clang::Module *, 16> Visited; 928139f7f9bSDimitry Andric SmallVector<clang::Module *, 16> Stack; 929139f7f9bSDimitry Andric 930139f7f9bSDimitry Andric // Seed the stack with imported modules. 931139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(), 932139f7f9bSDimitry Andric MEnd = ImportedModules.end(); 933139f7f9bSDimitry Andric M != MEnd; ++M) { 934139f7f9bSDimitry Andric if (Visited.insert(*M)) 935139f7f9bSDimitry Andric Stack.push_back(*M); 936139f7f9bSDimitry Andric } 937139f7f9bSDimitry Andric 938139f7f9bSDimitry Andric // Find all of the modules to import, making a little effort to prune 939139f7f9bSDimitry Andric // non-leaf modules. 940139f7f9bSDimitry Andric while (!Stack.empty()) { 941f785676fSDimitry Andric clang::Module *Mod = Stack.pop_back_val(); 942139f7f9bSDimitry Andric 943139f7f9bSDimitry Andric bool AnyChildren = false; 944139f7f9bSDimitry Andric 945139f7f9bSDimitry Andric // Visit the submodules of this module. 946139f7f9bSDimitry Andric for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(), 947139f7f9bSDimitry Andric SubEnd = Mod->submodule_end(); 948139f7f9bSDimitry Andric Sub != SubEnd; ++Sub) { 949139f7f9bSDimitry Andric // Skip explicit children; they need to be explicitly imported to be 950139f7f9bSDimitry Andric // linked against. 951139f7f9bSDimitry Andric if ((*Sub)->IsExplicit) 952139f7f9bSDimitry Andric continue; 953139f7f9bSDimitry Andric 954139f7f9bSDimitry Andric if (Visited.insert(*Sub)) { 955139f7f9bSDimitry Andric Stack.push_back(*Sub); 956139f7f9bSDimitry Andric AnyChildren = true; 957139f7f9bSDimitry Andric } 958139f7f9bSDimitry Andric } 959139f7f9bSDimitry Andric 960139f7f9bSDimitry Andric // We didn't find any children, so add this module to the list of 961139f7f9bSDimitry Andric // modules to link against. 962139f7f9bSDimitry Andric if (!AnyChildren) { 963139f7f9bSDimitry Andric LinkModules.insert(Mod); 964139f7f9bSDimitry Andric } 965139f7f9bSDimitry Andric } 966139f7f9bSDimitry Andric 967139f7f9bSDimitry Andric // Add link options for all of the imported modules in reverse topological 968f785676fSDimitry Andric // order. We don't do anything to try to order import link flags with respect 969f785676fSDimitry Andric // to linker options inserted by things like #pragma comment(). 970139f7f9bSDimitry Andric SmallVector<llvm::Value *, 16> MetadataArgs; 971139f7f9bSDimitry Andric Visited.clear(); 972139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(), 973139f7f9bSDimitry Andric MEnd = LinkModules.end(); 974139f7f9bSDimitry Andric M != MEnd; ++M) { 975139f7f9bSDimitry Andric if (Visited.insert(*M)) 976f785676fSDimitry Andric addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited); 977139f7f9bSDimitry Andric } 978139f7f9bSDimitry Andric std::reverse(MetadataArgs.begin(), MetadataArgs.end()); 979f785676fSDimitry Andric LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end()); 980139f7f9bSDimitry Andric 981139f7f9bSDimitry Andric // Add the linker options metadata flag. 982139f7f9bSDimitry Andric getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options", 983f785676fSDimitry Andric llvm::MDNode::get(getLLVMContext(), 984f785676fSDimitry Andric LinkerOptionsMetadata)); 985139f7f9bSDimitry Andric } 986139f7f9bSDimitry Andric 987f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() { 988f22ef01cSRoman Divacky // Emit code for any potentially referenced deferred decls. Since a 989f22ef01cSRoman Divacky // previously unused static decl may become used during the generation of code 990f22ef01cSRoman Divacky // for a static function, iterate until no changes are made. 991f22ef01cSRoman Divacky 992139f7f9bSDimitry Andric while (true) { 993f22ef01cSRoman Divacky if (!DeferredVTables.empty()) { 994139f7f9bSDimitry Andric EmitDeferredVTables(); 995139f7f9bSDimitry Andric 996139f7f9bSDimitry Andric // Emitting a v-table doesn't directly cause more v-tables to 997139f7f9bSDimitry Andric // become deferred, although it can cause functions to be 998139f7f9bSDimitry Andric // emitted that then need those v-tables. 999139f7f9bSDimitry Andric assert(DeferredVTables.empty()); 1000f22ef01cSRoman Divacky } 1001f22ef01cSRoman Divacky 1002139f7f9bSDimitry Andric // Stop if we're out of both deferred v-tables and deferred declarations. 1003139f7f9bSDimitry Andric if (DeferredDeclsToEmit.empty()) break; 1004139f7f9bSDimitry Andric 1005f22ef01cSRoman Divacky GlobalDecl D = DeferredDeclsToEmit.back(); 1006f22ef01cSRoman Divacky DeferredDeclsToEmit.pop_back(); 1007f22ef01cSRoman Divacky 1008f22ef01cSRoman Divacky // Check to see if we've already emitted this. This is necessary 1009f22ef01cSRoman Divacky // for a couple of reasons: first, decls can end up in the 1010f22ef01cSRoman Divacky // deferred-decls queue multiple times, and second, decls can end 1011f22ef01cSRoman Divacky // up with definitions in unusual ways (e.g. by an extern inline 1012f22ef01cSRoman Divacky // function acquiring a strong function redefinition). Just 1013f22ef01cSRoman Divacky // ignore these cases. 1014f22ef01cSRoman Divacky // 1015f22ef01cSRoman Divacky // TODO: That said, looking this up multiple times is very wasteful. 10166122f3e6SDimitry Andric StringRef Name = getMangledName(D); 1017f22ef01cSRoman Divacky llvm::GlobalValue *CGRef = GetGlobalValue(Name); 1018f22ef01cSRoman Divacky assert(CGRef && "Deferred decl wasn't referenced?"); 1019f22ef01cSRoman Divacky 1020f22ef01cSRoman Divacky if (!CGRef->isDeclaration()) 1021f22ef01cSRoman Divacky continue; 1022f22ef01cSRoman Divacky 1023f22ef01cSRoman Divacky // GlobalAlias::isDeclaration() defers to the aliasee, but for our 1024f22ef01cSRoman Divacky // purposes an alias counts as a definition. 1025f22ef01cSRoman Divacky if (isa<llvm::GlobalAlias>(CGRef)) 1026f22ef01cSRoman Divacky continue; 1027f22ef01cSRoman Divacky 1028f22ef01cSRoman Divacky // Otherwise, emit the definition and move on to the next one. 1029f22ef01cSRoman Divacky EmitGlobalDefinition(D); 1030f22ef01cSRoman Divacky } 1031f22ef01cSRoman Divacky } 1032f22ef01cSRoman Divacky 10336122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() { 10346122f3e6SDimitry Andric if (Annotations.empty()) 10356122f3e6SDimitry Andric return; 10366122f3e6SDimitry Andric 10376122f3e6SDimitry Andric // Create a new global variable for the ConstantStruct in the Module. 10386122f3e6SDimitry Andric llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get( 10396122f3e6SDimitry Andric Annotations[0]->getType(), Annotations.size()), Annotations); 10406122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), 10416122f3e6SDimitry Andric Array->getType(), false, llvm::GlobalValue::AppendingLinkage, Array, 10426122f3e6SDimitry Andric "llvm.global.annotations"); 10436122f3e6SDimitry Andric gv->setSection(AnnotationSection); 10446122f3e6SDimitry Andric } 10456122f3e6SDimitry Andric 1046139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) { 1047f785676fSDimitry Andric llvm::Constant *&AStr = AnnotationStrings[Str]; 1048f785676fSDimitry Andric if (AStr) 1049f785676fSDimitry Andric return AStr; 10506122f3e6SDimitry Andric 10516122f3e6SDimitry Andric // Not found yet, create a new global. 1052dff0c46cSDimitry Andric llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str); 10536122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), s->getType(), 10546122f3e6SDimitry Andric true, llvm::GlobalValue::PrivateLinkage, s, ".str"); 10556122f3e6SDimitry Andric gv->setSection(AnnotationSection); 10566122f3e6SDimitry Andric gv->setUnnamedAddr(true); 1057f785676fSDimitry Andric AStr = gv; 10586122f3e6SDimitry Andric return gv; 10596122f3e6SDimitry Andric } 10606122f3e6SDimitry Andric 10616122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) { 10626122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 10636122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(Loc); 10646122f3e6SDimitry Andric if (PLoc.isValid()) 10656122f3e6SDimitry Andric return EmitAnnotationString(PLoc.getFilename()); 10666122f3e6SDimitry Andric return EmitAnnotationString(SM.getBufferName(Loc)); 10676122f3e6SDimitry Andric } 10686122f3e6SDimitry Andric 10696122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { 10706122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 10716122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(L); 10726122f3e6SDimitry Andric unsigned LineNo = PLoc.isValid() ? PLoc.getLine() : 10736122f3e6SDimitry Andric SM.getExpansionLineNumber(L); 10746122f3e6SDimitry Andric return llvm::ConstantInt::get(Int32Ty, LineNo); 10756122f3e6SDimitry Andric } 10766122f3e6SDimitry Andric 1077f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 1078f22ef01cSRoman Divacky const AnnotateAttr *AA, 10796122f3e6SDimitry Andric SourceLocation L) { 10806122f3e6SDimitry Andric // Get the globals for file name, annotation, and the line number. 10816122f3e6SDimitry Andric llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), 10826122f3e6SDimitry Andric *UnitGV = EmitAnnotationUnit(L), 10836122f3e6SDimitry Andric *LineNoCst = EmitAnnotationLineNo(L); 1084f22ef01cSRoman Divacky 1085f22ef01cSRoman Divacky // Create the ConstantStruct for the global annotation. 1086f22ef01cSRoman Divacky llvm::Constant *Fields[4] = { 10876122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), 10886122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), 10896122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), 10906122f3e6SDimitry Andric LineNoCst 1091f22ef01cSRoman Divacky }; 109217a519f9SDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 1093f22ef01cSRoman Divacky } 1094f22ef01cSRoman Divacky 10956122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D, 10966122f3e6SDimitry Andric llvm::GlobalValue *GV) { 10976122f3e6SDimitry Andric assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute"); 10986122f3e6SDimitry Andric // Get the struct elements for these annotations. 10996122f3e6SDimitry Andric for (specific_attr_iterator<AnnotateAttr> 11006122f3e6SDimitry Andric ai = D->specific_attr_begin<AnnotateAttr>(), 11016122f3e6SDimitry Andric ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai) 11026122f3e6SDimitry Andric Annotations.push_back(EmitAnnotateAttr(GV, *ai, D->getLocation())); 11036122f3e6SDimitry Andric } 11046122f3e6SDimitry Andric 1105f22ef01cSRoman Divacky bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { 1106e580952dSDimitry Andric // Never defer when EmitAllDecls is specified. 1107dff0c46cSDimitry Andric if (LangOpts.EmitAllDecls) 1108f22ef01cSRoman Divacky return false; 1109f22ef01cSRoman Divacky 1110e580952dSDimitry Andric return !getContext().DeclMustBeEmitted(Global); 1111f22ef01cSRoman Divacky } 1112f22ef01cSRoman Divacky 11133861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( 11143861d79fSDimitry Andric const CXXUuidofExpr* E) { 11153861d79fSDimitry Andric // Sema has verified that IIDSource has a __declspec(uuid()), and that its 11163861d79fSDimitry Andric // well-formed. 1117f785676fSDimitry Andric StringRef Uuid = E->getUuidAsStringRef(Context); 1118f785676fSDimitry Andric std::string Name = "_GUID_" + Uuid.lower(); 1119f785676fSDimitry Andric std::replace(Name.begin(), Name.end(), '-', '_'); 11203861d79fSDimitry Andric 11213861d79fSDimitry Andric // Look for an existing global. 11223861d79fSDimitry Andric if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name)) 11233861d79fSDimitry Andric return GV; 11243861d79fSDimitry Andric 11253861d79fSDimitry Andric llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType()); 11263861d79fSDimitry Andric assert(Init && "failed to initialize as constant"); 11273861d79fSDimitry Andric 1128f785676fSDimitry Andric llvm::GlobalVariable *GV = new llvm::GlobalVariable( 1129f785676fSDimitry Andric getModule(), Init->getType(), 1130f785676fSDimitry Andric /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name); 11313861d79fSDimitry Andric return GV; 11323861d79fSDimitry Andric } 11333861d79fSDimitry Andric 1134f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { 1135f22ef01cSRoman Divacky const AliasAttr *AA = VD->getAttr<AliasAttr>(); 1136f22ef01cSRoman Divacky assert(AA && "No alias?"); 1137f22ef01cSRoman Divacky 11386122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); 1139f22ef01cSRoman Divacky 1140f22ef01cSRoman Divacky // See if there is already something with the target's name in the module. 1141f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); 11423861d79fSDimitry Andric if (Entry) { 11433861d79fSDimitry Andric unsigned AS = getContext().getTargetAddressSpace(VD->getType()); 11443861d79fSDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); 11453861d79fSDimitry Andric } 1146f22ef01cSRoman Divacky 1147f22ef01cSRoman Divacky llvm::Constant *Aliasee; 1148f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 11493861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, 11503861d79fSDimitry Andric GlobalDecl(cast<FunctionDecl>(VD)), 11512754fe60SDimitry Andric /*ForVTable=*/false); 1152f22ef01cSRoman Divacky else 1153f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 1154f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 11553861d79fSDimitry Andric 1156f22ef01cSRoman Divacky llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee); 1157f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 1158f22ef01cSRoman Divacky WeakRefReferences.insert(F); 1159f22ef01cSRoman Divacky 1160f22ef01cSRoman Divacky return Aliasee; 1161f22ef01cSRoman Divacky } 1162f22ef01cSRoman Divacky 1163f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) { 1164f22ef01cSRoman Divacky const ValueDecl *Global = cast<ValueDecl>(GD.getDecl()); 1165f22ef01cSRoman Divacky 1166f22ef01cSRoman Divacky // Weak references don't produce any output by themselves. 1167f22ef01cSRoman Divacky if (Global->hasAttr<WeakRefAttr>()) 1168f22ef01cSRoman Divacky return; 1169f22ef01cSRoman Divacky 1170f22ef01cSRoman Divacky // If this is an alias definition (which otherwise looks like a declaration) 1171f22ef01cSRoman Divacky // emit it now. 1172f22ef01cSRoman Divacky if (Global->hasAttr<AliasAttr>()) 1173f22ef01cSRoman Divacky return EmitAliasDefinition(GD); 1174f22ef01cSRoman Divacky 11756122f3e6SDimitry Andric // If this is CUDA, be selective about which declarations we emit. 1176dff0c46cSDimitry Andric if (LangOpts.CUDA) { 11776122f3e6SDimitry Andric if (CodeGenOpts.CUDAIsDevice) { 11786122f3e6SDimitry Andric if (!Global->hasAttr<CUDADeviceAttr>() && 11796122f3e6SDimitry Andric !Global->hasAttr<CUDAGlobalAttr>() && 11806122f3e6SDimitry Andric !Global->hasAttr<CUDAConstantAttr>() && 11816122f3e6SDimitry Andric !Global->hasAttr<CUDASharedAttr>()) 11826122f3e6SDimitry Andric return; 11836122f3e6SDimitry Andric } else { 11846122f3e6SDimitry Andric if (!Global->hasAttr<CUDAHostAttr>() && ( 11856122f3e6SDimitry Andric Global->hasAttr<CUDADeviceAttr>() || 11866122f3e6SDimitry Andric Global->hasAttr<CUDAConstantAttr>() || 11876122f3e6SDimitry Andric Global->hasAttr<CUDASharedAttr>())) 11886122f3e6SDimitry Andric return; 1189e580952dSDimitry Andric } 1190e580952dSDimitry Andric } 1191e580952dSDimitry Andric 11926122f3e6SDimitry Andric // Ignore declarations, they will be emitted on their first use. 11936122f3e6SDimitry Andric if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 1194f22ef01cSRoman Divacky // Forward declarations are emitted lazily on first use. 11956122f3e6SDimitry Andric if (!FD->doesThisDeclarationHaveABody()) { 11966122f3e6SDimitry Andric if (!FD->doesDeclarationForceExternallyVisibleDefinition()) 1197f22ef01cSRoman Divacky return; 11986122f3e6SDimitry Andric 11996122f3e6SDimitry Andric const FunctionDecl *InlineDefinition = 0; 12006122f3e6SDimitry Andric FD->getBody(InlineDefinition); 12016122f3e6SDimitry Andric 12026122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1203dff0c46cSDimitry Andric DeferredDecls.erase(MangledName); 12046122f3e6SDimitry Andric EmitGlobalDefinition(InlineDefinition); 12056122f3e6SDimitry Andric return; 12066122f3e6SDimitry Andric } 1207f22ef01cSRoman Divacky } else { 1208f22ef01cSRoman Divacky const VarDecl *VD = cast<VarDecl>(Global); 1209f22ef01cSRoman Divacky assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 1210f22ef01cSRoman Divacky 1211f22ef01cSRoman Divacky if (VD->isThisDeclarationADefinition() != VarDecl::Definition) 1212f22ef01cSRoman Divacky return; 1213f22ef01cSRoman Divacky } 1214f22ef01cSRoman Divacky 1215f22ef01cSRoman Divacky // Defer code generation when possible if this is a static definition, inline 1216f22ef01cSRoman Divacky // function etc. These we only want to emit if they are used. 1217f22ef01cSRoman Divacky if (!MayDeferGeneration(Global)) { 1218f22ef01cSRoman Divacky // Emit the definition if it can't be deferred. 1219f22ef01cSRoman Divacky EmitGlobalDefinition(GD); 1220f22ef01cSRoman Divacky return; 1221f22ef01cSRoman Divacky } 1222f22ef01cSRoman Divacky 1223e580952dSDimitry Andric // If we're deferring emission of a C++ variable with an 1224e580952dSDimitry Andric // initializer, remember the order in which it appeared in the file. 1225dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) && 1226e580952dSDimitry Andric cast<VarDecl>(Global)->hasInit()) { 1227e580952dSDimitry Andric DelayedCXXInitPosition[Global] = CXXGlobalInits.size(); 1228e580952dSDimitry Andric CXXGlobalInits.push_back(0); 1229e580952dSDimitry Andric } 1230e580952dSDimitry Andric 1231f22ef01cSRoman Divacky // If the value has already been used, add it directly to the 1232f22ef01cSRoman Divacky // DeferredDeclsToEmit list. 12336122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1234f22ef01cSRoman Divacky if (GetGlobalValue(MangledName)) 1235f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(GD); 1236f22ef01cSRoman Divacky else { 1237f22ef01cSRoman Divacky // Otherwise, remember that we saw a deferred decl with this name. The 1238f22ef01cSRoman Divacky // first use of the mangled name will cause it to move into 1239f22ef01cSRoman Divacky // DeferredDeclsToEmit. 1240f22ef01cSRoman Divacky DeferredDecls[MangledName] = GD; 1241f22ef01cSRoman Divacky } 1242f22ef01cSRoman Divacky } 1243f22ef01cSRoman Divacky 1244f8254f43SDimitry Andric namespace { 1245f8254f43SDimitry Andric struct FunctionIsDirectlyRecursive : 1246f8254f43SDimitry Andric public RecursiveASTVisitor<FunctionIsDirectlyRecursive> { 1247f8254f43SDimitry Andric const StringRef Name; 1248dff0c46cSDimitry Andric const Builtin::Context &BI; 1249f8254f43SDimitry Andric bool Result; 1250dff0c46cSDimitry Andric FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) : 1251dff0c46cSDimitry Andric Name(N), BI(C), Result(false) { 1252f8254f43SDimitry Andric } 1253f8254f43SDimitry Andric typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base; 1254f8254f43SDimitry Andric 1255f8254f43SDimitry Andric bool TraverseCallExpr(CallExpr *E) { 1256dff0c46cSDimitry Andric const FunctionDecl *FD = E->getDirectCallee(); 1257dff0c46cSDimitry Andric if (!FD) 1258f8254f43SDimitry Andric return true; 1259dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1260dff0c46cSDimitry Andric if (Attr && Name == Attr->getLabel()) { 1261dff0c46cSDimitry Andric Result = true; 1262dff0c46cSDimitry Andric return false; 1263dff0c46cSDimitry Andric } 1264dff0c46cSDimitry Andric unsigned BuiltinID = FD->getBuiltinID(); 1265dff0c46cSDimitry Andric if (!BuiltinID) 1266f8254f43SDimitry Andric return true; 1267dff0c46cSDimitry Andric StringRef BuiltinName = BI.GetName(BuiltinID); 1268dff0c46cSDimitry Andric if (BuiltinName.startswith("__builtin_") && 1269dff0c46cSDimitry Andric Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) { 1270f8254f43SDimitry Andric Result = true; 1271f8254f43SDimitry Andric return false; 1272f8254f43SDimitry Andric } 1273f8254f43SDimitry Andric return true; 1274f8254f43SDimitry Andric } 1275f8254f43SDimitry Andric }; 1276f8254f43SDimitry Andric } 1277f8254f43SDimitry Andric 1278dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another 1279dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin, 1280dff0c46cSDimitry Andric // ends up pointing to itself. 1281f8254f43SDimitry Andric bool 1282dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { 1283dff0c46cSDimitry Andric StringRef Name; 1284dff0c46cSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) { 1285dff0c46cSDimitry Andric // asm labels are a special kind of mangling we have to support. 1286dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1287dff0c46cSDimitry Andric if (!Attr) 1288f8254f43SDimitry Andric return false; 1289dff0c46cSDimitry Andric Name = Attr->getLabel(); 1290dff0c46cSDimitry Andric } else { 1291dff0c46cSDimitry Andric Name = FD->getName(); 1292dff0c46cSDimitry Andric } 1293f8254f43SDimitry Andric 1294dff0c46cSDimitry Andric FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); 1295dff0c46cSDimitry Andric Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); 1296f8254f43SDimitry Andric return Walker.Result; 1297f8254f43SDimitry Andric } 1298f8254f43SDimitry Andric 1299f8254f43SDimitry Andric bool 1300f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) { 1301f785676fSDimitry Andric if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage) 1302f8254f43SDimitry Andric return true; 1303f785676fSDimitry Andric const FunctionDecl *F = cast<FunctionDecl>(GD.getDecl()); 1304f8254f43SDimitry Andric if (CodeGenOpts.OptimizationLevel == 0 && 13057ae0e2c9SDimitry Andric !F->hasAttr<AlwaysInlineAttr>() && !F->hasAttr<ForceInlineAttr>()) 1306f8254f43SDimitry Andric return false; 1307f8254f43SDimitry Andric // PR9614. Avoid cases where the source code is lying to us. An available 1308f8254f43SDimitry Andric // externally function should have an equivalent function somewhere else, 1309f8254f43SDimitry Andric // but a function that calls itself is clearly not equivalent to the real 1310f8254f43SDimitry Andric // implementation. 1311f8254f43SDimitry Andric // This happens in glibc's btowc and in some configure checks. 1312dff0c46cSDimitry Andric return !isTriviallyRecursive(F); 1313f8254f43SDimitry Andric } 1314f8254f43SDimitry Andric 1315f785676fSDimitry Andric /// If the type for the method's class was generated by 1316f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a 1317f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart() 1318f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need 1319f785676fSDimitry Andric /// to construct the complete type prior to emitting the method. 1320f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) { 1321f785676fSDimitry Andric if (!D->isInstance()) 1322f785676fSDimitry Andric return; 1323f785676fSDimitry Andric 1324f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 1325f785676fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) { 1326f785676fSDimitry Andric const PointerType *ThisPtr = 1327f785676fSDimitry Andric cast<PointerType>(D->getThisType(getContext())); 1328f785676fSDimitry Andric DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation()); 1329f785676fSDimitry Andric } 1330f785676fSDimitry Andric } 1331f785676fSDimitry Andric 1332f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) { 1333f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 1334f22ef01cSRoman Divacky 1335f22ef01cSRoman Divacky PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(), 1336f22ef01cSRoman Divacky Context.getSourceManager(), 1337f22ef01cSRoman Divacky "Generating code for declaration"); 1338f22ef01cSRoman Divacky 1339f785676fSDimitry Andric if (isa<FunctionDecl>(D)) { 1340ffd1746dSEd Schouten // At -O0, don't generate IR for functions with available_externally 1341ffd1746dSEd Schouten // linkage. 1342f785676fSDimitry Andric if (!shouldEmitFunction(GD)) 1343ffd1746dSEd Schouten return; 1344ffd1746dSEd Schouten 1345ffd1746dSEd Schouten if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 1346f785676fSDimitry Andric CompleteDIClassType(Method); 1347bd5abe19SDimitry Andric // Make sure to emit the definition(s) before we emit the thunks. 1348bd5abe19SDimitry Andric // This is necessary for the generation of certain thunks. 1349bd5abe19SDimitry Andric if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method)) 1350bd5abe19SDimitry Andric EmitCXXConstructor(CD, GD.getCtorType()); 1351bd5abe19SDimitry Andric else if (const CXXDestructorDecl *DD =dyn_cast<CXXDestructorDecl>(Method)) 1352bd5abe19SDimitry Andric EmitCXXDestructor(DD, GD.getDtorType()); 1353bd5abe19SDimitry Andric else 1354bd5abe19SDimitry Andric EmitGlobalFunctionDefinition(GD); 1355bd5abe19SDimitry Andric 1356f22ef01cSRoman Divacky if (Method->isVirtual()) 1357f22ef01cSRoman Divacky getVTables().EmitThunks(GD); 1358f22ef01cSRoman Divacky 1359bd5abe19SDimitry Andric return; 1360ffd1746dSEd Schouten } 1361f22ef01cSRoman Divacky 1362f22ef01cSRoman Divacky return EmitGlobalFunctionDefinition(GD); 1363ffd1746dSEd Schouten } 1364f22ef01cSRoman Divacky 1365f22ef01cSRoman Divacky if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 1366f22ef01cSRoman Divacky return EmitGlobalVarDefinition(VD); 1367f22ef01cSRoman Divacky 13686122f3e6SDimitry Andric llvm_unreachable("Invalid argument to EmitGlobalDefinition()"); 1369f22ef01cSRoman Divacky } 1370f22ef01cSRoman Divacky 1371f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the 1372f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there 1373f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1374f22ef01cSRoman Divacky /// bitcasted to the right type. 1375f22ef01cSRoman Divacky /// 1376f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1377f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created. 1378f22ef01cSRoman Divacky llvm::Constant * 13796122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 13806122f3e6SDimitry Andric llvm::Type *Ty, 1381f785676fSDimitry Andric GlobalDecl GD, bool ForVTable, 1382139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1383f785676fSDimitry Andric const Decl *D = GD.getDecl(); 1384f785676fSDimitry Andric 1385f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1386f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1387f22ef01cSRoman Divacky if (Entry) { 13883861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1389f785676fSDimitry Andric const FunctionDecl *FD = cast_or_null<FunctionDecl>(D); 1390f22ef01cSRoman Divacky if (FD && !FD->hasAttr<WeakAttr>()) 1391f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1392f22ef01cSRoman Divacky } 1393f22ef01cSRoman Divacky 1394f22ef01cSRoman Divacky if (Entry->getType()->getElementType() == Ty) 1395f22ef01cSRoman Divacky return Entry; 1396f22ef01cSRoman Divacky 1397f22ef01cSRoman Divacky // Make sure the result is of the correct type. 139817a519f9SDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); 1399f22ef01cSRoman Divacky } 1400f22ef01cSRoman Divacky 1401f785676fSDimitry Andric // All MSVC dtors other than the base dtor are linkonce_odr and delegate to 1402f785676fSDimitry Andric // each other bottoming out with the base dtor. Therefore we emit non-base 1403f785676fSDimitry Andric // dtors on usage, even if there is no dtor definition in the TU. 1404f785676fSDimitry Andric if (D && isa<CXXDestructorDecl>(D) && 1405f785676fSDimitry Andric getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D), 1406f785676fSDimitry Andric GD.getDtorType())) 1407f785676fSDimitry Andric DeferredDeclsToEmit.push_back(GD); 1408f785676fSDimitry Andric 1409f22ef01cSRoman Divacky // This function doesn't have a complete type (for example, the return 1410f22ef01cSRoman Divacky // type is an incomplete struct). Use a fake type instead, and make 1411f22ef01cSRoman Divacky // sure not to try to set attributes. 1412f22ef01cSRoman Divacky bool IsIncompleteFunction = false; 1413f22ef01cSRoman Divacky 14146122f3e6SDimitry Andric llvm::FunctionType *FTy; 1415f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(Ty)) { 1416f22ef01cSRoman Divacky FTy = cast<llvm::FunctionType>(Ty); 1417f22ef01cSRoman Divacky } else { 1418bd5abe19SDimitry Andric FTy = llvm::FunctionType::get(VoidTy, false); 1419f22ef01cSRoman Divacky IsIncompleteFunction = true; 1420f22ef01cSRoman Divacky } 1421ffd1746dSEd Schouten 1422f22ef01cSRoman Divacky llvm::Function *F = llvm::Function::Create(FTy, 1423f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 1424f22ef01cSRoman Divacky MangledName, &getModule()); 1425f22ef01cSRoman Divacky assert(F->getName() == MangledName && "name was uniqued!"); 1426f785676fSDimitry Andric if (D) 1427f785676fSDimitry Andric SetFunctionAttributes(GD, F, IsIncompleteFunction); 1428139f7f9bSDimitry Andric if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) { 1429139f7f9bSDimitry Andric llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex); 1430139f7f9bSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 1431139f7f9bSDimitry Andric llvm::AttributeSet::get(VMContext, 1432139f7f9bSDimitry Andric llvm::AttributeSet::FunctionIndex, 1433139f7f9bSDimitry Andric B)); 1434139f7f9bSDimitry Andric } 1435f22ef01cSRoman Divacky 1436f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1437f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1438f22ef01cSRoman Divacky // of the file. 1439f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1440f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1441f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1442f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1443f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1444f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 14452754fe60SDimitry Andric 1446f785676fSDimitry Andric // Otherwise, if this is a sized deallocation function, emit a weak definition 1447f785676fSDimitry Andric // for it at the end of the translation unit. 1448f785676fSDimitry Andric } else if (D && cast<FunctionDecl>(D) 1449f785676fSDimitry Andric ->getCorrespondingUnsizedGlobalDeallocationFunction()) { 1450f785676fSDimitry Andric DeferredDeclsToEmit.push_back(GD); 1451f785676fSDimitry Andric 14522754fe60SDimitry Andric // Otherwise, there are cases we have to worry about where we're 14532754fe60SDimitry Andric // using a declaration for which we must emit a definition but where 14542754fe60SDimitry Andric // we might not find a top-level definition: 14552754fe60SDimitry Andric // - member functions defined inline in their classes 14562754fe60SDimitry Andric // - friend functions defined inline in some class 14572754fe60SDimitry Andric // - special member functions with implicit definitions 14582754fe60SDimitry Andric // If we ever change our AST traversal to walk into class methods, 14592754fe60SDimitry Andric // this will be unnecessary. 14602754fe60SDimitry Andric // 14612754fe60SDimitry Andric // We also don't emit a definition for a function if it's going to be an entry 14622754fe60SDimitry Andric // in a vtable, unless it's already marked as used. 1463f785676fSDimitry Andric } else if (getLangOpts().CPlusPlus && D) { 14642754fe60SDimitry Andric // Look for a declaration that's lexically in a record. 1465f785676fSDimitry Andric const FunctionDecl *FD = cast<FunctionDecl>(D); 14667ae0e2c9SDimitry Andric FD = FD->getMostRecentDecl(); 14672754fe60SDimitry Andric do { 14682754fe60SDimitry Andric if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) { 14692754fe60SDimitry Andric if (FD->isImplicit() && !ForVTable) { 14702754fe60SDimitry Andric assert(FD->isUsed() && "Sema didn't mark implicit function as used!"); 1471f785676fSDimitry Andric DeferredDeclsToEmit.push_back(GD.getWithDecl(FD)); 14722754fe60SDimitry Andric break; 1473bd5abe19SDimitry Andric } else if (FD->doesThisDeclarationHaveABody()) { 1474f785676fSDimitry Andric DeferredDeclsToEmit.push_back(GD.getWithDecl(FD)); 14752754fe60SDimitry Andric break; 1476f22ef01cSRoman Divacky } 1477f22ef01cSRoman Divacky } 1478dff0c46cSDimitry Andric FD = FD->getPreviousDecl(); 14792754fe60SDimitry Andric } while (FD); 1480f22ef01cSRoman Divacky } 1481f22ef01cSRoman Divacky 1482f22ef01cSRoman Divacky // Make sure the result is of the requested type. 1483f22ef01cSRoman Divacky if (!IsIncompleteFunction) { 1484f22ef01cSRoman Divacky assert(F->getType()->getElementType() == Ty); 1485f22ef01cSRoman Divacky return F; 1486f22ef01cSRoman Divacky } 1487f22ef01cSRoman Divacky 148817a519f9SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 1489f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(F, PTy); 1490f22ef01cSRoman Divacky } 1491f22ef01cSRoman Divacky 1492f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function. If Ty is 1493f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to 1494f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function). 1495f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, 14966122f3e6SDimitry Andric llvm::Type *Ty, 14972754fe60SDimitry Andric bool ForVTable) { 1498f22ef01cSRoman Divacky // If there was no specific requested type, just convert it now. 1499f22ef01cSRoman Divacky if (!Ty) 1500f22ef01cSRoman Divacky Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType()); 1501ffd1746dSEd Schouten 15026122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 15032754fe60SDimitry Andric return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable); 1504f22ef01cSRoman Divacky } 1505f22ef01cSRoman Divacky 1506f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified 1507f22ef01cSRoman Divacky /// type and name. 1508f22ef01cSRoman Divacky llvm::Constant * 15096122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, 15106122f3e6SDimitry Andric StringRef Name, 1511139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1512139f7f9bSDimitry Andric llvm::Constant *C 1513139f7f9bSDimitry Andric = GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 151417a519f9SDimitry Andric ExtraAttrs); 1515139f7f9bSDimitry Andric if (llvm::Function *F = dyn_cast<llvm::Function>(C)) 1516139f7f9bSDimitry Andric if (F->empty()) 1517139f7f9bSDimitry Andric F->setCallingConv(getRuntimeCC()); 1518139f7f9bSDimitry Andric return C; 1519f22ef01cSRoman Divacky } 1520f22ef01cSRoman Divacky 1521dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted 1522dff0c46cSDimitry Andric /// as a constant. 1523dff0c46cSDimitry Andric /// 1524dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs 1525dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is 1526dff0c46cSDimitry Andric /// not written to during its construction. 1527dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) { 1528dff0c46cSDimitry Andric if (!Ty.isConstant(Context) && !Ty->isReferenceType()) 1529f22ef01cSRoman Divacky return false; 1530bd5abe19SDimitry Andric 1531dff0c46cSDimitry Andric if (Context.getLangOpts().CPlusPlus) { 1532dff0c46cSDimitry Andric if (const CXXRecordDecl *Record 1533dff0c46cSDimitry Andric = Context.getBaseElementType(Ty)->getAsCXXRecordDecl()) 1534dff0c46cSDimitry Andric return ExcludeCtor && !Record->hasMutableFields() && 1535dff0c46cSDimitry Andric Record->hasTrivialDestructor(); 1536f22ef01cSRoman Divacky } 1537bd5abe19SDimitry Andric 1538f22ef01cSRoman Divacky return true; 1539f22ef01cSRoman Divacky } 1540f22ef01cSRoman Divacky 1541f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, 1542f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type. If there 1543f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1544f22ef01cSRoman Divacky /// bitcasted to the right type. 1545f22ef01cSRoman Divacky /// 1546f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1547f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created. 1548f22ef01cSRoman Divacky llvm::Constant * 15496122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, 15506122f3e6SDimitry Andric llvm::PointerType *Ty, 15512754fe60SDimitry Andric const VarDecl *D, 15522754fe60SDimitry Andric bool UnnamedAddr) { 1553f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1554f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1555f22ef01cSRoman Divacky if (Entry) { 15563861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1557f22ef01cSRoman Divacky if (D && !D->hasAttr<WeakAttr>()) 1558f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1559f22ef01cSRoman Divacky } 1560f22ef01cSRoman Divacky 15612754fe60SDimitry Andric if (UnnamedAddr) 15622754fe60SDimitry Andric Entry->setUnnamedAddr(true); 15632754fe60SDimitry Andric 1564f22ef01cSRoman Divacky if (Entry->getType() == Ty) 1565f22ef01cSRoman Divacky return Entry; 1566f22ef01cSRoman Divacky 1567f22ef01cSRoman Divacky // Make sure the result is of the correct type. 1568f785676fSDimitry Andric if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace()) 1569f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty); 1570f785676fSDimitry Andric 1571f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(Entry, Ty); 1572f22ef01cSRoman Divacky } 1573f22ef01cSRoman Divacky 1574f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1575f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1576f22ef01cSRoman Divacky // of the file. 1577f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1578f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1579f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1580f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1581f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1582f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 1583f22ef01cSRoman Divacky } 1584f22ef01cSRoman Divacky 15857ae0e2c9SDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace()); 1586f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 1587f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), Ty->getElementType(), false, 1588f22ef01cSRoman Divacky llvm::GlobalValue::ExternalLinkage, 1589f22ef01cSRoman Divacky 0, MangledName, 0, 15907ae0e2c9SDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 1591f22ef01cSRoman Divacky 1592f22ef01cSRoman Divacky // Handle things which are present even on external declarations. 1593f22ef01cSRoman Divacky if (D) { 1594f22ef01cSRoman Divacky // FIXME: This code is overly simple and should be merged with other global 1595f22ef01cSRoman Divacky // handling. 1596dff0c46cSDimitry Andric GV->setConstant(isTypeConstant(D->getType(), false)); 1597f22ef01cSRoman Divacky 15982754fe60SDimitry Andric // Set linkage and visibility in case we never see a definition. 1599139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 1600139f7f9bSDimitry Andric if (LV.getLinkage() != ExternalLinkage) { 16012754fe60SDimitry Andric // Don't set internal linkage on declarations. 16022754fe60SDimitry Andric } else { 16032754fe60SDimitry Andric if (D->hasAttr<DLLImportAttr>()) 16042754fe60SDimitry Andric GV->setLinkage(llvm::GlobalValue::DLLImportLinkage); 16053b0f4066SDimitry Andric else if (D->hasAttr<WeakAttr>() || D->isWeakImported()) 1606f22ef01cSRoman Divacky GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); 1607f22ef01cSRoman Divacky 16082754fe60SDimitry Andric // Set visibility on a declaration only if it's explicit. 1609139f7f9bSDimitry Andric if (LV.isVisibilityExplicit()) 1610139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 16112754fe60SDimitry Andric } 16122754fe60SDimitry Andric 1613284c1978SDimitry Andric if (D->getTLSKind()) { 1614284c1978SDimitry Andric if (D->getTLSKind() == VarDecl::TLS_Dynamic) 1615284c1978SDimitry Andric CXXThreadLocals.push_back(std::make_pair(D, GV)); 16167ae0e2c9SDimitry Andric setTLSMode(GV, *D); 1617f22ef01cSRoman Divacky } 1618f785676fSDimitry Andric 1619f785676fSDimitry Andric // If required by the ABI, treat declarations of static data members with 1620f785676fSDimitry Andric // inline initializers as definitions. 1621f785676fSDimitry Andric if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() && 1622f785676fSDimitry Andric D->isStaticDataMember() && D->hasInit() && 1623f785676fSDimitry Andric !D->isThisDeclarationADefinition()) 1624f785676fSDimitry Andric EmitGlobalVarDefinition(D); 1625284c1978SDimitry Andric } 1626f22ef01cSRoman Divacky 16277ae0e2c9SDimitry Andric if (AddrSpace != Ty->getAddressSpace()) 1628f785676fSDimitry Andric return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty); 1629f785676fSDimitry Andric 1630f22ef01cSRoman Divacky return GV; 1631f22ef01cSRoman Divacky } 1632f22ef01cSRoman Divacky 1633f22ef01cSRoman Divacky 16342754fe60SDimitry Andric llvm::GlobalVariable * 16356122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, 16366122f3e6SDimitry Andric llvm::Type *Ty, 16372754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage) { 16382754fe60SDimitry Andric llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name); 16392754fe60SDimitry Andric llvm::GlobalVariable *OldGV = 0; 16402754fe60SDimitry Andric 16412754fe60SDimitry Andric 16422754fe60SDimitry Andric if (GV) { 16432754fe60SDimitry Andric // Check if the variable has the right type. 16442754fe60SDimitry Andric if (GV->getType()->getElementType() == Ty) 16452754fe60SDimitry Andric return GV; 16462754fe60SDimitry Andric 16472754fe60SDimitry Andric // Because C++ name mangling, the only way we can end up with an already 16482754fe60SDimitry Andric // existing global with the same name is if it has been declared extern "C". 16492754fe60SDimitry Andric assert(GV->isDeclaration() && "Declaration has wrong type!"); 16502754fe60SDimitry Andric OldGV = GV; 16512754fe60SDimitry Andric } 16522754fe60SDimitry Andric 16532754fe60SDimitry Andric // Create a new variable. 16542754fe60SDimitry Andric GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true, 16552754fe60SDimitry Andric Linkage, 0, Name); 16562754fe60SDimitry Andric 16572754fe60SDimitry Andric if (OldGV) { 16582754fe60SDimitry Andric // Replace occurrences of the old variable if needed. 16592754fe60SDimitry Andric GV->takeName(OldGV); 16602754fe60SDimitry Andric 16612754fe60SDimitry Andric if (!OldGV->use_empty()) { 16622754fe60SDimitry Andric llvm::Constant *NewPtrForOldDecl = 16632754fe60SDimitry Andric llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 16642754fe60SDimitry Andric OldGV->replaceAllUsesWith(NewPtrForOldDecl); 16652754fe60SDimitry Andric } 16662754fe60SDimitry Andric 16672754fe60SDimitry Andric OldGV->eraseFromParent(); 16682754fe60SDimitry Andric } 16692754fe60SDimitry Andric 16702754fe60SDimitry Andric return GV; 16712754fe60SDimitry Andric } 16722754fe60SDimitry Andric 1673f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the 1674f22ef01cSRoman Divacky /// given global variable. If Ty is non-null and if the global doesn't exist, 1675cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the 1676f22ef01cSRoman Divacky /// normal requested type would be. 1677f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, 16786122f3e6SDimitry Andric llvm::Type *Ty) { 1679f22ef01cSRoman Divacky assert(D->hasGlobalStorage() && "Not a global variable"); 1680f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1681f22ef01cSRoman Divacky if (Ty == 0) 1682f22ef01cSRoman Divacky Ty = getTypes().ConvertTypeForMem(ASTTy); 1683f22ef01cSRoman Divacky 16846122f3e6SDimitry Andric llvm::PointerType *PTy = 16853b0f4066SDimitry Andric llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy)); 1686f22ef01cSRoman Divacky 16876122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1688f22ef01cSRoman Divacky return GetOrCreateLLVMGlobal(MangledName, PTy, D); 1689f22ef01cSRoman Divacky } 1690f22ef01cSRoman Divacky 1691f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the 1692f22ef01cSRoman Divacky /// specified type and name. 1693f22ef01cSRoman Divacky llvm::Constant * 16946122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, 16956122f3e6SDimitry Andric StringRef Name) { 16962754fe60SDimitry Andric return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), 0, 16972754fe60SDimitry Andric true); 1698f22ef01cSRoman Divacky } 1699f22ef01cSRoman Divacky 1700f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { 1701f22ef01cSRoman Divacky assert(!D->getInit() && "Cannot emit definite definitions here!"); 1702f22ef01cSRoman Divacky 1703f22ef01cSRoman Divacky if (MayDeferGeneration(D)) { 1704f22ef01cSRoman Divacky // If we have not seen a reference to this variable yet, place it 1705f22ef01cSRoman Divacky // into the deferred declarations table to be emitted if needed 1706f22ef01cSRoman Divacky // later. 17076122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1708f22ef01cSRoman Divacky if (!GetGlobalValue(MangledName)) { 1709f22ef01cSRoman Divacky DeferredDecls[MangledName] = D; 1710f22ef01cSRoman Divacky return; 1711f22ef01cSRoman Divacky } 1712f22ef01cSRoman Divacky } 1713f22ef01cSRoman Divacky 1714f22ef01cSRoman Divacky // The tentative definition is the only definition. 1715f22ef01cSRoman Divacky EmitGlobalVarDefinition(D); 1716f22ef01cSRoman Divacky } 1717f22ef01cSRoman Divacky 17186122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const { 17192754fe60SDimitry Andric return Context.toCharUnitsFromBits( 17203861d79fSDimitry Andric TheDataLayout.getTypeStoreSizeInBits(Ty)); 1721f22ef01cSRoman Divacky } 1722f22ef01cSRoman Divacky 17237ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D, 17247ae0e2c9SDimitry Andric unsigned AddrSpace) { 17257ae0e2c9SDimitry Andric if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) { 17267ae0e2c9SDimitry Andric if (D->hasAttr<CUDAConstantAttr>()) 17277ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant); 17287ae0e2c9SDimitry Andric else if (D->hasAttr<CUDASharedAttr>()) 17297ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared); 17307ae0e2c9SDimitry Andric else 17317ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device); 17327ae0e2c9SDimitry Andric } 17337ae0e2c9SDimitry Andric 17347ae0e2c9SDimitry Andric return AddrSpace; 17357ae0e2c9SDimitry Andric } 17367ae0e2c9SDimitry Andric 1737284c1978SDimitry Andric template<typename SomeDecl> 1738284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D, 1739284c1978SDimitry Andric llvm::GlobalValue *GV) { 1740284c1978SDimitry Andric if (!getLangOpts().CPlusPlus) 1741284c1978SDimitry Andric return; 1742284c1978SDimitry Andric 1743284c1978SDimitry Andric // Must have 'used' attribute, or else inline assembly can't rely on 1744284c1978SDimitry Andric // the name existing. 1745284c1978SDimitry Andric if (!D->template hasAttr<UsedAttr>()) 1746284c1978SDimitry Andric return; 1747284c1978SDimitry Andric 1748284c1978SDimitry Andric // Must have internal linkage and an ordinary name. 1749f785676fSDimitry Andric if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage) 1750284c1978SDimitry Andric return; 1751284c1978SDimitry Andric 1752284c1978SDimitry Andric // Must be in an extern "C" context. Entities declared directly within 1753284c1978SDimitry Andric // a record are not extern "C" even if the record is in such a context. 1754f785676fSDimitry Andric const SomeDecl *First = D->getFirstDecl(); 1755284c1978SDimitry Andric if (First->getDeclContext()->isRecord() || !First->isInExternCContext()) 1756284c1978SDimitry Andric return; 1757284c1978SDimitry Andric 1758284c1978SDimitry Andric // OK, this is an internal linkage entity inside an extern "C" linkage 1759284c1978SDimitry Andric // specification. Make a note of that so we can give it the "expected" 1760284c1978SDimitry Andric // mangled name if nothing else is using that name. 1761284c1978SDimitry Andric std::pair<StaticExternCMap::iterator, bool> R = 1762284c1978SDimitry Andric StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV)); 1763284c1978SDimitry Andric 1764284c1978SDimitry Andric // If we have multiple internal linkage entities with the same name 1765284c1978SDimitry Andric // in extern "C" regions, none of them gets that name. 1766284c1978SDimitry Andric if (!R.second) 1767284c1978SDimitry Andric R.first->second = 0; 1768284c1978SDimitry Andric } 1769284c1978SDimitry Andric 1770f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 1771f22ef01cSRoman Divacky llvm::Constant *Init = 0; 1772f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1773dff0c46cSDimitry Andric CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 1774dff0c46cSDimitry Andric bool NeedsGlobalCtor = false; 1775dff0c46cSDimitry Andric bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor(); 1776f22ef01cSRoman Divacky 1777dff0c46cSDimitry Andric const VarDecl *InitDecl; 1778dff0c46cSDimitry Andric const Expr *InitExpr = D->getAnyInitializer(InitDecl); 1779f22ef01cSRoman Divacky 1780f22ef01cSRoman Divacky if (!InitExpr) { 1781f22ef01cSRoman Divacky // This is a tentative definition; tentative definitions are 1782f22ef01cSRoman Divacky // implicitly initialized with { 0 }. 1783f22ef01cSRoman Divacky // 1784f22ef01cSRoman Divacky // Note that tentative definitions are only emitted at the end of 1785f22ef01cSRoman Divacky // a translation unit, so they should never have incomplete 1786f22ef01cSRoman Divacky // type. In addition, EmitTentativeDefinition makes sure that we 1787f22ef01cSRoman Divacky // never attempt to emit a tentative definition if a real one 1788f22ef01cSRoman Divacky // exists. A use may still exists, however, so we still may need 1789f22ef01cSRoman Divacky // to do a RAUW. 1790f22ef01cSRoman Divacky assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type"); 1791f22ef01cSRoman Divacky Init = EmitNullConstant(D->getType()); 1792f22ef01cSRoman Divacky } else { 17937ae0e2c9SDimitry Andric initializedGlobalDecl = GlobalDecl(D); 1794dff0c46cSDimitry Andric Init = EmitConstantInit(*InitDecl); 1795f785676fSDimitry Andric 1796f22ef01cSRoman Divacky if (!Init) { 1797f22ef01cSRoman Divacky QualType T = InitExpr->getType(); 1798f22ef01cSRoman Divacky if (D->getType()->isReferenceType()) 1799f22ef01cSRoman Divacky T = D->getType(); 1800f22ef01cSRoman Divacky 1801dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus) { 1802f22ef01cSRoman Divacky Init = EmitNullConstant(T); 1803dff0c46cSDimitry Andric NeedsGlobalCtor = true; 1804f22ef01cSRoman Divacky } else { 1805f22ef01cSRoman Divacky ErrorUnsupported(D, "static initializer"); 1806f22ef01cSRoman Divacky Init = llvm::UndefValue::get(getTypes().ConvertType(T)); 1807f22ef01cSRoman Divacky } 1808e580952dSDimitry Andric } else { 1809e580952dSDimitry Andric // We don't need an initializer, so remove the entry for the delayed 1810dff0c46cSDimitry Andric // initializer position (just in case this entry was delayed) if we 1811dff0c46cSDimitry Andric // also don't need to register a destructor. 1812dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && !NeedsGlobalDtor) 1813e580952dSDimitry Andric DelayedCXXInitPosition.erase(D); 1814f22ef01cSRoman Divacky } 1815f22ef01cSRoman Divacky } 1816f22ef01cSRoman Divacky 18176122f3e6SDimitry Andric llvm::Type* InitType = Init->getType(); 1818f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); 1819f22ef01cSRoman Divacky 1820f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 1821f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 1822f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast || 1823f785676fSDimitry Andric CE->getOpcode() == llvm::Instruction::AddrSpaceCast || 1824f785676fSDimitry Andric // All zero index gep. 1825f22ef01cSRoman Divacky CE->getOpcode() == llvm::Instruction::GetElementPtr); 1826f22ef01cSRoman Divacky Entry = CE->getOperand(0); 1827f22ef01cSRoman Divacky } 1828f22ef01cSRoman Divacky 1829f22ef01cSRoman Divacky // Entry is now either a Function or GlobalVariable. 1830f22ef01cSRoman Divacky llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Entry); 1831f22ef01cSRoman Divacky 1832f22ef01cSRoman Divacky // We have a definition after a declaration with the wrong type. 1833f22ef01cSRoman Divacky // We must make a new GlobalVariable* and update everything that used OldGV 1834f22ef01cSRoman Divacky // (a declaration or tentative definition) with the new GlobalVariable* 1835f22ef01cSRoman Divacky // (which will be a definition). 1836f22ef01cSRoman Divacky // 1837f22ef01cSRoman Divacky // This happens if there is a prototype for a global (e.g. 1838f22ef01cSRoman Divacky // "extern int x[];") and then a definition of a different type (e.g. 1839f22ef01cSRoman Divacky // "int x[10];"). This also happens when an initializer has a different type 1840f22ef01cSRoman Divacky // from the type of the global (this happens with unions). 1841f22ef01cSRoman Divacky if (GV == 0 || 1842f22ef01cSRoman Divacky GV->getType()->getElementType() != InitType || 18433b0f4066SDimitry Andric GV->getType()->getAddressSpace() != 18447ae0e2c9SDimitry Andric GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) { 1845f22ef01cSRoman Divacky 1846f22ef01cSRoman Divacky // Move the old entry aside so that we'll create a new one. 18476122f3e6SDimitry Andric Entry->setName(StringRef()); 1848f22ef01cSRoman Divacky 1849f22ef01cSRoman Divacky // Make a new global with the correct type, this is now guaranteed to work. 1850f22ef01cSRoman Divacky GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType)); 1851f22ef01cSRoman Divacky 1852f22ef01cSRoman Divacky // Replace all uses of the old global with the new global 1853f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 1854f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(GV, Entry->getType()); 1855f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 1856f22ef01cSRoman Divacky 1857f22ef01cSRoman Divacky // Erase the old global, since it is no longer used. 1858f22ef01cSRoman Divacky cast<llvm::GlobalValue>(Entry)->eraseFromParent(); 1859f22ef01cSRoman Divacky } 1860f22ef01cSRoman Divacky 1861284c1978SDimitry Andric MaybeHandleStaticInExternC(D, GV); 1862284c1978SDimitry Andric 18636122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 18646122f3e6SDimitry Andric AddGlobalAnnotations(D, GV); 1865f22ef01cSRoman Divacky 1866f22ef01cSRoman Divacky GV->setInitializer(Init); 1867f22ef01cSRoman Divacky 1868f22ef01cSRoman Divacky // If it is safe to mark the global 'constant', do so now. 1869dff0c46cSDimitry Andric GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor && 1870dff0c46cSDimitry Andric isTypeConstant(D->getType(), true)); 1871f22ef01cSRoman Divacky 1872f22ef01cSRoman Divacky GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 1873f22ef01cSRoman Divacky 1874f22ef01cSRoman Divacky // Set the llvm linkage type as appropriate. 18752754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 1876f785676fSDimitry Andric GetLLVMLinkageVarDefinition(D, GV->isConstant()); 18772754fe60SDimitry Andric GV->setLinkage(Linkage); 1878f785676fSDimitry Andric 1879f785676fSDimitry Andric // If required by the ABI, give definitions of static data members with inline 1880f785676fSDimitry Andric // initializers linkonce_odr linkage. 1881f785676fSDimitry Andric if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() && 1882f785676fSDimitry Andric D->isStaticDataMember() && InitExpr && 1883f785676fSDimitry Andric !InitDecl->isThisDeclarationADefinition()) 1884f785676fSDimitry Andric GV->setLinkage(llvm::GlobalVariable::LinkOnceODRLinkage); 1885f785676fSDimitry Andric 18862754fe60SDimitry Andric if (Linkage == llvm::GlobalVariable::CommonLinkage) 1887f22ef01cSRoman Divacky // common vars aren't constant even if declared const. 1888f22ef01cSRoman Divacky GV->setConstant(false); 1889f22ef01cSRoman Divacky 1890f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 1891f22ef01cSRoman Divacky 18922754fe60SDimitry Andric // Emit the initializer function if necessary. 1893dff0c46cSDimitry Andric if (NeedsGlobalCtor || NeedsGlobalDtor) 1894dff0c46cSDimitry Andric EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor); 18952754fe60SDimitry Andric 18963861d79fSDimitry Andric // If we are compiling with ASan, add metadata indicating dynamically 18973861d79fSDimitry Andric // initialized globals. 1898139f7f9bSDimitry Andric if (SanOpts.Address && NeedsGlobalCtor) { 18993861d79fSDimitry Andric llvm::Module &M = getModule(); 19003861d79fSDimitry Andric 19013861d79fSDimitry Andric llvm::NamedMDNode *DynamicInitializers = 19023861d79fSDimitry Andric M.getOrInsertNamedMetadata("llvm.asan.dynamically_initialized_globals"); 19033861d79fSDimitry Andric llvm::Value *GlobalToAdd[] = { GV }; 19043861d79fSDimitry Andric llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalToAdd); 19053861d79fSDimitry Andric DynamicInitializers->addOperand(ThisGlobal); 19063861d79fSDimitry Andric } 19073861d79fSDimitry Andric 1908f22ef01cSRoman Divacky // Emit global variable debug information. 19096122f3e6SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 19103861d79fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 1911f22ef01cSRoman Divacky DI->EmitGlobalVariable(GV, D); 1912f22ef01cSRoman Divacky } 1913f22ef01cSRoman Divacky 19142754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes 1915f785676fSDimitry Andric CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, bool isConstant) { 19162754fe60SDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForVariable(D); 19172754fe60SDimitry Andric if (Linkage == GVA_Internal) 19182754fe60SDimitry Andric return llvm::Function::InternalLinkage; 19192754fe60SDimitry Andric else if (D->hasAttr<DLLImportAttr>()) 19202754fe60SDimitry Andric return llvm::Function::DLLImportLinkage; 19212754fe60SDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 19222754fe60SDimitry Andric return llvm::Function::DLLExportLinkage; 1923f785676fSDimitry Andric else if (D->hasAttr<SelectAnyAttr>()) { 1924f785676fSDimitry Andric // selectany symbols are externally visible, so use weak instead of 1925f785676fSDimitry Andric // linkonce. MSVC optimizes away references to const selectany globals, so 1926f785676fSDimitry Andric // all definitions should be the same and ODR linkage should be used. 1927f785676fSDimitry Andric // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx 1928f785676fSDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 1929f785676fSDimitry Andric } else if (D->hasAttr<WeakAttr>()) { 1930f785676fSDimitry Andric if (isConstant) 19312754fe60SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 19322754fe60SDimitry Andric else 19332754fe60SDimitry Andric return llvm::GlobalVariable::WeakAnyLinkage; 19342754fe60SDimitry Andric } else if (Linkage == GVA_TemplateInstantiation || 19352754fe60SDimitry Andric Linkage == GVA_ExplicitTemplateInstantiation) 19363b0f4066SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 1937dff0c46cSDimitry Andric else if (!getLangOpts().CPlusPlus && 19382754fe60SDimitry Andric ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) || 19392754fe60SDimitry Andric D->getAttr<CommonAttr>()) && 19402754fe60SDimitry Andric !D->hasExternalStorage() && !D->getInit() && 1941284c1978SDimitry Andric !D->getAttr<SectionAttr>() && !D->getTLSKind() && 194217a519f9SDimitry Andric !D->getAttr<WeakImportAttr>()) { 19432754fe60SDimitry Andric // Thread local vars aren't considered common linkage. 19442754fe60SDimitry Andric return llvm::GlobalVariable::CommonLinkage; 1945284c1978SDimitry Andric } else if (D->getTLSKind() == VarDecl::TLS_Dynamic && 1946284c1978SDimitry Andric getTarget().getTriple().isMacOSX()) 1947284c1978SDimitry Andric // On Darwin, the backing variable for a C++11 thread_local variable always 1948284c1978SDimitry Andric // has internal linkage; all accesses should just be calls to the 1949284c1978SDimitry Andric // Itanium-specified entry point, which has the normal linkage of the 1950284c1978SDimitry Andric // variable. 1951284c1978SDimitry Andric return llvm::GlobalValue::InternalLinkage; 19522754fe60SDimitry Andric return llvm::GlobalVariable::ExternalLinkage; 19532754fe60SDimitry Andric } 19542754fe60SDimitry Andric 1955139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type. 1956139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites 1957139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old, 1958139f7f9bSDimitry Andric llvm::Function *newFn) { 1959139f7f9bSDimitry Andric // Fast path. 1960139f7f9bSDimitry Andric if (old->use_empty()) return; 1961139f7f9bSDimitry Andric 1962139f7f9bSDimitry Andric llvm::Type *newRetTy = newFn->getReturnType(); 1963139f7f9bSDimitry Andric SmallVector<llvm::Value*, 4> newArgs; 1964139f7f9bSDimitry Andric 1965139f7f9bSDimitry Andric for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end(); 1966139f7f9bSDimitry Andric ui != ue; ) { 1967139f7f9bSDimitry Andric llvm::Value::use_iterator use = ui++; // Increment before the use is erased. 1968139f7f9bSDimitry Andric llvm::User *user = *use; 1969139f7f9bSDimitry Andric 1970139f7f9bSDimitry Andric // Recognize and replace uses of bitcasts. Most calls to 1971139f7f9bSDimitry Andric // unprototyped functions will use bitcasts. 1972139f7f9bSDimitry Andric if (llvm::ConstantExpr *bitcast = dyn_cast<llvm::ConstantExpr>(user)) { 1973139f7f9bSDimitry Andric if (bitcast->getOpcode() == llvm::Instruction::BitCast) 1974139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(bitcast, newFn); 1975139f7f9bSDimitry Andric continue; 1976139f7f9bSDimitry Andric } 1977139f7f9bSDimitry Andric 1978139f7f9bSDimitry Andric // Recognize calls to the function. 1979139f7f9bSDimitry Andric llvm::CallSite callSite(user); 1980139f7f9bSDimitry Andric if (!callSite) continue; 1981139f7f9bSDimitry Andric if (!callSite.isCallee(use)) continue; 1982139f7f9bSDimitry Andric 1983139f7f9bSDimitry Andric // If the return types don't match exactly, then we can't 1984139f7f9bSDimitry Andric // transform this call unless it's dead. 1985139f7f9bSDimitry Andric if (callSite->getType() != newRetTy && !callSite->use_empty()) 1986139f7f9bSDimitry Andric continue; 1987139f7f9bSDimitry Andric 1988139f7f9bSDimitry Andric // Get the call site's attribute list. 1989139f7f9bSDimitry Andric SmallVector<llvm::AttributeSet, 8> newAttrs; 1990139f7f9bSDimitry Andric llvm::AttributeSet oldAttrs = callSite.getAttributes(); 1991139f7f9bSDimitry Andric 1992139f7f9bSDimitry Andric // Collect any return attributes from the call. 1993139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex)) 1994139f7f9bSDimitry Andric newAttrs.push_back( 1995139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), 1996139f7f9bSDimitry Andric oldAttrs.getRetAttributes())); 1997139f7f9bSDimitry Andric 1998139f7f9bSDimitry Andric // If the function was passed too few arguments, don't transform. 1999139f7f9bSDimitry Andric unsigned newNumArgs = newFn->arg_size(); 2000139f7f9bSDimitry Andric if (callSite.arg_size() < newNumArgs) continue; 2001139f7f9bSDimitry Andric 2002139f7f9bSDimitry Andric // If extra arguments were passed, we silently drop them. 2003139f7f9bSDimitry Andric // If any of the types mismatch, we don't transform. 2004139f7f9bSDimitry Andric unsigned argNo = 0; 2005139f7f9bSDimitry Andric bool dontTransform = false; 2006139f7f9bSDimitry Andric for (llvm::Function::arg_iterator ai = newFn->arg_begin(), 2007139f7f9bSDimitry Andric ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) { 2008139f7f9bSDimitry Andric if (callSite.getArgument(argNo)->getType() != ai->getType()) { 2009139f7f9bSDimitry Andric dontTransform = true; 2010139f7f9bSDimitry Andric break; 2011139f7f9bSDimitry Andric } 2012139f7f9bSDimitry Andric 2013139f7f9bSDimitry Andric // Add any parameter attributes. 2014139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(argNo + 1)) 2015139f7f9bSDimitry Andric newAttrs. 2016139f7f9bSDimitry Andric push_back(llvm:: 2017139f7f9bSDimitry Andric AttributeSet::get(newFn->getContext(), 2018139f7f9bSDimitry Andric oldAttrs.getParamAttributes(argNo + 1))); 2019139f7f9bSDimitry Andric } 2020139f7f9bSDimitry Andric if (dontTransform) 2021139f7f9bSDimitry Andric continue; 2022139f7f9bSDimitry Andric 2023139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) 2024139f7f9bSDimitry Andric newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(), 2025139f7f9bSDimitry Andric oldAttrs.getFnAttributes())); 2026139f7f9bSDimitry Andric 2027139f7f9bSDimitry Andric // Okay, we can transform this. Create the new call instruction and copy 2028139f7f9bSDimitry Andric // over the required information. 2029139f7f9bSDimitry Andric newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo); 2030139f7f9bSDimitry Andric 2031139f7f9bSDimitry Andric llvm::CallSite newCall; 2032139f7f9bSDimitry Andric if (callSite.isCall()) { 2033139f7f9bSDimitry Andric newCall = llvm::CallInst::Create(newFn, newArgs, "", 2034139f7f9bSDimitry Andric callSite.getInstruction()); 2035139f7f9bSDimitry Andric } else { 2036139f7f9bSDimitry Andric llvm::InvokeInst *oldInvoke = 2037139f7f9bSDimitry Andric cast<llvm::InvokeInst>(callSite.getInstruction()); 2038139f7f9bSDimitry Andric newCall = llvm::InvokeInst::Create(newFn, 2039139f7f9bSDimitry Andric oldInvoke->getNormalDest(), 2040139f7f9bSDimitry Andric oldInvoke->getUnwindDest(), 2041139f7f9bSDimitry Andric newArgs, "", 2042139f7f9bSDimitry Andric callSite.getInstruction()); 2043139f7f9bSDimitry Andric } 2044139f7f9bSDimitry Andric newArgs.clear(); // for the next iteration 2045139f7f9bSDimitry Andric 2046139f7f9bSDimitry Andric if (!newCall->getType()->isVoidTy()) 2047139f7f9bSDimitry Andric newCall->takeName(callSite.getInstruction()); 2048139f7f9bSDimitry Andric newCall.setAttributes( 2049139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), newAttrs)); 2050139f7f9bSDimitry Andric newCall.setCallingConv(callSite.getCallingConv()); 2051139f7f9bSDimitry Andric 2052139f7f9bSDimitry Andric // Finally, remove the old call, replacing any uses with the new one. 2053139f7f9bSDimitry Andric if (!callSite->use_empty()) 2054139f7f9bSDimitry Andric callSite->replaceAllUsesWith(newCall.getInstruction()); 2055139f7f9bSDimitry Andric 2056139f7f9bSDimitry Andric // Copy debug location attached to CI. 2057139f7f9bSDimitry Andric if (!callSite->getDebugLoc().isUnknown()) 2058139f7f9bSDimitry Andric newCall->setDebugLoc(callSite->getDebugLoc()); 2059139f7f9bSDimitry Andric callSite->eraseFromParent(); 2060139f7f9bSDimitry Andric } 2061139f7f9bSDimitry Andric } 2062139f7f9bSDimitry Andric 2063f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we 2064f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}". If there are 2065f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to 2066f22ef01cSRoman Divacky /// call the new function directly. 2067f22ef01cSRoman Divacky /// 2068f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to 2069f22ef01cSRoman Divacky /// functions to be able to inline them. If there is a bitcast in the way, it 2070f22ef01cSRoman Divacky /// won't inline them. Instcombine normally deletes these calls, but it isn't 2071f22ef01cSRoman Divacky /// run at -O0. 2072f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, 2073f22ef01cSRoman Divacky llvm::Function *NewFn) { 2074f22ef01cSRoman Divacky // If we're redefining a global as a function, don't transform it. 2075139f7f9bSDimitry Andric if (!isa<llvm::Function>(Old)) return; 2076f22ef01cSRoman Divacky 2077139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(Old, NewFn); 2078f22ef01cSRoman Divacky } 2079f22ef01cSRoman Divacky 2080dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 2081dff0c46cSDimitry Andric TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind(); 2082dff0c46cSDimitry Andric // If we have a definition, this might be a deferred decl. If the 2083dff0c46cSDimitry Andric // instantiation is explicit, make sure we emit it at the end. 2084dff0c46cSDimitry Andric if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition) 2085dff0c46cSDimitry Andric GetAddrOfGlobalVar(VD); 2086139f7f9bSDimitry Andric 2087139f7f9bSDimitry Andric EmitTopLevelDecl(VD); 2088dff0c46cSDimitry Andric } 2089f22ef01cSRoman Divacky 2090f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) { 2091f22ef01cSRoman Divacky const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl()); 20923b0f4066SDimitry Andric 20933b0f4066SDimitry Andric // Compute the function info and LLVM type. 2094dff0c46cSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 2095dff0c46cSDimitry Andric llvm::FunctionType *Ty = getTypes().GetFunctionType(FI); 20963b0f4066SDimitry Andric 2097f22ef01cSRoman Divacky // Get or create the prototype for the function. 2098f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfFunction(GD, Ty); 2099f22ef01cSRoman Divacky 2100f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 2101f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 2102f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast); 2103f22ef01cSRoman Divacky Entry = CE->getOperand(0); 2104f22ef01cSRoman Divacky } 2105f22ef01cSRoman Divacky 2106f785676fSDimitry Andric if (!cast<llvm::GlobalValue>(Entry)->isDeclaration()) { 2107f785676fSDimitry Andric getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name); 2108f785676fSDimitry Andric return; 2109f785676fSDimitry Andric } 2110f22ef01cSRoman Divacky 2111f22ef01cSRoman Divacky if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() != Ty) { 2112f22ef01cSRoman Divacky llvm::GlobalValue *OldFn = cast<llvm::GlobalValue>(Entry); 2113f22ef01cSRoman Divacky 2114f22ef01cSRoman Divacky // If the types mismatch then we have to rewrite the definition. 2115f22ef01cSRoman Divacky assert(OldFn->isDeclaration() && 2116f22ef01cSRoman Divacky "Shouldn't replace non-declaration"); 2117f22ef01cSRoman Divacky 2118f22ef01cSRoman Divacky // F is the Function* for the one with the wrong type, we must make a new 2119f22ef01cSRoman Divacky // Function* and update everything that used F (a declaration) with the new 2120f22ef01cSRoman Divacky // Function* (which will be a definition). 2121f22ef01cSRoman Divacky // 2122f22ef01cSRoman Divacky // This happens if there is a prototype for a function 2123f22ef01cSRoman Divacky // (e.g. "int f()") and then a definition of a different type 2124f22ef01cSRoman Divacky // (e.g. "int f(int x)"). Move the old function aside so that it 2125f22ef01cSRoman Divacky // doesn't interfere with GetAddrOfFunction. 21266122f3e6SDimitry Andric OldFn->setName(StringRef()); 2127f22ef01cSRoman Divacky llvm::Function *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty)); 2128f22ef01cSRoman Divacky 2129139f7f9bSDimitry Andric // This might be an implementation of a function without a 2130139f7f9bSDimitry Andric // prototype, in which case, try to do special replacement of 2131139f7f9bSDimitry Andric // calls which match the new prototype. The really key thing here 2132139f7f9bSDimitry Andric // is that we also potentially drop arguments from the call site 2133139f7f9bSDimitry Andric // so as to make a direct call, which makes the inliner happier 2134139f7f9bSDimitry Andric // and suppresses a number of optimizer warnings (!) about 2135139f7f9bSDimitry Andric // dropping arguments. 2136139f7f9bSDimitry Andric if (!OldFn->use_empty()) { 2137f22ef01cSRoman Divacky ReplaceUsesOfNonProtoTypeWithRealFunction(OldFn, NewFn); 2138f22ef01cSRoman Divacky OldFn->removeDeadConstantUsers(); 2139f22ef01cSRoman Divacky } 2140f22ef01cSRoman Divacky 2141f22ef01cSRoman Divacky // Replace uses of F with the Function we will endow with a body. 2142f22ef01cSRoman Divacky if (!Entry->use_empty()) { 2143f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 2144f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 2145f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 2146f22ef01cSRoman Divacky } 2147f22ef01cSRoman Divacky 2148f22ef01cSRoman Divacky // Ok, delete the old function now, which is dead. 2149f22ef01cSRoman Divacky OldFn->eraseFromParent(); 2150f22ef01cSRoman Divacky 2151f22ef01cSRoman Divacky Entry = NewFn; 2152f22ef01cSRoman Divacky } 2153f22ef01cSRoman Divacky 21542754fe60SDimitry Andric // We need to set linkage and visibility on the function before 21552754fe60SDimitry Andric // generating code for it because various parts of IR generation 21562754fe60SDimitry Andric // want to propagate this information down (e.g. to local static 21572754fe60SDimitry Andric // declarations). 2158f22ef01cSRoman Divacky llvm::Function *Fn = cast<llvm::Function>(Entry); 2159f785676fSDimitry Andric setFunctionLinkage(GD, Fn); 2160f22ef01cSRoman Divacky 21612754fe60SDimitry Andric // FIXME: this is redundant with part of SetFunctionDefinitionAttributes 21622754fe60SDimitry Andric setGlobalVisibility(Fn, D); 21632754fe60SDimitry Andric 2164284c1978SDimitry Andric MaybeHandleStaticInExternC(D, Fn); 2165284c1978SDimitry Andric 21663b0f4066SDimitry Andric CodeGenFunction(*this).GenerateCode(D, Fn, FI); 2167f22ef01cSRoman Divacky 2168f22ef01cSRoman Divacky SetFunctionDefinitionAttributes(D, Fn); 2169f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, Fn); 2170f22ef01cSRoman Divacky 2171f22ef01cSRoman Divacky if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) 2172f22ef01cSRoman Divacky AddGlobalCtor(Fn, CA->getPriority()); 2173f22ef01cSRoman Divacky if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) 2174f22ef01cSRoman Divacky AddGlobalDtor(Fn, DA->getPriority()); 21756122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 21766122f3e6SDimitry Andric AddGlobalAnnotations(D, Fn); 2177f22ef01cSRoman Divacky } 2178f22ef01cSRoman Divacky 2179f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { 2180f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 2181f22ef01cSRoman Divacky const AliasAttr *AA = D->getAttr<AliasAttr>(); 2182f22ef01cSRoman Divacky assert(AA && "Not an alias?"); 2183f22ef01cSRoman Divacky 21846122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 2185f22ef01cSRoman Divacky 2186f22ef01cSRoman Divacky // If there is a definition in the module, then it wins over the alias. 2187f22ef01cSRoman Divacky // This is dubious, but allow it to be safe. Just ignore the alias. 2188f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 2189f22ef01cSRoman Divacky if (Entry && !Entry->isDeclaration()) 2190f22ef01cSRoman Divacky return; 2191f22ef01cSRoman Divacky 2192f785676fSDimitry Andric Aliases.push_back(GD); 2193f785676fSDimitry Andric 21946122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); 2195f22ef01cSRoman Divacky 2196f22ef01cSRoman Divacky // Create a reference to the named value. This ensures that it is emitted 2197f22ef01cSRoman Divacky // if a deferred decl. 2198f22ef01cSRoman Divacky llvm::Constant *Aliasee; 2199f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 22003861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, 22012754fe60SDimitry Andric /*ForVTable=*/false); 2202f22ef01cSRoman Divacky else 2203f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 2204f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 2205f22ef01cSRoman Divacky 2206f22ef01cSRoman Divacky // Create the new alias itself, but don't set a name yet. 2207f22ef01cSRoman Divacky llvm::GlobalValue *GA = 2208f22ef01cSRoman Divacky new llvm::GlobalAlias(Aliasee->getType(), 2209f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 2210f22ef01cSRoman Divacky "", Aliasee, &getModule()); 2211f22ef01cSRoman Divacky 2212f22ef01cSRoman Divacky if (Entry) { 2213f22ef01cSRoman Divacky assert(Entry->isDeclaration()); 2214f22ef01cSRoman Divacky 2215f22ef01cSRoman Divacky // If there is a declaration in the module, then we had an extern followed 2216f22ef01cSRoman Divacky // by the alias, as in: 2217f22ef01cSRoman Divacky // extern int test6(); 2218f22ef01cSRoman Divacky // ... 2219f22ef01cSRoman Divacky // int test6() __attribute__((alias("test7"))); 2220f22ef01cSRoman Divacky // 2221f22ef01cSRoman Divacky // Remove it and replace uses of it with the alias. 2222f22ef01cSRoman Divacky GA->takeName(Entry); 2223f22ef01cSRoman Divacky 2224f22ef01cSRoman Divacky Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, 2225f22ef01cSRoman Divacky Entry->getType())); 2226f22ef01cSRoman Divacky Entry->eraseFromParent(); 2227f22ef01cSRoman Divacky } else { 2228ffd1746dSEd Schouten GA->setName(MangledName); 2229f22ef01cSRoman Divacky } 2230f22ef01cSRoman Divacky 2231f22ef01cSRoman Divacky // Set attributes which are particular to an alias; this is a 2232f22ef01cSRoman Divacky // specialization of the attributes which may be set on a global 2233f22ef01cSRoman Divacky // variable/function. 2234f22ef01cSRoman Divacky if (D->hasAttr<DLLExportAttr>()) { 2235f22ef01cSRoman Divacky if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 2236f22ef01cSRoman Divacky // The dllexport attribute is ignored for undefined symbols. 2237ffd1746dSEd Schouten if (FD->hasBody()) 2238f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2239f22ef01cSRoman Divacky } else { 2240f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2241f22ef01cSRoman Divacky } 2242f22ef01cSRoman Divacky } else if (D->hasAttr<WeakAttr>() || 2243f22ef01cSRoman Divacky D->hasAttr<WeakRefAttr>() || 22443b0f4066SDimitry Andric D->isWeakImported()) { 2245f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::WeakAnyLinkage); 2246f22ef01cSRoman Divacky } 2247f22ef01cSRoman Divacky 2248f22ef01cSRoman Divacky SetCommonAttributes(D, GA); 2249f22ef01cSRoman Divacky } 2250f22ef01cSRoman Divacky 225117a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID, 22526122f3e6SDimitry Andric ArrayRef<llvm::Type*> Tys) { 225317a519f9SDimitry Andric return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID, 225417a519f9SDimitry Andric Tys); 2255f22ef01cSRoman Divacky } 2256f22ef01cSRoman Divacky 2257f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> & 2258f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2259f22ef01cSRoman Divacky const StringLiteral *Literal, 2260f22ef01cSRoman Divacky bool TargetIsLSB, 2261f22ef01cSRoman Divacky bool &IsUTF16, 2262f22ef01cSRoman Divacky unsigned &StringLength) { 22636122f3e6SDimitry Andric StringRef String = Literal->getString(); 2264e580952dSDimitry Andric unsigned NumBytes = String.size(); 2265f22ef01cSRoman Divacky 2266f22ef01cSRoman Divacky // Check for simple case. 2267f22ef01cSRoman Divacky if (!Literal->containsNonAsciiOrNull()) { 2268f22ef01cSRoman Divacky StringLength = NumBytes; 2269e580952dSDimitry Andric return Map.GetOrCreateValue(String); 2270f22ef01cSRoman Divacky } 2271f22ef01cSRoman Divacky 2272dff0c46cSDimitry Andric // Otherwise, convert the UTF8 literals into a string of shorts. 2273dff0c46cSDimitry Andric IsUTF16 = true; 2274dff0c46cSDimitry Andric 2275dff0c46cSDimitry Andric SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls. 22763861d79fSDimitry Andric const UTF8 *FromPtr = (const UTF8 *)String.data(); 2277f22ef01cSRoman Divacky UTF16 *ToPtr = &ToBuf[0]; 2278f22ef01cSRoman Divacky 22792754fe60SDimitry Andric (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, 2280f22ef01cSRoman Divacky &ToPtr, ToPtr + NumBytes, 2281f22ef01cSRoman Divacky strictConversion); 2282f22ef01cSRoman Divacky 2283f22ef01cSRoman Divacky // ConvertUTF8toUTF16 returns the length in ToPtr. 2284f22ef01cSRoman Divacky StringLength = ToPtr - &ToBuf[0]; 2285f22ef01cSRoman Divacky 2286dff0c46cSDimitry Andric // Add an explicit null. 2287dff0c46cSDimitry Andric *ToPtr = 0; 2288dff0c46cSDimitry Andric return Map. 2289dff0c46cSDimitry Andric GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()), 2290dff0c46cSDimitry Andric (StringLength + 1) * 2)); 2291f22ef01cSRoman Divacky } 2292f22ef01cSRoman Divacky 2293bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> & 2294bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2295bd5abe19SDimitry Andric const StringLiteral *Literal, 2296dff0c46cSDimitry Andric unsigned &StringLength) { 22976122f3e6SDimitry Andric StringRef String = Literal->getString(); 2298bd5abe19SDimitry Andric StringLength = String.size(); 2299bd5abe19SDimitry Andric return Map.GetOrCreateValue(String); 2300bd5abe19SDimitry Andric } 2301bd5abe19SDimitry Andric 2302f22ef01cSRoman Divacky llvm::Constant * 2303f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { 2304f22ef01cSRoman Divacky unsigned StringLength = 0; 2305f22ef01cSRoman Divacky bool isUTF16 = false; 2306f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2307f22ef01cSRoman Divacky GetConstantCFStringEntry(CFConstantStringMap, Literal, 23083861d79fSDimitry Andric getDataLayout().isLittleEndian(), 2309f22ef01cSRoman Divacky isUTF16, StringLength); 2310f22ef01cSRoman Divacky 2311f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2312f22ef01cSRoman Divacky return C; 2313f22ef01cSRoman Divacky 2314dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2315f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2316284c1978SDimitry Andric llvm::Value *V; 2317f22ef01cSRoman Divacky 2318f22ef01cSRoman Divacky // If we don't already have it, get __CFConstantStringClassReference. 2319f22ef01cSRoman Divacky if (!CFConstantStringClassRef) { 23206122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 2321f22ef01cSRoman Divacky Ty = llvm::ArrayType::get(Ty, 0); 2322f22ef01cSRoman Divacky llvm::Constant *GV = CreateRuntimeVariable(Ty, 2323f22ef01cSRoman Divacky "__CFConstantStringClassReference"); 2324f22ef01cSRoman Divacky // Decay array -> ptr 2325284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2326284c1978SDimitry Andric CFConstantStringClassRef = V; 2327f22ef01cSRoman Divacky } 2328284c1978SDimitry Andric else 2329284c1978SDimitry Andric V = CFConstantStringClassRef; 2330f22ef01cSRoman Divacky 2331f22ef01cSRoman Divacky QualType CFTy = getContext().getCFConstantStringType(); 2332f22ef01cSRoman Divacky 23336122f3e6SDimitry Andric llvm::StructType *STy = 2334f22ef01cSRoman Divacky cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 2335f22ef01cSRoman Divacky 2336dff0c46cSDimitry Andric llvm::Constant *Fields[4]; 2337f22ef01cSRoman Divacky 2338f22ef01cSRoman Divacky // Class pointer. 2339284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2340f22ef01cSRoman Divacky 2341f22ef01cSRoman Divacky // Flags. 23426122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2343f22ef01cSRoman Divacky Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) : 2344f22ef01cSRoman Divacky llvm::ConstantInt::get(Ty, 0x07C8); 2345f22ef01cSRoman Divacky 2346f22ef01cSRoman Divacky // String pointer. 2347dff0c46cSDimitry Andric llvm::Constant *C = 0; 2348dff0c46cSDimitry Andric if (isUTF16) { 2349dff0c46cSDimitry Andric ArrayRef<uint16_t> Arr = 2350139f7f9bSDimitry Andric llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>( 2351139f7f9bSDimitry Andric const_cast<char *>(Entry.getKey().data())), 2352dff0c46cSDimitry Andric Entry.getKey().size() / 2); 2353dff0c46cSDimitry Andric C = llvm::ConstantDataArray::get(VMContext, Arr); 2354dff0c46cSDimitry Andric } else { 2355dff0c46cSDimitry Andric C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2356dff0c46cSDimitry Andric } 2357f22ef01cSRoman Divacky 2358f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2359dff0c46cSDimitry Andric if (isUTF16) 2360f22ef01cSRoman Divacky // FIXME: why do utf strings get "_" labels instead of "L" labels? 2361f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::InternalLinkage; 2362dff0c46cSDimitry Andric else 23633b0f4066SDimitry Andric // FIXME: With OS X ld 123.2 (xcode 4) and LTO we would get a linker error 23643b0f4066SDimitry Andric // when using private linkage. It is not clear if this is a bug in ld 23653b0f4066SDimitry Andric // or a reasonable new restriction. 23663b0f4066SDimitry Andric Linkage = llvm::GlobalValue::LinkerPrivateLinkage; 2367f22ef01cSRoman Divacky 2368dff0c46cSDimitry Andric // Note: -fwritable-strings doesn't make the backing store strings of 2369dff0c46cSDimitry Andric // CFStrings writable. (See <rdar://problem/10657500>) 2370f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2371dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true, 2372dff0c46cSDimitry Andric Linkage, C, ".str"); 23732754fe60SDimitry Andric GV->setUnnamedAddr(true); 2374284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2375284c1978SDimitry Andric // of the string is via this class initializer. 2376f22ef01cSRoman Divacky if (isUTF16) { 2377f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy); 2378f22ef01cSRoman Divacky GV->setAlignment(Align.getQuantity()); 23793b0f4066SDimitry Andric } else { 23803b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 23813b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 2382f22ef01cSRoman Divacky } 2383dff0c46cSDimitry Andric 2384dff0c46cSDimitry Andric // String. 23856122f3e6SDimitry Andric Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2386f22ef01cSRoman Divacky 2387dff0c46cSDimitry Andric if (isUTF16) 2388dff0c46cSDimitry Andric // Cast the UTF16 string to the correct type. 2389dff0c46cSDimitry Andric Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy); 2390dff0c46cSDimitry Andric 2391f22ef01cSRoman Divacky // String length. 2392f22ef01cSRoman Divacky Ty = getTypes().ConvertType(getContext().LongTy); 2393f22ef01cSRoman Divacky Fields[3] = llvm::ConstantInt::get(Ty, StringLength); 2394f22ef01cSRoman Divacky 2395f22ef01cSRoman Divacky // The struct. 2396f22ef01cSRoman Divacky C = llvm::ConstantStruct::get(STy, Fields); 2397f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2398f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2399f22ef01cSRoman Divacky "_unnamed_cfstring_"); 2400284c1978SDimitry Andric if (const char *Sect = getTarget().getCFStringSection()) 2401f22ef01cSRoman Divacky GV->setSection(Sect); 2402f22ef01cSRoman Divacky Entry.setValue(GV); 2403f22ef01cSRoman Divacky 2404f22ef01cSRoman Divacky return GV; 2405f22ef01cSRoman Divacky } 2406f22ef01cSRoman Divacky 24076122f3e6SDimitry Andric static RecordDecl * 24086122f3e6SDimitry Andric CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 24096122f3e6SDimitry Andric DeclContext *DC, IdentifierInfo *Id) { 24106122f3e6SDimitry Andric SourceLocation Loc; 2411dff0c46cSDimitry Andric if (Ctx.getLangOpts().CPlusPlus) 24126122f3e6SDimitry Andric return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 24136122f3e6SDimitry Andric else 24146122f3e6SDimitry Andric return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 24156122f3e6SDimitry Andric } 24166122f3e6SDimitry Andric 2417f22ef01cSRoman Divacky llvm::Constant * 24182754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) { 2419f22ef01cSRoman Divacky unsigned StringLength = 0; 2420f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2421bd5abe19SDimitry Andric GetConstantStringEntry(CFConstantStringMap, Literal, StringLength); 2422f22ef01cSRoman Divacky 2423f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2424f22ef01cSRoman Divacky return C; 2425f22ef01cSRoman Divacky 2426dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2427f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2428284c1978SDimitry Andric llvm::Value *V; 2429f22ef01cSRoman Divacky // If we don't already have it, get _NSConstantStringClassReference. 24302754fe60SDimitry Andric if (!ConstantStringClassRef) { 2431dff0c46cSDimitry Andric std::string StringClass(getLangOpts().ObjCConstantStringClass); 24326122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 24332754fe60SDimitry Andric llvm::Constant *GV; 24347ae0e2c9SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 2435bd5abe19SDimitry Andric std::string str = 2436bd5abe19SDimitry Andric StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" 2437bd5abe19SDimitry Andric : "OBJC_CLASS_$_" + StringClass; 2438bd5abe19SDimitry Andric GV = getObjCRuntime().GetClassGlobal(str); 2439bd5abe19SDimitry Andric // Make sure the result is of the correct type. 24406122f3e6SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 2441284c1978SDimitry Andric V = llvm::ConstantExpr::getBitCast(GV, PTy); 2442284c1978SDimitry Andric ConstantStringClassRef = V; 2443bd5abe19SDimitry Andric } else { 2444bd5abe19SDimitry Andric std::string str = 2445bd5abe19SDimitry Andric StringClass.empty() ? "_NSConstantStringClassReference" 2446bd5abe19SDimitry Andric : "_" + StringClass + "ClassReference"; 24476122f3e6SDimitry Andric llvm::Type *PTy = llvm::ArrayType::get(Ty, 0); 2448bd5abe19SDimitry Andric GV = CreateRuntimeVariable(PTy, str); 2449f22ef01cSRoman Divacky // Decay array -> ptr 2450284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2451284c1978SDimitry Andric ConstantStringClassRef = V; 2452f22ef01cSRoman Divacky } 2453bd5abe19SDimitry Andric } 2454284c1978SDimitry Andric else 2455284c1978SDimitry Andric V = ConstantStringClassRef; 2456f22ef01cSRoman Divacky 24576122f3e6SDimitry Andric if (!NSConstantStringType) { 24586122f3e6SDimitry Andric // Construct the type for a constant NSString. 24596122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 24606122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 24616122f3e6SDimitry Andric &Context.Idents.get("__builtin_NSString")); 24626122f3e6SDimitry Andric D->startDefinition(); 2463f22ef01cSRoman Divacky 24646122f3e6SDimitry Andric QualType FieldTypes[3]; 24656122f3e6SDimitry Andric 24666122f3e6SDimitry Andric // const int *isa; 24676122f3e6SDimitry Andric FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst()); 24686122f3e6SDimitry Andric // const char *str; 24696122f3e6SDimitry Andric FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst()); 24706122f3e6SDimitry Andric // unsigned int length; 24716122f3e6SDimitry Andric FieldTypes[2] = Context.UnsignedIntTy; 24726122f3e6SDimitry Andric 24736122f3e6SDimitry Andric // Create fields 24746122f3e6SDimitry Andric for (unsigned i = 0; i < 3; ++i) { 24756122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, D, 24766122f3e6SDimitry Andric SourceLocation(), 24776122f3e6SDimitry Andric SourceLocation(), 0, 24786122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 24796122f3e6SDimitry Andric /*BitWidth=*/0, 24806122f3e6SDimitry Andric /*Mutable=*/false, 24817ae0e2c9SDimitry Andric ICIS_NoInit); 24826122f3e6SDimitry Andric Field->setAccess(AS_public); 24836122f3e6SDimitry Andric D->addDecl(Field); 24846122f3e6SDimitry Andric } 24856122f3e6SDimitry Andric 24866122f3e6SDimitry Andric D->completeDefinition(); 24876122f3e6SDimitry Andric QualType NSTy = Context.getTagDeclType(D); 24886122f3e6SDimitry Andric NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy)); 24896122f3e6SDimitry Andric } 2490f22ef01cSRoman Divacky 2491dff0c46cSDimitry Andric llvm::Constant *Fields[3]; 2492f22ef01cSRoman Divacky 2493f22ef01cSRoman Divacky // Class pointer. 2494284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2495f22ef01cSRoman Divacky 2496f22ef01cSRoman Divacky // String pointer. 2497dff0c46cSDimitry Andric llvm::Constant *C = 2498dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2499f22ef01cSRoman Divacky 2500f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2501f22ef01cSRoman Divacky bool isConstant; 2502f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::PrivateLinkage; 2503dff0c46cSDimitry Andric isConstant = !LangOpts.WritableStrings; 2504f22ef01cSRoman Divacky 2505f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2506f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), C->getType(), isConstant, Linkage, C, 2507f22ef01cSRoman Divacky ".str"); 25082754fe60SDimitry Andric GV->setUnnamedAddr(true); 2509284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2510284c1978SDimitry Andric // of the string is via this class initializer. 25113b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 25123b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 25136122f3e6SDimitry Andric Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2514f22ef01cSRoman Divacky 2515f22ef01cSRoman Divacky // String length. 25166122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2517f22ef01cSRoman Divacky Fields[2] = llvm::ConstantInt::get(Ty, StringLength); 2518f22ef01cSRoman Divacky 2519f22ef01cSRoman Divacky // The struct. 25206122f3e6SDimitry Andric C = llvm::ConstantStruct::get(NSConstantStringType, Fields); 2521f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2522f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2523f22ef01cSRoman Divacky "_unnamed_nsstring_"); 2524f22ef01cSRoman Divacky // FIXME. Fix section. 2525f22ef01cSRoman Divacky if (const char *Sect = 25267ae0e2c9SDimitry Andric LangOpts.ObjCRuntime.isNonFragile() 2527284c1978SDimitry Andric ? getTarget().getNSStringNonFragileABISection() 2528284c1978SDimitry Andric : getTarget().getNSStringSection()) 2529f22ef01cSRoman Divacky GV->setSection(Sect); 2530f22ef01cSRoman Divacky Entry.setValue(GV); 2531f22ef01cSRoman Divacky 2532f22ef01cSRoman Divacky return GV; 2533f22ef01cSRoman Divacky } 2534f22ef01cSRoman Divacky 25356122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() { 25366122f3e6SDimitry Andric if (ObjCFastEnumerationStateType.isNull()) { 25376122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 25386122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 25396122f3e6SDimitry Andric &Context.Idents.get("__objcFastEnumerationState")); 25406122f3e6SDimitry Andric D->startDefinition(); 25416122f3e6SDimitry Andric 25426122f3e6SDimitry Andric QualType FieldTypes[] = { 25436122f3e6SDimitry Andric Context.UnsignedLongTy, 25446122f3e6SDimitry Andric Context.getPointerType(Context.getObjCIdType()), 25456122f3e6SDimitry Andric Context.getPointerType(Context.UnsignedLongTy), 25466122f3e6SDimitry Andric Context.getConstantArrayType(Context.UnsignedLongTy, 25476122f3e6SDimitry Andric llvm::APInt(32, 5), ArrayType::Normal, 0) 25486122f3e6SDimitry Andric }; 25496122f3e6SDimitry Andric 25506122f3e6SDimitry Andric for (size_t i = 0; i < 4; ++i) { 25516122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, 25526122f3e6SDimitry Andric D, 25536122f3e6SDimitry Andric SourceLocation(), 25546122f3e6SDimitry Andric SourceLocation(), 0, 25556122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 25566122f3e6SDimitry Andric /*BitWidth=*/0, 25576122f3e6SDimitry Andric /*Mutable=*/false, 25587ae0e2c9SDimitry Andric ICIS_NoInit); 25596122f3e6SDimitry Andric Field->setAccess(AS_public); 25606122f3e6SDimitry Andric D->addDecl(Field); 25616122f3e6SDimitry Andric } 25626122f3e6SDimitry Andric 25636122f3e6SDimitry Andric D->completeDefinition(); 25646122f3e6SDimitry Andric ObjCFastEnumerationStateType = Context.getTagDeclType(D); 25656122f3e6SDimitry Andric } 25666122f3e6SDimitry Andric 25676122f3e6SDimitry Andric return ObjCFastEnumerationStateType; 25686122f3e6SDimitry Andric } 25696122f3e6SDimitry Andric 2570dff0c46cSDimitry Andric llvm::Constant * 2571dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { 2572dff0c46cSDimitry Andric assert(!E->getType()->isPointerType() && "Strings are always arrays"); 2573f22ef01cSRoman Divacky 2574dff0c46cSDimitry Andric // Don't emit it as the address of the string, emit the string data itself 2575dff0c46cSDimitry Andric // as an inline array. 2576dff0c46cSDimitry Andric if (E->getCharByteWidth() == 1) { 2577dff0c46cSDimitry Andric SmallString<64> Str(E->getString()); 2578f22ef01cSRoman Divacky 2579dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2580dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType()); 2581dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2582dff0c46cSDimitry Andric return llvm::ConstantDataArray::getString(VMContext, Str, false); 25836122f3e6SDimitry Andric } 2584f22ef01cSRoman Divacky 2585dff0c46cSDimitry Andric llvm::ArrayType *AType = 2586dff0c46cSDimitry Andric cast<llvm::ArrayType>(getTypes().ConvertType(E->getType())); 2587dff0c46cSDimitry Andric llvm::Type *ElemTy = AType->getElementType(); 2588dff0c46cSDimitry Andric unsigned NumElements = AType->getNumElements(); 2589f22ef01cSRoman Divacky 2590dff0c46cSDimitry Andric // Wide strings have either 2-byte or 4-byte elements. 2591dff0c46cSDimitry Andric if (ElemTy->getPrimitiveSizeInBits() == 16) { 2592dff0c46cSDimitry Andric SmallVector<uint16_t, 32> Elements; 2593dff0c46cSDimitry Andric Elements.reserve(NumElements); 2594dff0c46cSDimitry Andric 2595dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2596dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2597dff0c46cSDimitry Andric Elements.resize(NumElements); 2598dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2599dff0c46cSDimitry Andric } 2600dff0c46cSDimitry Andric 2601dff0c46cSDimitry Andric assert(ElemTy->getPrimitiveSizeInBits() == 32); 2602dff0c46cSDimitry Andric SmallVector<uint32_t, 32> Elements; 2603dff0c46cSDimitry Andric Elements.reserve(NumElements); 2604dff0c46cSDimitry Andric 2605dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2606dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2607dff0c46cSDimitry Andric Elements.resize(NumElements); 2608dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2609f22ef01cSRoman Divacky } 2610f22ef01cSRoman Divacky 2611f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromLiteral - Return a pointer to a 2612f22ef01cSRoman Divacky /// constant array for the given string literal. 2613f22ef01cSRoman Divacky llvm::Constant * 2614f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 2615284c1978SDimitry Andric CharUnits Align = getContext().getAlignOfGlobalVarInChars(S->getType()); 2616dff0c46cSDimitry Andric if (S->isAscii() || S->isUTF8()) { 2617dff0c46cSDimitry Andric SmallString<64> Str(S->getString()); 2618dff0c46cSDimitry Andric 2619dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2620dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType()); 2621dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2622dff0c46cSDimitry Andric return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity()); 2623f22ef01cSRoman Divacky } 2624dff0c46cSDimitry Andric 2625dff0c46cSDimitry Andric // FIXME: the following does not memoize wide strings. 2626dff0c46cSDimitry Andric llvm::Constant *C = GetConstantArrayFromStringLiteral(S); 2627dff0c46cSDimitry Andric llvm::GlobalVariable *GV = 2628dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(),C->getType(), 2629dff0c46cSDimitry Andric !LangOpts.WritableStrings, 2630dff0c46cSDimitry Andric llvm::GlobalValue::PrivateLinkage, 2631dff0c46cSDimitry Andric C,".str"); 2632dff0c46cSDimitry Andric 2633dff0c46cSDimitry Andric GV->setAlignment(Align.getQuantity()); 2634dff0c46cSDimitry Andric GV->setUnnamedAddr(true); 2635dff0c46cSDimitry Andric return GV; 2636f22ef01cSRoman Divacky } 2637f22ef01cSRoman Divacky 2638f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant 2639f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node. 2640f22ef01cSRoman Divacky llvm::Constant * 2641f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { 2642f22ef01cSRoman Divacky std::string Str; 2643f22ef01cSRoman Divacky getContext().getObjCEncodingForType(E->getEncodedType(), Str); 2644f22ef01cSRoman Divacky 2645f22ef01cSRoman Divacky return GetAddrOfConstantCString(Str); 2646f22ef01cSRoman Divacky } 2647f22ef01cSRoman Divacky 2648f22ef01cSRoman Divacky 2649f22ef01cSRoman Divacky /// GenerateWritableString -- Creates storage for a string literal. 26506122f3e6SDimitry Andric static llvm::GlobalVariable *GenerateStringLiteral(StringRef str, 2651f22ef01cSRoman Divacky bool constant, 2652f22ef01cSRoman Divacky CodeGenModule &CGM, 26536122f3e6SDimitry Andric const char *GlobalName, 26546122f3e6SDimitry Andric unsigned Alignment) { 2655f22ef01cSRoman Divacky // Create Constant for this string literal. Don't add a '\0'. 2656f22ef01cSRoman Divacky llvm::Constant *C = 2657dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false); 2658f22ef01cSRoman Divacky 2659f785676fSDimitry Andric // OpenCL v1.1 s6.5.3: a string literal is in the constant address space. 2660f785676fSDimitry Andric unsigned AddrSpace = 0; 2661f785676fSDimitry Andric if (CGM.getLangOpts().OpenCL) 2662f785676fSDimitry Andric AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant); 2663f785676fSDimitry Andric 2664f22ef01cSRoman Divacky // Create a global variable for this string 2665f785676fSDimitry Andric llvm::GlobalVariable *GV = new llvm::GlobalVariable( 2666f785676fSDimitry Andric CGM.getModule(), C->getType(), constant, 2667f785676fSDimitry Andric llvm::GlobalValue::PrivateLinkage, C, GlobalName, 0, 2668f785676fSDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 26696122f3e6SDimitry Andric GV->setAlignment(Alignment); 26702754fe60SDimitry Andric GV->setUnnamedAddr(true); 26712754fe60SDimitry Andric return GV; 2672f22ef01cSRoman Divacky } 2673f22ef01cSRoman Divacky 2674f22ef01cSRoman Divacky /// GetAddrOfConstantString - Returns a pointer to a character array 2675f22ef01cSRoman Divacky /// containing the literal. This contents are exactly that of the 2676f22ef01cSRoman Divacky /// given string, i.e. it will not be null terminated automatically; 2677f22ef01cSRoman Divacky /// see GetAddrOfConstantCString. Note that whether the result is 2678f22ef01cSRoman Divacky /// actually a pointer to an LLVM constant depends on 2679f22ef01cSRoman Divacky /// Feature.WriteableStrings. 2680f22ef01cSRoman Divacky /// 2681f22ef01cSRoman Divacky /// The result has pointer to array type. 26826122f3e6SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantString(StringRef Str, 26836122f3e6SDimitry Andric const char *GlobalName, 26846122f3e6SDimitry Andric unsigned Alignment) { 2685f22ef01cSRoman Divacky // Get the default prefix if a name wasn't specified. 2686f22ef01cSRoman Divacky if (!GlobalName) 2687f22ef01cSRoman Divacky GlobalName = ".str"; 2688f22ef01cSRoman Divacky 2689284c1978SDimitry Andric if (Alignment == 0) 2690284c1978SDimitry Andric Alignment = getContext().getAlignOfGlobalVarInChars(getContext().CharTy) 2691284c1978SDimitry Andric .getQuantity(); 2692284c1978SDimitry Andric 2693f22ef01cSRoman Divacky // Don't share any string literals if strings aren't constant. 2694dff0c46cSDimitry Andric if (LangOpts.WritableStrings) 26956122f3e6SDimitry Andric return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment); 2696f22ef01cSRoman Divacky 26976122f3e6SDimitry Andric llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = 26983b0f4066SDimitry Andric ConstantStringMap.GetOrCreateValue(Str); 2699f22ef01cSRoman Divacky 27006122f3e6SDimitry Andric if (llvm::GlobalVariable *GV = Entry.getValue()) { 27016122f3e6SDimitry Andric if (Alignment > GV->getAlignment()) { 27026122f3e6SDimitry Andric GV->setAlignment(Alignment); 27036122f3e6SDimitry Andric } 27046122f3e6SDimitry Andric return GV; 27056122f3e6SDimitry Andric } 2706f22ef01cSRoman Divacky 2707f22ef01cSRoman Divacky // Create a global variable for this. 2708dff0c46cSDimitry Andric llvm::GlobalVariable *GV = GenerateStringLiteral(Str, true, *this, GlobalName, 2709dff0c46cSDimitry Andric Alignment); 27106122f3e6SDimitry Andric Entry.setValue(GV); 27116122f3e6SDimitry Andric return GV; 2712f22ef01cSRoman Divacky } 2713f22ef01cSRoman Divacky 2714f22ef01cSRoman Divacky /// GetAddrOfConstantCString - Returns a pointer to a character 27153b0f4066SDimitry Andric /// array containing the literal and a terminating '\0' 2716f22ef01cSRoman Divacky /// character. The result has pointer to array type. 27173b0f4066SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &Str, 27186122f3e6SDimitry Andric const char *GlobalName, 27196122f3e6SDimitry Andric unsigned Alignment) { 27206122f3e6SDimitry Andric StringRef StrWithNull(Str.c_str(), Str.size() + 1); 27216122f3e6SDimitry Andric return GetAddrOfConstantString(StrWithNull, GlobalName, Alignment); 2722f22ef01cSRoman Divacky } 2723f22ef01cSRoman Divacky 2724f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary( 2725f785676fSDimitry Andric const MaterializeTemporaryExpr *E, const Expr *Init) { 2726f785676fSDimitry Andric assert((E->getStorageDuration() == SD_Static || 2727f785676fSDimitry Andric E->getStorageDuration() == SD_Thread) && "not a global temporary"); 2728f785676fSDimitry Andric const VarDecl *VD = cast<VarDecl>(E->getExtendingDecl()); 2729f785676fSDimitry Andric 2730f785676fSDimitry Andric // If we're not materializing a subobject of the temporary, keep the 2731f785676fSDimitry Andric // cv-qualifiers from the type of the MaterializeTemporaryExpr. 2732f785676fSDimitry Andric QualType MaterializedType = Init->getType(); 2733f785676fSDimitry Andric if (Init == E->GetTemporaryExpr()) 2734f785676fSDimitry Andric MaterializedType = E->getType(); 2735f785676fSDimitry Andric 2736f785676fSDimitry Andric llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E]; 2737f785676fSDimitry Andric if (Slot) 2738f785676fSDimitry Andric return Slot; 2739f785676fSDimitry Andric 2740f785676fSDimitry Andric // FIXME: If an externally-visible declaration extends multiple temporaries, 2741f785676fSDimitry Andric // we need to give each temporary the same name in every translation unit (and 2742f785676fSDimitry Andric // we also need to make the temporaries externally-visible). 2743f785676fSDimitry Andric SmallString<256> Name; 2744f785676fSDimitry Andric llvm::raw_svector_ostream Out(Name); 2745f785676fSDimitry Andric getCXXABI().getMangleContext().mangleReferenceTemporary(VD, Out); 2746f785676fSDimitry Andric Out.flush(); 2747f785676fSDimitry Andric 2748f785676fSDimitry Andric APValue *Value = 0; 2749f785676fSDimitry Andric if (E->getStorageDuration() == SD_Static) { 2750f785676fSDimitry Andric // We might have a cached constant initializer for this temporary. Note 2751f785676fSDimitry Andric // that this might have a different value from the value computed by 2752f785676fSDimitry Andric // evaluating the initializer if the surrounding constant expression 2753f785676fSDimitry Andric // modifies the temporary. 2754f785676fSDimitry Andric Value = getContext().getMaterializedTemporaryValue(E, false); 2755f785676fSDimitry Andric if (Value && Value->isUninit()) 2756f785676fSDimitry Andric Value = 0; 2757f785676fSDimitry Andric } 2758f785676fSDimitry Andric 2759f785676fSDimitry Andric // Try evaluating it now, it might have a constant initializer. 2760f785676fSDimitry Andric Expr::EvalResult EvalResult; 2761f785676fSDimitry Andric if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) && 2762f785676fSDimitry Andric !EvalResult.hasSideEffects()) 2763f785676fSDimitry Andric Value = &EvalResult.Val; 2764f785676fSDimitry Andric 2765f785676fSDimitry Andric llvm::Constant *InitialValue = 0; 2766f785676fSDimitry Andric bool Constant = false; 2767f785676fSDimitry Andric llvm::Type *Type; 2768f785676fSDimitry Andric if (Value) { 2769f785676fSDimitry Andric // The temporary has a constant initializer, use it. 2770f785676fSDimitry Andric InitialValue = EmitConstantValue(*Value, MaterializedType, 0); 2771f785676fSDimitry Andric Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value); 2772f785676fSDimitry Andric Type = InitialValue->getType(); 2773f785676fSDimitry Andric } else { 2774f785676fSDimitry Andric // No initializer, the initialization will be provided when we 2775f785676fSDimitry Andric // initialize the declaration which performed lifetime extension. 2776f785676fSDimitry Andric Type = getTypes().ConvertTypeForMem(MaterializedType); 2777f785676fSDimitry Andric } 2778f785676fSDimitry Andric 2779f785676fSDimitry Andric // Create a global variable for this lifetime-extended temporary. 2780f785676fSDimitry Andric llvm::GlobalVariable *GV = 2781f785676fSDimitry Andric new llvm::GlobalVariable(getModule(), Type, Constant, 2782f785676fSDimitry Andric llvm::GlobalValue::PrivateLinkage, 2783f785676fSDimitry Andric InitialValue, Name.c_str()); 2784f785676fSDimitry Andric GV->setAlignment( 2785f785676fSDimitry Andric getContext().getTypeAlignInChars(MaterializedType).getQuantity()); 2786f785676fSDimitry Andric if (VD->getTLSKind()) 2787f785676fSDimitry Andric setTLSMode(GV, *VD); 2788f785676fSDimitry Andric Slot = GV; 2789f785676fSDimitry Andric return GV; 2790f785676fSDimitry Andric } 2791f785676fSDimitry Andric 2792f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized 2793f22ef01cSRoman Divacky /// properties for an implementation. 2794f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const 2795f22ef01cSRoman Divacky ObjCImplementationDecl *D) { 2796f22ef01cSRoman Divacky for (ObjCImplementationDecl::propimpl_iterator 2797f22ef01cSRoman Divacky i = D->propimpl_begin(), e = D->propimpl_end(); i != e; ++i) { 2798f22ef01cSRoman Divacky ObjCPropertyImplDecl *PID = *i; 2799f22ef01cSRoman Divacky 2800f22ef01cSRoman Divacky // Dynamic is just for type-checking. 2801f22ef01cSRoman Divacky if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 2802f22ef01cSRoman Divacky ObjCPropertyDecl *PD = PID->getPropertyDecl(); 2803f22ef01cSRoman Divacky 2804f22ef01cSRoman Divacky // Determine which methods need to be implemented, some may have 28053861d79fSDimitry Andric // been overridden. Note that ::isPropertyAccessor is not the method 2806f22ef01cSRoman Divacky // we want, that just indicates if the decl came from a 2807f22ef01cSRoman Divacky // property. What we want to know is if the method is defined in 2808f22ef01cSRoman Divacky // this implementation. 2809f22ef01cSRoman Divacky if (!D->getInstanceMethod(PD->getGetterName())) 2810f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCGetter( 2811f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2812f22ef01cSRoman Divacky if (!PD->isReadOnly() && 2813f22ef01cSRoman Divacky !D->getInstanceMethod(PD->getSetterName())) 2814f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCSetter( 2815f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2816f22ef01cSRoman Divacky } 2817f22ef01cSRoman Divacky } 2818f22ef01cSRoman Divacky } 2819f22ef01cSRoman Divacky 28203b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) { 28216122f3e6SDimitry Andric const ObjCInterfaceDecl *iface = impl->getClassInterface(); 28226122f3e6SDimitry Andric for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin(); 28233b0f4066SDimitry Andric ivar; ivar = ivar->getNextIvar()) 28243b0f4066SDimitry Andric if (ivar->getType().isDestructedType()) 28253b0f4066SDimitry Andric return true; 28263b0f4066SDimitry Andric 28273b0f4066SDimitry Andric return false; 28283b0f4066SDimitry Andric } 28293b0f4066SDimitry Andric 2830f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization 2831f22ef01cSRoman Divacky /// for an implementation. 2832f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) { 28333b0f4066SDimitry Andric // We might need a .cxx_destruct even if we don't have any ivar initializers. 28343b0f4066SDimitry Andric if (needsDestructMethod(D)) { 2835f22ef01cSRoman Divacky IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct"); 2836f22ef01cSRoman Divacky Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 28373b0f4066SDimitry Andric ObjCMethodDecl *DTORMethod = 28383b0f4066SDimitry Andric ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(), 28396122f3e6SDimitry Andric cxxSelector, getContext().VoidTy, 0, D, 28406122f3e6SDimitry Andric /*isInstance=*/true, /*isVariadic=*/false, 28413861d79fSDimitry Andric /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true, 28426122f3e6SDimitry Andric /*isDefined=*/false, ObjCMethodDecl::Required); 2843f22ef01cSRoman Divacky D->addInstanceMethod(DTORMethod); 2844f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false); 28453861d79fSDimitry Andric D->setHasDestructors(true); 28463b0f4066SDimitry Andric } 2847f22ef01cSRoman Divacky 28483b0f4066SDimitry Andric // If the implementation doesn't have any ivar initializers, we don't need 28493b0f4066SDimitry Andric // a .cxx_construct. 28503b0f4066SDimitry Andric if (D->getNumIvarInitializers() == 0) 28513b0f4066SDimitry Andric return; 28523b0f4066SDimitry Andric 28533b0f4066SDimitry Andric IdentifierInfo *II = &getContext().Idents.get(".cxx_construct"); 28543b0f4066SDimitry Andric Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 2855f22ef01cSRoman Divacky // The constructor returns 'self'. 2856f22ef01cSRoman Divacky ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(), 2857f22ef01cSRoman Divacky D->getLocation(), 28586122f3e6SDimitry Andric D->getLocation(), 28596122f3e6SDimitry Andric cxxSelector, 2860f22ef01cSRoman Divacky getContext().getObjCIdType(), 0, 28616122f3e6SDimitry Andric D, /*isInstance=*/true, 28626122f3e6SDimitry Andric /*isVariadic=*/false, 28633861d79fSDimitry Andric /*isPropertyAccessor=*/true, 28646122f3e6SDimitry Andric /*isImplicitlyDeclared=*/true, 28656122f3e6SDimitry Andric /*isDefined=*/false, 2866f22ef01cSRoman Divacky ObjCMethodDecl::Required); 2867f22ef01cSRoman Divacky D->addInstanceMethod(CTORMethod); 2868f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true); 28693861d79fSDimitry Andric D->setHasNonZeroConstructors(true); 2870f22ef01cSRoman Divacky } 2871f22ef01cSRoman Divacky 2872f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace. 2873f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) { 2874f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = ND->decls_begin(), E = ND->decls_end(); 2875f785676fSDimitry Andric I != E; ++I) { 2876f785676fSDimitry Andric if (const VarDecl *VD = dyn_cast<VarDecl>(*I)) 2877f785676fSDimitry Andric if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization && 2878f785676fSDimitry Andric VD->getTemplateSpecializationKind() != TSK_Undeclared) 2879f785676fSDimitry Andric continue; 2880f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2881f22ef01cSRoman Divacky } 2882f785676fSDimitry Andric } 2883f22ef01cSRoman Divacky 2884f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec. 2885f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { 2886f22ef01cSRoman Divacky if (LSD->getLanguage() != LinkageSpecDecl::lang_c && 2887f22ef01cSRoman Divacky LSD->getLanguage() != LinkageSpecDecl::lang_cxx) { 2888f22ef01cSRoman Divacky ErrorUnsupported(LSD, "linkage spec"); 2889f22ef01cSRoman Divacky return; 2890f22ef01cSRoman Divacky } 2891f22ef01cSRoman Divacky 2892f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = LSD->decls_begin(), E = LSD->decls_end(); 28933861d79fSDimitry Andric I != E; ++I) { 28943861d79fSDimitry Andric // Meta-data for ObjC class includes references to implemented methods. 28953861d79fSDimitry Andric // Generate class's method definitions first. 28963861d79fSDimitry Andric if (ObjCImplDecl *OID = dyn_cast<ObjCImplDecl>(*I)) { 28973861d79fSDimitry Andric for (ObjCContainerDecl::method_iterator M = OID->meth_begin(), 28983861d79fSDimitry Andric MEnd = OID->meth_end(); 28993861d79fSDimitry Andric M != MEnd; ++M) 29003861d79fSDimitry Andric EmitTopLevelDecl(*M); 29013861d79fSDimitry Andric } 2902f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2903f22ef01cSRoman Divacky } 29043861d79fSDimitry Andric } 2905f22ef01cSRoman Divacky 2906f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration. 2907f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) { 2908f22ef01cSRoman Divacky // Ignore dependent declarations. 2909f22ef01cSRoman Divacky if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) 2910f22ef01cSRoman Divacky return; 2911f22ef01cSRoman Divacky 2912f22ef01cSRoman Divacky switch (D->getKind()) { 2913f22ef01cSRoman Divacky case Decl::CXXConversion: 2914f22ef01cSRoman Divacky case Decl::CXXMethod: 2915f22ef01cSRoman Divacky case Decl::Function: 2916f22ef01cSRoman Divacky // Skip function templates 29173b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 29183b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2919f22ef01cSRoman Divacky return; 2920f22ef01cSRoman Divacky 2921f22ef01cSRoman Divacky EmitGlobal(cast<FunctionDecl>(D)); 2922f22ef01cSRoman Divacky break; 2923f22ef01cSRoman Divacky 2924f22ef01cSRoman Divacky case Decl::Var: 2925f785676fSDimitry Andric // Skip variable templates 2926f785676fSDimitry Andric if (cast<VarDecl>(D)->getDescribedVarTemplate()) 2927f785676fSDimitry Andric return; 2928f785676fSDimitry Andric case Decl::VarTemplateSpecialization: 2929f22ef01cSRoman Divacky EmitGlobal(cast<VarDecl>(D)); 2930f22ef01cSRoman Divacky break; 2931f22ef01cSRoman Divacky 29323b0f4066SDimitry Andric // Indirect fields from global anonymous structs and unions can be 29333b0f4066SDimitry Andric // ignored; only the actual variable requires IR gen support. 29343b0f4066SDimitry Andric case Decl::IndirectField: 29353b0f4066SDimitry Andric break; 29363b0f4066SDimitry Andric 2937f22ef01cSRoman Divacky // C++ Decls 2938f22ef01cSRoman Divacky case Decl::Namespace: 2939f22ef01cSRoman Divacky EmitNamespace(cast<NamespaceDecl>(D)); 2940f22ef01cSRoman Divacky break; 2941f22ef01cSRoman Divacky // No code generation needed. 2942f22ef01cSRoman Divacky case Decl::UsingShadow: 2943f22ef01cSRoman Divacky case Decl::Using: 2944f22ef01cSRoman Divacky case Decl::ClassTemplate: 2945f785676fSDimitry Andric case Decl::VarTemplate: 2946f785676fSDimitry Andric case Decl::VarTemplatePartialSpecialization: 2947f22ef01cSRoman Divacky case Decl::FunctionTemplate: 2948bd5abe19SDimitry Andric case Decl::TypeAliasTemplate: 2949bd5abe19SDimitry Andric case Decl::Block: 2950139f7f9bSDimitry Andric case Decl::Empty: 2951f22ef01cSRoman Divacky break; 2952f785676fSDimitry Andric case Decl::NamespaceAlias: 2953f785676fSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 2954f785676fSDimitry Andric DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D)); 2955f785676fSDimitry Andric return; 2956284c1978SDimitry Andric case Decl::UsingDirective: // using namespace X; [C++] 2957284c1978SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 2958284c1978SDimitry Andric DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D)); 2959284c1978SDimitry Andric return; 2960f22ef01cSRoman Divacky case Decl::CXXConstructor: 2961f22ef01cSRoman Divacky // Skip function templates 29623b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 29633b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2964f22ef01cSRoman Divacky return; 2965f22ef01cSRoman Divacky 2966f785676fSDimitry Andric getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D)); 2967f22ef01cSRoman Divacky break; 2968f22ef01cSRoman Divacky case Decl::CXXDestructor: 29693b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->isLateTemplateParsed()) 29703b0f4066SDimitry Andric return; 2971f785676fSDimitry Andric getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D)); 2972f22ef01cSRoman Divacky break; 2973f22ef01cSRoman Divacky 2974f22ef01cSRoman Divacky case Decl::StaticAssert: 2975f22ef01cSRoman Divacky // Nothing to do. 2976f22ef01cSRoman Divacky break; 2977f22ef01cSRoman Divacky 2978f22ef01cSRoman Divacky // Objective-C Decls 2979f22ef01cSRoman Divacky 2980f22ef01cSRoman Divacky // Forward declarations, no (immediate) code generation. 2981f22ef01cSRoman Divacky case Decl::ObjCInterface: 29827ae0e2c9SDimitry Andric case Decl::ObjCCategory: 2983f22ef01cSRoman Divacky break; 2984f22ef01cSRoman Divacky 2985dff0c46cSDimitry Andric case Decl::ObjCProtocol: { 2986dff0c46cSDimitry Andric ObjCProtocolDecl *Proto = cast<ObjCProtocolDecl>(D); 2987dff0c46cSDimitry Andric if (Proto->isThisDeclarationADefinition()) 2988dff0c46cSDimitry Andric ObjCRuntime->GenerateProtocol(Proto); 2989f22ef01cSRoman Divacky break; 2990dff0c46cSDimitry Andric } 2991f22ef01cSRoman Divacky 2992f22ef01cSRoman Divacky case Decl::ObjCCategoryImpl: 2993f22ef01cSRoman Divacky // Categories have properties but don't support synthesize so we 2994f22ef01cSRoman Divacky // can ignore them here. 29956122f3e6SDimitry Andric ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 2996f22ef01cSRoman Divacky break; 2997f22ef01cSRoman Divacky 2998f22ef01cSRoman Divacky case Decl::ObjCImplementation: { 2999f22ef01cSRoman Divacky ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D); 3000f22ef01cSRoman Divacky EmitObjCPropertyImplementations(OMD); 3001f22ef01cSRoman Divacky EmitObjCIvarInitializations(OMD); 30026122f3e6SDimitry Andric ObjCRuntime->GenerateClass(OMD); 3003dff0c46cSDimitry Andric // Emit global variable debug information. 3004dff0c46cSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 3005139f7f9bSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 3006139f7f9bSDimitry Andric DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( 3007139f7f9bSDimitry Andric OMD->getClassInterface()), OMD->getLocation()); 3008f22ef01cSRoman Divacky break; 3009f22ef01cSRoman Divacky } 3010f22ef01cSRoman Divacky case Decl::ObjCMethod: { 3011f22ef01cSRoman Divacky ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D); 3012f22ef01cSRoman Divacky // If this is not a prototype, emit the body. 3013f22ef01cSRoman Divacky if (OMD->getBody()) 3014f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCMethod(OMD); 3015f22ef01cSRoman Divacky break; 3016f22ef01cSRoman Divacky } 3017f22ef01cSRoman Divacky case Decl::ObjCCompatibleAlias: 3018dff0c46cSDimitry Andric ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D)); 3019f22ef01cSRoman Divacky break; 3020f22ef01cSRoman Divacky 3021f22ef01cSRoman Divacky case Decl::LinkageSpec: 3022f22ef01cSRoman Divacky EmitLinkageSpec(cast<LinkageSpecDecl>(D)); 3023f22ef01cSRoman Divacky break; 3024f22ef01cSRoman Divacky 3025f22ef01cSRoman Divacky case Decl::FileScopeAsm: { 3026f22ef01cSRoman Divacky FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D); 30276122f3e6SDimitry Andric StringRef AsmString = AD->getAsmString()->getString(); 3028f22ef01cSRoman Divacky 3029f22ef01cSRoman Divacky const std::string &S = getModule().getModuleInlineAsm(); 3030f22ef01cSRoman Divacky if (S.empty()) 3031f22ef01cSRoman Divacky getModule().setModuleInlineAsm(AsmString); 30327ae0e2c9SDimitry Andric else if (S.end()[-1] == '\n') 30336122f3e6SDimitry Andric getModule().setModuleInlineAsm(S + AsmString.str()); 3034f22ef01cSRoman Divacky else 3035f22ef01cSRoman Divacky getModule().setModuleInlineAsm(S + '\n' + AsmString.str()); 3036f22ef01cSRoman Divacky break; 3037f22ef01cSRoman Divacky } 3038f22ef01cSRoman Divacky 3039139f7f9bSDimitry Andric case Decl::Import: { 3040139f7f9bSDimitry Andric ImportDecl *Import = cast<ImportDecl>(D); 3041139f7f9bSDimitry Andric 3042139f7f9bSDimitry Andric // Ignore import declarations that come from imported modules. 3043139f7f9bSDimitry Andric if (clang::Module *Owner = Import->getOwningModule()) { 3044139f7f9bSDimitry Andric if (getLangOpts().CurrentModule.empty() || 3045139f7f9bSDimitry Andric Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) 3046139f7f9bSDimitry Andric break; 3047139f7f9bSDimitry Andric } 3048139f7f9bSDimitry Andric 3049139f7f9bSDimitry Andric ImportedModules.insert(Import->getImportedModule()); 3050139f7f9bSDimitry Andric break; 3051139f7f9bSDimitry Andric } 3052139f7f9bSDimitry Andric 3053f22ef01cSRoman Divacky default: 3054f22ef01cSRoman Divacky // Make sure we handled everything we should, every other kind is a 3055f22ef01cSRoman Divacky // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind 3056f22ef01cSRoman Divacky // function. Need to recode Decl::Kind to do that easily. 3057f22ef01cSRoman Divacky assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 3058f22ef01cSRoman Divacky } 3059f22ef01cSRoman Divacky } 3060ffd1746dSEd Schouten 3061ffd1746dSEd Schouten /// Turns the given pointer into a constant. 3062ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context, 3063ffd1746dSEd Schouten const void *Ptr) { 3064ffd1746dSEd Schouten uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr); 30656122f3e6SDimitry Andric llvm::Type *i64 = llvm::Type::getInt64Ty(Context); 3066ffd1746dSEd Schouten return llvm::ConstantInt::get(i64, PtrInt); 3067ffd1746dSEd Schouten } 3068ffd1746dSEd Schouten 3069ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM, 3070ffd1746dSEd Schouten llvm::NamedMDNode *&GlobalMetadata, 3071ffd1746dSEd Schouten GlobalDecl D, 3072ffd1746dSEd Schouten llvm::GlobalValue *Addr) { 3073ffd1746dSEd Schouten if (!GlobalMetadata) 3074ffd1746dSEd Schouten GlobalMetadata = 3075ffd1746dSEd Schouten CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs"); 3076ffd1746dSEd Schouten 3077ffd1746dSEd Schouten // TODO: should we report variant information for ctors/dtors? 3078ffd1746dSEd Schouten llvm::Value *Ops[] = { 3079ffd1746dSEd Schouten Addr, 3080ffd1746dSEd Schouten GetPointerConstant(CGM.getLLVMContext(), D.getDecl()) 3081ffd1746dSEd Schouten }; 30823b0f4066SDimitry Andric GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 3083ffd1746dSEd Schouten } 3084ffd1746dSEd Schouten 3085284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked 3086284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled 3087284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer 3088284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the 3089284c1978SDimitry Andric /// same translation unit. 3090284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() { 3091284c1978SDimitry Andric for (StaticExternCMap::iterator I = StaticExternCValues.begin(), 3092284c1978SDimitry Andric E = StaticExternCValues.end(); 3093284c1978SDimitry Andric I != E; ++I) { 3094284c1978SDimitry Andric IdentifierInfo *Name = I->first; 3095284c1978SDimitry Andric llvm::GlobalValue *Val = I->second; 3096284c1978SDimitry Andric if (Val && !getModule().getNamedValue(Name->getName())) 3097284c1978SDimitry Andric AddUsedGlobal(new llvm::GlobalAlias(Val->getType(), Val->getLinkage(), 3098284c1978SDimitry Andric Name->getName(), Val, &getModule())); 3099284c1978SDimitry Andric } 3100284c1978SDimitry Andric } 3101284c1978SDimitry Andric 3102ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the 3103ffd1746dSEd Schouten /// current module with the Decls they came from. This is useful for 3104ffd1746dSEd Schouten /// projects using IR gen as a subroutine. 3105ffd1746dSEd Schouten /// 3106ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly 3107ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata 3108ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'. 3109ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() { 3110ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 3111ffd1746dSEd Schouten 3112ffd1746dSEd Schouten // StaticLocalDeclMap 31136122f3e6SDimitry Andric for (llvm::DenseMap<GlobalDecl,StringRef>::iterator 3114ffd1746dSEd Schouten I = MangledDeclNames.begin(), E = MangledDeclNames.end(); 3115ffd1746dSEd Schouten I != E; ++I) { 3116ffd1746dSEd Schouten llvm::GlobalValue *Addr = getModule().getNamedValue(I->second); 3117ffd1746dSEd Schouten EmitGlobalDeclMetadata(*this, GlobalMetadata, I->first, Addr); 3118ffd1746dSEd Schouten } 3119ffd1746dSEd Schouten } 3120ffd1746dSEd Schouten 3121ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current 3122ffd1746dSEd Schouten /// function. 3123ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() { 3124ffd1746dSEd Schouten if (LocalDeclMap.empty()) return; 3125ffd1746dSEd Schouten 3126ffd1746dSEd Schouten llvm::LLVMContext &Context = getLLVMContext(); 3127ffd1746dSEd Schouten 3128ffd1746dSEd Schouten // Find the unique metadata ID for this name. 3129ffd1746dSEd Schouten unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr"); 3130ffd1746dSEd Schouten 3131ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 3132ffd1746dSEd Schouten 3133ffd1746dSEd Schouten for (llvm::DenseMap<const Decl*, llvm::Value*>::iterator 3134ffd1746dSEd Schouten I = LocalDeclMap.begin(), E = LocalDeclMap.end(); I != E; ++I) { 3135ffd1746dSEd Schouten const Decl *D = I->first; 3136ffd1746dSEd Schouten llvm::Value *Addr = I->second; 3137ffd1746dSEd Schouten 3138ffd1746dSEd Schouten if (llvm::AllocaInst *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) { 3139ffd1746dSEd Schouten llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D); 31403b0f4066SDimitry Andric Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr)); 3141ffd1746dSEd Schouten } else if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Addr)) { 3142ffd1746dSEd Schouten GlobalDecl GD = GlobalDecl(cast<VarDecl>(D)); 3143ffd1746dSEd Schouten EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV); 3144ffd1746dSEd Schouten } 3145ffd1746dSEd Schouten } 3146ffd1746dSEd Schouten } 3147e580952dSDimitry Andric 3148f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() { 3149f785676fSDimitry Andric llvm::NamedMDNode *IdentMetadata = 3150f785676fSDimitry Andric TheModule.getOrInsertNamedMetadata("llvm.ident"); 3151f785676fSDimitry Andric std::string Version = getClangFullVersion(); 3152f785676fSDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3153f785676fSDimitry Andric 3154f785676fSDimitry Andric llvm::Value *IdentNode[] = { 3155f785676fSDimitry Andric llvm::MDString::get(Ctx, Version) 3156f785676fSDimitry Andric }; 3157f785676fSDimitry Andric IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode)); 3158f785676fSDimitry Andric } 3159f785676fSDimitry Andric 3160bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() { 3161bd5abe19SDimitry Andric if (!getCodeGenOpts().CoverageFile.empty()) { 3162bd5abe19SDimitry Andric if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { 3163bd5abe19SDimitry Andric llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); 3164bd5abe19SDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3165bd5abe19SDimitry Andric llvm::MDString *CoverageFile = 3166bd5abe19SDimitry Andric llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); 3167bd5abe19SDimitry Andric for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { 3168bd5abe19SDimitry Andric llvm::MDNode *CU = CUNode->getOperand(i); 3169bd5abe19SDimitry Andric llvm::Value *node[] = { CoverageFile, CU }; 3170bd5abe19SDimitry Andric llvm::MDNode *N = llvm::MDNode::get(Ctx, node); 3171bd5abe19SDimitry Andric GCov->addOperand(N); 3172bd5abe19SDimitry Andric } 3173bd5abe19SDimitry Andric } 3174bd5abe19SDimitry Andric } 3175bd5abe19SDimitry Andric } 31763861d79fSDimitry Andric 31773861d79fSDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid, 31783861d79fSDimitry Andric QualType GuidType) { 31793861d79fSDimitry Andric // Sema has checked that all uuid strings are of the form 31803861d79fSDimitry Andric // "12345678-1234-1234-1234-1234567890ab". 31813861d79fSDimitry Andric assert(Uuid.size() == 36); 3182f785676fSDimitry Andric for (unsigned i = 0; i < 36; ++i) { 3183f785676fSDimitry Andric if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-'); 3184f785676fSDimitry Andric else assert(isHexDigit(Uuid[i])); 31853861d79fSDimitry Andric } 31863861d79fSDimitry Andric 3187f785676fSDimitry Andric const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 }; 31883861d79fSDimitry Andric 3189f785676fSDimitry Andric llvm::Constant *Field3[8]; 3190f785676fSDimitry Andric for (unsigned Idx = 0; Idx < 8; ++Idx) 3191f785676fSDimitry Andric Field3[Idx] = llvm::ConstantInt::get( 3192f785676fSDimitry Andric Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16); 31933861d79fSDimitry Andric 3194f785676fSDimitry Andric llvm::Constant *Fields[4] = { 3195f785676fSDimitry Andric llvm::ConstantInt::get(Int32Ty, Uuid.substr(0, 8), 16), 3196f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(9, 4), 16), 3197f785676fSDimitry Andric llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16), 3198f785676fSDimitry Andric llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3) 3199f785676fSDimitry Andric }; 3200f785676fSDimitry Andric 3201f785676fSDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 32023861d79fSDimitry Andric } 3203