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" 38139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h" 39dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h" 40f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h" 41139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h" 42139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 43139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h" 44139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h" 45139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 46f22ef01cSRoman Divacky #include "llvm/Support/CallSite.h" 47139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h" 48f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 49139f7f9bSDimitry Andric #include "llvm/Target/Mangler.h" 50139f7f9bSDimitry Andric 51f22ef01cSRoman Divacky using namespace clang; 52f22ef01cSRoman Divacky using namespace CodeGen; 53f22ef01cSRoman Divacky 546122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata"; 556122f3e6SDimitry Andric 56e580952dSDimitry Andric static CGCXXABI &createCXXABI(CodeGenModule &CGM) { 57284c1978SDimitry Andric switch (CGM.getTarget().getCXXABI().getKind()) { 58139f7f9bSDimitry Andric case TargetCXXABI::GenericAArch64: 59139f7f9bSDimitry Andric case TargetCXXABI::GenericARM: 60139f7f9bSDimitry Andric case TargetCXXABI::iOS: 61139f7f9bSDimitry Andric case TargetCXXABI::GenericItanium: 62139f7f9bSDimitry Andric return *CreateItaniumCXXABI(CGM); 63139f7f9bSDimitry Andric case TargetCXXABI::Microsoft: 64139f7f9bSDimitry Andric return *CreateMicrosoftCXXABI(CGM); 65e580952dSDimitry Andric } 66e580952dSDimitry Andric 67e580952dSDimitry Andric llvm_unreachable("invalid C++ ABI kind"); 68e580952dSDimitry Andric } 69e580952dSDimitry Andric 70f22ef01cSRoman Divacky 71f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 72284c1978SDimitry Andric llvm::Module &M, const llvm::DataLayout &TD, 736122f3e6SDimitry Andric DiagnosticsEngine &diags) 74284c1978SDimitry Andric : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M), 75284c1978SDimitry Andric Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()), 76284c1978SDimitry Andric ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(0), 77284c1978SDimitry Andric TheTargetCodeGenInfo(0), Types(*this), VTables(*this), 78284c1978SDimitry Andric ObjCRuntime(0), OpenCLRuntime(0), CUDARuntime(0), 79dff0c46cSDimitry Andric DebugInfo(0), ARCData(0), NoObjCARCExceptionsMetadata(0), 80dff0c46cSDimitry Andric RRData(0), CFConstantStringClassRef(0), 816122f3e6SDimitry Andric ConstantStringClassRef(0), NSConstantStringType(0), 82e580952dSDimitry Andric NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), 832754fe60SDimitry Andric BlockObjectAssign(0), BlockObjectDispose(0), 84139f7f9bSDimitry Andric BlockDescriptorType(0), GenericBlockLiteralType(0), 85139f7f9bSDimitry Andric LifetimeStartFn(0), LifetimeEndFn(0), 86139f7f9bSDimitry Andric SanitizerBlacklist(CGO.SanitizerBlacklistFile), 87139f7f9bSDimitry Andric SanOpts(SanitizerBlacklist.isIn(M) ? 88139f7f9bSDimitry Andric SanitizerOptions::Disabled : 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 175f22ef01cSRoman Divacky void CodeGenModule::Release() { 176f22ef01cSRoman Divacky EmitDeferred(); 177f22ef01cSRoman Divacky EmitCXXGlobalInitFunc(); 178f22ef01cSRoman Divacky EmitCXXGlobalDtorFunc(); 179284c1978SDimitry Andric EmitCXXThreadLocalInitFunc(); 1806122f3e6SDimitry Andric if (ObjCRuntime) 1816122f3e6SDimitry Andric if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction()) 182f22ef01cSRoman Divacky AddGlobalCtor(ObjCInitFunction); 183f22ef01cSRoman Divacky EmitCtorList(GlobalCtors, "llvm.global_ctors"); 184f22ef01cSRoman Divacky EmitCtorList(GlobalDtors, "llvm.global_dtors"); 1856122f3e6SDimitry Andric EmitGlobalAnnotations(); 186284c1978SDimitry Andric EmitStaticExternCAliases(); 187f22ef01cSRoman Divacky EmitLLVMUsed(); 188ffd1746dSEd Schouten 189284c1978SDimitry Andric if (CodeGenOpts.Autolink && Context.getLangOpts().Modules) { 190139f7f9bSDimitry Andric EmitModuleLinkOptions(); 191139f7f9bSDimitry Andric } 192139f7f9bSDimitry Andric 1932754fe60SDimitry Andric SimplifyPersonality(); 1942754fe60SDimitry Andric 195ffd1746dSEd Schouten if (getCodeGenOpts().EmitDeclMetadata) 196ffd1746dSEd Schouten EmitDeclMetadata(); 197bd5abe19SDimitry Andric 198bd5abe19SDimitry Andric if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) 199bd5abe19SDimitry Andric EmitCoverageFile(); 2006122f3e6SDimitry Andric 2016122f3e6SDimitry Andric if (DebugInfo) 2026122f3e6SDimitry Andric DebugInfo->finalize(); 203f22ef01cSRoman Divacky } 204f22ef01cSRoman Divacky 2053b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 2063b0f4066SDimitry Andric // Make sure that this type is translated. 2073b0f4066SDimitry Andric Types.UpdateCompletedType(TD); 2083b0f4066SDimitry Andric } 2093b0f4066SDimitry Andric 2102754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) { 2112754fe60SDimitry Andric if (!TBAA) 2122754fe60SDimitry Andric return 0; 2132754fe60SDimitry Andric return TBAA->getTBAAInfo(QTy); 2142754fe60SDimitry Andric } 2152754fe60SDimitry Andric 216dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() { 217dff0c46cSDimitry Andric if (!TBAA) 218dff0c46cSDimitry Andric return 0; 219dff0c46cSDimitry Andric return TBAA->getTBAAInfoForVTablePtr(); 220dff0c46cSDimitry Andric } 221dff0c46cSDimitry Andric 2223861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) { 2233861d79fSDimitry Andric if (!TBAA) 2243861d79fSDimitry Andric return 0; 2253861d79fSDimitry Andric return TBAA->getTBAAStructInfo(QTy); 2263861d79fSDimitry Andric } 2273861d79fSDimitry Andric 228139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) { 229139f7f9bSDimitry Andric if (!TBAA) 230139f7f9bSDimitry Andric return 0; 231139f7f9bSDimitry Andric return TBAA->getTBAAStructTypeInfo(QTy); 232139f7f9bSDimitry Andric } 233139f7f9bSDimitry Andric 234139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy, 235139f7f9bSDimitry Andric llvm::MDNode *AccessN, 236139f7f9bSDimitry Andric uint64_t O) { 237139f7f9bSDimitry Andric if (!TBAA) 238139f7f9bSDimitry Andric return 0; 239139f7f9bSDimitry Andric return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O); 240139f7f9bSDimitry Andric } 241139f7f9bSDimitry Andric 242284c1978SDimitry Andric /// Decorate the instruction with a TBAA tag. For scalar TBAA, the tag 243284c1978SDimitry Andric /// is the same as the type. For struct-path aware TBAA, the tag 244284c1978SDimitry Andric /// is different from the type: base type, access type and offset. 245284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type. 2462754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst, 247284c1978SDimitry Andric llvm::MDNode *TBAAInfo, 248284c1978SDimitry Andric bool ConvertTypeToTag) { 249284c1978SDimitry Andric if (ConvertTypeToTag && TBAA && CodeGenOpts.StructPathTBAA) 250284c1978SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, 251284c1978SDimitry Andric TBAA->getTBAAScalarTagInfo(TBAAInfo)); 252284c1978SDimitry Andric else 2532754fe60SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo); 2542754fe60SDimitry Andric } 2552754fe60SDimitry Andric 2566122f3e6SDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef error) { 2576122f3e6SDimitry Andric unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, error); 2583b0f4066SDimitry Andric getDiags().Report(Context.getFullLoc(loc), diagID); 259f22ef01cSRoman Divacky } 260f22ef01cSRoman Divacky 261f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 262f22ef01cSRoman Divacky /// specified stmt yet. 263f22ef01cSRoman Divacky void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, 264f22ef01cSRoman Divacky bool OmitOnError) { 265f22ef01cSRoman Divacky if (OmitOnError && getDiags().hasErrorOccurred()) 266f22ef01cSRoman Divacky return; 2676122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 268f22ef01cSRoman Divacky "cannot compile this %0 yet"); 269f22ef01cSRoman Divacky std::string Msg = Type; 270f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 271f22ef01cSRoman Divacky << Msg << S->getSourceRange(); 272f22ef01cSRoman Divacky } 273f22ef01cSRoman Divacky 274f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 275f22ef01cSRoman Divacky /// specified decl yet. 276f22ef01cSRoman Divacky void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, 277f22ef01cSRoman Divacky bool OmitOnError) { 278f22ef01cSRoman Divacky if (OmitOnError && getDiags().hasErrorOccurred()) 279f22ef01cSRoman Divacky return; 2806122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 281f22ef01cSRoman Divacky "cannot compile this %0 yet"); 282f22ef01cSRoman Divacky std::string Msg = Type; 283f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 284f22ef01cSRoman Divacky } 285f22ef01cSRoman Divacky 28617a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { 28717a519f9SDimitry Andric return llvm::ConstantInt::get(SizeTy, size.getQuantity()); 28817a519f9SDimitry Andric } 28917a519f9SDimitry Andric 290f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, 2912754fe60SDimitry Andric const NamedDecl *D) const { 292f22ef01cSRoman Divacky // Internal definitions always have default visibility. 293f22ef01cSRoman Divacky if (GV->hasLocalLinkage()) { 294f22ef01cSRoman Divacky GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 295f22ef01cSRoman Divacky return; 296f22ef01cSRoman Divacky } 297f22ef01cSRoman Divacky 2982754fe60SDimitry Andric // Set visibility for definitions. 299139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 300139f7f9bSDimitry Andric if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage()) 301139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 302f22ef01cSRoman Divacky } 303f22ef01cSRoman Divacky 3047ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { 3057ae0e2c9SDimitry Andric return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) 3067ae0e2c9SDimitry Andric .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) 3077ae0e2c9SDimitry Andric .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) 3087ae0e2c9SDimitry Andric .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) 3097ae0e2c9SDimitry Andric .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); 3107ae0e2c9SDimitry Andric } 3117ae0e2c9SDimitry Andric 3127ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( 3137ae0e2c9SDimitry Andric CodeGenOptions::TLSModel M) { 3147ae0e2c9SDimitry Andric switch (M) { 3157ae0e2c9SDimitry Andric case CodeGenOptions::GeneralDynamicTLSModel: 3167ae0e2c9SDimitry Andric return llvm::GlobalVariable::GeneralDynamicTLSModel; 3177ae0e2c9SDimitry Andric case CodeGenOptions::LocalDynamicTLSModel: 3187ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalDynamicTLSModel; 3197ae0e2c9SDimitry Andric case CodeGenOptions::InitialExecTLSModel: 3207ae0e2c9SDimitry Andric return llvm::GlobalVariable::InitialExecTLSModel; 3217ae0e2c9SDimitry Andric case CodeGenOptions::LocalExecTLSModel: 3227ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalExecTLSModel; 3237ae0e2c9SDimitry Andric } 3247ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model!"); 3257ae0e2c9SDimitry Andric } 3267ae0e2c9SDimitry Andric 3277ae0e2c9SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, 3287ae0e2c9SDimitry Andric const VarDecl &D) const { 329284c1978SDimitry Andric assert(D.getTLSKind() && "setting TLS mode on non-TLS var!"); 3307ae0e2c9SDimitry Andric 3317ae0e2c9SDimitry Andric llvm::GlobalVariable::ThreadLocalMode TLM; 3323861d79fSDimitry Andric TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); 3337ae0e2c9SDimitry Andric 3347ae0e2c9SDimitry Andric // Override the TLS model if it is explicitly specified. 3357ae0e2c9SDimitry Andric if (D.hasAttr<TLSModelAttr>()) { 3367ae0e2c9SDimitry Andric const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>(); 3377ae0e2c9SDimitry Andric TLM = GetLLVMTLSModel(Attr->getModel()); 3387ae0e2c9SDimitry Andric } 3397ae0e2c9SDimitry Andric 3407ae0e2c9SDimitry Andric GV->setThreadLocalMode(TLM); 3417ae0e2c9SDimitry Andric } 3427ae0e2c9SDimitry Andric 343e580952dSDimitry Andric /// Set the symbol visibility of type information (vtable and RTTI) 344e580952dSDimitry Andric /// associated with the given type. 345e580952dSDimitry Andric void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, 346e580952dSDimitry Andric const CXXRecordDecl *RD, 3472754fe60SDimitry Andric TypeVisibilityKind TVK) const { 348e580952dSDimitry Andric setGlobalVisibility(GV, RD); 349e580952dSDimitry Andric 350e580952dSDimitry Andric if (!CodeGenOpts.HiddenWeakVTables) 351e580952dSDimitry Andric return; 352e580952dSDimitry Andric 3532754fe60SDimitry Andric // We never want to drop the visibility for RTTI names. 3542754fe60SDimitry Andric if (TVK == TVK_ForRTTIName) 3552754fe60SDimitry Andric return; 3562754fe60SDimitry Andric 357e580952dSDimitry Andric // We want to drop the visibility to hidden for weak type symbols. 358e580952dSDimitry Andric // This isn't possible if there might be unresolved references 359e580952dSDimitry Andric // elsewhere that rely on this symbol being visible. 360e580952dSDimitry Andric 361e580952dSDimitry Andric // This should be kept roughly in sync with setThunkVisibility 362e580952dSDimitry Andric // in CGVTables.cpp. 363e580952dSDimitry Andric 364e580952dSDimitry Andric // Preconditions. 3652754fe60SDimitry Andric if (GV->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage || 366e580952dSDimitry Andric GV->getVisibility() != llvm::GlobalVariable::DefaultVisibility) 367e580952dSDimitry Andric return; 368e580952dSDimitry Andric 369e580952dSDimitry Andric // Don't override an explicit visibility attribute. 370139f7f9bSDimitry Andric if (RD->getExplicitVisibility(NamedDecl::VisibilityForType)) 371e580952dSDimitry Andric return; 372e580952dSDimitry Andric 373e580952dSDimitry Andric switch (RD->getTemplateSpecializationKind()) { 374e580952dSDimitry Andric // We have to disable the optimization if this is an EI definition 375e580952dSDimitry Andric // because there might be EI declarations in other shared objects. 376e580952dSDimitry Andric case TSK_ExplicitInstantiationDefinition: 377e580952dSDimitry Andric case TSK_ExplicitInstantiationDeclaration: 378e580952dSDimitry Andric return; 379e580952dSDimitry Andric 380e580952dSDimitry Andric // Every use of a non-template class's type information has to emit it. 381e580952dSDimitry Andric case TSK_Undeclared: 382e580952dSDimitry Andric break; 383e580952dSDimitry Andric 384e580952dSDimitry Andric // In theory, implicit instantiations can ignore the possibility of 385e580952dSDimitry Andric // an explicit instantiation declaration because there necessarily 386e580952dSDimitry Andric // must be an EI definition somewhere with default visibility. In 387e580952dSDimitry Andric // practice, it's possible to have an explicit instantiation for 388e580952dSDimitry Andric // an arbitrary template class, and linkers aren't necessarily able 389e580952dSDimitry Andric // to deal with mixed-visibility symbols. 390e580952dSDimitry Andric case TSK_ExplicitSpecialization: 391e580952dSDimitry Andric case TSK_ImplicitInstantiation: 392e580952dSDimitry Andric return; 393e580952dSDimitry Andric } 394e580952dSDimitry Andric 395e580952dSDimitry Andric // If there's a key function, there may be translation units 396e580952dSDimitry Andric // that don't have the key function's definition. But ignore 397e580952dSDimitry Andric // this if we're emitting RTTI under -fno-rtti. 398dff0c46cSDimitry Andric if (!(TVK != TVK_ForRTTI) || LangOpts.RTTI) { 399139f7f9bSDimitry Andric // FIXME: what should we do if we "lose" the key function during 400139f7f9bSDimitry Andric // the emission of the file? 401139f7f9bSDimitry Andric if (Context.getCurrentKeyFunction(RD)) 402e580952dSDimitry Andric return; 4032754fe60SDimitry Andric } 404e580952dSDimitry Andric 405e580952dSDimitry Andric // Otherwise, drop the visibility to hidden. 406e580952dSDimitry Andric GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 4072754fe60SDimitry Andric GV->setUnnamedAddr(true); 408e580952dSDimitry Andric } 409e580952dSDimitry Andric 4106122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) { 411f22ef01cSRoman Divacky const NamedDecl *ND = cast<NamedDecl>(GD.getDecl()); 412f22ef01cSRoman Divacky 4136122f3e6SDimitry Andric StringRef &Str = MangledDeclNames[GD.getCanonicalDecl()]; 414ffd1746dSEd Schouten if (!Str.empty()) 415ffd1746dSEd Schouten return Str; 416f22ef01cSRoman Divacky 417e580952dSDimitry Andric if (!getCXXABI().getMangleContext().shouldMangleDeclName(ND)) { 418ffd1746dSEd Schouten IdentifierInfo *II = ND->getIdentifier(); 419ffd1746dSEd Schouten assert(II && "Attempt to mangle unnamed decl."); 420ffd1746dSEd Schouten 421ffd1746dSEd Schouten Str = II->getName(); 422ffd1746dSEd Schouten return Str; 423f22ef01cSRoman Divacky } 424f22ef01cSRoman Divacky 425dff0c46cSDimitry Andric SmallString<256> Buffer; 4262754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer); 427ffd1746dSEd Schouten if (const CXXConstructorDecl *D = dyn_cast<CXXConstructorDecl>(ND)) 4282754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out); 429ffd1746dSEd Schouten else if (const CXXDestructorDecl *D = dyn_cast<CXXDestructorDecl>(ND)) 4302754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out); 431ffd1746dSEd Schouten else if (const BlockDecl *BD = dyn_cast<BlockDecl>(ND)) 4327ae0e2c9SDimitry Andric getCXXABI().getMangleContext().mangleBlock(BD, Out, 4337ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl())); 434ffd1746dSEd Schouten else 4352754fe60SDimitry Andric getCXXABI().getMangleContext().mangleName(ND, Out); 436ffd1746dSEd Schouten 437ffd1746dSEd Schouten // Allocate space for the mangled name. 4382754fe60SDimitry Andric Out.flush(); 439ffd1746dSEd Schouten size_t Length = Buffer.size(); 440ffd1746dSEd Schouten char *Name = MangledNamesAllocator.Allocate<char>(Length); 441ffd1746dSEd Schouten std::copy(Buffer.begin(), Buffer.end(), Name); 442ffd1746dSEd Schouten 4436122f3e6SDimitry Andric Str = StringRef(Name, Length); 444ffd1746dSEd Schouten 445ffd1746dSEd Schouten return Str; 446ffd1746dSEd Schouten } 447ffd1746dSEd Schouten 4482754fe60SDimitry Andric void CodeGenModule::getBlockMangledName(GlobalDecl GD, MangleBuffer &Buffer, 449ffd1746dSEd Schouten const BlockDecl *BD) { 4502754fe60SDimitry Andric MangleContext &MangleCtx = getCXXABI().getMangleContext(); 4512754fe60SDimitry Andric const Decl *D = GD.getDecl(); 4522754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer.getBuffer()); 4532754fe60SDimitry Andric if (D == 0) 4547ae0e2c9SDimitry Andric MangleCtx.mangleGlobalBlock(BD, 4557ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out); 4562754fe60SDimitry Andric else if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D)) 4572754fe60SDimitry Andric MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out); 4582754fe60SDimitry Andric else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) 4592754fe60SDimitry Andric MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out); 4602754fe60SDimitry Andric else 4612754fe60SDimitry Andric MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out); 462f22ef01cSRoman Divacky } 463f22ef01cSRoman Divacky 4646122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) { 465f22ef01cSRoman Divacky return getModule().getNamedValue(Name); 466f22ef01cSRoman Divacky } 467f22ef01cSRoman Divacky 468f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before 469f22ef01cSRoman Divacky /// main() runs. 470f22ef01cSRoman Divacky void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 471f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 472f22ef01cSRoman Divacky GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 473f22ef01cSRoman Divacky } 474f22ef01cSRoman Divacky 475f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called 476f22ef01cSRoman Divacky /// when the module is unloaded. 477f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 478f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 479f22ef01cSRoman Divacky GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 480f22ef01cSRoman Divacky } 481f22ef01cSRoman Divacky 482f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 483f22ef01cSRoman Divacky // Ctor function type is void()*. 484bd5abe19SDimitry Andric llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); 485f22ef01cSRoman Divacky llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 486f22ef01cSRoman Divacky 487f22ef01cSRoman Divacky // Get the type of a ctor entry, { i32, void ()* }. 488f22ef01cSRoman Divacky llvm::StructType *CtorStructTy = 489dff0c46cSDimitry Andric llvm::StructType::get(Int32Ty, llvm::PointerType::getUnqual(CtorFTy), NULL); 490f22ef01cSRoman Divacky 491f22ef01cSRoman Divacky // Construct the constructor and destructor arrays. 492dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> Ctors; 493f22ef01cSRoman Divacky for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 494dff0c46cSDimitry Andric llvm::Constant *S[] = { 495dff0c46cSDimitry Andric llvm::ConstantInt::get(Int32Ty, I->second, false), 496dff0c46cSDimitry Andric llvm::ConstantExpr::getBitCast(I->first, CtorPFTy) 497dff0c46cSDimitry Andric }; 498f22ef01cSRoman Divacky Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 499f22ef01cSRoman Divacky } 500f22ef01cSRoman Divacky 501f22ef01cSRoman Divacky if (!Ctors.empty()) { 502f22ef01cSRoman Divacky llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 503f22ef01cSRoman Divacky new llvm::GlobalVariable(TheModule, AT, false, 504f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 505f22ef01cSRoman Divacky llvm::ConstantArray::get(AT, Ctors), 506f22ef01cSRoman Divacky GlobalName); 507f22ef01cSRoman Divacky } 508f22ef01cSRoman Divacky } 509f22ef01cSRoman Divacky 510f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes 511f22ef01cSRoman Divacky CodeGenModule::getFunctionLinkage(const FunctionDecl *D) { 512e580952dSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); 513f22ef01cSRoman Divacky 514ffd1746dSEd Schouten if (Linkage == GVA_Internal) 515f22ef01cSRoman Divacky return llvm::Function::InternalLinkage; 516ffd1746dSEd Schouten 517ffd1746dSEd Schouten if (D->hasAttr<DLLExportAttr>()) 518f22ef01cSRoman Divacky return llvm::Function::DLLExportLinkage; 519ffd1746dSEd Schouten 520ffd1746dSEd Schouten if (D->hasAttr<WeakAttr>()) 521f22ef01cSRoman Divacky return llvm::Function::WeakAnyLinkage; 522ffd1746dSEd Schouten 523f22ef01cSRoman Divacky // In C99 mode, 'inline' functions are guaranteed to have a strong 524f22ef01cSRoman Divacky // definition somewhere else, so we can use available_externally linkage. 525ffd1746dSEd Schouten if (Linkage == GVA_C99Inline) 526f22ef01cSRoman Divacky return llvm::Function::AvailableExternallyLinkage; 527ffd1746dSEd Schouten 5286122f3e6SDimitry Andric // Note that Apple's kernel linker doesn't support symbol 5296122f3e6SDimitry Andric // coalescing, so we need to avoid linkonce and weak linkages there. 5306122f3e6SDimitry Andric // Normally, this means we just map to internal, but for explicit 5316122f3e6SDimitry Andric // instantiations we'll map to external. 5326122f3e6SDimitry Andric 533f22ef01cSRoman Divacky // In C++, the compiler has to emit a definition in every translation unit 534f22ef01cSRoman Divacky // that references the function. We should use linkonce_odr because 535f22ef01cSRoman Divacky // a) if all references in this translation unit are optimized away, we 536f22ef01cSRoman Divacky // don't need to codegen it. b) if the function persists, it needs to be 537f22ef01cSRoman Divacky // merged with other definitions. c) C++ has the ODR, so we know the 538f22ef01cSRoman Divacky // definition is dependable. 539ffd1746dSEd Schouten if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 540dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 5412754fe60SDimitry Andric ? llvm::Function::LinkOnceODRLinkage 5422754fe60SDimitry Andric : llvm::Function::InternalLinkage; 543ffd1746dSEd Schouten 544f22ef01cSRoman Divacky // An explicit instantiation of a template has weak linkage, since 545f22ef01cSRoman Divacky // explicit instantiations can occur in multiple translation units 546f22ef01cSRoman Divacky // and must all be equivalent. However, we are not allowed to 547f22ef01cSRoman Divacky // throw away these explicit instantiations. 548ffd1746dSEd Schouten if (Linkage == GVA_ExplicitTemplateInstantiation) 549dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 5502754fe60SDimitry Andric ? llvm::Function::WeakODRLinkage 5516122f3e6SDimitry Andric : llvm::Function::ExternalLinkage; 552ffd1746dSEd Schouten 553f22ef01cSRoman Divacky // Otherwise, we have strong external linkage. 554ffd1746dSEd Schouten assert(Linkage == GVA_StrongExternal); 555f22ef01cSRoman Divacky return llvm::Function::ExternalLinkage; 556f22ef01cSRoman Divacky } 557f22ef01cSRoman Divacky 558f22ef01cSRoman Divacky 559f22ef01cSRoman Divacky /// SetFunctionDefinitionAttributes - Set attributes for a global. 560f22ef01cSRoman Divacky /// 561f22ef01cSRoman Divacky /// FIXME: This is currently only done for aliases and functions, but not for 562f22ef01cSRoman Divacky /// variables (these details are set in EmitGlobalVarDefinition for variables). 563f22ef01cSRoman Divacky void CodeGenModule::SetFunctionDefinitionAttributes(const FunctionDecl *D, 564f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 565f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 566f22ef01cSRoman Divacky } 567f22ef01cSRoman Divacky 568f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D, 569f22ef01cSRoman Divacky const CGFunctionInfo &Info, 570f22ef01cSRoman Divacky llvm::Function *F) { 571f22ef01cSRoman Divacky unsigned CallingConv; 572f22ef01cSRoman Divacky AttributeListType AttributeList; 573139f7f9bSDimitry Andric ConstructAttributeList(Info, D, AttributeList, CallingConv, false); 574139f7f9bSDimitry Andric F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList)); 575f22ef01cSRoman Divacky F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); 576f22ef01cSRoman Divacky } 577f22ef01cSRoman Divacky 5786122f3e6SDimitry Andric /// Determines whether the language options require us to model 5796122f3e6SDimitry Andric /// unwind exceptions. We treat -fexceptions as mandating this 5806122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions 5816122f3e6SDimitry Andric /// enabled. This means, for example, that C with -fexceptions 5826122f3e6SDimitry Andric /// enables this. 583dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) { 5846122f3e6SDimitry Andric // If exceptions are completely disabled, obviously this is false. 585dff0c46cSDimitry Andric if (!LangOpts.Exceptions) return false; 5866122f3e6SDimitry Andric 5876122f3e6SDimitry Andric // If C++ exceptions are enabled, this is true. 588dff0c46cSDimitry Andric if (LangOpts.CXXExceptions) return true; 5896122f3e6SDimitry Andric 5906122f3e6SDimitry Andric // If ObjC exceptions are enabled, this depends on the ABI. 591dff0c46cSDimitry Andric if (LangOpts.ObjCExceptions) { 5927ae0e2c9SDimitry Andric return LangOpts.ObjCRuntime.hasUnwindExceptions(); 5936122f3e6SDimitry Andric } 5946122f3e6SDimitry Andric 5956122f3e6SDimitry Andric return true; 5966122f3e6SDimitry Andric } 5976122f3e6SDimitry Andric 598f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, 599f22ef01cSRoman Divacky llvm::Function *F) { 600bd5abe19SDimitry Andric if (CodeGenOpts.UnwindTables) 601bd5abe19SDimitry Andric F->setHasUWTable(); 602bd5abe19SDimitry Andric 603dff0c46cSDimitry Andric if (!hasUnwindExceptions(LangOpts)) 604139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoUnwind); 605f22ef01cSRoman Divacky 6066122f3e6SDimitry Andric if (D->hasAttr<NakedAttr>()) { 6076122f3e6SDimitry Andric // Naked implies noinline: we should not be inlining such functions. 608139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::Naked); 609139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoInline); 6106122f3e6SDimitry Andric } 6112754fe60SDimitry Andric 612f22ef01cSRoman Divacky if (D->hasAttr<NoInlineAttr>()) 613139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoInline); 614f22ef01cSRoman Divacky 6156122f3e6SDimitry Andric // (noinline wins over always_inline, and we can't specify both in IR) 6167ae0e2c9SDimitry Andric if ((D->hasAttr<AlwaysInlineAttr>() || D->hasAttr<ForceInlineAttr>()) && 617139f7f9bSDimitry Andric !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex, 618139f7f9bSDimitry Andric llvm::Attribute::NoInline)) 619139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::AlwaysInline); 6206122f3e6SDimitry Andric 6217ae0e2c9SDimitry Andric // FIXME: Communicate hot and cold attributes to LLVM more directly. 6227ae0e2c9SDimitry Andric if (D->hasAttr<ColdAttr>()) 623139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::OptimizeForSize); 6243861d79fSDimitry Andric 6253861d79fSDimitry Andric if (D->hasAttr<MinSizeAttr>()) 626139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::MinSize); 6277ae0e2c9SDimitry Andric 6282754fe60SDimitry Andric if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D)) 6292754fe60SDimitry Andric F->setUnnamedAddr(true); 6302754fe60SDimitry Andric 6313861d79fSDimitry Andric if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) 6323861d79fSDimitry Andric if (MD->isVirtual()) 6333861d79fSDimitry Andric F->setUnnamedAddr(true); 634f22ef01cSRoman Divacky 6353861d79fSDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 636139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::StackProtect); 6373861d79fSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 638139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::StackProtectReq); 6393861d79fSDimitry Andric 640139f7f9bSDimitry Andric // Add sanitizer attributes if function is not blacklisted. 641139f7f9bSDimitry Andric if (!SanitizerBlacklist.isIn(*F)) { 642139f7f9bSDimitry Andric // When AddressSanitizer is enabled, set SanitizeAddress attribute 643139f7f9bSDimitry Andric // unless __attribute__((no_sanitize_address)) is used. 644139f7f9bSDimitry Andric if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>()) 645139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeAddress); 646139f7f9bSDimitry Andric // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) 647139f7f9bSDimitry Andric if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) { 648139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeThread); 649139f7f9bSDimitry Andric } 650139f7f9bSDimitry Andric // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) 651139f7f9bSDimitry Andric if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>()) 652139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeMemory); 653dff0c46cSDimitry Andric } 654dff0c46cSDimitry Andric 655e580952dSDimitry Andric unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); 656e580952dSDimitry Andric if (alignment) 657e580952dSDimitry Andric F->setAlignment(alignment); 658e580952dSDimitry Andric 659f22ef01cSRoman Divacky // C++ ABI requires 2-byte alignment for member functions. 660f22ef01cSRoman Divacky if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) 661f22ef01cSRoman Divacky F->setAlignment(2); 662f22ef01cSRoman Divacky } 663f22ef01cSRoman Divacky 664f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D, 665f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 6662754fe60SDimitry Andric if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 6672754fe60SDimitry Andric setGlobalVisibility(GV, ND); 6682754fe60SDimitry Andric else 6692754fe60SDimitry Andric GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 670f22ef01cSRoman Divacky 671f22ef01cSRoman Divacky if (D->hasAttr<UsedAttr>()) 672f22ef01cSRoman Divacky AddUsedGlobal(GV); 673f22ef01cSRoman Divacky 674f22ef01cSRoman Divacky if (const SectionAttr *SA = D->getAttr<SectionAttr>()) 675f22ef01cSRoman Divacky GV->setSection(SA->getName()); 676f22ef01cSRoman Divacky 677139f7f9bSDimitry Andric // Alias cannot have attributes. Filter them here. 678139f7f9bSDimitry Andric if (!isa<llvm::GlobalAlias>(GV)) 679f22ef01cSRoman Divacky getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this); 680f22ef01cSRoman Divacky } 681f22ef01cSRoman Divacky 682f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D, 683f22ef01cSRoman Divacky llvm::Function *F, 684f22ef01cSRoman Divacky const CGFunctionInfo &FI) { 685f22ef01cSRoman Divacky SetLLVMFunctionAttributes(D, FI, F); 686f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, F); 687f22ef01cSRoman Divacky 688f22ef01cSRoman Divacky F->setLinkage(llvm::Function::InternalLinkage); 689f22ef01cSRoman Divacky 690f22ef01cSRoman Divacky SetCommonAttributes(D, F); 691f22ef01cSRoman Divacky } 692f22ef01cSRoman Divacky 693f22ef01cSRoman Divacky void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, 694f22ef01cSRoman Divacky llvm::Function *F, 695f22ef01cSRoman Divacky bool IsIncompleteFunction) { 6963b0f4066SDimitry Andric if (unsigned IID = F->getIntrinsicID()) { 6973b0f4066SDimitry Andric // If this is an intrinsic function, set the function's attributes 6983b0f4066SDimitry Andric // to the intrinsic's attributes. 6993861d79fSDimitry Andric F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), 7003861d79fSDimitry Andric (llvm::Intrinsic::ID)IID)); 7013b0f4066SDimitry Andric return; 7023b0f4066SDimitry Andric } 7033b0f4066SDimitry Andric 704f22ef01cSRoman Divacky const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl()); 705f22ef01cSRoman Divacky 706f22ef01cSRoman Divacky if (!IsIncompleteFunction) 707dff0c46cSDimitry Andric SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F); 708f22ef01cSRoman Divacky 709f22ef01cSRoman Divacky // Only a few attributes are set on declarations; these may later be 710f22ef01cSRoman Divacky // overridden by a definition. 711f22ef01cSRoman Divacky 712f22ef01cSRoman Divacky if (FD->hasAttr<DLLImportAttr>()) { 713f22ef01cSRoman Divacky F->setLinkage(llvm::Function::DLLImportLinkage); 714f22ef01cSRoman Divacky } else if (FD->hasAttr<WeakAttr>() || 7153b0f4066SDimitry Andric FD->isWeakImported()) { 716f22ef01cSRoman Divacky // "extern_weak" is overloaded in LLVM; we probably should have 717f22ef01cSRoman Divacky // separate linkage types for this. 718f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 719f22ef01cSRoman Divacky } else { 720f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalLinkage); 7212754fe60SDimitry Andric 722139f7f9bSDimitry Andric LinkageInfo LV = FD->getLinkageAndVisibility(); 723139f7f9bSDimitry Andric if (LV.getLinkage() == ExternalLinkage && LV.isVisibilityExplicit()) { 724139f7f9bSDimitry Andric F->setVisibility(GetLLVMVisibility(LV.getVisibility())); 7252754fe60SDimitry Andric } 726f22ef01cSRoman Divacky } 727f22ef01cSRoman Divacky 728f22ef01cSRoman Divacky if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) 729f22ef01cSRoman Divacky F->setSection(SA->getName()); 730f22ef01cSRoman Divacky } 731f22ef01cSRoman Divacky 732f22ef01cSRoman Divacky void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) { 733f22ef01cSRoman Divacky assert(!GV->isDeclaration() && 734f22ef01cSRoman Divacky "Only globals with definition can force usage."); 735f22ef01cSRoman Divacky LLVMUsed.push_back(GV); 736f22ef01cSRoman Divacky } 737f22ef01cSRoman Divacky 738f22ef01cSRoman Divacky void CodeGenModule::EmitLLVMUsed() { 739f22ef01cSRoman Divacky // Don't create llvm.used if there is no need. 740f22ef01cSRoman Divacky if (LLVMUsed.empty()) 741f22ef01cSRoman Divacky return; 742f22ef01cSRoman Divacky 743f22ef01cSRoman Divacky // Convert LLVMUsed to what ConstantArray needs. 744dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> UsedArray; 745f22ef01cSRoman Divacky UsedArray.resize(LLVMUsed.size()); 746f22ef01cSRoman Divacky for (unsigned i = 0, e = LLVMUsed.size(); i != e; ++i) { 747f22ef01cSRoman Divacky UsedArray[i] = 748f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]), 749dff0c46cSDimitry Andric Int8PtrTy); 750f22ef01cSRoman Divacky } 751f22ef01cSRoman Divacky 752f22ef01cSRoman Divacky if (UsedArray.empty()) 753f22ef01cSRoman Divacky return; 754dff0c46cSDimitry Andric llvm::ArrayType *ATy = llvm::ArrayType::get(Int8PtrTy, UsedArray.size()); 755f22ef01cSRoman Divacky 756f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 757f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), ATy, false, 758f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 759f22ef01cSRoman Divacky llvm::ConstantArray::get(ATy, UsedArray), 760f22ef01cSRoman Divacky "llvm.used"); 761f22ef01cSRoman Divacky 762f22ef01cSRoman Divacky GV->setSection("llvm.metadata"); 763f22ef01cSRoman Divacky } 764f22ef01cSRoman Divacky 765139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules 766139f7f9bSDimitry Andric /// it depends on, using a postorder walk. 767139f7f9bSDimitry Andric static void addLinkOptionsPostorder(llvm::LLVMContext &Context, 768139f7f9bSDimitry Andric Module *Mod, 769139f7f9bSDimitry Andric SmallVectorImpl<llvm::Value *> &Metadata, 770139f7f9bSDimitry Andric llvm::SmallPtrSet<Module *, 16> &Visited) { 771139f7f9bSDimitry Andric // Import this module's parent. 772139f7f9bSDimitry Andric if (Mod->Parent && Visited.insert(Mod->Parent)) { 773139f7f9bSDimitry Andric addLinkOptionsPostorder(Context, Mod->Parent, Metadata, Visited); 774139f7f9bSDimitry Andric } 775139f7f9bSDimitry Andric 776139f7f9bSDimitry Andric // Import this module's dependencies. 777139f7f9bSDimitry Andric for (unsigned I = Mod->Imports.size(); I > 0; --I) { 778139f7f9bSDimitry Andric if (Visited.insert(Mod->Imports[I-1])) 779139f7f9bSDimitry Andric addLinkOptionsPostorder(Context, Mod->Imports[I-1], Metadata, Visited); 780139f7f9bSDimitry Andric } 781139f7f9bSDimitry Andric 782139f7f9bSDimitry Andric // Add linker options to link against the libraries/frameworks 783139f7f9bSDimitry Andric // described by this module. 784139f7f9bSDimitry Andric for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) { 785139f7f9bSDimitry Andric // FIXME: -lfoo is Unix-centric and -framework Foo is Darwin-centric. 786139f7f9bSDimitry Andric // We need to know more about the linker to know how to encode these 787139f7f9bSDimitry Andric // options propertly. 788139f7f9bSDimitry Andric 789139f7f9bSDimitry Andric // Link against a framework. 790139f7f9bSDimitry Andric if (Mod->LinkLibraries[I-1].IsFramework) { 791139f7f9bSDimitry Andric llvm::Value *Args[2] = { 792139f7f9bSDimitry Andric llvm::MDString::get(Context, "-framework"), 793139f7f9bSDimitry Andric llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library) 794139f7f9bSDimitry Andric }; 795139f7f9bSDimitry Andric 796139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, Args)); 797139f7f9bSDimitry Andric continue; 798139f7f9bSDimitry Andric } 799139f7f9bSDimitry Andric 800139f7f9bSDimitry Andric // Link against a library. 801139f7f9bSDimitry Andric llvm::Value *OptString 802139f7f9bSDimitry Andric = llvm::MDString::get(Context, 803139f7f9bSDimitry Andric "-l" + Mod->LinkLibraries[I-1].Library); 804139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, OptString)); 805139f7f9bSDimitry Andric } 806139f7f9bSDimitry Andric } 807139f7f9bSDimitry Andric 808139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() { 809139f7f9bSDimitry Andric // Collect the set of all of the modules we want to visit to emit link 810139f7f9bSDimitry Andric // options, which is essentially the imported modules and all of their 811139f7f9bSDimitry Andric // non-explicit child modules. 812139f7f9bSDimitry Andric llvm::SetVector<clang::Module *> LinkModules; 813139f7f9bSDimitry Andric llvm::SmallPtrSet<clang::Module *, 16> Visited; 814139f7f9bSDimitry Andric SmallVector<clang::Module *, 16> Stack; 815139f7f9bSDimitry Andric 816139f7f9bSDimitry Andric // Seed the stack with imported modules. 817139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(), 818139f7f9bSDimitry Andric MEnd = ImportedModules.end(); 819139f7f9bSDimitry Andric M != MEnd; ++M) { 820139f7f9bSDimitry Andric if (Visited.insert(*M)) 821139f7f9bSDimitry Andric Stack.push_back(*M); 822139f7f9bSDimitry Andric } 823139f7f9bSDimitry Andric 824139f7f9bSDimitry Andric // Find all of the modules to import, making a little effort to prune 825139f7f9bSDimitry Andric // non-leaf modules. 826139f7f9bSDimitry Andric while (!Stack.empty()) { 827139f7f9bSDimitry Andric clang::Module *Mod = Stack.back(); 828139f7f9bSDimitry Andric Stack.pop_back(); 829139f7f9bSDimitry Andric 830139f7f9bSDimitry Andric bool AnyChildren = false; 831139f7f9bSDimitry Andric 832139f7f9bSDimitry Andric // Visit the submodules of this module. 833139f7f9bSDimitry Andric for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(), 834139f7f9bSDimitry Andric SubEnd = Mod->submodule_end(); 835139f7f9bSDimitry Andric Sub != SubEnd; ++Sub) { 836139f7f9bSDimitry Andric // Skip explicit children; they need to be explicitly imported to be 837139f7f9bSDimitry Andric // linked against. 838139f7f9bSDimitry Andric if ((*Sub)->IsExplicit) 839139f7f9bSDimitry Andric continue; 840139f7f9bSDimitry Andric 841139f7f9bSDimitry Andric if (Visited.insert(*Sub)) { 842139f7f9bSDimitry Andric Stack.push_back(*Sub); 843139f7f9bSDimitry Andric AnyChildren = true; 844139f7f9bSDimitry Andric } 845139f7f9bSDimitry Andric } 846139f7f9bSDimitry Andric 847139f7f9bSDimitry Andric // We didn't find any children, so add this module to the list of 848139f7f9bSDimitry Andric // modules to link against. 849139f7f9bSDimitry Andric if (!AnyChildren) { 850139f7f9bSDimitry Andric LinkModules.insert(Mod); 851139f7f9bSDimitry Andric } 852139f7f9bSDimitry Andric } 853139f7f9bSDimitry Andric 854139f7f9bSDimitry Andric // Add link options for all of the imported modules in reverse topological 855139f7f9bSDimitry Andric // order. 856139f7f9bSDimitry Andric SmallVector<llvm::Value *, 16> MetadataArgs; 857139f7f9bSDimitry Andric Visited.clear(); 858139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(), 859139f7f9bSDimitry Andric MEnd = LinkModules.end(); 860139f7f9bSDimitry Andric M != MEnd; ++M) { 861139f7f9bSDimitry Andric if (Visited.insert(*M)) 862139f7f9bSDimitry Andric addLinkOptionsPostorder(getLLVMContext(), *M, MetadataArgs, Visited); 863139f7f9bSDimitry Andric } 864139f7f9bSDimitry Andric std::reverse(MetadataArgs.begin(), MetadataArgs.end()); 865139f7f9bSDimitry Andric 866139f7f9bSDimitry Andric // Add the linker options metadata flag. 867139f7f9bSDimitry Andric getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options", 868139f7f9bSDimitry Andric llvm::MDNode::get(getLLVMContext(), MetadataArgs)); 869139f7f9bSDimitry Andric } 870139f7f9bSDimitry Andric 871f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() { 872f22ef01cSRoman Divacky // Emit code for any potentially referenced deferred decls. Since a 873f22ef01cSRoman Divacky // previously unused static decl may become used during the generation of code 874f22ef01cSRoman Divacky // for a static function, iterate until no changes are made. 875f22ef01cSRoman Divacky 876139f7f9bSDimitry Andric while (true) { 877f22ef01cSRoman Divacky if (!DeferredVTables.empty()) { 878139f7f9bSDimitry Andric EmitDeferredVTables(); 879139f7f9bSDimitry Andric 880139f7f9bSDimitry Andric // Emitting a v-table doesn't directly cause more v-tables to 881139f7f9bSDimitry Andric // become deferred, although it can cause functions to be 882139f7f9bSDimitry Andric // emitted that then need those v-tables. 883139f7f9bSDimitry Andric assert(DeferredVTables.empty()); 884f22ef01cSRoman Divacky } 885f22ef01cSRoman Divacky 886139f7f9bSDimitry Andric // Stop if we're out of both deferred v-tables and deferred declarations. 887139f7f9bSDimitry Andric if (DeferredDeclsToEmit.empty()) break; 888139f7f9bSDimitry Andric 889f22ef01cSRoman Divacky GlobalDecl D = DeferredDeclsToEmit.back(); 890f22ef01cSRoman Divacky DeferredDeclsToEmit.pop_back(); 891f22ef01cSRoman Divacky 892f22ef01cSRoman Divacky // Check to see if we've already emitted this. This is necessary 893f22ef01cSRoman Divacky // for a couple of reasons: first, decls can end up in the 894f22ef01cSRoman Divacky // deferred-decls queue multiple times, and second, decls can end 895f22ef01cSRoman Divacky // up with definitions in unusual ways (e.g. by an extern inline 896f22ef01cSRoman Divacky // function acquiring a strong function redefinition). Just 897f22ef01cSRoman Divacky // ignore these cases. 898f22ef01cSRoman Divacky // 899f22ef01cSRoman Divacky // TODO: That said, looking this up multiple times is very wasteful. 9006122f3e6SDimitry Andric StringRef Name = getMangledName(D); 901f22ef01cSRoman Divacky llvm::GlobalValue *CGRef = GetGlobalValue(Name); 902f22ef01cSRoman Divacky assert(CGRef && "Deferred decl wasn't referenced?"); 903f22ef01cSRoman Divacky 904f22ef01cSRoman Divacky if (!CGRef->isDeclaration()) 905f22ef01cSRoman Divacky continue; 906f22ef01cSRoman Divacky 907f22ef01cSRoman Divacky // GlobalAlias::isDeclaration() defers to the aliasee, but for our 908f22ef01cSRoman Divacky // purposes an alias counts as a definition. 909f22ef01cSRoman Divacky if (isa<llvm::GlobalAlias>(CGRef)) 910f22ef01cSRoman Divacky continue; 911f22ef01cSRoman Divacky 912f22ef01cSRoman Divacky // Otherwise, emit the definition and move on to the next one. 913f22ef01cSRoman Divacky EmitGlobalDefinition(D); 914f22ef01cSRoman Divacky } 915f22ef01cSRoman Divacky } 916f22ef01cSRoman Divacky 9176122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() { 9186122f3e6SDimitry Andric if (Annotations.empty()) 9196122f3e6SDimitry Andric return; 9206122f3e6SDimitry Andric 9216122f3e6SDimitry Andric // Create a new global variable for the ConstantStruct in the Module. 9226122f3e6SDimitry Andric llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get( 9236122f3e6SDimitry Andric Annotations[0]->getType(), Annotations.size()), Annotations); 9246122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), 9256122f3e6SDimitry Andric Array->getType(), false, llvm::GlobalValue::AppendingLinkage, Array, 9266122f3e6SDimitry Andric "llvm.global.annotations"); 9276122f3e6SDimitry Andric gv->setSection(AnnotationSection); 9286122f3e6SDimitry Andric } 9296122f3e6SDimitry Andric 930139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) { 9316122f3e6SDimitry Andric llvm::StringMap<llvm::Constant*>::iterator i = AnnotationStrings.find(Str); 9326122f3e6SDimitry Andric if (i != AnnotationStrings.end()) 9336122f3e6SDimitry Andric return i->second; 9346122f3e6SDimitry Andric 9356122f3e6SDimitry Andric // Not found yet, create a new global. 936dff0c46cSDimitry Andric llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str); 9376122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), s->getType(), 9386122f3e6SDimitry Andric true, llvm::GlobalValue::PrivateLinkage, s, ".str"); 9396122f3e6SDimitry Andric gv->setSection(AnnotationSection); 9406122f3e6SDimitry Andric gv->setUnnamedAddr(true); 9416122f3e6SDimitry Andric AnnotationStrings[Str] = gv; 9426122f3e6SDimitry Andric return gv; 9436122f3e6SDimitry Andric } 9446122f3e6SDimitry Andric 9456122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) { 9466122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 9476122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(Loc); 9486122f3e6SDimitry Andric if (PLoc.isValid()) 9496122f3e6SDimitry Andric return EmitAnnotationString(PLoc.getFilename()); 9506122f3e6SDimitry Andric return EmitAnnotationString(SM.getBufferName(Loc)); 9516122f3e6SDimitry Andric } 9526122f3e6SDimitry Andric 9536122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { 9546122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 9556122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(L); 9566122f3e6SDimitry Andric unsigned LineNo = PLoc.isValid() ? PLoc.getLine() : 9576122f3e6SDimitry Andric SM.getExpansionLineNumber(L); 9586122f3e6SDimitry Andric return llvm::ConstantInt::get(Int32Ty, LineNo); 9596122f3e6SDimitry Andric } 9606122f3e6SDimitry Andric 961f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 962f22ef01cSRoman Divacky const AnnotateAttr *AA, 9636122f3e6SDimitry Andric SourceLocation L) { 9646122f3e6SDimitry Andric // Get the globals for file name, annotation, and the line number. 9656122f3e6SDimitry Andric llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), 9666122f3e6SDimitry Andric *UnitGV = EmitAnnotationUnit(L), 9676122f3e6SDimitry Andric *LineNoCst = EmitAnnotationLineNo(L); 968f22ef01cSRoman Divacky 969f22ef01cSRoman Divacky // Create the ConstantStruct for the global annotation. 970f22ef01cSRoman Divacky llvm::Constant *Fields[4] = { 9716122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), 9726122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), 9736122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), 9746122f3e6SDimitry Andric LineNoCst 975f22ef01cSRoman Divacky }; 97617a519f9SDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 977f22ef01cSRoman Divacky } 978f22ef01cSRoman Divacky 9796122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D, 9806122f3e6SDimitry Andric llvm::GlobalValue *GV) { 9816122f3e6SDimitry Andric assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute"); 9826122f3e6SDimitry Andric // Get the struct elements for these annotations. 9836122f3e6SDimitry Andric for (specific_attr_iterator<AnnotateAttr> 9846122f3e6SDimitry Andric ai = D->specific_attr_begin<AnnotateAttr>(), 9856122f3e6SDimitry Andric ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai) 9866122f3e6SDimitry Andric Annotations.push_back(EmitAnnotateAttr(GV, *ai, D->getLocation())); 9876122f3e6SDimitry Andric } 9886122f3e6SDimitry Andric 989f22ef01cSRoman Divacky bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { 990e580952dSDimitry Andric // Never defer when EmitAllDecls is specified. 991dff0c46cSDimitry Andric if (LangOpts.EmitAllDecls) 992f22ef01cSRoman Divacky return false; 993f22ef01cSRoman Divacky 994e580952dSDimitry Andric return !getContext().DeclMustBeEmitted(Global); 995f22ef01cSRoman Divacky } 996f22ef01cSRoman Divacky 9973861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( 9983861d79fSDimitry Andric const CXXUuidofExpr* E) { 9993861d79fSDimitry Andric // Sema has verified that IIDSource has a __declspec(uuid()), and that its 10003861d79fSDimitry Andric // well-formed. 10013861d79fSDimitry Andric StringRef Uuid; 10023861d79fSDimitry Andric if (E->isTypeOperand()) 10033861d79fSDimitry Andric Uuid = CXXUuidofExpr::GetUuidAttrOfType(E->getTypeOperand())->getGuid(); 10043861d79fSDimitry Andric else { 10053861d79fSDimitry Andric // Special case: __uuidof(0) means an all-zero GUID. 10063861d79fSDimitry Andric Expr *Op = E->getExprOperand(); 10073861d79fSDimitry Andric if (!Op->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) 10083861d79fSDimitry Andric Uuid = CXXUuidofExpr::GetUuidAttrOfType(Op->getType())->getGuid(); 10093861d79fSDimitry Andric else 10103861d79fSDimitry Andric Uuid = "00000000-0000-0000-0000-000000000000"; 10113861d79fSDimitry Andric } 10123861d79fSDimitry Andric std::string Name = "__uuid_" + Uuid.str(); 10133861d79fSDimitry Andric 10143861d79fSDimitry Andric // Look for an existing global. 10153861d79fSDimitry Andric if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name)) 10163861d79fSDimitry Andric return GV; 10173861d79fSDimitry Andric 10183861d79fSDimitry Andric llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType()); 10193861d79fSDimitry Andric assert(Init && "failed to initialize as constant"); 10203861d79fSDimitry Andric 10213861d79fSDimitry Andric // GUIDs are assumed to be 16 bytes, spread over 4-2-2-8 bytes. However, the 10223861d79fSDimitry Andric // first field is declared as "long", which for many targets is 8 bytes. 10233861d79fSDimitry Andric // Those architectures are not supported. (With the MS abi, long is always 4 10243861d79fSDimitry Andric // bytes.) 10253861d79fSDimitry Andric llvm::Type *GuidType = getTypes().ConvertType(E->getType()); 10263861d79fSDimitry Andric if (Init->getType() != GuidType) { 10273861d79fSDimitry Andric DiagnosticsEngine &Diags = getDiags(); 10283861d79fSDimitry Andric unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 10293861d79fSDimitry Andric "__uuidof codegen is not supported on this architecture"); 10303861d79fSDimitry Andric Diags.Report(E->getExprLoc(), DiagID) << E->getSourceRange(); 10313861d79fSDimitry Andric Init = llvm::UndefValue::get(GuidType); 10323861d79fSDimitry Andric } 10333861d79fSDimitry Andric 10343861d79fSDimitry Andric llvm::GlobalVariable *GV = new llvm::GlobalVariable(getModule(), GuidType, 10353861d79fSDimitry Andric /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage, Init, Name); 10363861d79fSDimitry Andric GV->setUnnamedAddr(true); 10373861d79fSDimitry Andric return GV; 10383861d79fSDimitry Andric } 10393861d79fSDimitry Andric 1040f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { 1041f22ef01cSRoman Divacky const AliasAttr *AA = VD->getAttr<AliasAttr>(); 1042f22ef01cSRoman Divacky assert(AA && "No alias?"); 1043f22ef01cSRoman Divacky 10446122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); 1045f22ef01cSRoman Divacky 1046f22ef01cSRoman Divacky // See if there is already something with the target's name in the module. 1047f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); 10483861d79fSDimitry Andric if (Entry) { 10493861d79fSDimitry Andric unsigned AS = getContext().getTargetAddressSpace(VD->getType()); 10503861d79fSDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); 10513861d79fSDimitry Andric } 1052f22ef01cSRoman Divacky 1053f22ef01cSRoman Divacky llvm::Constant *Aliasee; 1054f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 10553861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, 10563861d79fSDimitry Andric GlobalDecl(cast<FunctionDecl>(VD)), 10572754fe60SDimitry Andric /*ForVTable=*/false); 1058f22ef01cSRoman Divacky else 1059f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 1060f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 10613861d79fSDimitry Andric 1062f22ef01cSRoman Divacky llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee); 1063f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 1064f22ef01cSRoman Divacky WeakRefReferences.insert(F); 1065f22ef01cSRoman Divacky 1066f22ef01cSRoman Divacky return Aliasee; 1067f22ef01cSRoman Divacky } 1068f22ef01cSRoman Divacky 1069f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) { 1070f22ef01cSRoman Divacky const ValueDecl *Global = cast<ValueDecl>(GD.getDecl()); 1071f22ef01cSRoman Divacky 1072f22ef01cSRoman Divacky // Weak references don't produce any output by themselves. 1073f22ef01cSRoman Divacky if (Global->hasAttr<WeakRefAttr>()) 1074f22ef01cSRoman Divacky return; 1075f22ef01cSRoman Divacky 1076f22ef01cSRoman Divacky // If this is an alias definition (which otherwise looks like a declaration) 1077f22ef01cSRoman Divacky // emit it now. 1078f22ef01cSRoman Divacky if (Global->hasAttr<AliasAttr>()) 1079f22ef01cSRoman Divacky return EmitAliasDefinition(GD); 1080f22ef01cSRoman Divacky 10816122f3e6SDimitry Andric // If this is CUDA, be selective about which declarations we emit. 1082dff0c46cSDimitry Andric if (LangOpts.CUDA) { 10836122f3e6SDimitry Andric if (CodeGenOpts.CUDAIsDevice) { 10846122f3e6SDimitry Andric if (!Global->hasAttr<CUDADeviceAttr>() && 10856122f3e6SDimitry Andric !Global->hasAttr<CUDAGlobalAttr>() && 10866122f3e6SDimitry Andric !Global->hasAttr<CUDAConstantAttr>() && 10876122f3e6SDimitry Andric !Global->hasAttr<CUDASharedAttr>()) 10886122f3e6SDimitry Andric return; 10896122f3e6SDimitry Andric } else { 10906122f3e6SDimitry Andric if (!Global->hasAttr<CUDAHostAttr>() && ( 10916122f3e6SDimitry Andric Global->hasAttr<CUDADeviceAttr>() || 10926122f3e6SDimitry Andric Global->hasAttr<CUDAConstantAttr>() || 10936122f3e6SDimitry Andric Global->hasAttr<CUDASharedAttr>())) 10946122f3e6SDimitry Andric return; 1095e580952dSDimitry Andric } 1096e580952dSDimitry Andric } 1097e580952dSDimitry Andric 10986122f3e6SDimitry Andric // Ignore declarations, they will be emitted on their first use. 10996122f3e6SDimitry Andric if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 1100f22ef01cSRoman Divacky // Forward declarations are emitted lazily on first use. 11016122f3e6SDimitry Andric if (!FD->doesThisDeclarationHaveABody()) { 11026122f3e6SDimitry Andric if (!FD->doesDeclarationForceExternallyVisibleDefinition()) 1103f22ef01cSRoman Divacky return; 11046122f3e6SDimitry Andric 11056122f3e6SDimitry Andric const FunctionDecl *InlineDefinition = 0; 11066122f3e6SDimitry Andric FD->getBody(InlineDefinition); 11076122f3e6SDimitry Andric 11086122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1109dff0c46cSDimitry Andric DeferredDecls.erase(MangledName); 11106122f3e6SDimitry Andric EmitGlobalDefinition(InlineDefinition); 11116122f3e6SDimitry Andric return; 11126122f3e6SDimitry Andric } 1113f22ef01cSRoman Divacky } else { 1114f22ef01cSRoman Divacky const VarDecl *VD = cast<VarDecl>(Global); 1115f22ef01cSRoman Divacky assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 1116f22ef01cSRoman Divacky 1117f22ef01cSRoman Divacky if (VD->isThisDeclarationADefinition() != VarDecl::Definition) 1118f22ef01cSRoman Divacky return; 1119f22ef01cSRoman Divacky } 1120f22ef01cSRoman Divacky 1121f22ef01cSRoman Divacky // Defer code generation when possible if this is a static definition, inline 1122f22ef01cSRoman Divacky // function etc. These we only want to emit if they are used. 1123f22ef01cSRoman Divacky if (!MayDeferGeneration(Global)) { 1124f22ef01cSRoman Divacky // Emit the definition if it can't be deferred. 1125f22ef01cSRoman Divacky EmitGlobalDefinition(GD); 1126f22ef01cSRoman Divacky return; 1127f22ef01cSRoman Divacky } 1128f22ef01cSRoman Divacky 1129e580952dSDimitry Andric // If we're deferring emission of a C++ variable with an 1130e580952dSDimitry Andric // initializer, remember the order in which it appeared in the file. 1131dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) && 1132e580952dSDimitry Andric cast<VarDecl>(Global)->hasInit()) { 1133e580952dSDimitry Andric DelayedCXXInitPosition[Global] = CXXGlobalInits.size(); 1134e580952dSDimitry Andric CXXGlobalInits.push_back(0); 1135e580952dSDimitry Andric } 1136e580952dSDimitry Andric 1137f22ef01cSRoman Divacky // If the value has already been used, add it directly to the 1138f22ef01cSRoman Divacky // DeferredDeclsToEmit list. 11396122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1140f22ef01cSRoman Divacky if (GetGlobalValue(MangledName)) 1141f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(GD); 1142f22ef01cSRoman Divacky else { 1143f22ef01cSRoman Divacky // Otherwise, remember that we saw a deferred decl with this name. The 1144f22ef01cSRoman Divacky // first use of the mangled name will cause it to move into 1145f22ef01cSRoman Divacky // DeferredDeclsToEmit. 1146f22ef01cSRoman Divacky DeferredDecls[MangledName] = GD; 1147f22ef01cSRoman Divacky } 1148f22ef01cSRoman Divacky } 1149f22ef01cSRoman Divacky 1150f8254f43SDimitry Andric namespace { 1151f8254f43SDimitry Andric struct FunctionIsDirectlyRecursive : 1152f8254f43SDimitry Andric public RecursiveASTVisitor<FunctionIsDirectlyRecursive> { 1153f8254f43SDimitry Andric const StringRef Name; 1154dff0c46cSDimitry Andric const Builtin::Context &BI; 1155f8254f43SDimitry Andric bool Result; 1156dff0c46cSDimitry Andric FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) : 1157dff0c46cSDimitry Andric Name(N), BI(C), Result(false) { 1158f8254f43SDimitry Andric } 1159f8254f43SDimitry Andric typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base; 1160f8254f43SDimitry Andric 1161f8254f43SDimitry Andric bool TraverseCallExpr(CallExpr *E) { 1162dff0c46cSDimitry Andric const FunctionDecl *FD = E->getDirectCallee(); 1163dff0c46cSDimitry Andric if (!FD) 1164f8254f43SDimitry Andric return true; 1165dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1166dff0c46cSDimitry Andric if (Attr && Name == Attr->getLabel()) { 1167dff0c46cSDimitry Andric Result = true; 1168dff0c46cSDimitry Andric return false; 1169dff0c46cSDimitry Andric } 1170dff0c46cSDimitry Andric unsigned BuiltinID = FD->getBuiltinID(); 1171dff0c46cSDimitry Andric if (!BuiltinID) 1172f8254f43SDimitry Andric return true; 1173dff0c46cSDimitry Andric StringRef BuiltinName = BI.GetName(BuiltinID); 1174dff0c46cSDimitry Andric if (BuiltinName.startswith("__builtin_") && 1175dff0c46cSDimitry Andric Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) { 1176f8254f43SDimitry Andric Result = true; 1177f8254f43SDimitry Andric return false; 1178f8254f43SDimitry Andric } 1179f8254f43SDimitry Andric return true; 1180f8254f43SDimitry Andric } 1181f8254f43SDimitry Andric }; 1182f8254f43SDimitry Andric } 1183f8254f43SDimitry Andric 1184dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another 1185dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin, 1186dff0c46cSDimitry Andric // ends up pointing to itself. 1187f8254f43SDimitry Andric bool 1188dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { 1189dff0c46cSDimitry Andric StringRef Name; 1190dff0c46cSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) { 1191dff0c46cSDimitry Andric // asm labels are a special kind of mangling we have to support. 1192dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1193dff0c46cSDimitry Andric if (!Attr) 1194f8254f43SDimitry Andric return false; 1195dff0c46cSDimitry Andric Name = Attr->getLabel(); 1196dff0c46cSDimitry Andric } else { 1197dff0c46cSDimitry Andric Name = FD->getName(); 1198dff0c46cSDimitry Andric } 1199f8254f43SDimitry Andric 1200dff0c46cSDimitry Andric FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); 1201dff0c46cSDimitry Andric Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); 1202f8254f43SDimitry Andric return Walker.Result; 1203f8254f43SDimitry Andric } 1204f8254f43SDimitry Andric 1205f8254f43SDimitry Andric bool 1206f8254f43SDimitry Andric CodeGenModule::shouldEmitFunction(const FunctionDecl *F) { 1207f8254f43SDimitry Andric if (getFunctionLinkage(F) != llvm::Function::AvailableExternallyLinkage) 1208f8254f43SDimitry Andric return true; 1209f8254f43SDimitry Andric if (CodeGenOpts.OptimizationLevel == 0 && 12107ae0e2c9SDimitry Andric !F->hasAttr<AlwaysInlineAttr>() && !F->hasAttr<ForceInlineAttr>()) 1211f8254f43SDimitry Andric return false; 1212f8254f43SDimitry Andric // PR9614. Avoid cases where the source code is lying to us. An available 1213f8254f43SDimitry Andric // externally function should have an equivalent function somewhere else, 1214f8254f43SDimitry Andric // but a function that calls itself is clearly not equivalent to the real 1215f8254f43SDimitry Andric // implementation. 1216f8254f43SDimitry Andric // This happens in glibc's btowc and in some configure checks. 1217dff0c46cSDimitry Andric return !isTriviallyRecursive(F); 1218f8254f43SDimitry Andric } 1219f8254f43SDimitry Andric 1220f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) { 1221f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 1222f22ef01cSRoman Divacky 1223f22ef01cSRoman Divacky PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(), 1224f22ef01cSRoman Divacky Context.getSourceManager(), 1225f22ef01cSRoman Divacky "Generating code for declaration"); 1226f22ef01cSRoman Divacky 1227ffd1746dSEd Schouten if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 1228ffd1746dSEd Schouten // At -O0, don't generate IR for functions with available_externally 1229ffd1746dSEd Schouten // linkage. 1230f8254f43SDimitry Andric if (!shouldEmitFunction(Function)) 1231ffd1746dSEd Schouten return; 1232ffd1746dSEd Schouten 1233ffd1746dSEd Schouten if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 1234bd5abe19SDimitry Andric // Make sure to emit the definition(s) before we emit the thunks. 1235bd5abe19SDimitry Andric // This is necessary for the generation of certain thunks. 1236bd5abe19SDimitry Andric if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method)) 1237bd5abe19SDimitry Andric EmitCXXConstructor(CD, GD.getCtorType()); 1238bd5abe19SDimitry Andric else if (const CXXDestructorDecl *DD =dyn_cast<CXXDestructorDecl>(Method)) 1239bd5abe19SDimitry Andric EmitCXXDestructor(DD, GD.getDtorType()); 1240bd5abe19SDimitry Andric else 1241bd5abe19SDimitry Andric EmitGlobalFunctionDefinition(GD); 1242bd5abe19SDimitry Andric 1243f22ef01cSRoman Divacky if (Method->isVirtual()) 1244f22ef01cSRoman Divacky getVTables().EmitThunks(GD); 1245f22ef01cSRoman Divacky 1246bd5abe19SDimitry Andric return; 1247ffd1746dSEd Schouten } 1248f22ef01cSRoman Divacky 1249f22ef01cSRoman Divacky return EmitGlobalFunctionDefinition(GD); 1250ffd1746dSEd Schouten } 1251f22ef01cSRoman Divacky 1252f22ef01cSRoman Divacky if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 1253f22ef01cSRoman Divacky return EmitGlobalVarDefinition(VD); 1254f22ef01cSRoman Divacky 12556122f3e6SDimitry Andric llvm_unreachable("Invalid argument to EmitGlobalDefinition()"); 1256f22ef01cSRoman Divacky } 1257f22ef01cSRoman Divacky 1258f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the 1259f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there 1260f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1261f22ef01cSRoman Divacky /// bitcasted to the right type. 1262f22ef01cSRoman Divacky /// 1263f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1264f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created. 1265f22ef01cSRoman Divacky llvm::Constant * 12666122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 12676122f3e6SDimitry Andric llvm::Type *Ty, 126817a519f9SDimitry Andric GlobalDecl D, bool ForVTable, 1269139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1270f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1271f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1272f22ef01cSRoman Divacky if (Entry) { 12733861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1274f22ef01cSRoman Divacky const FunctionDecl *FD = cast_or_null<FunctionDecl>(D.getDecl()); 1275f22ef01cSRoman Divacky if (FD && !FD->hasAttr<WeakAttr>()) 1276f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1277f22ef01cSRoman Divacky } 1278f22ef01cSRoman Divacky 1279f22ef01cSRoman Divacky if (Entry->getType()->getElementType() == Ty) 1280f22ef01cSRoman Divacky return Entry; 1281f22ef01cSRoman Divacky 1282f22ef01cSRoman Divacky // Make sure the result is of the correct type. 128317a519f9SDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); 1284f22ef01cSRoman Divacky } 1285f22ef01cSRoman Divacky 1286f22ef01cSRoman Divacky // This function doesn't have a complete type (for example, the return 1287f22ef01cSRoman Divacky // type is an incomplete struct). Use a fake type instead, and make 1288f22ef01cSRoman Divacky // sure not to try to set attributes. 1289f22ef01cSRoman Divacky bool IsIncompleteFunction = false; 1290f22ef01cSRoman Divacky 12916122f3e6SDimitry Andric llvm::FunctionType *FTy; 1292f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(Ty)) { 1293f22ef01cSRoman Divacky FTy = cast<llvm::FunctionType>(Ty); 1294f22ef01cSRoman Divacky } else { 1295bd5abe19SDimitry Andric FTy = llvm::FunctionType::get(VoidTy, false); 1296f22ef01cSRoman Divacky IsIncompleteFunction = true; 1297f22ef01cSRoman Divacky } 1298ffd1746dSEd Schouten 1299f22ef01cSRoman Divacky llvm::Function *F = llvm::Function::Create(FTy, 1300f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 1301f22ef01cSRoman Divacky MangledName, &getModule()); 1302f22ef01cSRoman Divacky assert(F->getName() == MangledName && "name was uniqued!"); 1303f22ef01cSRoman Divacky if (D.getDecl()) 1304f22ef01cSRoman Divacky SetFunctionAttributes(D, F, IsIncompleteFunction); 1305139f7f9bSDimitry Andric if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) { 1306139f7f9bSDimitry Andric llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex); 1307139f7f9bSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 1308139f7f9bSDimitry Andric llvm::AttributeSet::get(VMContext, 1309139f7f9bSDimitry Andric llvm::AttributeSet::FunctionIndex, 1310139f7f9bSDimitry Andric B)); 1311139f7f9bSDimitry Andric } 1312f22ef01cSRoman Divacky 1313f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1314f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1315f22ef01cSRoman Divacky // of the file. 1316f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1317f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1318f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1319f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1320f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1321f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 13222754fe60SDimitry Andric 13232754fe60SDimitry Andric // Otherwise, there are cases we have to worry about where we're 13242754fe60SDimitry Andric // using a declaration for which we must emit a definition but where 13252754fe60SDimitry Andric // we might not find a top-level definition: 13262754fe60SDimitry Andric // - member functions defined inline in their classes 13272754fe60SDimitry Andric // - friend functions defined inline in some class 13282754fe60SDimitry Andric // - special member functions with implicit definitions 13292754fe60SDimitry Andric // If we ever change our AST traversal to walk into class methods, 13302754fe60SDimitry Andric // this will be unnecessary. 13312754fe60SDimitry Andric // 13322754fe60SDimitry Andric // We also don't emit a definition for a function if it's going to be an entry 13332754fe60SDimitry Andric // in a vtable, unless it's already marked as used. 1334dff0c46cSDimitry Andric } else if (getLangOpts().CPlusPlus && D.getDecl()) { 13352754fe60SDimitry Andric // Look for a declaration that's lexically in a record. 13362754fe60SDimitry Andric const FunctionDecl *FD = cast<FunctionDecl>(D.getDecl()); 13377ae0e2c9SDimitry Andric FD = FD->getMostRecentDecl(); 13382754fe60SDimitry Andric do { 13392754fe60SDimitry Andric if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) { 13402754fe60SDimitry Andric if (FD->isImplicit() && !ForVTable) { 13412754fe60SDimitry Andric assert(FD->isUsed() && "Sema didn't mark implicit function as used!"); 13422754fe60SDimitry Andric DeferredDeclsToEmit.push_back(D.getWithDecl(FD)); 13432754fe60SDimitry Andric break; 1344bd5abe19SDimitry Andric } else if (FD->doesThisDeclarationHaveABody()) { 13452754fe60SDimitry Andric DeferredDeclsToEmit.push_back(D.getWithDecl(FD)); 13462754fe60SDimitry Andric break; 1347f22ef01cSRoman Divacky } 1348f22ef01cSRoman Divacky } 1349dff0c46cSDimitry Andric FD = FD->getPreviousDecl(); 13502754fe60SDimitry Andric } while (FD); 1351f22ef01cSRoman Divacky } 1352f22ef01cSRoman Divacky 1353f22ef01cSRoman Divacky // Make sure the result is of the requested type. 1354f22ef01cSRoman Divacky if (!IsIncompleteFunction) { 1355f22ef01cSRoman Divacky assert(F->getType()->getElementType() == Ty); 1356f22ef01cSRoman Divacky return F; 1357f22ef01cSRoman Divacky } 1358f22ef01cSRoman Divacky 135917a519f9SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 1360f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(F, PTy); 1361f22ef01cSRoman Divacky } 1362f22ef01cSRoman Divacky 1363f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function. If Ty is 1364f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to 1365f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function). 1366f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, 13676122f3e6SDimitry Andric llvm::Type *Ty, 13682754fe60SDimitry Andric bool ForVTable) { 1369f22ef01cSRoman Divacky // If there was no specific requested type, just convert it now. 1370f22ef01cSRoman Divacky if (!Ty) 1371f22ef01cSRoman Divacky Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType()); 1372ffd1746dSEd Schouten 13736122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 13742754fe60SDimitry Andric return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable); 1375f22ef01cSRoman Divacky } 1376f22ef01cSRoman Divacky 1377f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified 1378f22ef01cSRoman Divacky /// type and name. 1379f22ef01cSRoman Divacky llvm::Constant * 13806122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, 13816122f3e6SDimitry Andric StringRef Name, 1382139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1383139f7f9bSDimitry Andric llvm::Constant *C 1384139f7f9bSDimitry Andric = GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 138517a519f9SDimitry Andric ExtraAttrs); 1386139f7f9bSDimitry Andric if (llvm::Function *F = dyn_cast<llvm::Function>(C)) 1387139f7f9bSDimitry Andric if (F->empty()) 1388139f7f9bSDimitry Andric F->setCallingConv(getRuntimeCC()); 1389139f7f9bSDimitry Andric return C; 1390f22ef01cSRoman Divacky } 1391f22ef01cSRoman Divacky 1392dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted 1393dff0c46cSDimitry Andric /// as a constant. 1394dff0c46cSDimitry Andric /// 1395dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs 1396dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is 1397dff0c46cSDimitry Andric /// not written to during its construction. 1398dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) { 1399dff0c46cSDimitry Andric if (!Ty.isConstant(Context) && !Ty->isReferenceType()) 1400f22ef01cSRoman Divacky return false; 1401bd5abe19SDimitry Andric 1402dff0c46cSDimitry Andric if (Context.getLangOpts().CPlusPlus) { 1403dff0c46cSDimitry Andric if (const CXXRecordDecl *Record 1404dff0c46cSDimitry Andric = Context.getBaseElementType(Ty)->getAsCXXRecordDecl()) 1405dff0c46cSDimitry Andric return ExcludeCtor && !Record->hasMutableFields() && 1406dff0c46cSDimitry Andric Record->hasTrivialDestructor(); 1407f22ef01cSRoman Divacky } 1408bd5abe19SDimitry Andric 1409f22ef01cSRoman Divacky return true; 1410f22ef01cSRoman Divacky } 1411f22ef01cSRoman Divacky 1412f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, 1413f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type. If there 1414f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1415f22ef01cSRoman Divacky /// bitcasted to the right type. 1416f22ef01cSRoman Divacky /// 1417f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1418f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created. 1419f22ef01cSRoman Divacky llvm::Constant * 14206122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, 14216122f3e6SDimitry Andric llvm::PointerType *Ty, 14222754fe60SDimitry Andric const VarDecl *D, 14232754fe60SDimitry Andric bool UnnamedAddr) { 1424f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1425f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1426f22ef01cSRoman Divacky if (Entry) { 14273861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1428f22ef01cSRoman Divacky if (D && !D->hasAttr<WeakAttr>()) 1429f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1430f22ef01cSRoman Divacky } 1431f22ef01cSRoman Divacky 14322754fe60SDimitry Andric if (UnnamedAddr) 14332754fe60SDimitry Andric Entry->setUnnamedAddr(true); 14342754fe60SDimitry Andric 1435f22ef01cSRoman Divacky if (Entry->getType() == Ty) 1436f22ef01cSRoman Divacky return Entry; 1437f22ef01cSRoman Divacky 1438f22ef01cSRoman Divacky // Make sure the result is of the correct type. 1439f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(Entry, Ty); 1440f22ef01cSRoman Divacky } 1441f22ef01cSRoman Divacky 1442f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1443f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1444f22ef01cSRoman Divacky // of the file. 1445f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1446f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1447f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1448f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1449f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1450f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 1451f22ef01cSRoman Divacky } 1452f22ef01cSRoman Divacky 14537ae0e2c9SDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace()); 1454f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 1455f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), Ty->getElementType(), false, 1456f22ef01cSRoman Divacky llvm::GlobalValue::ExternalLinkage, 1457f22ef01cSRoman Divacky 0, MangledName, 0, 14587ae0e2c9SDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 1459f22ef01cSRoman Divacky 1460f22ef01cSRoman Divacky // Handle things which are present even on external declarations. 1461f22ef01cSRoman Divacky if (D) { 1462f22ef01cSRoman Divacky // FIXME: This code is overly simple and should be merged with other global 1463f22ef01cSRoman Divacky // handling. 1464dff0c46cSDimitry Andric GV->setConstant(isTypeConstant(D->getType(), false)); 1465f22ef01cSRoman Divacky 14662754fe60SDimitry Andric // Set linkage and visibility in case we never see a definition. 1467139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 1468139f7f9bSDimitry Andric if (LV.getLinkage() != ExternalLinkage) { 14692754fe60SDimitry Andric // Don't set internal linkage on declarations. 14702754fe60SDimitry Andric } else { 14712754fe60SDimitry Andric if (D->hasAttr<DLLImportAttr>()) 14722754fe60SDimitry Andric GV->setLinkage(llvm::GlobalValue::DLLImportLinkage); 14733b0f4066SDimitry Andric else if (D->hasAttr<WeakAttr>() || D->isWeakImported()) 1474f22ef01cSRoman Divacky GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); 1475f22ef01cSRoman Divacky 14762754fe60SDimitry Andric // Set visibility on a declaration only if it's explicit. 1477139f7f9bSDimitry Andric if (LV.isVisibilityExplicit()) 1478139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 14792754fe60SDimitry Andric } 14802754fe60SDimitry Andric 1481284c1978SDimitry Andric if (D->getTLSKind()) { 1482284c1978SDimitry Andric if (D->getTLSKind() == VarDecl::TLS_Dynamic) 1483284c1978SDimitry Andric CXXThreadLocals.push_back(std::make_pair(D, GV)); 14847ae0e2c9SDimitry Andric setTLSMode(GV, *D); 1485f22ef01cSRoman Divacky } 1486284c1978SDimitry Andric } 1487f22ef01cSRoman Divacky 14887ae0e2c9SDimitry Andric if (AddrSpace != Ty->getAddressSpace()) 14897ae0e2c9SDimitry Andric return llvm::ConstantExpr::getBitCast(GV, Ty); 14907ae0e2c9SDimitry Andric else 1491f22ef01cSRoman Divacky return GV; 1492f22ef01cSRoman Divacky } 1493f22ef01cSRoman Divacky 1494f22ef01cSRoman Divacky 14952754fe60SDimitry Andric llvm::GlobalVariable * 14966122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, 14976122f3e6SDimitry Andric llvm::Type *Ty, 14982754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage) { 14992754fe60SDimitry Andric llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name); 15002754fe60SDimitry Andric llvm::GlobalVariable *OldGV = 0; 15012754fe60SDimitry Andric 15022754fe60SDimitry Andric 15032754fe60SDimitry Andric if (GV) { 15042754fe60SDimitry Andric // Check if the variable has the right type. 15052754fe60SDimitry Andric if (GV->getType()->getElementType() == Ty) 15062754fe60SDimitry Andric return GV; 15072754fe60SDimitry Andric 15082754fe60SDimitry Andric // Because C++ name mangling, the only way we can end up with an already 15092754fe60SDimitry Andric // existing global with the same name is if it has been declared extern "C". 15102754fe60SDimitry Andric assert(GV->isDeclaration() && "Declaration has wrong type!"); 15112754fe60SDimitry Andric OldGV = GV; 15122754fe60SDimitry Andric } 15132754fe60SDimitry Andric 15142754fe60SDimitry Andric // Create a new variable. 15152754fe60SDimitry Andric GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true, 15162754fe60SDimitry Andric Linkage, 0, Name); 15172754fe60SDimitry Andric 15182754fe60SDimitry Andric if (OldGV) { 15192754fe60SDimitry Andric // Replace occurrences of the old variable if needed. 15202754fe60SDimitry Andric GV->takeName(OldGV); 15212754fe60SDimitry Andric 15222754fe60SDimitry Andric if (!OldGV->use_empty()) { 15232754fe60SDimitry Andric llvm::Constant *NewPtrForOldDecl = 15242754fe60SDimitry Andric llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 15252754fe60SDimitry Andric OldGV->replaceAllUsesWith(NewPtrForOldDecl); 15262754fe60SDimitry Andric } 15272754fe60SDimitry Andric 15282754fe60SDimitry Andric OldGV->eraseFromParent(); 15292754fe60SDimitry Andric } 15302754fe60SDimitry Andric 15312754fe60SDimitry Andric return GV; 15322754fe60SDimitry Andric } 15332754fe60SDimitry Andric 1534f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the 1535f22ef01cSRoman Divacky /// given global variable. If Ty is non-null and if the global doesn't exist, 1536cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the 1537f22ef01cSRoman Divacky /// normal requested type would be. 1538f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, 15396122f3e6SDimitry Andric llvm::Type *Ty) { 1540f22ef01cSRoman Divacky assert(D->hasGlobalStorage() && "Not a global variable"); 1541f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1542f22ef01cSRoman Divacky if (Ty == 0) 1543f22ef01cSRoman Divacky Ty = getTypes().ConvertTypeForMem(ASTTy); 1544f22ef01cSRoman Divacky 15456122f3e6SDimitry Andric llvm::PointerType *PTy = 15463b0f4066SDimitry Andric llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy)); 1547f22ef01cSRoman Divacky 15486122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1549f22ef01cSRoman Divacky return GetOrCreateLLVMGlobal(MangledName, PTy, D); 1550f22ef01cSRoman Divacky } 1551f22ef01cSRoman Divacky 1552f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the 1553f22ef01cSRoman Divacky /// specified type and name. 1554f22ef01cSRoman Divacky llvm::Constant * 15556122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, 15566122f3e6SDimitry Andric StringRef Name) { 15572754fe60SDimitry Andric return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), 0, 15582754fe60SDimitry Andric true); 1559f22ef01cSRoman Divacky } 1560f22ef01cSRoman Divacky 1561f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { 1562f22ef01cSRoman Divacky assert(!D->getInit() && "Cannot emit definite definitions here!"); 1563f22ef01cSRoman Divacky 1564f22ef01cSRoman Divacky if (MayDeferGeneration(D)) { 1565f22ef01cSRoman Divacky // If we have not seen a reference to this variable yet, place it 1566f22ef01cSRoman Divacky // into the deferred declarations table to be emitted if needed 1567f22ef01cSRoman Divacky // later. 15686122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1569f22ef01cSRoman Divacky if (!GetGlobalValue(MangledName)) { 1570f22ef01cSRoman Divacky DeferredDecls[MangledName] = D; 1571f22ef01cSRoman Divacky return; 1572f22ef01cSRoman Divacky } 1573f22ef01cSRoman Divacky } 1574f22ef01cSRoman Divacky 1575f22ef01cSRoman Divacky // The tentative definition is the only definition. 1576f22ef01cSRoman Divacky EmitGlobalVarDefinition(D); 1577f22ef01cSRoman Divacky } 1578f22ef01cSRoman Divacky 15796122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const { 15802754fe60SDimitry Andric return Context.toCharUnitsFromBits( 15813861d79fSDimitry Andric TheDataLayout.getTypeStoreSizeInBits(Ty)); 1582f22ef01cSRoman Divacky } 1583f22ef01cSRoman Divacky 1584dff0c46cSDimitry Andric llvm::Constant * 1585dff0c46cSDimitry Andric CodeGenModule::MaybeEmitGlobalStdInitializerListInitializer(const VarDecl *D, 1586dff0c46cSDimitry Andric const Expr *rawInit) { 1587dff0c46cSDimitry Andric ArrayRef<ExprWithCleanups::CleanupObject> cleanups; 1588dff0c46cSDimitry Andric if (const ExprWithCleanups *withCleanups = 1589dff0c46cSDimitry Andric dyn_cast<ExprWithCleanups>(rawInit)) { 1590dff0c46cSDimitry Andric cleanups = withCleanups->getObjects(); 1591dff0c46cSDimitry Andric rawInit = withCleanups->getSubExpr(); 1592dff0c46cSDimitry Andric } 1593dff0c46cSDimitry Andric 1594dff0c46cSDimitry Andric const InitListExpr *init = dyn_cast<InitListExpr>(rawInit); 1595dff0c46cSDimitry Andric if (!init || !init->initializesStdInitializerList() || 1596dff0c46cSDimitry Andric init->getNumInits() == 0) 1597dff0c46cSDimitry Andric return 0; 1598dff0c46cSDimitry Andric 1599dff0c46cSDimitry Andric ASTContext &ctx = getContext(); 1600dff0c46cSDimitry Andric unsigned numInits = init->getNumInits(); 1601dff0c46cSDimitry Andric // FIXME: This check is here because we would otherwise silently miscompile 1602dff0c46cSDimitry Andric // nested global std::initializer_lists. Better would be to have a real 1603dff0c46cSDimitry Andric // implementation. 1604dff0c46cSDimitry Andric for (unsigned i = 0; i < numInits; ++i) { 1605dff0c46cSDimitry Andric const InitListExpr *inner = dyn_cast<InitListExpr>(init->getInit(i)); 1606dff0c46cSDimitry Andric if (inner && inner->initializesStdInitializerList()) { 1607dff0c46cSDimitry Andric ErrorUnsupported(inner, "nested global std::initializer_list"); 1608dff0c46cSDimitry Andric return 0; 1609dff0c46cSDimitry Andric } 1610dff0c46cSDimitry Andric } 1611dff0c46cSDimitry Andric 1612dff0c46cSDimitry Andric // Synthesize a fake VarDecl for the array and initialize that. 1613dff0c46cSDimitry Andric QualType elementType = init->getInit(0)->getType(); 1614dff0c46cSDimitry Andric llvm::APInt numElements(ctx.getTypeSize(ctx.getSizeType()), numInits); 1615dff0c46cSDimitry Andric QualType arrayType = ctx.getConstantArrayType(elementType, numElements, 1616dff0c46cSDimitry Andric ArrayType::Normal, 0); 1617dff0c46cSDimitry Andric 1618dff0c46cSDimitry Andric IdentifierInfo *name = &ctx.Idents.get(D->getNameAsString() + "__initlist"); 1619dff0c46cSDimitry Andric TypeSourceInfo *sourceInfo = ctx.getTrivialTypeSourceInfo( 1620dff0c46cSDimitry Andric arrayType, D->getLocation()); 1621dff0c46cSDimitry Andric VarDecl *backingArray = VarDecl::Create(ctx, const_cast<DeclContext*>( 1622dff0c46cSDimitry Andric D->getDeclContext()), 1623dff0c46cSDimitry Andric D->getLocStart(), D->getLocation(), 1624dff0c46cSDimitry Andric name, arrayType, sourceInfo, 1625139f7f9bSDimitry Andric SC_Static); 1626284c1978SDimitry Andric backingArray->setTSCSpec(D->getTSCSpec()); 1627dff0c46cSDimitry Andric 1628dff0c46cSDimitry Andric // Now clone the InitListExpr to initialize the array instead. 1629dff0c46cSDimitry Andric // Incredible hack: we want to use the existing InitListExpr here, so we need 1630dff0c46cSDimitry Andric // to tell it that it no longer initializes a std::initializer_list. 16313861d79fSDimitry Andric ArrayRef<Expr*> Inits(const_cast<InitListExpr*>(init)->getInits(), 16323861d79fSDimitry Andric init->getNumInits()); 16333861d79fSDimitry Andric Expr *arrayInit = new (ctx) InitListExpr(ctx, init->getLBraceLoc(), Inits, 1634dff0c46cSDimitry Andric init->getRBraceLoc()); 1635dff0c46cSDimitry Andric arrayInit->setType(arrayType); 1636dff0c46cSDimitry Andric 1637dff0c46cSDimitry Andric if (!cleanups.empty()) 1638dff0c46cSDimitry Andric arrayInit = ExprWithCleanups::Create(ctx, arrayInit, cleanups); 1639dff0c46cSDimitry Andric 1640dff0c46cSDimitry Andric backingArray->setInit(arrayInit); 1641dff0c46cSDimitry Andric 1642dff0c46cSDimitry Andric // Emit the definition of the array. 1643dff0c46cSDimitry Andric EmitGlobalVarDefinition(backingArray); 1644dff0c46cSDimitry Andric 1645dff0c46cSDimitry Andric // Inspect the initializer list to validate it and determine its type. 1646dff0c46cSDimitry Andric // FIXME: doing this every time is probably inefficient; caching would be nice 1647dff0c46cSDimitry Andric RecordDecl *record = init->getType()->castAs<RecordType>()->getDecl(); 1648dff0c46cSDimitry Andric RecordDecl::field_iterator field = record->field_begin(); 1649dff0c46cSDimitry Andric if (field == record->field_end()) { 1650dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1651dff0c46cSDimitry Andric return 0; 1652dff0c46cSDimitry Andric } 1653dff0c46cSDimitry Andric QualType elementPtr = ctx.getPointerType(elementType.withConst()); 1654dff0c46cSDimitry Andric // Start pointer. 1655dff0c46cSDimitry Andric if (!ctx.hasSameType(field->getType(), elementPtr)) { 1656dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1657dff0c46cSDimitry Andric return 0; 1658dff0c46cSDimitry Andric } 1659dff0c46cSDimitry Andric ++field; 1660dff0c46cSDimitry Andric if (field == record->field_end()) { 1661dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1662dff0c46cSDimitry Andric return 0; 1663dff0c46cSDimitry Andric } 1664dff0c46cSDimitry Andric bool isStartEnd = false; 1665dff0c46cSDimitry Andric if (ctx.hasSameType(field->getType(), elementPtr)) { 1666dff0c46cSDimitry Andric // End pointer. 1667dff0c46cSDimitry Andric isStartEnd = true; 1668dff0c46cSDimitry Andric } else if(!ctx.hasSameType(field->getType(), ctx.getSizeType())) { 1669dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1670dff0c46cSDimitry Andric return 0; 1671dff0c46cSDimitry Andric } 1672dff0c46cSDimitry Andric 1673dff0c46cSDimitry Andric // Now build an APValue representing the std::initializer_list. 1674dff0c46cSDimitry Andric APValue initListValue(APValue::UninitStruct(), 0, 2); 1675dff0c46cSDimitry Andric APValue &startField = initListValue.getStructField(0); 1676dff0c46cSDimitry Andric APValue::LValuePathEntry startOffsetPathEntry; 1677dff0c46cSDimitry Andric startOffsetPathEntry.ArrayIndex = 0; 1678dff0c46cSDimitry Andric startField = APValue(APValue::LValueBase(backingArray), 1679dff0c46cSDimitry Andric CharUnits::fromQuantity(0), 1680dff0c46cSDimitry Andric llvm::makeArrayRef(startOffsetPathEntry), 1681dff0c46cSDimitry Andric /*IsOnePastTheEnd=*/false, 0); 1682dff0c46cSDimitry Andric 1683dff0c46cSDimitry Andric if (isStartEnd) { 1684dff0c46cSDimitry Andric APValue &endField = initListValue.getStructField(1); 1685dff0c46cSDimitry Andric APValue::LValuePathEntry endOffsetPathEntry; 1686dff0c46cSDimitry Andric endOffsetPathEntry.ArrayIndex = numInits; 1687dff0c46cSDimitry Andric endField = APValue(APValue::LValueBase(backingArray), 1688dff0c46cSDimitry Andric ctx.getTypeSizeInChars(elementType) * numInits, 1689dff0c46cSDimitry Andric llvm::makeArrayRef(endOffsetPathEntry), 1690dff0c46cSDimitry Andric /*IsOnePastTheEnd=*/true, 0); 1691dff0c46cSDimitry Andric } else { 1692dff0c46cSDimitry Andric APValue &sizeField = initListValue.getStructField(1); 1693dff0c46cSDimitry Andric sizeField = APValue(llvm::APSInt(numElements)); 1694dff0c46cSDimitry Andric } 1695dff0c46cSDimitry Andric 1696dff0c46cSDimitry Andric // Emit the constant for the initializer_list. 1697dff0c46cSDimitry Andric llvm::Constant *llvmInit = 1698dff0c46cSDimitry Andric EmitConstantValueForMemory(initListValue, D->getType()); 1699dff0c46cSDimitry Andric assert(llvmInit && "failed to initialize as constant"); 1700dff0c46cSDimitry Andric return llvmInit; 1701dff0c46cSDimitry Andric } 1702dff0c46cSDimitry Andric 17037ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D, 17047ae0e2c9SDimitry Andric unsigned AddrSpace) { 17057ae0e2c9SDimitry Andric if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) { 17067ae0e2c9SDimitry Andric if (D->hasAttr<CUDAConstantAttr>()) 17077ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant); 17087ae0e2c9SDimitry Andric else if (D->hasAttr<CUDASharedAttr>()) 17097ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared); 17107ae0e2c9SDimitry Andric else 17117ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device); 17127ae0e2c9SDimitry Andric } 17137ae0e2c9SDimitry Andric 17147ae0e2c9SDimitry Andric return AddrSpace; 17157ae0e2c9SDimitry Andric } 17167ae0e2c9SDimitry Andric 1717284c1978SDimitry Andric template<typename SomeDecl> 1718284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D, 1719284c1978SDimitry Andric llvm::GlobalValue *GV) { 1720284c1978SDimitry Andric if (!getLangOpts().CPlusPlus) 1721284c1978SDimitry Andric return; 1722284c1978SDimitry Andric 1723284c1978SDimitry Andric // Must have 'used' attribute, or else inline assembly can't rely on 1724284c1978SDimitry Andric // the name existing. 1725284c1978SDimitry Andric if (!D->template hasAttr<UsedAttr>()) 1726284c1978SDimitry Andric return; 1727284c1978SDimitry Andric 1728284c1978SDimitry Andric // Must have internal linkage and an ordinary name. 1729284c1978SDimitry Andric if (!D->getIdentifier() || D->getLinkage() != InternalLinkage) 1730284c1978SDimitry Andric return; 1731284c1978SDimitry Andric 1732284c1978SDimitry Andric // Must be in an extern "C" context. Entities declared directly within 1733284c1978SDimitry Andric // a record are not extern "C" even if the record is in such a context. 1734284c1978SDimitry Andric const SomeDecl *First = D->getFirstDeclaration(); 1735284c1978SDimitry Andric if (First->getDeclContext()->isRecord() || !First->isInExternCContext()) 1736284c1978SDimitry Andric return; 1737284c1978SDimitry Andric 1738284c1978SDimitry Andric // OK, this is an internal linkage entity inside an extern "C" linkage 1739284c1978SDimitry Andric // specification. Make a note of that so we can give it the "expected" 1740284c1978SDimitry Andric // mangled name if nothing else is using that name. 1741284c1978SDimitry Andric std::pair<StaticExternCMap::iterator, bool> R = 1742284c1978SDimitry Andric StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV)); 1743284c1978SDimitry Andric 1744284c1978SDimitry Andric // If we have multiple internal linkage entities with the same name 1745284c1978SDimitry Andric // in extern "C" regions, none of them gets that name. 1746284c1978SDimitry Andric if (!R.second) 1747284c1978SDimitry Andric R.first->second = 0; 1748284c1978SDimitry Andric } 1749284c1978SDimitry Andric 1750f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 1751f22ef01cSRoman Divacky llvm::Constant *Init = 0; 1752f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1753dff0c46cSDimitry Andric CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 1754dff0c46cSDimitry Andric bool NeedsGlobalCtor = false; 1755dff0c46cSDimitry Andric bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor(); 1756f22ef01cSRoman Divacky 1757dff0c46cSDimitry Andric const VarDecl *InitDecl; 1758dff0c46cSDimitry Andric const Expr *InitExpr = D->getAnyInitializer(InitDecl); 1759f22ef01cSRoman Divacky 1760f22ef01cSRoman Divacky if (!InitExpr) { 1761f22ef01cSRoman Divacky // This is a tentative definition; tentative definitions are 1762f22ef01cSRoman Divacky // implicitly initialized with { 0 }. 1763f22ef01cSRoman Divacky // 1764f22ef01cSRoman Divacky // Note that tentative definitions are only emitted at the end of 1765f22ef01cSRoman Divacky // a translation unit, so they should never have incomplete 1766f22ef01cSRoman Divacky // type. In addition, EmitTentativeDefinition makes sure that we 1767f22ef01cSRoman Divacky // never attempt to emit a tentative definition if a real one 1768f22ef01cSRoman Divacky // exists. A use may still exists, however, so we still may need 1769f22ef01cSRoman Divacky // to do a RAUW. 1770f22ef01cSRoman Divacky assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type"); 1771f22ef01cSRoman Divacky Init = EmitNullConstant(D->getType()); 1772f22ef01cSRoman Divacky } else { 1773dff0c46cSDimitry Andric // If this is a std::initializer_list, emit the special initializer. 1774dff0c46cSDimitry Andric Init = MaybeEmitGlobalStdInitializerListInitializer(D, InitExpr); 1775dff0c46cSDimitry Andric // An empty init list will perform zero-initialization, which happens 1776dff0c46cSDimitry Andric // to be exactly what we want. 1777dff0c46cSDimitry Andric // FIXME: It does so in a global constructor, which is *not* what we 1778dff0c46cSDimitry Andric // want. 1779dff0c46cSDimitry Andric 17807ae0e2c9SDimitry Andric if (!Init) { 17817ae0e2c9SDimitry Andric initializedGlobalDecl = GlobalDecl(D); 1782dff0c46cSDimitry Andric Init = EmitConstantInit(*InitDecl); 17837ae0e2c9SDimitry Andric } 1784f22ef01cSRoman Divacky if (!Init) { 1785f22ef01cSRoman Divacky QualType T = InitExpr->getType(); 1786f22ef01cSRoman Divacky if (D->getType()->isReferenceType()) 1787f22ef01cSRoman Divacky T = D->getType(); 1788f22ef01cSRoman Divacky 1789dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus) { 1790f22ef01cSRoman Divacky Init = EmitNullConstant(T); 1791dff0c46cSDimitry Andric NeedsGlobalCtor = true; 1792f22ef01cSRoman Divacky } else { 1793f22ef01cSRoman Divacky ErrorUnsupported(D, "static initializer"); 1794f22ef01cSRoman Divacky Init = llvm::UndefValue::get(getTypes().ConvertType(T)); 1795f22ef01cSRoman Divacky } 1796e580952dSDimitry Andric } else { 1797e580952dSDimitry Andric // We don't need an initializer, so remove the entry for the delayed 1798dff0c46cSDimitry Andric // initializer position (just in case this entry was delayed) if we 1799dff0c46cSDimitry Andric // also don't need to register a destructor. 1800dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && !NeedsGlobalDtor) 1801e580952dSDimitry Andric DelayedCXXInitPosition.erase(D); 1802f22ef01cSRoman Divacky } 1803f22ef01cSRoman Divacky } 1804f22ef01cSRoman Divacky 18056122f3e6SDimitry Andric llvm::Type* InitType = Init->getType(); 1806f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); 1807f22ef01cSRoman Divacky 1808f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 1809f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 1810f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast || 1811f22ef01cSRoman Divacky // all zero index gep. 1812f22ef01cSRoman Divacky CE->getOpcode() == llvm::Instruction::GetElementPtr); 1813f22ef01cSRoman Divacky Entry = CE->getOperand(0); 1814f22ef01cSRoman Divacky } 1815f22ef01cSRoman Divacky 1816f22ef01cSRoman Divacky // Entry is now either a Function or GlobalVariable. 1817f22ef01cSRoman Divacky llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Entry); 1818f22ef01cSRoman Divacky 1819f22ef01cSRoman Divacky // We have a definition after a declaration with the wrong type. 1820f22ef01cSRoman Divacky // We must make a new GlobalVariable* and update everything that used OldGV 1821f22ef01cSRoman Divacky // (a declaration or tentative definition) with the new GlobalVariable* 1822f22ef01cSRoman Divacky // (which will be a definition). 1823f22ef01cSRoman Divacky // 1824f22ef01cSRoman Divacky // This happens if there is a prototype for a global (e.g. 1825f22ef01cSRoman Divacky // "extern int x[];") and then a definition of a different type (e.g. 1826f22ef01cSRoman Divacky // "int x[10];"). This also happens when an initializer has a different type 1827f22ef01cSRoman Divacky // from the type of the global (this happens with unions). 1828f22ef01cSRoman Divacky if (GV == 0 || 1829f22ef01cSRoman Divacky GV->getType()->getElementType() != InitType || 18303b0f4066SDimitry Andric GV->getType()->getAddressSpace() != 18317ae0e2c9SDimitry Andric GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) { 1832f22ef01cSRoman Divacky 1833f22ef01cSRoman Divacky // Move the old entry aside so that we'll create a new one. 18346122f3e6SDimitry Andric Entry->setName(StringRef()); 1835f22ef01cSRoman Divacky 1836f22ef01cSRoman Divacky // Make a new global with the correct type, this is now guaranteed to work. 1837f22ef01cSRoman Divacky GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType)); 1838f22ef01cSRoman Divacky 1839f22ef01cSRoman Divacky // Replace all uses of the old global with the new global 1840f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 1841f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(GV, Entry->getType()); 1842f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 1843f22ef01cSRoman Divacky 1844f22ef01cSRoman Divacky // Erase the old global, since it is no longer used. 1845f22ef01cSRoman Divacky cast<llvm::GlobalValue>(Entry)->eraseFromParent(); 1846f22ef01cSRoman Divacky } 1847f22ef01cSRoman Divacky 1848284c1978SDimitry Andric MaybeHandleStaticInExternC(D, GV); 1849284c1978SDimitry Andric 18506122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 18516122f3e6SDimitry Andric AddGlobalAnnotations(D, GV); 1852f22ef01cSRoman Divacky 1853f22ef01cSRoman Divacky GV->setInitializer(Init); 1854f22ef01cSRoman Divacky 1855f22ef01cSRoman Divacky // If it is safe to mark the global 'constant', do so now. 1856dff0c46cSDimitry Andric GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor && 1857dff0c46cSDimitry Andric isTypeConstant(D->getType(), true)); 1858f22ef01cSRoman Divacky 1859f22ef01cSRoman Divacky GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 1860f22ef01cSRoman Divacky 1861f22ef01cSRoman Divacky // Set the llvm linkage type as appropriate. 18622754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 18632754fe60SDimitry Andric GetLLVMLinkageVarDefinition(D, GV); 18642754fe60SDimitry Andric GV->setLinkage(Linkage); 18652754fe60SDimitry Andric if (Linkage == llvm::GlobalVariable::CommonLinkage) 1866f22ef01cSRoman Divacky // common vars aren't constant even if declared const. 1867f22ef01cSRoman Divacky GV->setConstant(false); 1868f22ef01cSRoman Divacky 1869f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 1870f22ef01cSRoman Divacky 18712754fe60SDimitry Andric // Emit the initializer function if necessary. 1872dff0c46cSDimitry Andric if (NeedsGlobalCtor || NeedsGlobalDtor) 1873dff0c46cSDimitry Andric EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor); 18742754fe60SDimitry Andric 18753861d79fSDimitry Andric // If we are compiling with ASan, add metadata indicating dynamically 18763861d79fSDimitry Andric // initialized globals. 1877139f7f9bSDimitry Andric if (SanOpts.Address && NeedsGlobalCtor) { 18783861d79fSDimitry Andric llvm::Module &M = getModule(); 18793861d79fSDimitry Andric 18803861d79fSDimitry Andric llvm::NamedMDNode *DynamicInitializers = 18813861d79fSDimitry Andric M.getOrInsertNamedMetadata("llvm.asan.dynamically_initialized_globals"); 18823861d79fSDimitry Andric llvm::Value *GlobalToAdd[] = { GV }; 18833861d79fSDimitry Andric llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalToAdd); 18843861d79fSDimitry Andric DynamicInitializers->addOperand(ThisGlobal); 18853861d79fSDimitry Andric } 18863861d79fSDimitry Andric 1887f22ef01cSRoman Divacky // Emit global variable debug information. 18886122f3e6SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 18893861d79fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 1890f22ef01cSRoman Divacky DI->EmitGlobalVariable(GV, D); 1891f22ef01cSRoman Divacky } 1892f22ef01cSRoman Divacky 18932754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes 18942754fe60SDimitry Andric CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, 18952754fe60SDimitry Andric llvm::GlobalVariable *GV) { 18962754fe60SDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForVariable(D); 18972754fe60SDimitry Andric if (Linkage == GVA_Internal) 18982754fe60SDimitry Andric return llvm::Function::InternalLinkage; 18992754fe60SDimitry Andric else if (D->hasAttr<DLLImportAttr>()) 19002754fe60SDimitry Andric return llvm::Function::DLLImportLinkage; 19012754fe60SDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 19022754fe60SDimitry Andric return llvm::Function::DLLExportLinkage; 19032754fe60SDimitry Andric else if (D->hasAttr<WeakAttr>()) { 19042754fe60SDimitry Andric if (GV->isConstant()) 19052754fe60SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 19062754fe60SDimitry Andric else 19072754fe60SDimitry Andric return llvm::GlobalVariable::WeakAnyLinkage; 19082754fe60SDimitry Andric } else if (Linkage == GVA_TemplateInstantiation || 19092754fe60SDimitry Andric Linkage == GVA_ExplicitTemplateInstantiation) 19103b0f4066SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 1911dff0c46cSDimitry Andric else if (!getLangOpts().CPlusPlus && 19122754fe60SDimitry Andric ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) || 19132754fe60SDimitry Andric D->getAttr<CommonAttr>()) && 19142754fe60SDimitry Andric !D->hasExternalStorage() && !D->getInit() && 1915284c1978SDimitry Andric !D->getAttr<SectionAttr>() && !D->getTLSKind() && 191617a519f9SDimitry Andric !D->getAttr<WeakImportAttr>()) { 19172754fe60SDimitry Andric // Thread local vars aren't considered common linkage. 19182754fe60SDimitry Andric return llvm::GlobalVariable::CommonLinkage; 1919284c1978SDimitry Andric } else if (D->getTLSKind() == VarDecl::TLS_Dynamic && 1920284c1978SDimitry Andric getTarget().getTriple().isMacOSX()) 1921284c1978SDimitry Andric // On Darwin, the backing variable for a C++11 thread_local variable always 1922284c1978SDimitry Andric // has internal linkage; all accesses should just be calls to the 1923284c1978SDimitry Andric // Itanium-specified entry point, which has the normal linkage of the 1924284c1978SDimitry Andric // variable. 1925284c1978SDimitry Andric return llvm::GlobalValue::InternalLinkage; 19262754fe60SDimitry Andric return llvm::GlobalVariable::ExternalLinkage; 19272754fe60SDimitry Andric } 19282754fe60SDimitry Andric 1929139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type. 1930139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites 1931139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old, 1932139f7f9bSDimitry Andric llvm::Function *newFn) { 1933139f7f9bSDimitry Andric // Fast path. 1934139f7f9bSDimitry Andric if (old->use_empty()) return; 1935139f7f9bSDimitry Andric 1936139f7f9bSDimitry Andric llvm::Type *newRetTy = newFn->getReturnType(); 1937139f7f9bSDimitry Andric SmallVector<llvm::Value*, 4> newArgs; 1938139f7f9bSDimitry Andric 1939139f7f9bSDimitry Andric for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end(); 1940139f7f9bSDimitry Andric ui != ue; ) { 1941139f7f9bSDimitry Andric llvm::Value::use_iterator use = ui++; // Increment before the use is erased. 1942139f7f9bSDimitry Andric llvm::User *user = *use; 1943139f7f9bSDimitry Andric 1944139f7f9bSDimitry Andric // Recognize and replace uses of bitcasts. Most calls to 1945139f7f9bSDimitry Andric // unprototyped functions will use bitcasts. 1946139f7f9bSDimitry Andric if (llvm::ConstantExpr *bitcast = dyn_cast<llvm::ConstantExpr>(user)) { 1947139f7f9bSDimitry Andric if (bitcast->getOpcode() == llvm::Instruction::BitCast) 1948139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(bitcast, newFn); 1949139f7f9bSDimitry Andric continue; 1950139f7f9bSDimitry Andric } 1951139f7f9bSDimitry Andric 1952139f7f9bSDimitry Andric // Recognize calls to the function. 1953139f7f9bSDimitry Andric llvm::CallSite callSite(user); 1954139f7f9bSDimitry Andric if (!callSite) continue; 1955139f7f9bSDimitry Andric if (!callSite.isCallee(use)) continue; 1956139f7f9bSDimitry Andric 1957139f7f9bSDimitry Andric // If the return types don't match exactly, then we can't 1958139f7f9bSDimitry Andric // transform this call unless it's dead. 1959139f7f9bSDimitry Andric if (callSite->getType() != newRetTy && !callSite->use_empty()) 1960139f7f9bSDimitry Andric continue; 1961139f7f9bSDimitry Andric 1962139f7f9bSDimitry Andric // Get the call site's attribute list. 1963139f7f9bSDimitry Andric SmallVector<llvm::AttributeSet, 8> newAttrs; 1964139f7f9bSDimitry Andric llvm::AttributeSet oldAttrs = callSite.getAttributes(); 1965139f7f9bSDimitry Andric 1966139f7f9bSDimitry Andric // Collect any return attributes from the call. 1967139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex)) 1968139f7f9bSDimitry Andric newAttrs.push_back( 1969139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), 1970139f7f9bSDimitry Andric oldAttrs.getRetAttributes())); 1971139f7f9bSDimitry Andric 1972139f7f9bSDimitry Andric // If the function was passed too few arguments, don't transform. 1973139f7f9bSDimitry Andric unsigned newNumArgs = newFn->arg_size(); 1974139f7f9bSDimitry Andric if (callSite.arg_size() < newNumArgs) continue; 1975139f7f9bSDimitry Andric 1976139f7f9bSDimitry Andric // If extra arguments were passed, we silently drop them. 1977139f7f9bSDimitry Andric // If any of the types mismatch, we don't transform. 1978139f7f9bSDimitry Andric unsigned argNo = 0; 1979139f7f9bSDimitry Andric bool dontTransform = false; 1980139f7f9bSDimitry Andric for (llvm::Function::arg_iterator ai = newFn->arg_begin(), 1981139f7f9bSDimitry Andric ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) { 1982139f7f9bSDimitry Andric if (callSite.getArgument(argNo)->getType() != ai->getType()) { 1983139f7f9bSDimitry Andric dontTransform = true; 1984139f7f9bSDimitry Andric break; 1985139f7f9bSDimitry Andric } 1986139f7f9bSDimitry Andric 1987139f7f9bSDimitry Andric // Add any parameter attributes. 1988139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(argNo + 1)) 1989139f7f9bSDimitry Andric newAttrs. 1990139f7f9bSDimitry Andric push_back(llvm:: 1991139f7f9bSDimitry Andric AttributeSet::get(newFn->getContext(), 1992139f7f9bSDimitry Andric oldAttrs.getParamAttributes(argNo + 1))); 1993139f7f9bSDimitry Andric } 1994139f7f9bSDimitry Andric if (dontTransform) 1995139f7f9bSDimitry Andric continue; 1996139f7f9bSDimitry Andric 1997139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) 1998139f7f9bSDimitry Andric newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(), 1999139f7f9bSDimitry Andric oldAttrs.getFnAttributes())); 2000139f7f9bSDimitry Andric 2001139f7f9bSDimitry Andric // Okay, we can transform this. Create the new call instruction and copy 2002139f7f9bSDimitry Andric // over the required information. 2003139f7f9bSDimitry Andric newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo); 2004139f7f9bSDimitry Andric 2005139f7f9bSDimitry Andric llvm::CallSite newCall; 2006139f7f9bSDimitry Andric if (callSite.isCall()) { 2007139f7f9bSDimitry Andric newCall = llvm::CallInst::Create(newFn, newArgs, "", 2008139f7f9bSDimitry Andric callSite.getInstruction()); 2009139f7f9bSDimitry Andric } else { 2010139f7f9bSDimitry Andric llvm::InvokeInst *oldInvoke = 2011139f7f9bSDimitry Andric cast<llvm::InvokeInst>(callSite.getInstruction()); 2012139f7f9bSDimitry Andric newCall = llvm::InvokeInst::Create(newFn, 2013139f7f9bSDimitry Andric oldInvoke->getNormalDest(), 2014139f7f9bSDimitry Andric oldInvoke->getUnwindDest(), 2015139f7f9bSDimitry Andric newArgs, "", 2016139f7f9bSDimitry Andric callSite.getInstruction()); 2017139f7f9bSDimitry Andric } 2018139f7f9bSDimitry Andric newArgs.clear(); // for the next iteration 2019139f7f9bSDimitry Andric 2020139f7f9bSDimitry Andric if (!newCall->getType()->isVoidTy()) 2021139f7f9bSDimitry Andric newCall->takeName(callSite.getInstruction()); 2022139f7f9bSDimitry Andric newCall.setAttributes( 2023139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), newAttrs)); 2024139f7f9bSDimitry Andric newCall.setCallingConv(callSite.getCallingConv()); 2025139f7f9bSDimitry Andric 2026139f7f9bSDimitry Andric // Finally, remove the old call, replacing any uses with the new one. 2027139f7f9bSDimitry Andric if (!callSite->use_empty()) 2028139f7f9bSDimitry Andric callSite->replaceAllUsesWith(newCall.getInstruction()); 2029139f7f9bSDimitry Andric 2030139f7f9bSDimitry Andric // Copy debug location attached to CI. 2031139f7f9bSDimitry Andric if (!callSite->getDebugLoc().isUnknown()) 2032139f7f9bSDimitry Andric newCall->setDebugLoc(callSite->getDebugLoc()); 2033139f7f9bSDimitry Andric callSite->eraseFromParent(); 2034139f7f9bSDimitry Andric } 2035139f7f9bSDimitry Andric } 2036139f7f9bSDimitry Andric 2037f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we 2038f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}". If there are 2039f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to 2040f22ef01cSRoman Divacky /// call the new function directly. 2041f22ef01cSRoman Divacky /// 2042f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to 2043f22ef01cSRoman Divacky /// functions to be able to inline them. If there is a bitcast in the way, it 2044f22ef01cSRoman Divacky /// won't inline them. Instcombine normally deletes these calls, but it isn't 2045f22ef01cSRoman Divacky /// run at -O0. 2046f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, 2047f22ef01cSRoman Divacky llvm::Function *NewFn) { 2048f22ef01cSRoman Divacky // If we're redefining a global as a function, don't transform it. 2049139f7f9bSDimitry Andric if (!isa<llvm::Function>(Old)) return; 2050f22ef01cSRoman Divacky 2051139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(Old, NewFn); 2052f22ef01cSRoman Divacky } 2053f22ef01cSRoman Divacky 2054dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 2055dff0c46cSDimitry Andric TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind(); 2056dff0c46cSDimitry Andric // If we have a definition, this might be a deferred decl. If the 2057dff0c46cSDimitry Andric // instantiation is explicit, make sure we emit it at the end. 2058dff0c46cSDimitry Andric if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition) 2059dff0c46cSDimitry Andric GetAddrOfGlobalVar(VD); 2060139f7f9bSDimitry Andric 2061139f7f9bSDimitry Andric EmitTopLevelDecl(VD); 2062dff0c46cSDimitry Andric } 2063f22ef01cSRoman Divacky 2064f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) { 2065f22ef01cSRoman Divacky const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl()); 20663b0f4066SDimitry Andric 20673b0f4066SDimitry Andric // Compute the function info and LLVM type. 2068dff0c46cSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 2069dff0c46cSDimitry Andric llvm::FunctionType *Ty = getTypes().GetFunctionType(FI); 20703b0f4066SDimitry Andric 2071f22ef01cSRoman Divacky // Get or create the prototype for the function. 2072f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfFunction(GD, Ty); 2073f22ef01cSRoman Divacky 2074f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 2075f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 2076f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast); 2077f22ef01cSRoman Divacky Entry = CE->getOperand(0); 2078f22ef01cSRoman Divacky } 2079f22ef01cSRoman Divacky 2080f22ef01cSRoman Divacky 2081f22ef01cSRoman Divacky if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() != Ty) { 2082f22ef01cSRoman Divacky llvm::GlobalValue *OldFn = cast<llvm::GlobalValue>(Entry); 2083f22ef01cSRoman Divacky 2084f22ef01cSRoman Divacky // If the types mismatch then we have to rewrite the definition. 2085f22ef01cSRoman Divacky assert(OldFn->isDeclaration() && 2086f22ef01cSRoman Divacky "Shouldn't replace non-declaration"); 2087f22ef01cSRoman Divacky 2088f22ef01cSRoman Divacky // F is the Function* for the one with the wrong type, we must make a new 2089f22ef01cSRoman Divacky // Function* and update everything that used F (a declaration) with the new 2090f22ef01cSRoman Divacky // Function* (which will be a definition). 2091f22ef01cSRoman Divacky // 2092f22ef01cSRoman Divacky // This happens if there is a prototype for a function 2093f22ef01cSRoman Divacky // (e.g. "int f()") and then a definition of a different type 2094f22ef01cSRoman Divacky // (e.g. "int f(int x)"). Move the old function aside so that it 2095f22ef01cSRoman Divacky // doesn't interfere with GetAddrOfFunction. 20966122f3e6SDimitry Andric OldFn->setName(StringRef()); 2097f22ef01cSRoman Divacky llvm::Function *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty)); 2098f22ef01cSRoman Divacky 2099139f7f9bSDimitry Andric // This might be an implementation of a function without a 2100139f7f9bSDimitry Andric // prototype, in which case, try to do special replacement of 2101139f7f9bSDimitry Andric // calls which match the new prototype. The really key thing here 2102139f7f9bSDimitry Andric // is that we also potentially drop arguments from the call site 2103139f7f9bSDimitry Andric // so as to make a direct call, which makes the inliner happier 2104139f7f9bSDimitry Andric // and suppresses a number of optimizer warnings (!) about 2105139f7f9bSDimitry Andric // dropping arguments. 2106139f7f9bSDimitry Andric if (!OldFn->use_empty()) { 2107f22ef01cSRoman Divacky ReplaceUsesOfNonProtoTypeWithRealFunction(OldFn, NewFn); 2108f22ef01cSRoman Divacky OldFn->removeDeadConstantUsers(); 2109f22ef01cSRoman Divacky } 2110f22ef01cSRoman Divacky 2111f22ef01cSRoman Divacky // Replace uses of F with the Function we will endow with a body. 2112f22ef01cSRoman Divacky if (!Entry->use_empty()) { 2113f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 2114f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 2115f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 2116f22ef01cSRoman Divacky } 2117f22ef01cSRoman Divacky 2118f22ef01cSRoman Divacky // Ok, delete the old function now, which is dead. 2119f22ef01cSRoman Divacky OldFn->eraseFromParent(); 2120f22ef01cSRoman Divacky 2121f22ef01cSRoman Divacky Entry = NewFn; 2122f22ef01cSRoman Divacky } 2123f22ef01cSRoman Divacky 21242754fe60SDimitry Andric // We need to set linkage and visibility on the function before 21252754fe60SDimitry Andric // generating code for it because various parts of IR generation 21262754fe60SDimitry Andric // want to propagate this information down (e.g. to local static 21272754fe60SDimitry Andric // declarations). 2128f22ef01cSRoman Divacky llvm::Function *Fn = cast<llvm::Function>(Entry); 2129f22ef01cSRoman Divacky setFunctionLinkage(D, Fn); 2130f22ef01cSRoman Divacky 21312754fe60SDimitry Andric // FIXME: this is redundant with part of SetFunctionDefinitionAttributes 21322754fe60SDimitry Andric setGlobalVisibility(Fn, D); 21332754fe60SDimitry Andric 2134284c1978SDimitry Andric MaybeHandleStaticInExternC(D, Fn); 2135284c1978SDimitry Andric 21363b0f4066SDimitry Andric CodeGenFunction(*this).GenerateCode(D, Fn, FI); 2137f22ef01cSRoman Divacky 2138f22ef01cSRoman Divacky SetFunctionDefinitionAttributes(D, Fn); 2139f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, Fn); 2140f22ef01cSRoman Divacky 2141f22ef01cSRoman Divacky if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) 2142f22ef01cSRoman Divacky AddGlobalCtor(Fn, CA->getPriority()); 2143f22ef01cSRoman Divacky if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) 2144f22ef01cSRoman Divacky AddGlobalDtor(Fn, DA->getPriority()); 21456122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 21466122f3e6SDimitry Andric AddGlobalAnnotations(D, Fn); 2147f22ef01cSRoman Divacky } 2148f22ef01cSRoman Divacky 2149f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { 2150f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 2151f22ef01cSRoman Divacky const AliasAttr *AA = D->getAttr<AliasAttr>(); 2152f22ef01cSRoman Divacky assert(AA && "Not an alias?"); 2153f22ef01cSRoman Divacky 21546122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 2155f22ef01cSRoman Divacky 2156f22ef01cSRoman Divacky // If there is a definition in the module, then it wins over the alias. 2157f22ef01cSRoman Divacky // This is dubious, but allow it to be safe. Just ignore the alias. 2158f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 2159f22ef01cSRoman Divacky if (Entry && !Entry->isDeclaration()) 2160f22ef01cSRoman Divacky return; 2161f22ef01cSRoman Divacky 21626122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); 2163f22ef01cSRoman Divacky 2164f22ef01cSRoman Divacky // Create a reference to the named value. This ensures that it is emitted 2165f22ef01cSRoman Divacky // if a deferred decl. 2166f22ef01cSRoman Divacky llvm::Constant *Aliasee; 2167f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 21683861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, 21692754fe60SDimitry Andric /*ForVTable=*/false); 2170f22ef01cSRoman Divacky else 2171f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 2172f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 2173f22ef01cSRoman Divacky 2174f22ef01cSRoman Divacky // Create the new alias itself, but don't set a name yet. 2175f22ef01cSRoman Divacky llvm::GlobalValue *GA = 2176f22ef01cSRoman Divacky new llvm::GlobalAlias(Aliasee->getType(), 2177f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 2178f22ef01cSRoman Divacky "", Aliasee, &getModule()); 2179f22ef01cSRoman Divacky 2180f22ef01cSRoman Divacky if (Entry) { 2181f22ef01cSRoman Divacky assert(Entry->isDeclaration()); 2182f22ef01cSRoman Divacky 2183f22ef01cSRoman Divacky // If there is a declaration in the module, then we had an extern followed 2184f22ef01cSRoman Divacky // by the alias, as in: 2185f22ef01cSRoman Divacky // extern int test6(); 2186f22ef01cSRoman Divacky // ... 2187f22ef01cSRoman Divacky // int test6() __attribute__((alias("test7"))); 2188f22ef01cSRoman Divacky // 2189f22ef01cSRoman Divacky // Remove it and replace uses of it with the alias. 2190f22ef01cSRoman Divacky GA->takeName(Entry); 2191f22ef01cSRoman Divacky 2192f22ef01cSRoman Divacky Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, 2193f22ef01cSRoman Divacky Entry->getType())); 2194f22ef01cSRoman Divacky Entry->eraseFromParent(); 2195f22ef01cSRoman Divacky } else { 2196ffd1746dSEd Schouten GA->setName(MangledName); 2197f22ef01cSRoman Divacky } 2198f22ef01cSRoman Divacky 2199f22ef01cSRoman Divacky // Set attributes which are particular to an alias; this is a 2200f22ef01cSRoman Divacky // specialization of the attributes which may be set on a global 2201f22ef01cSRoman Divacky // variable/function. 2202f22ef01cSRoman Divacky if (D->hasAttr<DLLExportAttr>()) { 2203f22ef01cSRoman Divacky if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 2204f22ef01cSRoman Divacky // The dllexport attribute is ignored for undefined symbols. 2205ffd1746dSEd Schouten if (FD->hasBody()) 2206f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2207f22ef01cSRoman Divacky } else { 2208f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2209f22ef01cSRoman Divacky } 2210f22ef01cSRoman Divacky } else if (D->hasAttr<WeakAttr>() || 2211f22ef01cSRoman Divacky D->hasAttr<WeakRefAttr>() || 22123b0f4066SDimitry Andric D->isWeakImported()) { 2213f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::WeakAnyLinkage); 2214f22ef01cSRoman Divacky } 2215f22ef01cSRoman Divacky 2216f22ef01cSRoman Divacky SetCommonAttributes(D, GA); 2217f22ef01cSRoman Divacky } 2218f22ef01cSRoman Divacky 221917a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID, 22206122f3e6SDimitry Andric ArrayRef<llvm::Type*> Tys) { 222117a519f9SDimitry Andric return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID, 222217a519f9SDimitry Andric Tys); 2223f22ef01cSRoman Divacky } 2224f22ef01cSRoman Divacky 2225f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> & 2226f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2227f22ef01cSRoman Divacky const StringLiteral *Literal, 2228f22ef01cSRoman Divacky bool TargetIsLSB, 2229f22ef01cSRoman Divacky bool &IsUTF16, 2230f22ef01cSRoman Divacky unsigned &StringLength) { 22316122f3e6SDimitry Andric StringRef String = Literal->getString(); 2232e580952dSDimitry Andric unsigned NumBytes = String.size(); 2233f22ef01cSRoman Divacky 2234f22ef01cSRoman Divacky // Check for simple case. 2235f22ef01cSRoman Divacky if (!Literal->containsNonAsciiOrNull()) { 2236f22ef01cSRoman Divacky StringLength = NumBytes; 2237e580952dSDimitry Andric return Map.GetOrCreateValue(String); 2238f22ef01cSRoman Divacky } 2239f22ef01cSRoman Divacky 2240dff0c46cSDimitry Andric // Otherwise, convert the UTF8 literals into a string of shorts. 2241dff0c46cSDimitry Andric IsUTF16 = true; 2242dff0c46cSDimitry Andric 2243dff0c46cSDimitry Andric SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls. 22443861d79fSDimitry Andric const UTF8 *FromPtr = (const UTF8 *)String.data(); 2245f22ef01cSRoman Divacky UTF16 *ToPtr = &ToBuf[0]; 2246f22ef01cSRoman Divacky 22472754fe60SDimitry Andric (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, 2248f22ef01cSRoman Divacky &ToPtr, ToPtr + NumBytes, 2249f22ef01cSRoman Divacky strictConversion); 2250f22ef01cSRoman Divacky 2251f22ef01cSRoman Divacky // ConvertUTF8toUTF16 returns the length in ToPtr. 2252f22ef01cSRoman Divacky StringLength = ToPtr - &ToBuf[0]; 2253f22ef01cSRoman Divacky 2254dff0c46cSDimitry Andric // Add an explicit null. 2255dff0c46cSDimitry Andric *ToPtr = 0; 2256dff0c46cSDimitry Andric return Map. 2257dff0c46cSDimitry Andric GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()), 2258dff0c46cSDimitry Andric (StringLength + 1) * 2)); 2259f22ef01cSRoman Divacky } 2260f22ef01cSRoman Divacky 2261bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> & 2262bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2263bd5abe19SDimitry Andric const StringLiteral *Literal, 2264dff0c46cSDimitry Andric unsigned &StringLength) { 22656122f3e6SDimitry Andric StringRef String = Literal->getString(); 2266bd5abe19SDimitry Andric StringLength = String.size(); 2267bd5abe19SDimitry Andric return Map.GetOrCreateValue(String); 2268bd5abe19SDimitry Andric } 2269bd5abe19SDimitry Andric 2270f22ef01cSRoman Divacky llvm::Constant * 2271f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { 2272f22ef01cSRoman Divacky unsigned StringLength = 0; 2273f22ef01cSRoman Divacky bool isUTF16 = false; 2274f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2275f22ef01cSRoman Divacky GetConstantCFStringEntry(CFConstantStringMap, Literal, 22763861d79fSDimitry Andric getDataLayout().isLittleEndian(), 2277f22ef01cSRoman Divacky isUTF16, StringLength); 2278f22ef01cSRoman Divacky 2279f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2280f22ef01cSRoman Divacky return C; 2281f22ef01cSRoman Divacky 2282dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2283f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2284284c1978SDimitry Andric llvm::Value *V; 2285f22ef01cSRoman Divacky 2286f22ef01cSRoman Divacky // If we don't already have it, get __CFConstantStringClassReference. 2287f22ef01cSRoman Divacky if (!CFConstantStringClassRef) { 22886122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 2289f22ef01cSRoman Divacky Ty = llvm::ArrayType::get(Ty, 0); 2290f22ef01cSRoman Divacky llvm::Constant *GV = CreateRuntimeVariable(Ty, 2291f22ef01cSRoman Divacky "__CFConstantStringClassReference"); 2292f22ef01cSRoman Divacky // Decay array -> ptr 2293284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2294284c1978SDimitry Andric CFConstantStringClassRef = V; 2295f22ef01cSRoman Divacky } 2296284c1978SDimitry Andric else 2297284c1978SDimitry Andric V = CFConstantStringClassRef; 2298f22ef01cSRoman Divacky 2299f22ef01cSRoman Divacky QualType CFTy = getContext().getCFConstantStringType(); 2300f22ef01cSRoman Divacky 23016122f3e6SDimitry Andric llvm::StructType *STy = 2302f22ef01cSRoman Divacky cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 2303f22ef01cSRoman Divacky 2304dff0c46cSDimitry Andric llvm::Constant *Fields[4]; 2305f22ef01cSRoman Divacky 2306f22ef01cSRoman Divacky // Class pointer. 2307284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2308f22ef01cSRoman Divacky 2309f22ef01cSRoman Divacky // Flags. 23106122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2311f22ef01cSRoman Divacky Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) : 2312f22ef01cSRoman Divacky llvm::ConstantInt::get(Ty, 0x07C8); 2313f22ef01cSRoman Divacky 2314f22ef01cSRoman Divacky // String pointer. 2315dff0c46cSDimitry Andric llvm::Constant *C = 0; 2316dff0c46cSDimitry Andric if (isUTF16) { 2317dff0c46cSDimitry Andric ArrayRef<uint16_t> Arr = 2318139f7f9bSDimitry Andric llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>( 2319139f7f9bSDimitry Andric const_cast<char *>(Entry.getKey().data())), 2320dff0c46cSDimitry Andric Entry.getKey().size() / 2); 2321dff0c46cSDimitry Andric C = llvm::ConstantDataArray::get(VMContext, Arr); 2322dff0c46cSDimitry Andric } else { 2323dff0c46cSDimitry Andric C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2324dff0c46cSDimitry Andric } 2325f22ef01cSRoman Divacky 2326f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2327dff0c46cSDimitry Andric if (isUTF16) 2328f22ef01cSRoman Divacky // FIXME: why do utf strings get "_" labels instead of "L" labels? 2329f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::InternalLinkage; 2330dff0c46cSDimitry Andric else 23313b0f4066SDimitry Andric // FIXME: With OS X ld 123.2 (xcode 4) and LTO we would get a linker error 23323b0f4066SDimitry Andric // when using private linkage. It is not clear if this is a bug in ld 23333b0f4066SDimitry Andric // or a reasonable new restriction. 23343b0f4066SDimitry Andric Linkage = llvm::GlobalValue::LinkerPrivateLinkage; 2335f22ef01cSRoman Divacky 2336dff0c46cSDimitry Andric // Note: -fwritable-strings doesn't make the backing store strings of 2337dff0c46cSDimitry Andric // CFStrings writable. (See <rdar://problem/10657500>) 2338f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2339dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true, 2340dff0c46cSDimitry Andric Linkage, C, ".str"); 23412754fe60SDimitry Andric GV->setUnnamedAddr(true); 2342284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2343284c1978SDimitry Andric // of the string is via this class initializer. 2344f22ef01cSRoman Divacky if (isUTF16) { 2345f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy); 2346f22ef01cSRoman Divacky GV->setAlignment(Align.getQuantity()); 23473b0f4066SDimitry Andric } else { 23483b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 23493b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 2350f22ef01cSRoman Divacky } 2351dff0c46cSDimitry Andric 2352dff0c46cSDimitry Andric // String. 23536122f3e6SDimitry Andric Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2354f22ef01cSRoman Divacky 2355dff0c46cSDimitry Andric if (isUTF16) 2356dff0c46cSDimitry Andric // Cast the UTF16 string to the correct type. 2357dff0c46cSDimitry Andric Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy); 2358dff0c46cSDimitry Andric 2359f22ef01cSRoman Divacky // String length. 2360f22ef01cSRoman Divacky Ty = getTypes().ConvertType(getContext().LongTy); 2361f22ef01cSRoman Divacky Fields[3] = llvm::ConstantInt::get(Ty, StringLength); 2362f22ef01cSRoman Divacky 2363f22ef01cSRoman Divacky // The struct. 2364f22ef01cSRoman Divacky C = llvm::ConstantStruct::get(STy, Fields); 2365f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2366f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2367f22ef01cSRoman Divacky "_unnamed_cfstring_"); 2368284c1978SDimitry Andric if (const char *Sect = getTarget().getCFStringSection()) 2369f22ef01cSRoman Divacky GV->setSection(Sect); 2370f22ef01cSRoman Divacky Entry.setValue(GV); 2371f22ef01cSRoman Divacky 2372f22ef01cSRoman Divacky return GV; 2373f22ef01cSRoman Divacky } 2374f22ef01cSRoman Divacky 23756122f3e6SDimitry Andric static RecordDecl * 23766122f3e6SDimitry Andric CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 23776122f3e6SDimitry Andric DeclContext *DC, IdentifierInfo *Id) { 23786122f3e6SDimitry Andric SourceLocation Loc; 2379dff0c46cSDimitry Andric if (Ctx.getLangOpts().CPlusPlus) 23806122f3e6SDimitry Andric return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 23816122f3e6SDimitry Andric else 23826122f3e6SDimitry Andric return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 23836122f3e6SDimitry Andric } 23846122f3e6SDimitry Andric 2385f22ef01cSRoman Divacky llvm::Constant * 23862754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) { 2387f22ef01cSRoman Divacky unsigned StringLength = 0; 2388f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2389bd5abe19SDimitry Andric GetConstantStringEntry(CFConstantStringMap, Literal, StringLength); 2390f22ef01cSRoman Divacky 2391f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2392f22ef01cSRoman Divacky return C; 2393f22ef01cSRoman Divacky 2394dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2395f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2396284c1978SDimitry Andric llvm::Value *V; 2397f22ef01cSRoman Divacky // If we don't already have it, get _NSConstantStringClassReference. 23982754fe60SDimitry Andric if (!ConstantStringClassRef) { 2399dff0c46cSDimitry Andric std::string StringClass(getLangOpts().ObjCConstantStringClass); 24006122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 24012754fe60SDimitry Andric llvm::Constant *GV; 24027ae0e2c9SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 2403bd5abe19SDimitry Andric std::string str = 2404bd5abe19SDimitry Andric StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" 2405bd5abe19SDimitry Andric : "OBJC_CLASS_$_" + StringClass; 2406bd5abe19SDimitry Andric GV = getObjCRuntime().GetClassGlobal(str); 2407bd5abe19SDimitry Andric // Make sure the result is of the correct type. 24086122f3e6SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 2409284c1978SDimitry Andric V = llvm::ConstantExpr::getBitCast(GV, PTy); 2410284c1978SDimitry Andric ConstantStringClassRef = V; 2411bd5abe19SDimitry Andric } else { 2412bd5abe19SDimitry Andric std::string str = 2413bd5abe19SDimitry Andric StringClass.empty() ? "_NSConstantStringClassReference" 2414bd5abe19SDimitry Andric : "_" + StringClass + "ClassReference"; 24156122f3e6SDimitry Andric llvm::Type *PTy = llvm::ArrayType::get(Ty, 0); 2416bd5abe19SDimitry Andric GV = CreateRuntimeVariable(PTy, str); 2417f22ef01cSRoman Divacky // Decay array -> ptr 2418284c1978SDimitry Andric V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2419284c1978SDimitry Andric ConstantStringClassRef = V; 2420f22ef01cSRoman Divacky } 2421bd5abe19SDimitry Andric } 2422284c1978SDimitry Andric else 2423284c1978SDimitry Andric V = ConstantStringClassRef; 2424f22ef01cSRoman Divacky 24256122f3e6SDimitry Andric if (!NSConstantStringType) { 24266122f3e6SDimitry Andric // Construct the type for a constant NSString. 24276122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 24286122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 24296122f3e6SDimitry Andric &Context.Idents.get("__builtin_NSString")); 24306122f3e6SDimitry Andric D->startDefinition(); 2431f22ef01cSRoman Divacky 24326122f3e6SDimitry Andric QualType FieldTypes[3]; 24336122f3e6SDimitry Andric 24346122f3e6SDimitry Andric // const int *isa; 24356122f3e6SDimitry Andric FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst()); 24366122f3e6SDimitry Andric // const char *str; 24376122f3e6SDimitry Andric FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst()); 24386122f3e6SDimitry Andric // unsigned int length; 24396122f3e6SDimitry Andric FieldTypes[2] = Context.UnsignedIntTy; 24406122f3e6SDimitry Andric 24416122f3e6SDimitry Andric // Create fields 24426122f3e6SDimitry Andric for (unsigned i = 0; i < 3; ++i) { 24436122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, D, 24446122f3e6SDimitry Andric SourceLocation(), 24456122f3e6SDimitry Andric SourceLocation(), 0, 24466122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 24476122f3e6SDimitry Andric /*BitWidth=*/0, 24486122f3e6SDimitry Andric /*Mutable=*/false, 24497ae0e2c9SDimitry Andric ICIS_NoInit); 24506122f3e6SDimitry Andric Field->setAccess(AS_public); 24516122f3e6SDimitry Andric D->addDecl(Field); 24526122f3e6SDimitry Andric } 24536122f3e6SDimitry Andric 24546122f3e6SDimitry Andric D->completeDefinition(); 24556122f3e6SDimitry Andric QualType NSTy = Context.getTagDeclType(D); 24566122f3e6SDimitry Andric NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy)); 24576122f3e6SDimitry Andric } 2458f22ef01cSRoman Divacky 2459dff0c46cSDimitry Andric llvm::Constant *Fields[3]; 2460f22ef01cSRoman Divacky 2461f22ef01cSRoman Divacky // Class pointer. 2462284c1978SDimitry Andric Fields[0] = cast<llvm::ConstantExpr>(V); 2463f22ef01cSRoman Divacky 2464f22ef01cSRoman Divacky // String pointer. 2465dff0c46cSDimitry Andric llvm::Constant *C = 2466dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2467f22ef01cSRoman Divacky 2468f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2469f22ef01cSRoman Divacky bool isConstant; 2470f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::PrivateLinkage; 2471dff0c46cSDimitry Andric isConstant = !LangOpts.WritableStrings; 2472f22ef01cSRoman Divacky 2473f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2474f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), C->getType(), isConstant, Linkage, C, 2475f22ef01cSRoman Divacky ".str"); 24762754fe60SDimitry Andric GV->setUnnamedAddr(true); 2477284c1978SDimitry Andric // Don't enforce the target's minimum global alignment, since the only use 2478284c1978SDimitry Andric // of the string is via this class initializer. 24793b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 24803b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 24816122f3e6SDimitry Andric Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2482f22ef01cSRoman Divacky 2483f22ef01cSRoman Divacky // String length. 24846122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2485f22ef01cSRoman Divacky Fields[2] = llvm::ConstantInt::get(Ty, StringLength); 2486f22ef01cSRoman Divacky 2487f22ef01cSRoman Divacky // The struct. 24886122f3e6SDimitry Andric C = llvm::ConstantStruct::get(NSConstantStringType, Fields); 2489f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2490f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2491f22ef01cSRoman Divacky "_unnamed_nsstring_"); 2492f22ef01cSRoman Divacky // FIXME. Fix section. 2493f22ef01cSRoman Divacky if (const char *Sect = 24947ae0e2c9SDimitry Andric LangOpts.ObjCRuntime.isNonFragile() 2495284c1978SDimitry Andric ? getTarget().getNSStringNonFragileABISection() 2496284c1978SDimitry Andric : getTarget().getNSStringSection()) 2497f22ef01cSRoman Divacky GV->setSection(Sect); 2498f22ef01cSRoman Divacky Entry.setValue(GV); 2499f22ef01cSRoman Divacky 2500f22ef01cSRoman Divacky return GV; 2501f22ef01cSRoman Divacky } 2502f22ef01cSRoman Divacky 25036122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() { 25046122f3e6SDimitry Andric if (ObjCFastEnumerationStateType.isNull()) { 25056122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 25066122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 25076122f3e6SDimitry Andric &Context.Idents.get("__objcFastEnumerationState")); 25086122f3e6SDimitry Andric D->startDefinition(); 25096122f3e6SDimitry Andric 25106122f3e6SDimitry Andric QualType FieldTypes[] = { 25116122f3e6SDimitry Andric Context.UnsignedLongTy, 25126122f3e6SDimitry Andric Context.getPointerType(Context.getObjCIdType()), 25136122f3e6SDimitry Andric Context.getPointerType(Context.UnsignedLongTy), 25146122f3e6SDimitry Andric Context.getConstantArrayType(Context.UnsignedLongTy, 25156122f3e6SDimitry Andric llvm::APInt(32, 5), ArrayType::Normal, 0) 25166122f3e6SDimitry Andric }; 25176122f3e6SDimitry Andric 25186122f3e6SDimitry Andric for (size_t i = 0; i < 4; ++i) { 25196122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, 25206122f3e6SDimitry Andric D, 25216122f3e6SDimitry Andric SourceLocation(), 25226122f3e6SDimitry Andric SourceLocation(), 0, 25236122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 25246122f3e6SDimitry Andric /*BitWidth=*/0, 25256122f3e6SDimitry Andric /*Mutable=*/false, 25267ae0e2c9SDimitry Andric ICIS_NoInit); 25276122f3e6SDimitry Andric Field->setAccess(AS_public); 25286122f3e6SDimitry Andric D->addDecl(Field); 25296122f3e6SDimitry Andric } 25306122f3e6SDimitry Andric 25316122f3e6SDimitry Andric D->completeDefinition(); 25326122f3e6SDimitry Andric ObjCFastEnumerationStateType = Context.getTagDeclType(D); 25336122f3e6SDimitry Andric } 25346122f3e6SDimitry Andric 25356122f3e6SDimitry Andric return ObjCFastEnumerationStateType; 25366122f3e6SDimitry Andric } 25376122f3e6SDimitry Andric 2538dff0c46cSDimitry Andric llvm::Constant * 2539dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { 2540dff0c46cSDimitry Andric assert(!E->getType()->isPointerType() && "Strings are always arrays"); 2541f22ef01cSRoman Divacky 2542dff0c46cSDimitry Andric // Don't emit it as the address of the string, emit the string data itself 2543dff0c46cSDimitry Andric // as an inline array. 2544dff0c46cSDimitry Andric if (E->getCharByteWidth() == 1) { 2545dff0c46cSDimitry Andric SmallString<64> Str(E->getString()); 2546f22ef01cSRoman Divacky 2547dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2548dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType()); 2549dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2550dff0c46cSDimitry Andric return llvm::ConstantDataArray::getString(VMContext, Str, false); 25516122f3e6SDimitry Andric } 2552f22ef01cSRoman Divacky 2553dff0c46cSDimitry Andric llvm::ArrayType *AType = 2554dff0c46cSDimitry Andric cast<llvm::ArrayType>(getTypes().ConvertType(E->getType())); 2555dff0c46cSDimitry Andric llvm::Type *ElemTy = AType->getElementType(); 2556dff0c46cSDimitry Andric unsigned NumElements = AType->getNumElements(); 2557f22ef01cSRoman Divacky 2558dff0c46cSDimitry Andric // Wide strings have either 2-byte or 4-byte elements. 2559dff0c46cSDimitry Andric if (ElemTy->getPrimitiveSizeInBits() == 16) { 2560dff0c46cSDimitry Andric SmallVector<uint16_t, 32> Elements; 2561dff0c46cSDimitry Andric Elements.reserve(NumElements); 2562dff0c46cSDimitry Andric 2563dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2564dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2565dff0c46cSDimitry Andric Elements.resize(NumElements); 2566dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2567dff0c46cSDimitry Andric } 2568dff0c46cSDimitry Andric 2569dff0c46cSDimitry Andric assert(ElemTy->getPrimitiveSizeInBits() == 32); 2570dff0c46cSDimitry Andric SmallVector<uint32_t, 32> Elements; 2571dff0c46cSDimitry Andric Elements.reserve(NumElements); 2572dff0c46cSDimitry Andric 2573dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2574dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2575dff0c46cSDimitry Andric Elements.resize(NumElements); 2576dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2577f22ef01cSRoman Divacky } 2578f22ef01cSRoman Divacky 2579f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromLiteral - Return a pointer to a 2580f22ef01cSRoman Divacky /// constant array for the given string literal. 2581f22ef01cSRoman Divacky llvm::Constant * 2582f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 2583284c1978SDimitry Andric CharUnits Align = getContext().getAlignOfGlobalVarInChars(S->getType()); 2584dff0c46cSDimitry Andric if (S->isAscii() || S->isUTF8()) { 2585dff0c46cSDimitry Andric SmallString<64> Str(S->getString()); 2586dff0c46cSDimitry Andric 2587dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2588dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType()); 2589dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2590dff0c46cSDimitry Andric return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity()); 2591f22ef01cSRoman Divacky } 2592dff0c46cSDimitry Andric 2593dff0c46cSDimitry Andric // FIXME: the following does not memoize wide strings. 2594dff0c46cSDimitry Andric llvm::Constant *C = GetConstantArrayFromStringLiteral(S); 2595dff0c46cSDimitry Andric llvm::GlobalVariable *GV = 2596dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(),C->getType(), 2597dff0c46cSDimitry Andric !LangOpts.WritableStrings, 2598dff0c46cSDimitry Andric llvm::GlobalValue::PrivateLinkage, 2599dff0c46cSDimitry Andric C,".str"); 2600dff0c46cSDimitry Andric 2601dff0c46cSDimitry Andric GV->setAlignment(Align.getQuantity()); 2602dff0c46cSDimitry Andric GV->setUnnamedAddr(true); 2603dff0c46cSDimitry Andric return GV; 2604f22ef01cSRoman Divacky } 2605f22ef01cSRoman Divacky 2606f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant 2607f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node. 2608f22ef01cSRoman Divacky llvm::Constant * 2609f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { 2610f22ef01cSRoman Divacky std::string Str; 2611f22ef01cSRoman Divacky getContext().getObjCEncodingForType(E->getEncodedType(), Str); 2612f22ef01cSRoman Divacky 2613f22ef01cSRoman Divacky return GetAddrOfConstantCString(Str); 2614f22ef01cSRoman Divacky } 2615f22ef01cSRoman Divacky 2616f22ef01cSRoman Divacky 2617f22ef01cSRoman Divacky /// GenerateWritableString -- Creates storage for a string literal. 26186122f3e6SDimitry Andric static llvm::GlobalVariable *GenerateStringLiteral(StringRef str, 2619f22ef01cSRoman Divacky bool constant, 2620f22ef01cSRoman Divacky CodeGenModule &CGM, 26216122f3e6SDimitry Andric const char *GlobalName, 26226122f3e6SDimitry Andric unsigned Alignment) { 2623f22ef01cSRoman Divacky // Create Constant for this string literal. Don't add a '\0'. 2624f22ef01cSRoman Divacky llvm::Constant *C = 2625dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false); 2626f22ef01cSRoman Divacky 2627f22ef01cSRoman Divacky // Create a global variable for this string 26282754fe60SDimitry Andric llvm::GlobalVariable *GV = 26292754fe60SDimitry Andric new llvm::GlobalVariable(CGM.getModule(), C->getType(), constant, 2630f22ef01cSRoman Divacky llvm::GlobalValue::PrivateLinkage, 2631f22ef01cSRoman Divacky C, GlobalName); 26326122f3e6SDimitry Andric GV->setAlignment(Alignment); 26332754fe60SDimitry Andric GV->setUnnamedAddr(true); 26342754fe60SDimitry Andric return GV; 2635f22ef01cSRoman Divacky } 2636f22ef01cSRoman Divacky 2637f22ef01cSRoman Divacky /// GetAddrOfConstantString - Returns a pointer to a character array 2638f22ef01cSRoman Divacky /// containing the literal. This contents are exactly that of the 2639f22ef01cSRoman Divacky /// given string, i.e. it will not be null terminated automatically; 2640f22ef01cSRoman Divacky /// see GetAddrOfConstantCString. Note that whether the result is 2641f22ef01cSRoman Divacky /// actually a pointer to an LLVM constant depends on 2642f22ef01cSRoman Divacky /// Feature.WriteableStrings. 2643f22ef01cSRoman Divacky /// 2644f22ef01cSRoman Divacky /// The result has pointer to array type. 26456122f3e6SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantString(StringRef Str, 26466122f3e6SDimitry Andric const char *GlobalName, 26476122f3e6SDimitry Andric unsigned Alignment) { 2648f22ef01cSRoman Divacky // Get the default prefix if a name wasn't specified. 2649f22ef01cSRoman Divacky if (!GlobalName) 2650f22ef01cSRoman Divacky GlobalName = ".str"; 2651f22ef01cSRoman Divacky 2652284c1978SDimitry Andric if (Alignment == 0) 2653284c1978SDimitry Andric Alignment = getContext().getAlignOfGlobalVarInChars(getContext().CharTy) 2654284c1978SDimitry Andric .getQuantity(); 2655284c1978SDimitry Andric 2656f22ef01cSRoman Divacky // Don't share any string literals if strings aren't constant. 2657dff0c46cSDimitry Andric if (LangOpts.WritableStrings) 26586122f3e6SDimitry Andric return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment); 2659f22ef01cSRoman Divacky 26606122f3e6SDimitry Andric llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = 26613b0f4066SDimitry Andric ConstantStringMap.GetOrCreateValue(Str); 2662f22ef01cSRoman Divacky 26636122f3e6SDimitry Andric if (llvm::GlobalVariable *GV = Entry.getValue()) { 26646122f3e6SDimitry Andric if (Alignment > GV->getAlignment()) { 26656122f3e6SDimitry Andric GV->setAlignment(Alignment); 26666122f3e6SDimitry Andric } 26676122f3e6SDimitry Andric return GV; 26686122f3e6SDimitry Andric } 2669f22ef01cSRoman Divacky 2670f22ef01cSRoman Divacky // Create a global variable for this. 2671dff0c46cSDimitry Andric llvm::GlobalVariable *GV = GenerateStringLiteral(Str, true, *this, GlobalName, 2672dff0c46cSDimitry Andric Alignment); 26736122f3e6SDimitry Andric Entry.setValue(GV); 26746122f3e6SDimitry Andric return GV; 2675f22ef01cSRoman Divacky } 2676f22ef01cSRoman Divacky 2677f22ef01cSRoman Divacky /// GetAddrOfConstantCString - Returns a pointer to a character 26783b0f4066SDimitry Andric /// array containing the literal and a terminating '\0' 2679f22ef01cSRoman Divacky /// character. The result has pointer to array type. 26803b0f4066SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &Str, 26816122f3e6SDimitry Andric const char *GlobalName, 26826122f3e6SDimitry Andric unsigned Alignment) { 26836122f3e6SDimitry Andric StringRef StrWithNull(Str.c_str(), Str.size() + 1); 26846122f3e6SDimitry Andric return GetAddrOfConstantString(StrWithNull, GlobalName, Alignment); 2685f22ef01cSRoman Divacky } 2686f22ef01cSRoman Divacky 2687f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized 2688f22ef01cSRoman Divacky /// properties for an implementation. 2689f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const 2690f22ef01cSRoman Divacky ObjCImplementationDecl *D) { 2691f22ef01cSRoman Divacky for (ObjCImplementationDecl::propimpl_iterator 2692f22ef01cSRoman Divacky i = D->propimpl_begin(), e = D->propimpl_end(); i != e; ++i) { 2693f22ef01cSRoman Divacky ObjCPropertyImplDecl *PID = *i; 2694f22ef01cSRoman Divacky 2695f22ef01cSRoman Divacky // Dynamic is just for type-checking. 2696f22ef01cSRoman Divacky if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 2697f22ef01cSRoman Divacky ObjCPropertyDecl *PD = PID->getPropertyDecl(); 2698f22ef01cSRoman Divacky 2699f22ef01cSRoman Divacky // Determine which methods need to be implemented, some may have 27003861d79fSDimitry Andric // been overridden. Note that ::isPropertyAccessor is not the method 2701f22ef01cSRoman Divacky // we want, that just indicates if the decl came from a 2702f22ef01cSRoman Divacky // property. What we want to know is if the method is defined in 2703f22ef01cSRoman Divacky // this implementation. 2704f22ef01cSRoman Divacky if (!D->getInstanceMethod(PD->getGetterName())) 2705f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCGetter( 2706f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2707f22ef01cSRoman Divacky if (!PD->isReadOnly() && 2708f22ef01cSRoman Divacky !D->getInstanceMethod(PD->getSetterName())) 2709f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCSetter( 2710f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2711f22ef01cSRoman Divacky } 2712f22ef01cSRoman Divacky } 2713f22ef01cSRoman Divacky } 2714f22ef01cSRoman Divacky 27153b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) { 27166122f3e6SDimitry Andric const ObjCInterfaceDecl *iface = impl->getClassInterface(); 27176122f3e6SDimitry Andric for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin(); 27183b0f4066SDimitry Andric ivar; ivar = ivar->getNextIvar()) 27193b0f4066SDimitry Andric if (ivar->getType().isDestructedType()) 27203b0f4066SDimitry Andric return true; 27213b0f4066SDimitry Andric 27223b0f4066SDimitry Andric return false; 27233b0f4066SDimitry Andric } 27243b0f4066SDimitry Andric 2725f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization 2726f22ef01cSRoman Divacky /// for an implementation. 2727f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) { 27283b0f4066SDimitry Andric // We might need a .cxx_destruct even if we don't have any ivar initializers. 27293b0f4066SDimitry Andric if (needsDestructMethod(D)) { 2730f22ef01cSRoman Divacky IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct"); 2731f22ef01cSRoman Divacky Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 27323b0f4066SDimitry Andric ObjCMethodDecl *DTORMethod = 27333b0f4066SDimitry Andric ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(), 27346122f3e6SDimitry Andric cxxSelector, getContext().VoidTy, 0, D, 27356122f3e6SDimitry Andric /*isInstance=*/true, /*isVariadic=*/false, 27363861d79fSDimitry Andric /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true, 27376122f3e6SDimitry Andric /*isDefined=*/false, ObjCMethodDecl::Required); 2738f22ef01cSRoman Divacky D->addInstanceMethod(DTORMethod); 2739f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false); 27403861d79fSDimitry Andric D->setHasDestructors(true); 27413b0f4066SDimitry Andric } 2742f22ef01cSRoman Divacky 27433b0f4066SDimitry Andric // If the implementation doesn't have any ivar initializers, we don't need 27443b0f4066SDimitry Andric // a .cxx_construct. 27453b0f4066SDimitry Andric if (D->getNumIvarInitializers() == 0) 27463b0f4066SDimitry Andric return; 27473b0f4066SDimitry Andric 27483b0f4066SDimitry Andric IdentifierInfo *II = &getContext().Idents.get(".cxx_construct"); 27493b0f4066SDimitry Andric Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 2750f22ef01cSRoman Divacky // The constructor returns 'self'. 2751f22ef01cSRoman Divacky ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(), 2752f22ef01cSRoman Divacky D->getLocation(), 27536122f3e6SDimitry Andric D->getLocation(), 27546122f3e6SDimitry Andric cxxSelector, 2755f22ef01cSRoman Divacky getContext().getObjCIdType(), 0, 27566122f3e6SDimitry Andric D, /*isInstance=*/true, 27576122f3e6SDimitry Andric /*isVariadic=*/false, 27583861d79fSDimitry Andric /*isPropertyAccessor=*/true, 27596122f3e6SDimitry Andric /*isImplicitlyDeclared=*/true, 27606122f3e6SDimitry Andric /*isDefined=*/false, 2761f22ef01cSRoman Divacky ObjCMethodDecl::Required); 2762f22ef01cSRoman Divacky D->addInstanceMethod(CTORMethod); 2763f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true); 27643861d79fSDimitry Andric D->setHasNonZeroConstructors(true); 2765f22ef01cSRoman Divacky } 2766f22ef01cSRoman Divacky 2767f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace. 2768f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) { 2769f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = ND->decls_begin(), E = ND->decls_end(); 2770f22ef01cSRoman Divacky I != E; ++I) 2771f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2772f22ef01cSRoman Divacky } 2773f22ef01cSRoman Divacky 2774f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec. 2775f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { 2776f22ef01cSRoman Divacky if (LSD->getLanguage() != LinkageSpecDecl::lang_c && 2777f22ef01cSRoman Divacky LSD->getLanguage() != LinkageSpecDecl::lang_cxx) { 2778f22ef01cSRoman Divacky ErrorUnsupported(LSD, "linkage spec"); 2779f22ef01cSRoman Divacky return; 2780f22ef01cSRoman Divacky } 2781f22ef01cSRoman Divacky 2782f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = LSD->decls_begin(), E = LSD->decls_end(); 27833861d79fSDimitry Andric I != E; ++I) { 27843861d79fSDimitry Andric // Meta-data for ObjC class includes references to implemented methods. 27853861d79fSDimitry Andric // Generate class's method definitions first. 27863861d79fSDimitry Andric if (ObjCImplDecl *OID = dyn_cast<ObjCImplDecl>(*I)) { 27873861d79fSDimitry Andric for (ObjCContainerDecl::method_iterator M = OID->meth_begin(), 27883861d79fSDimitry Andric MEnd = OID->meth_end(); 27893861d79fSDimitry Andric M != MEnd; ++M) 27903861d79fSDimitry Andric EmitTopLevelDecl(*M); 27913861d79fSDimitry Andric } 2792f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2793f22ef01cSRoman Divacky } 27943861d79fSDimitry Andric } 2795f22ef01cSRoman Divacky 2796f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration. 2797f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) { 2798f22ef01cSRoman Divacky // If an error has occurred, stop code generation, but continue 2799f22ef01cSRoman Divacky // parsing and semantic analysis (to ensure all warnings and errors 2800f22ef01cSRoman Divacky // are emitted). 2801f22ef01cSRoman Divacky if (Diags.hasErrorOccurred()) 2802f22ef01cSRoman Divacky return; 2803f22ef01cSRoman Divacky 2804f22ef01cSRoman Divacky // Ignore dependent declarations. 2805f22ef01cSRoman Divacky if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) 2806f22ef01cSRoman Divacky return; 2807f22ef01cSRoman Divacky 2808f22ef01cSRoman Divacky switch (D->getKind()) { 2809f22ef01cSRoman Divacky case Decl::CXXConversion: 2810f22ef01cSRoman Divacky case Decl::CXXMethod: 2811f22ef01cSRoman Divacky case Decl::Function: 2812f22ef01cSRoman Divacky // Skip function templates 28133b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 28143b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2815f22ef01cSRoman Divacky return; 2816f22ef01cSRoman Divacky 2817f22ef01cSRoman Divacky EmitGlobal(cast<FunctionDecl>(D)); 2818f22ef01cSRoman Divacky break; 2819f22ef01cSRoman Divacky 2820f22ef01cSRoman Divacky case Decl::Var: 2821f22ef01cSRoman Divacky EmitGlobal(cast<VarDecl>(D)); 2822f22ef01cSRoman Divacky break; 2823f22ef01cSRoman Divacky 28243b0f4066SDimitry Andric // Indirect fields from global anonymous structs and unions can be 28253b0f4066SDimitry Andric // ignored; only the actual variable requires IR gen support. 28263b0f4066SDimitry Andric case Decl::IndirectField: 28273b0f4066SDimitry Andric break; 28283b0f4066SDimitry Andric 2829f22ef01cSRoman Divacky // C++ Decls 2830f22ef01cSRoman Divacky case Decl::Namespace: 2831f22ef01cSRoman Divacky EmitNamespace(cast<NamespaceDecl>(D)); 2832f22ef01cSRoman Divacky break; 2833f22ef01cSRoman Divacky // No code generation needed. 2834f22ef01cSRoman Divacky case Decl::UsingShadow: 2835f22ef01cSRoman Divacky case Decl::Using: 2836f22ef01cSRoman Divacky case Decl::ClassTemplate: 2837f22ef01cSRoman Divacky case Decl::FunctionTemplate: 2838bd5abe19SDimitry Andric case Decl::TypeAliasTemplate: 2839f22ef01cSRoman Divacky case Decl::NamespaceAlias: 2840bd5abe19SDimitry Andric case Decl::Block: 2841139f7f9bSDimitry Andric case Decl::Empty: 2842f22ef01cSRoman Divacky break; 2843284c1978SDimitry Andric case Decl::UsingDirective: // using namespace X; [C++] 2844284c1978SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 2845284c1978SDimitry Andric DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D)); 2846284c1978SDimitry Andric return; 2847f22ef01cSRoman Divacky case Decl::CXXConstructor: 2848f22ef01cSRoman Divacky // Skip function templates 28493b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 28503b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2851f22ef01cSRoman Divacky return; 2852f22ef01cSRoman Divacky 2853f22ef01cSRoman Divacky EmitCXXConstructors(cast<CXXConstructorDecl>(D)); 2854f22ef01cSRoman Divacky break; 2855f22ef01cSRoman Divacky case Decl::CXXDestructor: 28563b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->isLateTemplateParsed()) 28573b0f4066SDimitry Andric return; 2858f22ef01cSRoman Divacky EmitCXXDestructors(cast<CXXDestructorDecl>(D)); 2859f22ef01cSRoman Divacky break; 2860f22ef01cSRoman Divacky 2861f22ef01cSRoman Divacky case Decl::StaticAssert: 2862f22ef01cSRoman Divacky // Nothing to do. 2863f22ef01cSRoman Divacky break; 2864f22ef01cSRoman Divacky 2865f22ef01cSRoman Divacky // Objective-C Decls 2866f22ef01cSRoman Divacky 2867f22ef01cSRoman Divacky // Forward declarations, no (immediate) code generation. 2868f22ef01cSRoman Divacky case Decl::ObjCInterface: 28697ae0e2c9SDimitry Andric case Decl::ObjCCategory: 2870f22ef01cSRoman Divacky break; 2871f22ef01cSRoman Divacky 2872dff0c46cSDimitry Andric case Decl::ObjCProtocol: { 2873dff0c46cSDimitry Andric ObjCProtocolDecl *Proto = cast<ObjCProtocolDecl>(D); 2874dff0c46cSDimitry Andric if (Proto->isThisDeclarationADefinition()) 2875dff0c46cSDimitry Andric ObjCRuntime->GenerateProtocol(Proto); 2876f22ef01cSRoman Divacky break; 2877dff0c46cSDimitry Andric } 2878f22ef01cSRoman Divacky 2879f22ef01cSRoman Divacky case Decl::ObjCCategoryImpl: 2880f22ef01cSRoman Divacky // Categories have properties but don't support synthesize so we 2881f22ef01cSRoman Divacky // can ignore them here. 28826122f3e6SDimitry Andric ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 2883f22ef01cSRoman Divacky break; 2884f22ef01cSRoman Divacky 2885f22ef01cSRoman Divacky case Decl::ObjCImplementation: { 2886f22ef01cSRoman Divacky ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D); 2887f22ef01cSRoman Divacky EmitObjCPropertyImplementations(OMD); 2888f22ef01cSRoman Divacky EmitObjCIvarInitializations(OMD); 28896122f3e6SDimitry Andric ObjCRuntime->GenerateClass(OMD); 2890dff0c46cSDimitry Andric // Emit global variable debug information. 2891dff0c46cSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 2892139f7f9bSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 2893139f7f9bSDimitry Andric DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( 2894139f7f9bSDimitry Andric OMD->getClassInterface()), OMD->getLocation()); 2895f22ef01cSRoman Divacky break; 2896f22ef01cSRoman Divacky } 2897f22ef01cSRoman Divacky case Decl::ObjCMethod: { 2898f22ef01cSRoman Divacky ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D); 2899f22ef01cSRoman Divacky // If this is not a prototype, emit the body. 2900f22ef01cSRoman Divacky if (OMD->getBody()) 2901f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCMethod(OMD); 2902f22ef01cSRoman Divacky break; 2903f22ef01cSRoman Divacky } 2904f22ef01cSRoman Divacky case Decl::ObjCCompatibleAlias: 2905dff0c46cSDimitry Andric ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D)); 2906f22ef01cSRoman Divacky break; 2907f22ef01cSRoman Divacky 2908f22ef01cSRoman Divacky case Decl::LinkageSpec: 2909f22ef01cSRoman Divacky EmitLinkageSpec(cast<LinkageSpecDecl>(D)); 2910f22ef01cSRoman Divacky break; 2911f22ef01cSRoman Divacky 2912f22ef01cSRoman Divacky case Decl::FileScopeAsm: { 2913f22ef01cSRoman Divacky FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D); 29146122f3e6SDimitry Andric StringRef AsmString = AD->getAsmString()->getString(); 2915f22ef01cSRoman Divacky 2916f22ef01cSRoman Divacky const std::string &S = getModule().getModuleInlineAsm(); 2917f22ef01cSRoman Divacky if (S.empty()) 2918f22ef01cSRoman Divacky getModule().setModuleInlineAsm(AsmString); 29197ae0e2c9SDimitry Andric else if (S.end()[-1] == '\n') 29206122f3e6SDimitry Andric getModule().setModuleInlineAsm(S + AsmString.str()); 2921f22ef01cSRoman Divacky else 2922f22ef01cSRoman Divacky getModule().setModuleInlineAsm(S + '\n' + AsmString.str()); 2923f22ef01cSRoman Divacky break; 2924f22ef01cSRoman Divacky } 2925f22ef01cSRoman Divacky 2926139f7f9bSDimitry Andric case Decl::Import: { 2927139f7f9bSDimitry Andric ImportDecl *Import = cast<ImportDecl>(D); 2928139f7f9bSDimitry Andric 2929139f7f9bSDimitry Andric // Ignore import declarations that come from imported modules. 2930139f7f9bSDimitry Andric if (clang::Module *Owner = Import->getOwningModule()) { 2931139f7f9bSDimitry Andric if (getLangOpts().CurrentModule.empty() || 2932139f7f9bSDimitry Andric Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) 2933139f7f9bSDimitry Andric break; 2934139f7f9bSDimitry Andric } 2935139f7f9bSDimitry Andric 2936139f7f9bSDimitry Andric ImportedModules.insert(Import->getImportedModule()); 2937139f7f9bSDimitry Andric break; 2938139f7f9bSDimitry Andric } 2939139f7f9bSDimitry Andric 2940f22ef01cSRoman Divacky default: 2941f22ef01cSRoman Divacky // Make sure we handled everything we should, every other kind is a 2942f22ef01cSRoman Divacky // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind 2943f22ef01cSRoman Divacky // function. Need to recode Decl::Kind to do that easily. 2944f22ef01cSRoman Divacky assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 2945f22ef01cSRoman Divacky } 2946f22ef01cSRoman Divacky } 2947ffd1746dSEd Schouten 2948ffd1746dSEd Schouten /// Turns the given pointer into a constant. 2949ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context, 2950ffd1746dSEd Schouten const void *Ptr) { 2951ffd1746dSEd Schouten uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr); 29526122f3e6SDimitry Andric llvm::Type *i64 = llvm::Type::getInt64Ty(Context); 2953ffd1746dSEd Schouten return llvm::ConstantInt::get(i64, PtrInt); 2954ffd1746dSEd Schouten } 2955ffd1746dSEd Schouten 2956ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM, 2957ffd1746dSEd Schouten llvm::NamedMDNode *&GlobalMetadata, 2958ffd1746dSEd Schouten GlobalDecl D, 2959ffd1746dSEd Schouten llvm::GlobalValue *Addr) { 2960ffd1746dSEd Schouten if (!GlobalMetadata) 2961ffd1746dSEd Schouten GlobalMetadata = 2962ffd1746dSEd Schouten CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs"); 2963ffd1746dSEd Schouten 2964ffd1746dSEd Schouten // TODO: should we report variant information for ctors/dtors? 2965ffd1746dSEd Schouten llvm::Value *Ops[] = { 2966ffd1746dSEd Schouten Addr, 2967ffd1746dSEd Schouten GetPointerConstant(CGM.getLLVMContext(), D.getDecl()) 2968ffd1746dSEd Schouten }; 29693b0f4066SDimitry Andric GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 2970ffd1746dSEd Schouten } 2971ffd1746dSEd Schouten 2972284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked 2973284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled 2974284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer 2975284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the 2976284c1978SDimitry Andric /// same translation unit. 2977284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() { 2978284c1978SDimitry Andric for (StaticExternCMap::iterator I = StaticExternCValues.begin(), 2979284c1978SDimitry Andric E = StaticExternCValues.end(); 2980284c1978SDimitry Andric I != E; ++I) { 2981284c1978SDimitry Andric IdentifierInfo *Name = I->first; 2982284c1978SDimitry Andric llvm::GlobalValue *Val = I->second; 2983284c1978SDimitry Andric if (Val && !getModule().getNamedValue(Name->getName())) 2984284c1978SDimitry Andric AddUsedGlobal(new llvm::GlobalAlias(Val->getType(), Val->getLinkage(), 2985284c1978SDimitry Andric Name->getName(), Val, &getModule())); 2986284c1978SDimitry Andric } 2987284c1978SDimitry Andric } 2988284c1978SDimitry Andric 2989ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the 2990ffd1746dSEd Schouten /// current module with the Decls they came from. This is useful for 2991ffd1746dSEd Schouten /// projects using IR gen as a subroutine. 2992ffd1746dSEd Schouten /// 2993ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly 2994ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata 2995ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'. 2996ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() { 2997ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 2998ffd1746dSEd Schouten 2999ffd1746dSEd Schouten // StaticLocalDeclMap 30006122f3e6SDimitry Andric for (llvm::DenseMap<GlobalDecl,StringRef>::iterator 3001ffd1746dSEd Schouten I = MangledDeclNames.begin(), E = MangledDeclNames.end(); 3002ffd1746dSEd Schouten I != E; ++I) { 3003ffd1746dSEd Schouten llvm::GlobalValue *Addr = getModule().getNamedValue(I->second); 3004ffd1746dSEd Schouten EmitGlobalDeclMetadata(*this, GlobalMetadata, I->first, Addr); 3005ffd1746dSEd Schouten } 3006ffd1746dSEd Schouten } 3007ffd1746dSEd Schouten 3008ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current 3009ffd1746dSEd Schouten /// function. 3010ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() { 3011ffd1746dSEd Schouten if (LocalDeclMap.empty()) return; 3012ffd1746dSEd Schouten 3013ffd1746dSEd Schouten llvm::LLVMContext &Context = getLLVMContext(); 3014ffd1746dSEd Schouten 3015ffd1746dSEd Schouten // Find the unique metadata ID for this name. 3016ffd1746dSEd Schouten unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr"); 3017ffd1746dSEd Schouten 3018ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 3019ffd1746dSEd Schouten 3020ffd1746dSEd Schouten for (llvm::DenseMap<const Decl*, llvm::Value*>::iterator 3021ffd1746dSEd Schouten I = LocalDeclMap.begin(), E = LocalDeclMap.end(); I != E; ++I) { 3022ffd1746dSEd Schouten const Decl *D = I->first; 3023ffd1746dSEd Schouten llvm::Value *Addr = I->second; 3024ffd1746dSEd Schouten 3025ffd1746dSEd Schouten if (llvm::AllocaInst *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) { 3026ffd1746dSEd Schouten llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D); 30273b0f4066SDimitry Andric Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr)); 3028ffd1746dSEd Schouten } else if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Addr)) { 3029ffd1746dSEd Schouten GlobalDecl GD = GlobalDecl(cast<VarDecl>(D)); 3030ffd1746dSEd Schouten EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV); 3031ffd1746dSEd Schouten } 3032ffd1746dSEd Schouten } 3033ffd1746dSEd Schouten } 3034e580952dSDimitry Andric 3035bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() { 3036bd5abe19SDimitry Andric if (!getCodeGenOpts().CoverageFile.empty()) { 3037bd5abe19SDimitry Andric if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { 3038bd5abe19SDimitry Andric llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); 3039bd5abe19SDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 3040bd5abe19SDimitry Andric llvm::MDString *CoverageFile = 3041bd5abe19SDimitry Andric llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); 3042bd5abe19SDimitry Andric for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { 3043bd5abe19SDimitry Andric llvm::MDNode *CU = CUNode->getOperand(i); 3044bd5abe19SDimitry Andric llvm::Value *node[] = { CoverageFile, CU }; 3045bd5abe19SDimitry Andric llvm::MDNode *N = llvm::MDNode::get(Ctx, node); 3046bd5abe19SDimitry Andric GCov->addOperand(N); 3047bd5abe19SDimitry Andric } 3048bd5abe19SDimitry Andric } 3049bd5abe19SDimitry Andric } 3050bd5abe19SDimitry Andric } 30513861d79fSDimitry Andric 30523861d79fSDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid, 30533861d79fSDimitry Andric QualType GuidType) { 30543861d79fSDimitry Andric // Sema has checked that all uuid strings are of the form 30553861d79fSDimitry Andric // "12345678-1234-1234-1234-1234567890ab". 30563861d79fSDimitry Andric assert(Uuid.size() == 36); 30573861d79fSDimitry Andric const char *Uuidstr = Uuid.data(); 30583861d79fSDimitry Andric for (int i = 0; i < 36; ++i) { 30593861d79fSDimitry Andric if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuidstr[i] == '-'); 3060139f7f9bSDimitry Andric else assert(isHexDigit(Uuidstr[i])); 30613861d79fSDimitry Andric } 30623861d79fSDimitry Andric 30633861d79fSDimitry Andric llvm::APInt Field0(32, StringRef(Uuidstr , 8), 16); 30643861d79fSDimitry Andric llvm::APInt Field1(16, StringRef(Uuidstr + 9, 4), 16); 30653861d79fSDimitry Andric llvm::APInt Field2(16, StringRef(Uuidstr + 14, 4), 16); 30663861d79fSDimitry Andric static const int Field3ValueOffsets[] = { 19, 21, 24, 26, 28, 30, 32, 34 }; 30673861d79fSDimitry Andric 30683861d79fSDimitry Andric APValue InitStruct(APValue::UninitStruct(), /*NumBases=*/0, /*NumFields=*/4); 30693861d79fSDimitry Andric InitStruct.getStructField(0) = APValue(llvm::APSInt(Field0)); 30703861d79fSDimitry Andric InitStruct.getStructField(1) = APValue(llvm::APSInt(Field1)); 30713861d79fSDimitry Andric InitStruct.getStructField(2) = APValue(llvm::APSInt(Field2)); 30723861d79fSDimitry Andric APValue& Arr = InitStruct.getStructField(3); 30733861d79fSDimitry Andric Arr = APValue(APValue::UninitArray(), 8, 8); 30743861d79fSDimitry Andric for (int t = 0; t < 8; ++t) 30753861d79fSDimitry Andric Arr.getArrayInitializedElt(t) = APValue(llvm::APSInt( 30763861d79fSDimitry Andric llvm::APInt(8, StringRef(Uuidstr + Field3ValueOffsets[t], 2), 16))); 30773861d79fSDimitry Andric 30783861d79fSDimitry Andric return EmitConstantValue(InitStruct, GuidType); 30793861d79fSDimitry Andric } 3080