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/Basic/TargetOptions.h" 39139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h" 40dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h" 41f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h" 42139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h" 43139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 44139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h" 45139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h" 46139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 47f22ef01cSRoman Divacky #include "llvm/Support/CallSite.h" 48139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h" 49f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 50139f7f9bSDimitry Andric #include "llvm/Target/Mangler.h" 51139f7f9bSDimitry Andric 52f22ef01cSRoman Divacky using namespace clang; 53f22ef01cSRoman Divacky using namespace CodeGen; 54f22ef01cSRoman Divacky 556122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata"; 566122f3e6SDimitry Andric 57e580952dSDimitry Andric static CGCXXABI &createCXXABI(CodeGenModule &CGM) { 58139f7f9bSDimitry Andric switch (CGM.getContext().getTargetInfo().getCXXABI().getKind()) { 59139f7f9bSDimitry Andric case TargetCXXABI::GenericAArch64: 60139f7f9bSDimitry Andric case TargetCXXABI::GenericARM: 61139f7f9bSDimitry Andric case TargetCXXABI::iOS: 62139f7f9bSDimitry Andric case TargetCXXABI::GenericItanium: 63139f7f9bSDimitry Andric return *CreateItaniumCXXABI(CGM); 64139f7f9bSDimitry Andric case TargetCXXABI::Microsoft: 65139f7f9bSDimitry Andric return *CreateMicrosoftCXXABI(CGM); 66e580952dSDimitry Andric } 67e580952dSDimitry Andric 68e580952dSDimitry Andric llvm_unreachable("invalid C++ ABI kind"); 69e580952dSDimitry Andric } 70e580952dSDimitry Andric 71f22ef01cSRoman Divacky 72f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 73139f7f9bSDimitry Andric const TargetOptions &TO, llvm::Module &M, 74139f7f9bSDimitry Andric const llvm::DataLayout &TD, 756122f3e6SDimitry Andric DiagnosticsEngine &diags) 76139f7f9bSDimitry Andric : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TargetOpts(TO), 77139f7f9bSDimitry Andric TheModule(M), TheDataLayout(TD), TheTargetCodeGenInfo(0), Diags(diags), 78e580952dSDimitry Andric ABI(createCXXABI(*this)), 79dff0c46cSDimitry Andric Types(*this), 802754fe60SDimitry Andric TBAA(0), 816122f3e6SDimitry Andric VTables(*this), ObjCRuntime(0), OpenCLRuntime(0), CUDARuntime(0), 82dff0c46cSDimitry Andric DebugInfo(0), ARCData(0), NoObjCARCExceptionsMetadata(0), 83dff0c46cSDimitry Andric RRData(0), CFConstantStringClassRef(0), 846122f3e6SDimitry Andric ConstantStringClassRef(0), NSConstantStringType(0), 85e580952dSDimitry Andric VMContext(M.getContext()), 86e580952dSDimitry Andric NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), 872754fe60SDimitry Andric BlockObjectAssign(0), BlockObjectDispose(0), 88139f7f9bSDimitry Andric BlockDescriptorType(0), GenericBlockLiteralType(0), 89139f7f9bSDimitry Andric LifetimeStartFn(0), LifetimeEndFn(0), 90139f7f9bSDimitry Andric SanitizerBlacklist(CGO.SanitizerBlacklistFile), 91139f7f9bSDimitry Andric SanOpts(SanitizerBlacklist.isIn(M) ? 92139f7f9bSDimitry Andric SanitizerOptions::Disabled : LangOpts.Sanitize) { 93dff0c46cSDimitry Andric 94dff0c46cSDimitry Andric // Initialize the type cache. 95dff0c46cSDimitry Andric llvm::LLVMContext &LLVMContext = M.getContext(); 96dff0c46cSDimitry Andric VoidTy = llvm::Type::getVoidTy(LLVMContext); 97dff0c46cSDimitry Andric Int8Ty = llvm::Type::getInt8Ty(LLVMContext); 98dff0c46cSDimitry Andric Int16Ty = llvm::Type::getInt16Ty(LLVMContext); 99dff0c46cSDimitry Andric Int32Ty = llvm::Type::getInt32Ty(LLVMContext); 100dff0c46cSDimitry Andric Int64Ty = llvm::Type::getInt64Ty(LLVMContext); 101dff0c46cSDimitry Andric FloatTy = llvm::Type::getFloatTy(LLVMContext); 102dff0c46cSDimitry Andric DoubleTy = llvm::Type::getDoubleTy(LLVMContext); 103dff0c46cSDimitry Andric PointerWidthInBits = C.getTargetInfo().getPointerWidth(0); 104dff0c46cSDimitry Andric PointerAlignInBytes = 105dff0c46cSDimitry Andric C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity(); 106dff0c46cSDimitry Andric IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth()); 107dff0c46cSDimitry Andric IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits); 108dff0c46cSDimitry Andric Int8PtrTy = Int8Ty->getPointerTo(0); 109dff0c46cSDimitry Andric Int8PtrPtrTy = Int8PtrTy->getPointerTo(0); 110dff0c46cSDimitry Andric 111139f7f9bSDimitry Andric RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC(); 112139f7f9bSDimitry Andric 113dff0c46cSDimitry Andric if (LangOpts.ObjC1) 1143b0f4066SDimitry Andric createObjCRuntime(); 115dff0c46cSDimitry Andric if (LangOpts.OpenCL) 1166122f3e6SDimitry Andric createOpenCLRuntime(); 117dff0c46cSDimitry Andric if (LangOpts.CUDA) 1186122f3e6SDimitry Andric createCUDARuntime(); 119f22ef01cSRoman Divacky 1207ae0e2c9SDimitry Andric // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0. 121139f7f9bSDimitry Andric if (SanOpts.Thread || 1227ae0e2c9SDimitry Andric (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)) 1237ae0e2c9SDimitry Andric TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(), 1242754fe60SDimitry Andric ABI.getMangleContext()); 1252754fe60SDimitry Andric 1263b0f4066SDimitry Andric // If debug info or coverage generation is enabled, create the CGDebugInfo 1273b0f4066SDimitry Andric // object. 1283861d79fSDimitry Andric if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo || 1297ae0e2c9SDimitry Andric CodeGenOpts.EmitGcovArcs || 1303b0f4066SDimitry Andric CodeGenOpts.EmitGcovNotes) 1313b0f4066SDimitry Andric DebugInfo = new CGDebugInfo(*this); 1322754fe60SDimitry Andric 1332754fe60SDimitry Andric Block.GlobalUniqueCount = 0; 1342754fe60SDimitry Andric 135dff0c46cSDimitry Andric if (C.getLangOpts().ObjCAutoRefCount) 13617a519f9SDimitry Andric ARCData = new ARCEntrypoints(); 13717a519f9SDimitry Andric RRData = new RREntrypoints(); 138f22ef01cSRoman Divacky } 139f22ef01cSRoman Divacky 140f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() { 1416122f3e6SDimitry Andric delete ObjCRuntime; 1426122f3e6SDimitry Andric delete OpenCLRuntime; 1436122f3e6SDimitry Andric delete CUDARuntime; 1446122f3e6SDimitry Andric delete TheTargetCodeGenInfo; 145e580952dSDimitry Andric delete &ABI; 1462754fe60SDimitry Andric delete TBAA; 147f22ef01cSRoman Divacky delete DebugInfo; 14817a519f9SDimitry Andric delete ARCData; 14917a519f9SDimitry Andric delete RRData; 150f22ef01cSRoman Divacky } 151f22ef01cSRoman Divacky 152f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() { 1537ae0e2c9SDimitry Andric // This is just isGNUFamily(), but we want to force implementors of 1547ae0e2c9SDimitry Andric // new ABIs to decide how best to do this. 1557ae0e2c9SDimitry Andric switch (LangOpts.ObjCRuntime.getKind()) { 1567ae0e2c9SDimitry Andric case ObjCRuntime::GNUstep: 1577ae0e2c9SDimitry Andric case ObjCRuntime::GCC: 1587ae0e2c9SDimitry Andric case ObjCRuntime::ObjFW: 1596122f3e6SDimitry Andric ObjCRuntime = CreateGNUObjCRuntime(*this); 1607ae0e2c9SDimitry Andric return; 1617ae0e2c9SDimitry Andric 1627ae0e2c9SDimitry Andric case ObjCRuntime::FragileMacOSX: 1637ae0e2c9SDimitry Andric case ObjCRuntime::MacOSX: 1647ae0e2c9SDimitry Andric case ObjCRuntime::iOS: 1656122f3e6SDimitry Andric ObjCRuntime = CreateMacObjCRuntime(*this); 1667ae0e2c9SDimitry Andric return; 1677ae0e2c9SDimitry Andric } 1687ae0e2c9SDimitry Andric llvm_unreachable("bad runtime kind"); 1696122f3e6SDimitry Andric } 1706122f3e6SDimitry Andric 1716122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() { 1726122f3e6SDimitry Andric OpenCLRuntime = new CGOpenCLRuntime(*this); 1736122f3e6SDimitry Andric } 1746122f3e6SDimitry Andric 1756122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() { 1766122f3e6SDimitry Andric CUDARuntime = CreateNVCUDARuntime(*this); 177f22ef01cSRoman Divacky } 178f22ef01cSRoman Divacky 179f22ef01cSRoman Divacky void CodeGenModule::Release() { 180f22ef01cSRoman Divacky EmitDeferred(); 181f22ef01cSRoman Divacky EmitCXXGlobalInitFunc(); 182f22ef01cSRoman Divacky EmitCXXGlobalDtorFunc(); 1836122f3e6SDimitry Andric if (ObjCRuntime) 1846122f3e6SDimitry Andric if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction()) 185f22ef01cSRoman Divacky AddGlobalCtor(ObjCInitFunction); 186f22ef01cSRoman Divacky EmitCtorList(GlobalCtors, "llvm.global_ctors"); 187f22ef01cSRoman Divacky EmitCtorList(GlobalDtors, "llvm.global_dtors"); 1886122f3e6SDimitry Andric EmitGlobalAnnotations(); 189f22ef01cSRoman Divacky EmitLLVMUsed(); 190ffd1746dSEd Schouten 191139f7f9bSDimitry Andric if (CodeGenOpts.ModulesAutolink) { 192139f7f9bSDimitry Andric EmitModuleLinkOptions(); 193139f7f9bSDimitry Andric } 194139f7f9bSDimitry Andric 1952754fe60SDimitry Andric SimplifyPersonality(); 1962754fe60SDimitry Andric 197ffd1746dSEd Schouten if (getCodeGenOpts().EmitDeclMetadata) 198ffd1746dSEd Schouten EmitDeclMetadata(); 199bd5abe19SDimitry Andric 200bd5abe19SDimitry Andric if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) 201bd5abe19SDimitry Andric EmitCoverageFile(); 2026122f3e6SDimitry Andric 2036122f3e6SDimitry Andric if (DebugInfo) 2046122f3e6SDimitry Andric DebugInfo->finalize(); 205f22ef01cSRoman Divacky } 206f22ef01cSRoman Divacky 2073b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { 2083b0f4066SDimitry Andric // Make sure that this type is translated. 2093b0f4066SDimitry Andric Types.UpdateCompletedType(TD); 2103b0f4066SDimitry Andric } 2113b0f4066SDimitry Andric 2122754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) { 2132754fe60SDimitry Andric if (!TBAA) 2142754fe60SDimitry Andric return 0; 2152754fe60SDimitry Andric return TBAA->getTBAAInfo(QTy); 2162754fe60SDimitry Andric } 2172754fe60SDimitry Andric 218dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() { 219dff0c46cSDimitry Andric if (!TBAA) 220dff0c46cSDimitry Andric return 0; 221dff0c46cSDimitry Andric return TBAA->getTBAAInfoForVTablePtr(); 222dff0c46cSDimitry Andric } 223dff0c46cSDimitry Andric 2243861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) { 2253861d79fSDimitry Andric if (!TBAA) 2263861d79fSDimitry Andric return 0; 2273861d79fSDimitry Andric return TBAA->getTBAAStructInfo(QTy); 2283861d79fSDimitry Andric } 2293861d79fSDimitry Andric 230139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) { 231139f7f9bSDimitry Andric if (!TBAA) 232139f7f9bSDimitry Andric return 0; 233139f7f9bSDimitry Andric return TBAA->getTBAAStructTypeInfo(QTy); 234139f7f9bSDimitry Andric } 235139f7f9bSDimitry Andric 236139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy, 237139f7f9bSDimitry Andric llvm::MDNode *AccessN, 238139f7f9bSDimitry Andric uint64_t O) { 239139f7f9bSDimitry Andric if (!TBAA) 240139f7f9bSDimitry Andric return 0; 241139f7f9bSDimitry Andric return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O); 242139f7f9bSDimitry Andric } 243139f7f9bSDimitry Andric 2442754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst, 2452754fe60SDimitry Andric llvm::MDNode *TBAAInfo) { 2462754fe60SDimitry Andric Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo); 2472754fe60SDimitry Andric } 2482754fe60SDimitry Andric 249f22ef01cSRoman Divacky bool CodeGenModule::isTargetDarwin() const { 2506122f3e6SDimitry Andric return getContext().getTargetInfo().getTriple().isOSDarwin(); 2513b0f4066SDimitry Andric } 2523b0f4066SDimitry Andric 2536122f3e6SDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef error) { 2546122f3e6SDimitry Andric unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, error); 2553b0f4066SDimitry Andric getDiags().Report(Context.getFullLoc(loc), diagID); 256f22ef01cSRoman Divacky } 257f22ef01cSRoman Divacky 258f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 259f22ef01cSRoman Divacky /// specified stmt yet. 260f22ef01cSRoman Divacky void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, 261f22ef01cSRoman Divacky bool OmitOnError) { 262f22ef01cSRoman Divacky if (OmitOnError && getDiags().hasErrorOccurred()) 263f22ef01cSRoman Divacky return; 2646122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 265f22ef01cSRoman Divacky "cannot compile this %0 yet"); 266f22ef01cSRoman Divacky std::string Msg = Type; 267f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID) 268f22ef01cSRoman Divacky << Msg << S->getSourceRange(); 269f22ef01cSRoman Divacky } 270f22ef01cSRoman Divacky 271f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the 272f22ef01cSRoman Divacky /// specified decl yet. 273f22ef01cSRoman Divacky void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, 274f22ef01cSRoman Divacky bool OmitOnError) { 275f22ef01cSRoman Divacky if (OmitOnError && getDiags().hasErrorOccurred()) 276f22ef01cSRoman Divacky return; 2776122f3e6SDimitry Andric unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, 278f22ef01cSRoman Divacky "cannot compile this %0 yet"); 279f22ef01cSRoman Divacky std::string Msg = Type; 280f22ef01cSRoman Divacky getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; 281f22ef01cSRoman Divacky } 282f22ef01cSRoman Divacky 28317a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) { 28417a519f9SDimitry Andric return llvm::ConstantInt::get(SizeTy, size.getQuantity()); 28517a519f9SDimitry Andric } 28617a519f9SDimitry Andric 287f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, 2882754fe60SDimitry Andric const NamedDecl *D) const { 289f22ef01cSRoman Divacky // Internal definitions always have default visibility. 290f22ef01cSRoman Divacky if (GV->hasLocalLinkage()) { 291f22ef01cSRoman Divacky GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 292f22ef01cSRoman Divacky return; 293f22ef01cSRoman Divacky } 294f22ef01cSRoman Divacky 2952754fe60SDimitry Andric // Set visibility for definitions. 296139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 297139f7f9bSDimitry Andric if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage()) 298139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 299f22ef01cSRoman Divacky } 300f22ef01cSRoman Divacky 3017ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { 3027ae0e2c9SDimitry Andric return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S) 3037ae0e2c9SDimitry Andric .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel) 3047ae0e2c9SDimitry Andric .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel) 3057ae0e2c9SDimitry Andric .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel) 3067ae0e2c9SDimitry Andric .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel); 3077ae0e2c9SDimitry Andric } 3087ae0e2c9SDimitry Andric 3097ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel( 3107ae0e2c9SDimitry Andric CodeGenOptions::TLSModel M) { 3117ae0e2c9SDimitry Andric switch (M) { 3127ae0e2c9SDimitry Andric case CodeGenOptions::GeneralDynamicTLSModel: 3137ae0e2c9SDimitry Andric return llvm::GlobalVariable::GeneralDynamicTLSModel; 3147ae0e2c9SDimitry Andric case CodeGenOptions::LocalDynamicTLSModel: 3157ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalDynamicTLSModel; 3167ae0e2c9SDimitry Andric case CodeGenOptions::InitialExecTLSModel: 3177ae0e2c9SDimitry Andric return llvm::GlobalVariable::InitialExecTLSModel; 3187ae0e2c9SDimitry Andric case CodeGenOptions::LocalExecTLSModel: 3197ae0e2c9SDimitry Andric return llvm::GlobalVariable::LocalExecTLSModel; 3207ae0e2c9SDimitry Andric } 3217ae0e2c9SDimitry Andric llvm_unreachable("Invalid TLS model!"); 3227ae0e2c9SDimitry Andric } 3237ae0e2c9SDimitry Andric 3247ae0e2c9SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, 3257ae0e2c9SDimitry Andric const VarDecl &D) const { 3267ae0e2c9SDimitry Andric assert(D.isThreadSpecified() && "setting TLS mode on non-TLS var!"); 3277ae0e2c9SDimitry Andric 3287ae0e2c9SDimitry Andric llvm::GlobalVariable::ThreadLocalMode TLM; 3293861d79fSDimitry Andric TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel()); 3307ae0e2c9SDimitry Andric 3317ae0e2c9SDimitry Andric // Override the TLS model if it is explicitly specified. 3327ae0e2c9SDimitry Andric if (D.hasAttr<TLSModelAttr>()) { 3337ae0e2c9SDimitry Andric const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>(); 3347ae0e2c9SDimitry Andric TLM = GetLLVMTLSModel(Attr->getModel()); 3357ae0e2c9SDimitry Andric } 3367ae0e2c9SDimitry Andric 3377ae0e2c9SDimitry Andric GV->setThreadLocalMode(TLM); 3387ae0e2c9SDimitry Andric } 3397ae0e2c9SDimitry Andric 340e580952dSDimitry Andric /// Set the symbol visibility of type information (vtable and RTTI) 341e580952dSDimitry Andric /// associated with the given type. 342e580952dSDimitry Andric void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, 343e580952dSDimitry Andric const CXXRecordDecl *RD, 3442754fe60SDimitry Andric TypeVisibilityKind TVK) const { 345e580952dSDimitry Andric setGlobalVisibility(GV, RD); 346e580952dSDimitry Andric 347e580952dSDimitry Andric if (!CodeGenOpts.HiddenWeakVTables) 348e580952dSDimitry Andric return; 349e580952dSDimitry Andric 3502754fe60SDimitry Andric // We never want to drop the visibility for RTTI names. 3512754fe60SDimitry Andric if (TVK == TVK_ForRTTIName) 3522754fe60SDimitry Andric return; 3532754fe60SDimitry Andric 354e580952dSDimitry Andric // We want to drop the visibility to hidden for weak type symbols. 355e580952dSDimitry Andric // This isn't possible if there might be unresolved references 356e580952dSDimitry Andric // elsewhere that rely on this symbol being visible. 357e580952dSDimitry Andric 358e580952dSDimitry Andric // This should be kept roughly in sync with setThunkVisibility 359e580952dSDimitry Andric // in CGVTables.cpp. 360e580952dSDimitry Andric 361e580952dSDimitry Andric // Preconditions. 3622754fe60SDimitry Andric if (GV->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage || 363e580952dSDimitry Andric GV->getVisibility() != llvm::GlobalVariable::DefaultVisibility) 364e580952dSDimitry Andric return; 365e580952dSDimitry Andric 366e580952dSDimitry Andric // Don't override an explicit visibility attribute. 367139f7f9bSDimitry Andric if (RD->getExplicitVisibility(NamedDecl::VisibilityForType)) 368e580952dSDimitry Andric return; 369e580952dSDimitry Andric 370e580952dSDimitry Andric switch (RD->getTemplateSpecializationKind()) { 371e580952dSDimitry Andric // We have to disable the optimization if this is an EI definition 372e580952dSDimitry Andric // because there might be EI declarations in other shared objects. 373e580952dSDimitry Andric case TSK_ExplicitInstantiationDefinition: 374e580952dSDimitry Andric case TSK_ExplicitInstantiationDeclaration: 375e580952dSDimitry Andric return; 376e580952dSDimitry Andric 377e580952dSDimitry Andric // Every use of a non-template class's type information has to emit it. 378e580952dSDimitry Andric case TSK_Undeclared: 379e580952dSDimitry Andric break; 380e580952dSDimitry Andric 381e580952dSDimitry Andric // In theory, implicit instantiations can ignore the possibility of 382e580952dSDimitry Andric // an explicit instantiation declaration because there necessarily 383e580952dSDimitry Andric // must be an EI definition somewhere with default visibility. In 384e580952dSDimitry Andric // practice, it's possible to have an explicit instantiation for 385e580952dSDimitry Andric // an arbitrary template class, and linkers aren't necessarily able 386e580952dSDimitry Andric // to deal with mixed-visibility symbols. 387e580952dSDimitry Andric case TSK_ExplicitSpecialization: 388e580952dSDimitry Andric case TSK_ImplicitInstantiation: 389e580952dSDimitry Andric return; 390e580952dSDimitry Andric } 391e580952dSDimitry Andric 392e580952dSDimitry Andric // If there's a key function, there may be translation units 393e580952dSDimitry Andric // that don't have the key function's definition. But ignore 394e580952dSDimitry Andric // this if we're emitting RTTI under -fno-rtti. 395dff0c46cSDimitry Andric if (!(TVK != TVK_ForRTTI) || LangOpts.RTTI) { 396139f7f9bSDimitry Andric // FIXME: what should we do if we "lose" the key function during 397139f7f9bSDimitry Andric // the emission of the file? 398139f7f9bSDimitry Andric if (Context.getCurrentKeyFunction(RD)) 399e580952dSDimitry Andric return; 4002754fe60SDimitry Andric } 401e580952dSDimitry Andric 402e580952dSDimitry Andric // Otherwise, drop the visibility to hidden. 403e580952dSDimitry Andric GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 4042754fe60SDimitry Andric GV->setUnnamedAddr(true); 405e580952dSDimitry Andric } 406e580952dSDimitry Andric 4076122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) { 408f22ef01cSRoman Divacky const NamedDecl *ND = cast<NamedDecl>(GD.getDecl()); 409f22ef01cSRoman Divacky 4106122f3e6SDimitry Andric StringRef &Str = MangledDeclNames[GD.getCanonicalDecl()]; 411ffd1746dSEd Schouten if (!Str.empty()) 412ffd1746dSEd Schouten return Str; 413f22ef01cSRoman Divacky 414e580952dSDimitry Andric if (!getCXXABI().getMangleContext().shouldMangleDeclName(ND)) { 415ffd1746dSEd Schouten IdentifierInfo *II = ND->getIdentifier(); 416ffd1746dSEd Schouten assert(II && "Attempt to mangle unnamed decl."); 417ffd1746dSEd Schouten 418ffd1746dSEd Schouten Str = II->getName(); 419ffd1746dSEd Schouten return Str; 420f22ef01cSRoman Divacky } 421f22ef01cSRoman Divacky 422dff0c46cSDimitry Andric SmallString<256> Buffer; 4232754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer); 424ffd1746dSEd Schouten if (const CXXConstructorDecl *D = dyn_cast<CXXConstructorDecl>(ND)) 4252754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out); 426ffd1746dSEd Schouten else if (const CXXDestructorDecl *D = dyn_cast<CXXDestructorDecl>(ND)) 4272754fe60SDimitry Andric getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out); 428ffd1746dSEd Schouten else if (const BlockDecl *BD = dyn_cast<BlockDecl>(ND)) 4297ae0e2c9SDimitry Andric getCXXABI().getMangleContext().mangleBlock(BD, Out, 4307ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl())); 431ffd1746dSEd Schouten else 4322754fe60SDimitry Andric getCXXABI().getMangleContext().mangleName(ND, Out); 433ffd1746dSEd Schouten 434ffd1746dSEd Schouten // Allocate space for the mangled name. 4352754fe60SDimitry Andric Out.flush(); 436ffd1746dSEd Schouten size_t Length = Buffer.size(); 437ffd1746dSEd Schouten char *Name = MangledNamesAllocator.Allocate<char>(Length); 438ffd1746dSEd Schouten std::copy(Buffer.begin(), Buffer.end(), Name); 439ffd1746dSEd Schouten 4406122f3e6SDimitry Andric Str = StringRef(Name, Length); 441ffd1746dSEd Schouten 442ffd1746dSEd Schouten return Str; 443ffd1746dSEd Schouten } 444ffd1746dSEd Schouten 4452754fe60SDimitry Andric void CodeGenModule::getBlockMangledName(GlobalDecl GD, MangleBuffer &Buffer, 446ffd1746dSEd Schouten const BlockDecl *BD) { 4472754fe60SDimitry Andric MangleContext &MangleCtx = getCXXABI().getMangleContext(); 4482754fe60SDimitry Andric const Decl *D = GD.getDecl(); 4492754fe60SDimitry Andric llvm::raw_svector_ostream Out(Buffer.getBuffer()); 4502754fe60SDimitry Andric if (D == 0) 4517ae0e2c9SDimitry Andric MangleCtx.mangleGlobalBlock(BD, 4527ae0e2c9SDimitry Andric dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out); 4532754fe60SDimitry Andric else if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D)) 4542754fe60SDimitry Andric MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out); 4552754fe60SDimitry Andric else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) 4562754fe60SDimitry Andric MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out); 4572754fe60SDimitry Andric else 4582754fe60SDimitry Andric MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out); 459f22ef01cSRoman Divacky } 460f22ef01cSRoman Divacky 4616122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) { 462f22ef01cSRoman Divacky return getModule().getNamedValue(Name); 463f22ef01cSRoman Divacky } 464f22ef01cSRoman Divacky 465f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before 466f22ef01cSRoman Divacky /// main() runs. 467f22ef01cSRoman Divacky void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) { 468f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 469f22ef01cSRoman Divacky GlobalCtors.push_back(std::make_pair(Ctor, Priority)); 470f22ef01cSRoman Divacky } 471f22ef01cSRoman Divacky 472f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called 473f22ef01cSRoman Divacky /// when the module is unloaded. 474f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) { 475f22ef01cSRoman Divacky // FIXME: Type coercion of void()* types. 476f22ef01cSRoman Divacky GlobalDtors.push_back(std::make_pair(Dtor, Priority)); 477f22ef01cSRoman Divacky } 478f22ef01cSRoman Divacky 479f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { 480f22ef01cSRoman Divacky // Ctor function type is void()*. 481bd5abe19SDimitry Andric llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); 482f22ef01cSRoman Divacky llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); 483f22ef01cSRoman Divacky 484f22ef01cSRoman Divacky // Get the type of a ctor entry, { i32, void ()* }. 485f22ef01cSRoman Divacky llvm::StructType *CtorStructTy = 486dff0c46cSDimitry Andric llvm::StructType::get(Int32Ty, llvm::PointerType::getUnqual(CtorFTy), NULL); 487f22ef01cSRoman Divacky 488f22ef01cSRoman Divacky // Construct the constructor and destructor arrays. 489dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> Ctors; 490f22ef01cSRoman Divacky for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { 491dff0c46cSDimitry Andric llvm::Constant *S[] = { 492dff0c46cSDimitry Andric llvm::ConstantInt::get(Int32Ty, I->second, false), 493dff0c46cSDimitry Andric llvm::ConstantExpr::getBitCast(I->first, CtorPFTy) 494dff0c46cSDimitry Andric }; 495f22ef01cSRoman Divacky Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S)); 496f22ef01cSRoman Divacky } 497f22ef01cSRoman Divacky 498f22ef01cSRoman Divacky if (!Ctors.empty()) { 499f22ef01cSRoman Divacky llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size()); 500f22ef01cSRoman Divacky new llvm::GlobalVariable(TheModule, AT, false, 501f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 502f22ef01cSRoman Divacky llvm::ConstantArray::get(AT, Ctors), 503f22ef01cSRoman Divacky GlobalName); 504f22ef01cSRoman Divacky } 505f22ef01cSRoman Divacky } 506f22ef01cSRoman Divacky 507f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes 508f22ef01cSRoman Divacky CodeGenModule::getFunctionLinkage(const FunctionDecl *D) { 509e580952dSDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForFunction(D); 510f22ef01cSRoman Divacky 511ffd1746dSEd Schouten if (Linkage == GVA_Internal) 512f22ef01cSRoman Divacky return llvm::Function::InternalLinkage; 513ffd1746dSEd Schouten 514ffd1746dSEd Schouten if (D->hasAttr<DLLExportAttr>()) 515f22ef01cSRoman Divacky return llvm::Function::DLLExportLinkage; 516ffd1746dSEd Schouten 517ffd1746dSEd Schouten if (D->hasAttr<WeakAttr>()) 518f22ef01cSRoman Divacky return llvm::Function::WeakAnyLinkage; 519ffd1746dSEd Schouten 520f22ef01cSRoman Divacky // In C99 mode, 'inline' functions are guaranteed to have a strong 521f22ef01cSRoman Divacky // definition somewhere else, so we can use available_externally linkage. 522ffd1746dSEd Schouten if (Linkage == GVA_C99Inline) 523f22ef01cSRoman Divacky return llvm::Function::AvailableExternallyLinkage; 524ffd1746dSEd Schouten 5256122f3e6SDimitry Andric // Note that Apple's kernel linker doesn't support symbol 5266122f3e6SDimitry Andric // coalescing, so we need to avoid linkonce and weak linkages there. 5276122f3e6SDimitry Andric // Normally, this means we just map to internal, but for explicit 5286122f3e6SDimitry Andric // instantiations we'll map to external. 5296122f3e6SDimitry Andric 530f22ef01cSRoman Divacky // In C++, the compiler has to emit a definition in every translation unit 531f22ef01cSRoman Divacky // that references the function. We should use linkonce_odr because 532f22ef01cSRoman Divacky // a) if all references in this translation unit are optimized away, we 533f22ef01cSRoman Divacky // don't need to codegen it. b) if the function persists, it needs to be 534f22ef01cSRoman Divacky // merged with other definitions. c) C++ has the ODR, so we know the 535f22ef01cSRoman Divacky // definition is dependable. 536ffd1746dSEd Schouten if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 537dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 5382754fe60SDimitry Andric ? llvm::Function::LinkOnceODRLinkage 5392754fe60SDimitry Andric : llvm::Function::InternalLinkage; 540ffd1746dSEd Schouten 541f22ef01cSRoman Divacky // An explicit instantiation of a template has weak linkage, since 542f22ef01cSRoman Divacky // explicit instantiations can occur in multiple translation units 543f22ef01cSRoman Divacky // and must all be equivalent. However, we are not allowed to 544f22ef01cSRoman Divacky // throw away these explicit instantiations. 545ffd1746dSEd Schouten if (Linkage == GVA_ExplicitTemplateInstantiation) 546dff0c46cSDimitry Andric return !Context.getLangOpts().AppleKext 5472754fe60SDimitry Andric ? llvm::Function::WeakODRLinkage 5486122f3e6SDimitry Andric : llvm::Function::ExternalLinkage; 549ffd1746dSEd Schouten 550f22ef01cSRoman Divacky // Otherwise, we have strong external linkage. 551ffd1746dSEd Schouten assert(Linkage == GVA_StrongExternal); 552f22ef01cSRoman Divacky return llvm::Function::ExternalLinkage; 553f22ef01cSRoman Divacky } 554f22ef01cSRoman Divacky 555f22ef01cSRoman Divacky 556f22ef01cSRoman Divacky /// SetFunctionDefinitionAttributes - Set attributes for a global. 557f22ef01cSRoman Divacky /// 558f22ef01cSRoman Divacky /// FIXME: This is currently only done for aliases and functions, but not for 559f22ef01cSRoman Divacky /// variables (these details are set in EmitGlobalVarDefinition for variables). 560f22ef01cSRoman Divacky void CodeGenModule::SetFunctionDefinitionAttributes(const FunctionDecl *D, 561f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 562f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 563f22ef01cSRoman Divacky } 564f22ef01cSRoman Divacky 565f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D, 566f22ef01cSRoman Divacky const CGFunctionInfo &Info, 567f22ef01cSRoman Divacky llvm::Function *F) { 568f22ef01cSRoman Divacky unsigned CallingConv; 569f22ef01cSRoman Divacky AttributeListType AttributeList; 570139f7f9bSDimitry Andric ConstructAttributeList(Info, D, AttributeList, CallingConv, false); 571139f7f9bSDimitry Andric F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList)); 572f22ef01cSRoman Divacky F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); 573f22ef01cSRoman Divacky } 574f22ef01cSRoman Divacky 5756122f3e6SDimitry Andric /// Determines whether the language options require us to model 5766122f3e6SDimitry Andric /// unwind exceptions. We treat -fexceptions as mandating this 5776122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions 5786122f3e6SDimitry Andric /// enabled. This means, for example, that C with -fexceptions 5796122f3e6SDimitry Andric /// enables this. 580dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) { 5816122f3e6SDimitry Andric // If exceptions are completely disabled, obviously this is false. 582dff0c46cSDimitry Andric if (!LangOpts.Exceptions) return false; 5836122f3e6SDimitry Andric 5846122f3e6SDimitry Andric // If C++ exceptions are enabled, this is true. 585dff0c46cSDimitry Andric if (LangOpts.CXXExceptions) return true; 5866122f3e6SDimitry Andric 5876122f3e6SDimitry Andric // If ObjC exceptions are enabled, this depends on the ABI. 588dff0c46cSDimitry Andric if (LangOpts.ObjCExceptions) { 5897ae0e2c9SDimitry Andric return LangOpts.ObjCRuntime.hasUnwindExceptions(); 5906122f3e6SDimitry Andric } 5916122f3e6SDimitry Andric 5926122f3e6SDimitry Andric return true; 5936122f3e6SDimitry Andric } 5946122f3e6SDimitry Andric 595f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, 596f22ef01cSRoman Divacky llvm::Function *F) { 597bd5abe19SDimitry Andric if (CodeGenOpts.UnwindTables) 598bd5abe19SDimitry Andric F->setHasUWTable(); 599bd5abe19SDimitry Andric 600dff0c46cSDimitry Andric if (!hasUnwindExceptions(LangOpts)) 601139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoUnwind); 602f22ef01cSRoman Divacky 6036122f3e6SDimitry Andric if (D->hasAttr<NakedAttr>()) { 6046122f3e6SDimitry Andric // Naked implies noinline: we should not be inlining such functions. 605139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::Naked); 606139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoInline); 6076122f3e6SDimitry Andric } 6082754fe60SDimitry Andric 609f22ef01cSRoman Divacky if (D->hasAttr<NoInlineAttr>()) 610139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::NoInline); 611f22ef01cSRoman Divacky 6126122f3e6SDimitry Andric // (noinline wins over always_inline, and we can't specify both in IR) 6137ae0e2c9SDimitry Andric if ((D->hasAttr<AlwaysInlineAttr>() || D->hasAttr<ForceInlineAttr>()) && 614139f7f9bSDimitry Andric !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex, 615139f7f9bSDimitry Andric llvm::Attribute::NoInline)) 616139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::AlwaysInline); 6176122f3e6SDimitry Andric 6187ae0e2c9SDimitry Andric // FIXME: Communicate hot and cold attributes to LLVM more directly. 6197ae0e2c9SDimitry Andric if (D->hasAttr<ColdAttr>()) 620139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::OptimizeForSize); 6213861d79fSDimitry Andric 6223861d79fSDimitry Andric if (D->hasAttr<MinSizeAttr>()) 623139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::MinSize); 6247ae0e2c9SDimitry Andric 6252754fe60SDimitry Andric if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D)) 6262754fe60SDimitry Andric F->setUnnamedAddr(true); 6272754fe60SDimitry Andric 6283861d79fSDimitry Andric if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) 6293861d79fSDimitry Andric if (MD->isVirtual()) 6303861d79fSDimitry Andric F->setUnnamedAddr(true); 631f22ef01cSRoman Divacky 6323861d79fSDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 633139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::StackProtect); 6343861d79fSDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 635139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::StackProtectReq); 6363861d79fSDimitry Andric 637139f7f9bSDimitry Andric // Add sanitizer attributes if function is not blacklisted. 638139f7f9bSDimitry Andric if (!SanitizerBlacklist.isIn(*F)) { 639139f7f9bSDimitry Andric // When AddressSanitizer is enabled, set SanitizeAddress attribute 640139f7f9bSDimitry Andric // unless __attribute__((no_sanitize_address)) is used. 641139f7f9bSDimitry Andric if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>()) 642139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeAddress); 643139f7f9bSDimitry Andric // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) 644139f7f9bSDimitry Andric if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) { 645139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeThread); 646139f7f9bSDimitry Andric } 647139f7f9bSDimitry Andric // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) 648139f7f9bSDimitry Andric if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>()) 649139f7f9bSDimitry Andric F->addFnAttr(llvm::Attribute::SanitizeMemory); 650dff0c46cSDimitry Andric } 651dff0c46cSDimitry Andric 652e580952dSDimitry Andric unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); 653e580952dSDimitry Andric if (alignment) 654e580952dSDimitry Andric F->setAlignment(alignment); 655e580952dSDimitry Andric 656f22ef01cSRoman Divacky // C++ ABI requires 2-byte alignment for member functions. 657f22ef01cSRoman Divacky if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) 658f22ef01cSRoman Divacky F->setAlignment(2); 659f22ef01cSRoman Divacky } 660f22ef01cSRoman Divacky 661f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D, 662f22ef01cSRoman Divacky llvm::GlobalValue *GV) { 6632754fe60SDimitry Andric if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 6642754fe60SDimitry Andric setGlobalVisibility(GV, ND); 6652754fe60SDimitry Andric else 6662754fe60SDimitry Andric GV->setVisibility(llvm::GlobalValue::DefaultVisibility); 667f22ef01cSRoman Divacky 668f22ef01cSRoman Divacky if (D->hasAttr<UsedAttr>()) 669f22ef01cSRoman Divacky AddUsedGlobal(GV); 670f22ef01cSRoman Divacky 671f22ef01cSRoman Divacky if (const SectionAttr *SA = D->getAttr<SectionAttr>()) 672f22ef01cSRoman Divacky GV->setSection(SA->getName()); 673f22ef01cSRoman Divacky 674139f7f9bSDimitry Andric // Alias cannot have attributes. Filter them here. 675139f7f9bSDimitry Andric if (!isa<llvm::GlobalAlias>(GV)) 676f22ef01cSRoman Divacky getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this); 677f22ef01cSRoman Divacky } 678f22ef01cSRoman Divacky 679f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D, 680f22ef01cSRoman Divacky llvm::Function *F, 681f22ef01cSRoman Divacky const CGFunctionInfo &FI) { 682f22ef01cSRoman Divacky SetLLVMFunctionAttributes(D, FI, F); 683f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, F); 684f22ef01cSRoman Divacky 685f22ef01cSRoman Divacky F->setLinkage(llvm::Function::InternalLinkage); 686f22ef01cSRoman Divacky 687f22ef01cSRoman Divacky SetCommonAttributes(D, F); 688f22ef01cSRoman Divacky } 689f22ef01cSRoman Divacky 690f22ef01cSRoman Divacky void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, 691f22ef01cSRoman Divacky llvm::Function *F, 692f22ef01cSRoman Divacky bool IsIncompleteFunction) { 6933b0f4066SDimitry Andric if (unsigned IID = F->getIntrinsicID()) { 6943b0f4066SDimitry Andric // If this is an intrinsic function, set the function's attributes 6953b0f4066SDimitry Andric // to the intrinsic's attributes. 6963861d79fSDimitry Andric F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), 6973861d79fSDimitry Andric (llvm::Intrinsic::ID)IID)); 6983b0f4066SDimitry Andric return; 6993b0f4066SDimitry Andric } 7003b0f4066SDimitry Andric 701f22ef01cSRoman Divacky const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl()); 702f22ef01cSRoman Divacky 703f22ef01cSRoman Divacky if (!IsIncompleteFunction) 704dff0c46cSDimitry Andric SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F); 705f22ef01cSRoman Divacky 706f22ef01cSRoman Divacky // Only a few attributes are set on declarations; these may later be 707f22ef01cSRoman Divacky // overridden by a definition. 708f22ef01cSRoman Divacky 709f22ef01cSRoman Divacky if (FD->hasAttr<DLLImportAttr>()) { 710f22ef01cSRoman Divacky F->setLinkage(llvm::Function::DLLImportLinkage); 711f22ef01cSRoman Divacky } else if (FD->hasAttr<WeakAttr>() || 7123b0f4066SDimitry Andric FD->isWeakImported()) { 713f22ef01cSRoman Divacky // "extern_weak" is overloaded in LLVM; we probably should have 714f22ef01cSRoman Divacky // separate linkage types for this. 715f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 716f22ef01cSRoman Divacky } else { 717f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalLinkage); 7182754fe60SDimitry Andric 719139f7f9bSDimitry Andric LinkageInfo LV = FD->getLinkageAndVisibility(); 720139f7f9bSDimitry Andric if (LV.getLinkage() == ExternalLinkage && LV.isVisibilityExplicit()) { 721139f7f9bSDimitry Andric F->setVisibility(GetLLVMVisibility(LV.getVisibility())); 7222754fe60SDimitry Andric } 723f22ef01cSRoman Divacky } 724f22ef01cSRoman Divacky 725f22ef01cSRoman Divacky if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) 726f22ef01cSRoman Divacky F->setSection(SA->getName()); 727f22ef01cSRoman Divacky } 728f22ef01cSRoman Divacky 729f22ef01cSRoman Divacky void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) { 730f22ef01cSRoman Divacky assert(!GV->isDeclaration() && 731f22ef01cSRoman Divacky "Only globals with definition can force usage."); 732f22ef01cSRoman Divacky LLVMUsed.push_back(GV); 733f22ef01cSRoman Divacky } 734f22ef01cSRoman Divacky 735f22ef01cSRoman Divacky void CodeGenModule::EmitLLVMUsed() { 736f22ef01cSRoman Divacky // Don't create llvm.used if there is no need. 737f22ef01cSRoman Divacky if (LLVMUsed.empty()) 738f22ef01cSRoman Divacky return; 739f22ef01cSRoman Divacky 740f22ef01cSRoman Divacky // Convert LLVMUsed to what ConstantArray needs. 741dff0c46cSDimitry Andric SmallVector<llvm::Constant*, 8> UsedArray; 742f22ef01cSRoman Divacky UsedArray.resize(LLVMUsed.size()); 743f22ef01cSRoman Divacky for (unsigned i = 0, e = LLVMUsed.size(); i != e; ++i) { 744f22ef01cSRoman Divacky UsedArray[i] = 745f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]), 746dff0c46cSDimitry Andric Int8PtrTy); 747f22ef01cSRoman Divacky } 748f22ef01cSRoman Divacky 749f22ef01cSRoman Divacky if (UsedArray.empty()) 750f22ef01cSRoman Divacky return; 751dff0c46cSDimitry Andric llvm::ArrayType *ATy = llvm::ArrayType::get(Int8PtrTy, UsedArray.size()); 752f22ef01cSRoman Divacky 753f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 754f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), ATy, false, 755f22ef01cSRoman Divacky llvm::GlobalValue::AppendingLinkage, 756f22ef01cSRoman Divacky llvm::ConstantArray::get(ATy, UsedArray), 757f22ef01cSRoman Divacky "llvm.used"); 758f22ef01cSRoman Divacky 759f22ef01cSRoman Divacky GV->setSection("llvm.metadata"); 760f22ef01cSRoman Divacky } 761f22ef01cSRoman Divacky 762139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules 763139f7f9bSDimitry Andric /// it depends on, using a postorder walk. 764139f7f9bSDimitry Andric static void addLinkOptionsPostorder(llvm::LLVMContext &Context, 765139f7f9bSDimitry Andric Module *Mod, 766139f7f9bSDimitry Andric SmallVectorImpl<llvm::Value *> &Metadata, 767139f7f9bSDimitry Andric llvm::SmallPtrSet<Module *, 16> &Visited) { 768139f7f9bSDimitry Andric // Import this module's parent. 769139f7f9bSDimitry Andric if (Mod->Parent && Visited.insert(Mod->Parent)) { 770139f7f9bSDimitry Andric addLinkOptionsPostorder(Context, Mod->Parent, Metadata, Visited); 771139f7f9bSDimitry Andric } 772139f7f9bSDimitry Andric 773139f7f9bSDimitry Andric // Import this module's dependencies. 774139f7f9bSDimitry Andric for (unsigned I = Mod->Imports.size(); I > 0; --I) { 775139f7f9bSDimitry Andric if (Visited.insert(Mod->Imports[I-1])) 776139f7f9bSDimitry Andric addLinkOptionsPostorder(Context, Mod->Imports[I-1], Metadata, Visited); 777139f7f9bSDimitry Andric } 778139f7f9bSDimitry Andric 779139f7f9bSDimitry Andric // Add linker options to link against the libraries/frameworks 780139f7f9bSDimitry Andric // described by this module. 781139f7f9bSDimitry Andric for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) { 782139f7f9bSDimitry Andric // FIXME: -lfoo is Unix-centric and -framework Foo is Darwin-centric. 783139f7f9bSDimitry Andric // We need to know more about the linker to know how to encode these 784139f7f9bSDimitry Andric // options propertly. 785139f7f9bSDimitry Andric 786139f7f9bSDimitry Andric // Link against a framework. 787139f7f9bSDimitry Andric if (Mod->LinkLibraries[I-1].IsFramework) { 788139f7f9bSDimitry Andric llvm::Value *Args[2] = { 789139f7f9bSDimitry Andric llvm::MDString::get(Context, "-framework"), 790139f7f9bSDimitry Andric llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library) 791139f7f9bSDimitry Andric }; 792139f7f9bSDimitry Andric 793139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, Args)); 794139f7f9bSDimitry Andric continue; 795139f7f9bSDimitry Andric } 796139f7f9bSDimitry Andric 797139f7f9bSDimitry Andric // Link against a library. 798139f7f9bSDimitry Andric llvm::Value *OptString 799139f7f9bSDimitry Andric = llvm::MDString::get(Context, 800139f7f9bSDimitry Andric "-l" + Mod->LinkLibraries[I-1].Library); 801139f7f9bSDimitry Andric Metadata.push_back(llvm::MDNode::get(Context, OptString)); 802139f7f9bSDimitry Andric } 803139f7f9bSDimitry Andric } 804139f7f9bSDimitry Andric 805139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() { 806139f7f9bSDimitry Andric // Collect the set of all of the modules we want to visit to emit link 807139f7f9bSDimitry Andric // options, which is essentially the imported modules and all of their 808139f7f9bSDimitry Andric // non-explicit child modules. 809139f7f9bSDimitry Andric llvm::SetVector<clang::Module *> LinkModules; 810139f7f9bSDimitry Andric llvm::SmallPtrSet<clang::Module *, 16> Visited; 811139f7f9bSDimitry Andric SmallVector<clang::Module *, 16> Stack; 812139f7f9bSDimitry Andric 813139f7f9bSDimitry Andric // Seed the stack with imported modules. 814139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(), 815139f7f9bSDimitry Andric MEnd = ImportedModules.end(); 816139f7f9bSDimitry Andric M != MEnd; ++M) { 817139f7f9bSDimitry Andric if (Visited.insert(*M)) 818139f7f9bSDimitry Andric Stack.push_back(*M); 819139f7f9bSDimitry Andric } 820139f7f9bSDimitry Andric 821139f7f9bSDimitry Andric // Find all of the modules to import, making a little effort to prune 822139f7f9bSDimitry Andric // non-leaf modules. 823139f7f9bSDimitry Andric while (!Stack.empty()) { 824139f7f9bSDimitry Andric clang::Module *Mod = Stack.back(); 825139f7f9bSDimitry Andric Stack.pop_back(); 826139f7f9bSDimitry Andric 827139f7f9bSDimitry Andric bool AnyChildren = false; 828139f7f9bSDimitry Andric 829139f7f9bSDimitry Andric // Visit the submodules of this module. 830139f7f9bSDimitry Andric for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(), 831139f7f9bSDimitry Andric SubEnd = Mod->submodule_end(); 832139f7f9bSDimitry Andric Sub != SubEnd; ++Sub) { 833139f7f9bSDimitry Andric // Skip explicit children; they need to be explicitly imported to be 834139f7f9bSDimitry Andric // linked against. 835139f7f9bSDimitry Andric if ((*Sub)->IsExplicit) 836139f7f9bSDimitry Andric continue; 837139f7f9bSDimitry Andric 838139f7f9bSDimitry Andric if (Visited.insert(*Sub)) { 839139f7f9bSDimitry Andric Stack.push_back(*Sub); 840139f7f9bSDimitry Andric AnyChildren = true; 841139f7f9bSDimitry Andric } 842139f7f9bSDimitry Andric } 843139f7f9bSDimitry Andric 844139f7f9bSDimitry Andric // We didn't find any children, so add this module to the list of 845139f7f9bSDimitry Andric // modules to link against. 846139f7f9bSDimitry Andric if (!AnyChildren) { 847139f7f9bSDimitry Andric LinkModules.insert(Mod); 848139f7f9bSDimitry Andric } 849139f7f9bSDimitry Andric } 850139f7f9bSDimitry Andric 851139f7f9bSDimitry Andric // Add link options for all of the imported modules in reverse topological 852139f7f9bSDimitry Andric // order. 853139f7f9bSDimitry Andric SmallVector<llvm::Value *, 16> MetadataArgs; 854139f7f9bSDimitry Andric Visited.clear(); 855139f7f9bSDimitry Andric for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(), 856139f7f9bSDimitry Andric MEnd = LinkModules.end(); 857139f7f9bSDimitry Andric M != MEnd; ++M) { 858139f7f9bSDimitry Andric if (Visited.insert(*M)) 859139f7f9bSDimitry Andric addLinkOptionsPostorder(getLLVMContext(), *M, MetadataArgs, Visited); 860139f7f9bSDimitry Andric } 861139f7f9bSDimitry Andric std::reverse(MetadataArgs.begin(), MetadataArgs.end()); 862139f7f9bSDimitry Andric 863139f7f9bSDimitry Andric // Add the linker options metadata flag. 864139f7f9bSDimitry Andric getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options", 865139f7f9bSDimitry Andric llvm::MDNode::get(getLLVMContext(), MetadataArgs)); 866139f7f9bSDimitry Andric } 867139f7f9bSDimitry Andric 868f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() { 869f22ef01cSRoman Divacky // Emit code for any potentially referenced deferred decls. Since a 870f22ef01cSRoman Divacky // previously unused static decl may become used during the generation of code 871f22ef01cSRoman Divacky // for a static function, iterate until no changes are made. 872f22ef01cSRoman Divacky 873139f7f9bSDimitry Andric while (true) { 874f22ef01cSRoman Divacky if (!DeferredVTables.empty()) { 875139f7f9bSDimitry Andric EmitDeferredVTables(); 876139f7f9bSDimitry Andric 877139f7f9bSDimitry Andric // Emitting a v-table doesn't directly cause more v-tables to 878139f7f9bSDimitry Andric // become deferred, although it can cause functions to be 879139f7f9bSDimitry Andric // emitted that then need those v-tables. 880139f7f9bSDimitry Andric assert(DeferredVTables.empty()); 881f22ef01cSRoman Divacky } 882f22ef01cSRoman Divacky 883139f7f9bSDimitry Andric // Stop if we're out of both deferred v-tables and deferred declarations. 884139f7f9bSDimitry Andric if (DeferredDeclsToEmit.empty()) break; 885139f7f9bSDimitry Andric 886f22ef01cSRoman Divacky GlobalDecl D = DeferredDeclsToEmit.back(); 887f22ef01cSRoman Divacky DeferredDeclsToEmit.pop_back(); 888f22ef01cSRoman Divacky 889f22ef01cSRoman Divacky // Check to see if we've already emitted this. This is necessary 890f22ef01cSRoman Divacky // for a couple of reasons: first, decls can end up in the 891f22ef01cSRoman Divacky // deferred-decls queue multiple times, and second, decls can end 892f22ef01cSRoman Divacky // up with definitions in unusual ways (e.g. by an extern inline 893f22ef01cSRoman Divacky // function acquiring a strong function redefinition). Just 894f22ef01cSRoman Divacky // ignore these cases. 895f22ef01cSRoman Divacky // 896f22ef01cSRoman Divacky // TODO: That said, looking this up multiple times is very wasteful. 8976122f3e6SDimitry Andric StringRef Name = getMangledName(D); 898f22ef01cSRoman Divacky llvm::GlobalValue *CGRef = GetGlobalValue(Name); 899f22ef01cSRoman Divacky assert(CGRef && "Deferred decl wasn't referenced?"); 900f22ef01cSRoman Divacky 901f22ef01cSRoman Divacky if (!CGRef->isDeclaration()) 902f22ef01cSRoman Divacky continue; 903f22ef01cSRoman Divacky 904f22ef01cSRoman Divacky // GlobalAlias::isDeclaration() defers to the aliasee, but for our 905f22ef01cSRoman Divacky // purposes an alias counts as a definition. 906f22ef01cSRoman Divacky if (isa<llvm::GlobalAlias>(CGRef)) 907f22ef01cSRoman Divacky continue; 908f22ef01cSRoman Divacky 909f22ef01cSRoman Divacky // Otherwise, emit the definition and move on to the next one. 910f22ef01cSRoman Divacky EmitGlobalDefinition(D); 911f22ef01cSRoman Divacky } 912f22ef01cSRoman Divacky } 913f22ef01cSRoman Divacky 9146122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() { 9156122f3e6SDimitry Andric if (Annotations.empty()) 9166122f3e6SDimitry Andric return; 9176122f3e6SDimitry Andric 9186122f3e6SDimitry Andric // Create a new global variable for the ConstantStruct in the Module. 9196122f3e6SDimitry Andric llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get( 9206122f3e6SDimitry Andric Annotations[0]->getType(), Annotations.size()), Annotations); 9216122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), 9226122f3e6SDimitry Andric Array->getType(), false, llvm::GlobalValue::AppendingLinkage, Array, 9236122f3e6SDimitry Andric "llvm.global.annotations"); 9246122f3e6SDimitry Andric gv->setSection(AnnotationSection); 9256122f3e6SDimitry Andric } 9266122f3e6SDimitry Andric 927139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) { 9286122f3e6SDimitry Andric llvm::StringMap<llvm::Constant*>::iterator i = AnnotationStrings.find(Str); 9296122f3e6SDimitry Andric if (i != AnnotationStrings.end()) 9306122f3e6SDimitry Andric return i->second; 9316122f3e6SDimitry Andric 9326122f3e6SDimitry Andric // Not found yet, create a new global. 933dff0c46cSDimitry Andric llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str); 9346122f3e6SDimitry Andric llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), s->getType(), 9356122f3e6SDimitry Andric true, llvm::GlobalValue::PrivateLinkage, s, ".str"); 9366122f3e6SDimitry Andric gv->setSection(AnnotationSection); 9376122f3e6SDimitry Andric gv->setUnnamedAddr(true); 9386122f3e6SDimitry Andric AnnotationStrings[Str] = gv; 9396122f3e6SDimitry Andric return gv; 9406122f3e6SDimitry Andric } 9416122f3e6SDimitry Andric 9426122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) { 9436122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 9446122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(Loc); 9456122f3e6SDimitry Andric if (PLoc.isValid()) 9466122f3e6SDimitry Andric return EmitAnnotationString(PLoc.getFilename()); 9476122f3e6SDimitry Andric return EmitAnnotationString(SM.getBufferName(Loc)); 9486122f3e6SDimitry Andric } 9496122f3e6SDimitry Andric 9506122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { 9516122f3e6SDimitry Andric SourceManager &SM = getContext().getSourceManager(); 9526122f3e6SDimitry Andric PresumedLoc PLoc = SM.getPresumedLoc(L); 9536122f3e6SDimitry Andric unsigned LineNo = PLoc.isValid() ? PLoc.getLine() : 9546122f3e6SDimitry Andric SM.getExpansionLineNumber(L); 9556122f3e6SDimitry Andric return llvm::ConstantInt::get(Int32Ty, LineNo); 9566122f3e6SDimitry Andric } 9576122f3e6SDimitry Andric 958f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, 959f22ef01cSRoman Divacky const AnnotateAttr *AA, 9606122f3e6SDimitry Andric SourceLocation L) { 9616122f3e6SDimitry Andric // Get the globals for file name, annotation, and the line number. 9626122f3e6SDimitry Andric llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), 9636122f3e6SDimitry Andric *UnitGV = EmitAnnotationUnit(L), 9646122f3e6SDimitry Andric *LineNoCst = EmitAnnotationLineNo(L); 965f22ef01cSRoman Divacky 966f22ef01cSRoman Divacky // Create the ConstantStruct for the global annotation. 967f22ef01cSRoman Divacky llvm::Constant *Fields[4] = { 9686122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), 9696122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), 9706122f3e6SDimitry Andric llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), 9716122f3e6SDimitry Andric LineNoCst 972f22ef01cSRoman Divacky }; 97317a519f9SDimitry Andric return llvm::ConstantStruct::getAnon(Fields); 974f22ef01cSRoman Divacky } 975f22ef01cSRoman Divacky 9766122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D, 9776122f3e6SDimitry Andric llvm::GlobalValue *GV) { 9786122f3e6SDimitry Andric assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute"); 9796122f3e6SDimitry Andric // Get the struct elements for these annotations. 9806122f3e6SDimitry Andric for (specific_attr_iterator<AnnotateAttr> 9816122f3e6SDimitry Andric ai = D->specific_attr_begin<AnnotateAttr>(), 9826122f3e6SDimitry Andric ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai) 9836122f3e6SDimitry Andric Annotations.push_back(EmitAnnotateAttr(GV, *ai, D->getLocation())); 9846122f3e6SDimitry Andric } 9856122f3e6SDimitry Andric 986f22ef01cSRoman Divacky bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) { 987e580952dSDimitry Andric // Never defer when EmitAllDecls is specified. 988dff0c46cSDimitry Andric if (LangOpts.EmitAllDecls) 989f22ef01cSRoman Divacky return false; 990f22ef01cSRoman Divacky 991e580952dSDimitry Andric return !getContext().DeclMustBeEmitted(Global); 992f22ef01cSRoman Divacky } 993f22ef01cSRoman Divacky 9943861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor( 9953861d79fSDimitry Andric const CXXUuidofExpr* E) { 9963861d79fSDimitry Andric // Sema has verified that IIDSource has a __declspec(uuid()), and that its 9973861d79fSDimitry Andric // well-formed. 9983861d79fSDimitry Andric StringRef Uuid; 9993861d79fSDimitry Andric if (E->isTypeOperand()) 10003861d79fSDimitry Andric Uuid = CXXUuidofExpr::GetUuidAttrOfType(E->getTypeOperand())->getGuid(); 10013861d79fSDimitry Andric else { 10023861d79fSDimitry Andric // Special case: __uuidof(0) means an all-zero GUID. 10033861d79fSDimitry Andric Expr *Op = E->getExprOperand(); 10043861d79fSDimitry Andric if (!Op->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) 10053861d79fSDimitry Andric Uuid = CXXUuidofExpr::GetUuidAttrOfType(Op->getType())->getGuid(); 10063861d79fSDimitry Andric else 10073861d79fSDimitry Andric Uuid = "00000000-0000-0000-0000-000000000000"; 10083861d79fSDimitry Andric } 10093861d79fSDimitry Andric std::string Name = "__uuid_" + Uuid.str(); 10103861d79fSDimitry Andric 10113861d79fSDimitry Andric // Look for an existing global. 10123861d79fSDimitry Andric if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name)) 10133861d79fSDimitry Andric return GV; 10143861d79fSDimitry Andric 10153861d79fSDimitry Andric llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType()); 10163861d79fSDimitry Andric assert(Init && "failed to initialize as constant"); 10173861d79fSDimitry Andric 10183861d79fSDimitry Andric // GUIDs are assumed to be 16 bytes, spread over 4-2-2-8 bytes. However, the 10193861d79fSDimitry Andric // first field is declared as "long", which for many targets is 8 bytes. 10203861d79fSDimitry Andric // Those architectures are not supported. (With the MS abi, long is always 4 10213861d79fSDimitry Andric // bytes.) 10223861d79fSDimitry Andric llvm::Type *GuidType = getTypes().ConvertType(E->getType()); 10233861d79fSDimitry Andric if (Init->getType() != GuidType) { 10243861d79fSDimitry Andric DiagnosticsEngine &Diags = getDiags(); 10253861d79fSDimitry Andric unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 10263861d79fSDimitry Andric "__uuidof codegen is not supported on this architecture"); 10273861d79fSDimitry Andric Diags.Report(E->getExprLoc(), DiagID) << E->getSourceRange(); 10283861d79fSDimitry Andric Init = llvm::UndefValue::get(GuidType); 10293861d79fSDimitry Andric } 10303861d79fSDimitry Andric 10313861d79fSDimitry Andric llvm::GlobalVariable *GV = new llvm::GlobalVariable(getModule(), GuidType, 10323861d79fSDimitry Andric /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage, Init, Name); 10333861d79fSDimitry Andric GV->setUnnamedAddr(true); 10343861d79fSDimitry Andric return GV; 10353861d79fSDimitry Andric } 10363861d79fSDimitry Andric 1037f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) { 1038f22ef01cSRoman Divacky const AliasAttr *AA = VD->getAttr<AliasAttr>(); 1039f22ef01cSRoman Divacky assert(AA && "No alias?"); 1040f22ef01cSRoman Divacky 10416122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType()); 1042f22ef01cSRoman Divacky 1043f22ef01cSRoman Divacky // See if there is already something with the target's name in the module. 1044f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); 10453861d79fSDimitry Andric if (Entry) { 10463861d79fSDimitry Andric unsigned AS = getContext().getTargetAddressSpace(VD->getType()); 10473861d79fSDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); 10483861d79fSDimitry Andric } 1049f22ef01cSRoman Divacky 1050f22ef01cSRoman Divacky llvm::Constant *Aliasee; 1051f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 10523861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, 10533861d79fSDimitry Andric GlobalDecl(cast<FunctionDecl>(VD)), 10542754fe60SDimitry Andric /*ForVTable=*/false); 1055f22ef01cSRoman Divacky else 1056f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 1057f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 10583861d79fSDimitry Andric 1059f22ef01cSRoman Divacky llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee); 1060f22ef01cSRoman Divacky F->setLinkage(llvm::Function::ExternalWeakLinkage); 1061f22ef01cSRoman Divacky WeakRefReferences.insert(F); 1062f22ef01cSRoman Divacky 1063f22ef01cSRoman Divacky return Aliasee; 1064f22ef01cSRoman Divacky } 1065f22ef01cSRoman Divacky 1066f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) { 1067f22ef01cSRoman Divacky const ValueDecl *Global = cast<ValueDecl>(GD.getDecl()); 1068f22ef01cSRoman Divacky 1069f22ef01cSRoman Divacky // Weak references don't produce any output by themselves. 1070f22ef01cSRoman Divacky if (Global->hasAttr<WeakRefAttr>()) 1071f22ef01cSRoman Divacky return; 1072f22ef01cSRoman Divacky 1073f22ef01cSRoman Divacky // If this is an alias definition (which otherwise looks like a declaration) 1074f22ef01cSRoman Divacky // emit it now. 1075f22ef01cSRoman Divacky if (Global->hasAttr<AliasAttr>()) 1076f22ef01cSRoman Divacky return EmitAliasDefinition(GD); 1077f22ef01cSRoman Divacky 10786122f3e6SDimitry Andric // If this is CUDA, be selective about which declarations we emit. 1079dff0c46cSDimitry Andric if (LangOpts.CUDA) { 10806122f3e6SDimitry Andric if (CodeGenOpts.CUDAIsDevice) { 10816122f3e6SDimitry Andric if (!Global->hasAttr<CUDADeviceAttr>() && 10826122f3e6SDimitry Andric !Global->hasAttr<CUDAGlobalAttr>() && 10836122f3e6SDimitry Andric !Global->hasAttr<CUDAConstantAttr>() && 10846122f3e6SDimitry Andric !Global->hasAttr<CUDASharedAttr>()) 10856122f3e6SDimitry Andric return; 10866122f3e6SDimitry Andric } else { 10876122f3e6SDimitry Andric if (!Global->hasAttr<CUDAHostAttr>() && ( 10886122f3e6SDimitry Andric Global->hasAttr<CUDADeviceAttr>() || 10896122f3e6SDimitry Andric Global->hasAttr<CUDAConstantAttr>() || 10906122f3e6SDimitry Andric Global->hasAttr<CUDASharedAttr>())) 10916122f3e6SDimitry Andric return; 1092e580952dSDimitry Andric } 1093e580952dSDimitry Andric } 1094e580952dSDimitry Andric 10956122f3e6SDimitry Andric // Ignore declarations, they will be emitted on their first use. 10966122f3e6SDimitry Andric if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) { 1097f22ef01cSRoman Divacky // Forward declarations are emitted lazily on first use. 10986122f3e6SDimitry Andric if (!FD->doesThisDeclarationHaveABody()) { 10996122f3e6SDimitry Andric if (!FD->doesDeclarationForceExternallyVisibleDefinition()) 1100f22ef01cSRoman Divacky return; 11016122f3e6SDimitry Andric 11026122f3e6SDimitry Andric const FunctionDecl *InlineDefinition = 0; 11036122f3e6SDimitry Andric FD->getBody(InlineDefinition); 11046122f3e6SDimitry Andric 11056122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1106dff0c46cSDimitry Andric DeferredDecls.erase(MangledName); 11076122f3e6SDimitry Andric EmitGlobalDefinition(InlineDefinition); 11086122f3e6SDimitry Andric return; 11096122f3e6SDimitry Andric } 1110f22ef01cSRoman Divacky } else { 1111f22ef01cSRoman Divacky const VarDecl *VD = cast<VarDecl>(Global); 1112f22ef01cSRoman Divacky assert(VD->isFileVarDecl() && "Cannot emit local var decl as global."); 1113f22ef01cSRoman Divacky 1114f22ef01cSRoman Divacky if (VD->isThisDeclarationADefinition() != VarDecl::Definition) 1115f22ef01cSRoman Divacky return; 1116f22ef01cSRoman Divacky } 1117f22ef01cSRoman Divacky 1118f22ef01cSRoman Divacky // Defer code generation when possible if this is a static definition, inline 1119f22ef01cSRoman Divacky // function etc. These we only want to emit if they are used. 1120f22ef01cSRoman Divacky if (!MayDeferGeneration(Global)) { 1121f22ef01cSRoman Divacky // Emit the definition if it can't be deferred. 1122f22ef01cSRoman Divacky EmitGlobalDefinition(GD); 1123f22ef01cSRoman Divacky return; 1124f22ef01cSRoman Divacky } 1125f22ef01cSRoman Divacky 1126e580952dSDimitry Andric // If we're deferring emission of a C++ variable with an 1127e580952dSDimitry Andric // initializer, remember the order in which it appeared in the file. 1128dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) && 1129e580952dSDimitry Andric cast<VarDecl>(Global)->hasInit()) { 1130e580952dSDimitry Andric DelayedCXXInitPosition[Global] = CXXGlobalInits.size(); 1131e580952dSDimitry Andric CXXGlobalInits.push_back(0); 1132e580952dSDimitry Andric } 1133e580952dSDimitry Andric 1134f22ef01cSRoman Divacky // If the value has already been used, add it directly to the 1135f22ef01cSRoman Divacky // DeferredDeclsToEmit list. 11366122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 1137f22ef01cSRoman Divacky if (GetGlobalValue(MangledName)) 1138f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(GD); 1139f22ef01cSRoman Divacky else { 1140f22ef01cSRoman Divacky // Otherwise, remember that we saw a deferred decl with this name. The 1141f22ef01cSRoman Divacky // first use of the mangled name will cause it to move into 1142f22ef01cSRoman Divacky // DeferredDeclsToEmit. 1143f22ef01cSRoman Divacky DeferredDecls[MangledName] = GD; 1144f22ef01cSRoman Divacky } 1145f22ef01cSRoman Divacky } 1146f22ef01cSRoman Divacky 1147f8254f43SDimitry Andric namespace { 1148f8254f43SDimitry Andric struct FunctionIsDirectlyRecursive : 1149f8254f43SDimitry Andric public RecursiveASTVisitor<FunctionIsDirectlyRecursive> { 1150f8254f43SDimitry Andric const StringRef Name; 1151dff0c46cSDimitry Andric const Builtin::Context &BI; 1152f8254f43SDimitry Andric bool Result; 1153dff0c46cSDimitry Andric FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) : 1154dff0c46cSDimitry Andric Name(N), BI(C), Result(false) { 1155f8254f43SDimitry Andric } 1156f8254f43SDimitry Andric typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base; 1157f8254f43SDimitry Andric 1158f8254f43SDimitry Andric bool TraverseCallExpr(CallExpr *E) { 1159dff0c46cSDimitry Andric const FunctionDecl *FD = E->getDirectCallee(); 1160dff0c46cSDimitry Andric if (!FD) 1161f8254f43SDimitry Andric return true; 1162dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1163dff0c46cSDimitry Andric if (Attr && Name == Attr->getLabel()) { 1164dff0c46cSDimitry Andric Result = true; 1165dff0c46cSDimitry Andric return false; 1166dff0c46cSDimitry Andric } 1167dff0c46cSDimitry Andric unsigned BuiltinID = FD->getBuiltinID(); 1168dff0c46cSDimitry Andric if (!BuiltinID) 1169f8254f43SDimitry Andric return true; 1170dff0c46cSDimitry Andric StringRef BuiltinName = BI.GetName(BuiltinID); 1171dff0c46cSDimitry Andric if (BuiltinName.startswith("__builtin_") && 1172dff0c46cSDimitry Andric Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) { 1173f8254f43SDimitry Andric Result = true; 1174f8254f43SDimitry Andric return false; 1175f8254f43SDimitry Andric } 1176f8254f43SDimitry Andric return true; 1177f8254f43SDimitry Andric } 1178f8254f43SDimitry Andric }; 1179f8254f43SDimitry Andric } 1180f8254f43SDimitry Andric 1181dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another 1182dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin, 1183dff0c46cSDimitry Andric // ends up pointing to itself. 1184f8254f43SDimitry Andric bool 1185dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) { 1186dff0c46cSDimitry Andric StringRef Name; 1187dff0c46cSDimitry Andric if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) { 1188dff0c46cSDimitry Andric // asm labels are a special kind of mangling we have to support. 1189dff0c46cSDimitry Andric AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>(); 1190dff0c46cSDimitry Andric if (!Attr) 1191f8254f43SDimitry Andric return false; 1192dff0c46cSDimitry Andric Name = Attr->getLabel(); 1193dff0c46cSDimitry Andric } else { 1194dff0c46cSDimitry Andric Name = FD->getName(); 1195dff0c46cSDimitry Andric } 1196f8254f43SDimitry Andric 1197dff0c46cSDimitry Andric FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo); 1198dff0c46cSDimitry Andric Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD)); 1199f8254f43SDimitry Andric return Walker.Result; 1200f8254f43SDimitry Andric } 1201f8254f43SDimitry Andric 1202f8254f43SDimitry Andric bool 1203f8254f43SDimitry Andric CodeGenModule::shouldEmitFunction(const FunctionDecl *F) { 1204f8254f43SDimitry Andric if (getFunctionLinkage(F) != llvm::Function::AvailableExternallyLinkage) 1205f8254f43SDimitry Andric return true; 1206f8254f43SDimitry Andric if (CodeGenOpts.OptimizationLevel == 0 && 12077ae0e2c9SDimitry Andric !F->hasAttr<AlwaysInlineAttr>() && !F->hasAttr<ForceInlineAttr>()) 1208f8254f43SDimitry Andric return false; 1209f8254f43SDimitry Andric // PR9614. Avoid cases where the source code is lying to us. An available 1210f8254f43SDimitry Andric // externally function should have an equivalent function somewhere else, 1211f8254f43SDimitry Andric // but a function that calls itself is clearly not equivalent to the real 1212f8254f43SDimitry Andric // implementation. 1213f8254f43SDimitry Andric // This happens in glibc's btowc and in some configure checks. 1214dff0c46cSDimitry Andric return !isTriviallyRecursive(F); 1215f8254f43SDimitry Andric } 1216f8254f43SDimitry Andric 1217f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) { 1218f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 1219f22ef01cSRoman Divacky 1220f22ef01cSRoman Divacky PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(), 1221f22ef01cSRoman Divacky Context.getSourceManager(), 1222f22ef01cSRoman Divacky "Generating code for declaration"); 1223f22ef01cSRoman Divacky 1224ffd1746dSEd Schouten if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 1225ffd1746dSEd Schouten // At -O0, don't generate IR for functions with available_externally 1226ffd1746dSEd Schouten // linkage. 1227f8254f43SDimitry Andric if (!shouldEmitFunction(Function)) 1228ffd1746dSEd Schouten return; 1229ffd1746dSEd Schouten 1230ffd1746dSEd Schouten if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 1231bd5abe19SDimitry Andric // Make sure to emit the definition(s) before we emit the thunks. 1232bd5abe19SDimitry Andric // This is necessary for the generation of certain thunks. 1233bd5abe19SDimitry Andric if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method)) 1234bd5abe19SDimitry Andric EmitCXXConstructor(CD, GD.getCtorType()); 1235bd5abe19SDimitry Andric else if (const CXXDestructorDecl *DD =dyn_cast<CXXDestructorDecl>(Method)) 1236bd5abe19SDimitry Andric EmitCXXDestructor(DD, GD.getDtorType()); 1237bd5abe19SDimitry Andric else 1238bd5abe19SDimitry Andric EmitGlobalFunctionDefinition(GD); 1239bd5abe19SDimitry Andric 1240f22ef01cSRoman Divacky if (Method->isVirtual()) 1241f22ef01cSRoman Divacky getVTables().EmitThunks(GD); 1242f22ef01cSRoman Divacky 1243bd5abe19SDimitry Andric return; 1244ffd1746dSEd Schouten } 1245f22ef01cSRoman Divacky 1246f22ef01cSRoman Divacky return EmitGlobalFunctionDefinition(GD); 1247ffd1746dSEd Schouten } 1248f22ef01cSRoman Divacky 1249f22ef01cSRoman Divacky if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 1250f22ef01cSRoman Divacky return EmitGlobalVarDefinition(VD); 1251f22ef01cSRoman Divacky 12526122f3e6SDimitry Andric llvm_unreachable("Invalid argument to EmitGlobalDefinition()"); 1253f22ef01cSRoman Divacky } 1254f22ef01cSRoman Divacky 1255f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the 1256f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there 1257f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1258f22ef01cSRoman Divacky /// bitcasted to the right type. 1259f22ef01cSRoman Divacky /// 1260f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1261f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created. 1262f22ef01cSRoman Divacky llvm::Constant * 12636122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName, 12646122f3e6SDimitry Andric llvm::Type *Ty, 126517a519f9SDimitry Andric GlobalDecl D, bool ForVTable, 1266139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1267f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1268f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1269f22ef01cSRoman Divacky if (Entry) { 12703861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1271f22ef01cSRoman Divacky const FunctionDecl *FD = cast_or_null<FunctionDecl>(D.getDecl()); 1272f22ef01cSRoman Divacky if (FD && !FD->hasAttr<WeakAttr>()) 1273f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1274f22ef01cSRoman Divacky } 1275f22ef01cSRoman Divacky 1276f22ef01cSRoman Divacky if (Entry->getType()->getElementType() == Ty) 1277f22ef01cSRoman Divacky return Entry; 1278f22ef01cSRoman Divacky 1279f22ef01cSRoman Divacky // Make sure the result is of the correct type. 128017a519f9SDimitry Andric return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); 1281f22ef01cSRoman Divacky } 1282f22ef01cSRoman Divacky 1283f22ef01cSRoman Divacky // This function doesn't have a complete type (for example, the return 1284f22ef01cSRoman Divacky // type is an incomplete struct). Use a fake type instead, and make 1285f22ef01cSRoman Divacky // sure not to try to set attributes. 1286f22ef01cSRoman Divacky bool IsIncompleteFunction = false; 1287f22ef01cSRoman Divacky 12886122f3e6SDimitry Andric llvm::FunctionType *FTy; 1289f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(Ty)) { 1290f22ef01cSRoman Divacky FTy = cast<llvm::FunctionType>(Ty); 1291f22ef01cSRoman Divacky } else { 1292bd5abe19SDimitry Andric FTy = llvm::FunctionType::get(VoidTy, false); 1293f22ef01cSRoman Divacky IsIncompleteFunction = true; 1294f22ef01cSRoman Divacky } 1295ffd1746dSEd Schouten 1296f22ef01cSRoman Divacky llvm::Function *F = llvm::Function::Create(FTy, 1297f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 1298f22ef01cSRoman Divacky MangledName, &getModule()); 1299f22ef01cSRoman Divacky assert(F->getName() == MangledName && "name was uniqued!"); 1300f22ef01cSRoman Divacky if (D.getDecl()) 1301f22ef01cSRoman Divacky SetFunctionAttributes(D, F, IsIncompleteFunction); 1302139f7f9bSDimitry Andric if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) { 1303139f7f9bSDimitry Andric llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex); 1304139f7f9bSDimitry Andric F->addAttributes(llvm::AttributeSet::FunctionIndex, 1305139f7f9bSDimitry Andric llvm::AttributeSet::get(VMContext, 1306139f7f9bSDimitry Andric llvm::AttributeSet::FunctionIndex, 1307139f7f9bSDimitry Andric B)); 1308139f7f9bSDimitry Andric } 1309f22ef01cSRoman Divacky 1310f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1311f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1312f22ef01cSRoman Divacky // of the file. 1313f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1314f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1315f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1316f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1317f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1318f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 13192754fe60SDimitry Andric 13202754fe60SDimitry Andric // Otherwise, there are cases we have to worry about where we're 13212754fe60SDimitry Andric // using a declaration for which we must emit a definition but where 13222754fe60SDimitry Andric // we might not find a top-level definition: 13232754fe60SDimitry Andric // - member functions defined inline in their classes 13242754fe60SDimitry Andric // - friend functions defined inline in some class 13252754fe60SDimitry Andric // - special member functions with implicit definitions 13262754fe60SDimitry Andric // If we ever change our AST traversal to walk into class methods, 13272754fe60SDimitry Andric // this will be unnecessary. 13282754fe60SDimitry Andric // 13292754fe60SDimitry Andric // We also don't emit a definition for a function if it's going to be an entry 13302754fe60SDimitry Andric // in a vtable, unless it's already marked as used. 1331dff0c46cSDimitry Andric } else if (getLangOpts().CPlusPlus && D.getDecl()) { 13322754fe60SDimitry Andric // Look for a declaration that's lexically in a record. 13332754fe60SDimitry Andric const FunctionDecl *FD = cast<FunctionDecl>(D.getDecl()); 13347ae0e2c9SDimitry Andric FD = FD->getMostRecentDecl(); 13352754fe60SDimitry Andric do { 13362754fe60SDimitry Andric if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) { 13372754fe60SDimitry Andric if (FD->isImplicit() && !ForVTable) { 13382754fe60SDimitry Andric assert(FD->isUsed() && "Sema didn't mark implicit function as used!"); 13392754fe60SDimitry Andric DeferredDeclsToEmit.push_back(D.getWithDecl(FD)); 13402754fe60SDimitry Andric break; 1341bd5abe19SDimitry Andric } else if (FD->doesThisDeclarationHaveABody()) { 13422754fe60SDimitry Andric DeferredDeclsToEmit.push_back(D.getWithDecl(FD)); 13432754fe60SDimitry Andric break; 1344f22ef01cSRoman Divacky } 1345f22ef01cSRoman Divacky } 1346dff0c46cSDimitry Andric FD = FD->getPreviousDecl(); 13472754fe60SDimitry Andric } while (FD); 1348f22ef01cSRoman Divacky } 1349f22ef01cSRoman Divacky 1350f22ef01cSRoman Divacky // Make sure the result is of the requested type. 1351f22ef01cSRoman Divacky if (!IsIncompleteFunction) { 1352f22ef01cSRoman Divacky assert(F->getType()->getElementType() == Ty); 1353f22ef01cSRoman Divacky return F; 1354f22ef01cSRoman Divacky } 1355f22ef01cSRoman Divacky 135617a519f9SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 1357f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(F, PTy); 1358f22ef01cSRoman Divacky } 1359f22ef01cSRoman Divacky 1360f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function. If Ty is 1361f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to 1362f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function). 1363f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, 13646122f3e6SDimitry Andric llvm::Type *Ty, 13652754fe60SDimitry Andric bool ForVTable) { 1366f22ef01cSRoman Divacky // If there was no specific requested type, just convert it now. 1367f22ef01cSRoman Divacky if (!Ty) 1368f22ef01cSRoman Divacky Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType()); 1369ffd1746dSEd Schouten 13706122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 13712754fe60SDimitry Andric return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable); 1372f22ef01cSRoman Divacky } 1373f22ef01cSRoman Divacky 1374f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified 1375f22ef01cSRoman Divacky /// type and name. 1376f22ef01cSRoman Divacky llvm::Constant * 13776122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy, 13786122f3e6SDimitry Andric StringRef Name, 1379139f7f9bSDimitry Andric llvm::AttributeSet ExtraAttrs) { 1380139f7f9bSDimitry Andric llvm::Constant *C 1381139f7f9bSDimitry Andric = GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false, 138217a519f9SDimitry Andric ExtraAttrs); 1383139f7f9bSDimitry Andric if (llvm::Function *F = dyn_cast<llvm::Function>(C)) 1384139f7f9bSDimitry Andric if (F->empty()) 1385139f7f9bSDimitry Andric F->setCallingConv(getRuntimeCC()); 1386139f7f9bSDimitry Andric return C; 1387f22ef01cSRoman Divacky } 1388f22ef01cSRoman Divacky 1389dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted 1390dff0c46cSDimitry Andric /// as a constant. 1391dff0c46cSDimitry Andric /// 1392dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs 1393dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is 1394dff0c46cSDimitry Andric /// not written to during its construction. 1395dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) { 1396dff0c46cSDimitry Andric if (!Ty.isConstant(Context) && !Ty->isReferenceType()) 1397f22ef01cSRoman Divacky return false; 1398bd5abe19SDimitry Andric 1399dff0c46cSDimitry Andric if (Context.getLangOpts().CPlusPlus) { 1400dff0c46cSDimitry Andric if (const CXXRecordDecl *Record 1401dff0c46cSDimitry Andric = Context.getBaseElementType(Ty)->getAsCXXRecordDecl()) 1402dff0c46cSDimitry Andric return ExcludeCtor && !Record->hasMutableFields() && 1403dff0c46cSDimitry Andric Record->hasTrivialDestructor(); 1404f22ef01cSRoman Divacky } 1405bd5abe19SDimitry Andric 1406f22ef01cSRoman Divacky return true; 1407f22ef01cSRoman Divacky } 1408f22ef01cSRoman Divacky 1409f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, 1410f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type. If there 1411f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially 1412f22ef01cSRoman Divacky /// bitcasted to the right type. 1413f22ef01cSRoman Divacky /// 1414f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this. This is used 1415f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created. 1416f22ef01cSRoman Divacky llvm::Constant * 14176122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, 14186122f3e6SDimitry Andric llvm::PointerType *Ty, 14192754fe60SDimitry Andric const VarDecl *D, 14202754fe60SDimitry Andric bool UnnamedAddr) { 1421f22ef01cSRoman Divacky // Lookup the entry, lazily creating it if necessary. 1422f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 1423f22ef01cSRoman Divacky if (Entry) { 14243861d79fSDimitry Andric if (WeakRefReferences.erase(Entry)) { 1425f22ef01cSRoman Divacky if (D && !D->hasAttr<WeakAttr>()) 1426f22ef01cSRoman Divacky Entry->setLinkage(llvm::Function::ExternalLinkage); 1427f22ef01cSRoman Divacky } 1428f22ef01cSRoman Divacky 14292754fe60SDimitry Andric if (UnnamedAddr) 14302754fe60SDimitry Andric Entry->setUnnamedAddr(true); 14312754fe60SDimitry Andric 1432f22ef01cSRoman Divacky if (Entry->getType() == Ty) 1433f22ef01cSRoman Divacky return Entry; 1434f22ef01cSRoman Divacky 1435f22ef01cSRoman Divacky // Make sure the result is of the correct type. 1436f22ef01cSRoman Divacky return llvm::ConstantExpr::getBitCast(Entry, Ty); 1437f22ef01cSRoman Divacky } 1438f22ef01cSRoman Divacky 1439f22ef01cSRoman Divacky // This is the first use or definition of a mangled name. If there is a 1440f22ef01cSRoman Divacky // deferred decl with this name, remember that we need to emit it at the end 1441f22ef01cSRoman Divacky // of the file. 1442f22ef01cSRoman Divacky llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName); 1443f22ef01cSRoman Divacky if (DDI != DeferredDecls.end()) { 1444f22ef01cSRoman Divacky // Move the potentially referenced deferred decl to the DeferredDeclsToEmit 1445f22ef01cSRoman Divacky // list, and remove it from DeferredDecls (since we don't need it anymore). 1446f22ef01cSRoman Divacky DeferredDeclsToEmit.push_back(DDI->second); 1447f22ef01cSRoman Divacky DeferredDecls.erase(DDI); 1448f22ef01cSRoman Divacky } 1449f22ef01cSRoman Divacky 14507ae0e2c9SDimitry Andric unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace()); 1451f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 1452f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), Ty->getElementType(), false, 1453f22ef01cSRoman Divacky llvm::GlobalValue::ExternalLinkage, 1454f22ef01cSRoman Divacky 0, MangledName, 0, 14557ae0e2c9SDimitry Andric llvm::GlobalVariable::NotThreadLocal, AddrSpace); 1456f22ef01cSRoman Divacky 1457f22ef01cSRoman Divacky // Handle things which are present even on external declarations. 1458f22ef01cSRoman Divacky if (D) { 1459f22ef01cSRoman Divacky // FIXME: This code is overly simple and should be merged with other global 1460f22ef01cSRoman Divacky // handling. 1461dff0c46cSDimitry Andric GV->setConstant(isTypeConstant(D->getType(), false)); 1462f22ef01cSRoman Divacky 14632754fe60SDimitry Andric // Set linkage and visibility in case we never see a definition. 1464139f7f9bSDimitry Andric LinkageInfo LV = D->getLinkageAndVisibility(); 1465139f7f9bSDimitry Andric if (LV.getLinkage() != ExternalLinkage) { 14662754fe60SDimitry Andric // Don't set internal linkage on declarations. 14672754fe60SDimitry Andric } else { 14682754fe60SDimitry Andric if (D->hasAttr<DLLImportAttr>()) 14692754fe60SDimitry Andric GV->setLinkage(llvm::GlobalValue::DLLImportLinkage); 14703b0f4066SDimitry Andric else if (D->hasAttr<WeakAttr>() || D->isWeakImported()) 1471f22ef01cSRoman Divacky GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); 1472f22ef01cSRoman Divacky 14732754fe60SDimitry Andric // Set visibility on a declaration only if it's explicit. 1474139f7f9bSDimitry Andric if (LV.isVisibilityExplicit()) 1475139f7f9bSDimitry Andric GV->setVisibility(GetLLVMVisibility(LV.getVisibility())); 14762754fe60SDimitry Andric } 14772754fe60SDimitry Andric 14787ae0e2c9SDimitry Andric if (D->isThreadSpecified()) 14797ae0e2c9SDimitry Andric setTLSMode(GV, *D); 1480f22ef01cSRoman Divacky } 1481f22ef01cSRoman Divacky 14827ae0e2c9SDimitry Andric if (AddrSpace != Ty->getAddressSpace()) 14837ae0e2c9SDimitry Andric return llvm::ConstantExpr::getBitCast(GV, Ty); 14847ae0e2c9SDimitry Andric else 1485f22ef01cSRoman Divacky return GV; 1486f22ef01cSRoman Divacky } 1487f22ef01cSRoman Divacky 1488f22ef01cSRoman Divacky 14892754fe60SDimitry Andric llvm::GlobalVariable * 14906122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name, 14916122f3e6SDimitry Andric llvm::Type *Ty, 14922754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage) { 14932754fe60SDimitry Andric llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name); 14942754fe60SDimitry Andric llvm::GlobalVariable *OldGV = 0; 14952754fe60SDimitry Andric 14962754fe60SDimitry Andric 14972754fe60SDimitry Andric if (GV) { 14982754fe60SDimitry Andric // Check if the variable has the right type. 14992754fe60SDimitry Andric if (GV->getType()->getElementType() == Ty) 15002754fe60SDimitry Andric return GV; 15012754fe60SDimitry Andric 15022754fe60SDimitry Andric // Because C++ name mangling, the only way we can end up with an already 15032754fe60SDimitry Andric // existing global with the same name is if it has been declared extern "C". 15042754fe60SDimitry Andric assert(GV->isDeclaration() && "Declaration has wrong type!"); 15052754fe60SDimitry Andric OldGV = GV; 15062754fe60SDimitry Andric } 15072754fe60SDimitry Andric 15082754fe60SDimitry Andric // Create a new variable. 15092754fe60SDimitry Andric GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true, 15102754fe60SDimitry Andric Linkage, 0, Name); 15112754fe60SDimitry Andric 15122754fe60SDimitry Andric if (OldGV) { 15132754fe60SDimitry Andric // Replace occurrences of the old variable if needed. 15142754fe60SDimitry Andric GV->takeName(OldGV); 15152754fe60SDimitry Andric 15162754fe60SDimitry Andric if (!OldGV->use_empty()) { 15172754fe60SDimitry Andric llvm::Constant *NewPtrForOldDecl = 15182754fe60SDimitry Andric llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 15192754fe60SDimitry Andric OldGV->replaceAllUsesWith(NewPtrForOldDecl); 15202754fe60SDimitry Andric } 15212754fe60SDimitry Andric 15222754fe60SDimitry Andric OldGV->eraseFromParent(); 15232754fe60SDimitry Andric } 15242754fe60SDimitry Andric 15252754fe60SDimitry Andric return GV; 15262754fe60SDimitry Andric } 15272754fe60SDimitry Andric 1528f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the 1529f22ef01cSRoman Divacky /// given global variable. If Ty is non-null and if the global doesn't exist, 1530cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the 1531f22ef01cSRoman Divacky /// normal requested type would be. 1532f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, 15336122f3e6SDimitry Andric llvm::Type *Ty) { 1534f22ef01cSRoman Divacky assert(D->hasGlobalStorage() && "Not a global variable"); 1535f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1536f22ef01cSRoman Divacky if (Ty == 0) 1537f22ef01cSRoman Divacky Ty = getTypes().ConvertTypeForMem(ASTTy); 1538f22ef01cSRoman Divacky 15396122f3e6SDimitry Andric llvm::PointerType *PTy = 15403b0f4066SDimitry Andric llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy)); 1541f22ef01cSRoman Divacky 15426122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1543f22ef01cSRoman Divacky return GetOrCreateLLVMGlobal(MangledName, PTy, D); 1544f22ef01cSRoman Divacky } 1545f22ef01cSRoman Divacky 1546f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the 1547f22ef01cSRoman Divacky /// specified type and name. 1548f22ef01cSRoman Divacky llvm::Constant * 15496122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, 15506122f3e6SDimitry Andric StringRef Name) { 15512754fe60SDimitry Andric return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), 0, 15522754fe60SDimitry Andric true); 1553f22ef01cSRoman Divacky } 1554f22ef01cSRoman Divacky 1555f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { 1556f22ef01cSRoman Divacky assert(!D->getInit() && "Cannot emit definite definitions here!"); 1557f22ef01cSRoman Divacky 1558f22ef01cSRoman Divacky if (MayDeferGeneration(D)) { 1559f22ef01cSRoman Divacky // If we have not seen a reference to this variable yet, place it 1560f22ef01cSRoman Divacky // into the deferred declarations table to be emitted if needed 1561f22ef01cSRoman Divacky // later. 15626122f3e6SDimitry Andric StringRef MangledName = getMangledName(D); 1563f22ef01cSRoman Divacky if (!GetGlobalValue(MangledName)) { 1564f22ef01cSRoman Divacky DeferredDecls[MangledName] = D; 1565f22ef01cSRoman Divacky return; 1566f22ef01cSRoman Divacky } 1567f22ef01cSRoman Divacky } 1568f22ef01cSRoman Divacky 1569f22ef01cSRoman Divacky // The tentative definition is the only definition. 1570f22ef01cSRoman Divacky EmitGlobalVarDefinition(D); 1571f22ef01cSRoman Divacky } 1572f22ef01cSRoman Divacky 15736122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const { 15742754fe60SDimitry Andric return Context.toCharUnitsFromBits( 15753861d79fSDimitry Andric TheDataLayout.getTypeStoreSizeInBits(Ty)); 1576f22ef01cSRoman Divacky } 1577f22ef01cSRoman Divacky 1578dff0c46cSDimitry Andric llvm::Constant * 1579dff0c46cSDimitry Andric CodeGenModule::MaybeEmitGlobalStdInitializerListInitializer(const VarDecl *D, 1580dff0c46cSDimitry Andric const Expr *rawInit) { 1581dff0c46cSDimitry Andric ArrayRef<ExprWithCleanups::CleanupObject> cleanups; 1582dff0c46cSDimitry Andric if (const ExprWithCleanups *withCleanups = 1583dff0c46cSDimitry Andric dyn_cast<ExprWithCleanups>(rawInit)) { 1584dff0c46cSDimitry Andric cleanups = withCleanups->getObjects(); 1585dff0c46cSDimitry Andric rawInit = withCleanups->getSubExpr(); 1586dff0c46cSDimitry Andric } 1587dff0c46cSDimitry Andric 1588dff0c46cSDimitry Andric const InitListExpr *init = dyn_cast<InitListExpr>(rawInit); 1589dff0c46cSDimitry Andric if (!init || !init->initializesStdInitializerList() || 1590dff0c46cSDimitry Andric init->getNumInits() == 0) 1591dff0c46cSDimitry Andric return 0; 1592dff0c46cSDimitry Andric 1593dff0c46cSDimitry Andric ASTContext &ctx = getContext(); 1594dff0c46cSDimitry Andric unsigned numInits = init->getNumInits(); 1595dff0c46cSDimitry Andric // FIXME: This check is here because we would otherwise silently miscompile 1596dff0c46cSDimitry Andric // nested global std::initializer_lists. Better would be to have a real 1597dff0c46cSDimitry Andric // implementation. 1598dff0c46cSDimitry Andric for (unsigned i = 0; i < numInits; ++i) { 1599dff0c46cSDimitry Andric const InitListExpr *inner = dyn_cast<InitListExpr>(init->getInit(i)); 1600dff0c46cSDimitry Andric if (inner && inner->initializesStdInitializerList()) { 1601dff0c46cSDimitry Andric ErrorUnsupported(inner, "nested global std::initializer_list"); 1602dff0c46cSDimitry Andric return 0; 1603dff0c46cSDimitry Andric } 1604dff0c46cSDimitry Andric } 1605dff0c46cSDimitry Andric 1606dff0c46cSDimitry Andric // Synthesize a fake VarDecl for the array and initialize that. 1607dff0c46cSDimitry Andric QualType elementType = init->getInit(0)->getType(); 1608dff0c46cSDimitry Andric llvm::APInt numElements(ctx.getTypeSize(ctx.getSizeType()), numInits); 1609dff0c46cSDimitry Andric QualType arrayType = ctx.getConstantArrayType(elementType, numElements, 1610dff0c46cSDimitry Andric ArrayType::Normal, 0); 1611dff0c46cSDimitry Andric 1612dff0c46cSDimitry Andric IdentifierInfo *name = &ctx.Idents.get(D->getNameAsString() + "__initlist"); 1613dff0c46cSDimitry Andric TypeSourceInfo *sourceInfo = ctx.getTrivialTypeSourceInfo( 1614dff0c46cSDimitry Andric arrayType, D->getLocation()); 1615dff0c46cSDimitry Andric VarDecl *backingArray = VarDecl::Create(ctx, const_cast<DeclContext*>( 1616dff0c46cSDimitry Andric D->getDeclContext()), 1617dff0c46cSDimitry Andric D->getLocStart(), D->getLocation(), 1618dff0c46cSDimitry Andric name, arrayType, sourceInfo, 1619139f7f9bSDimitry Andric SC_Static); 1620dff0c46cSDimitry Andric 1621dff0c46cSDimitry Andric // Now clone the InitListExpr to initialize the array instead. 1622dff0c46cSDimitry Andric // Incredible hack: we want to use the existing InitListExpr here, so we need 1623dff0c46cSDimitry Andric // to tell it that it no longer initializes a std::initializer_list. 16243861d79fSDimitry Andric ArrayRef<Expr*> Inits(const_cast<InitListExpr*>(init)->getInits(), 16253861d79fSDimitry Andric init->getNumInits()); 16263861d79fSDimitry Andric Expr *arrayInit = new (ctx) InitListExpr(ctx, init->getLBraceLoc(), Inits, 1627dff0c46cSDimitry Andric init->getRBraceLoc()); 1628dff0c46cSDimitry Andric arrayInit->setType(arrayType); 1629dff0c46cSDimitry Andric 1630dff0c46cSDimitry Andric if (!cleanups.empty()) 1631dff0c46cSDimitry Andric arrayInit = ExprWithCleanups::Create(ctx, arrayInit, cleanups); 1632dff0c46cSDimitry Andric 1633dff0c46cSDimitry Andric backingArray->setInit(arrayInit); 1634dff0c46cSDimitry Andric 1635dff0c46cSDimitry Andric // Emit the definition of the array. 1636dff0c46cSDimitry Andric EmitGlobalVarDefinition(backingArray); 1637dff0c46cSDimitry Andric 1638dff0c46cSDimitry Andric // Inspect the initializer list to validate it and determine its type. 1639dff0c46cSDimitry Andric // FIXME: doing this every time is probably inefficient; caching would be nice 1640dff0c46cSDimitry Andric RecordDecl *record = init->getType()->castAs<RecordType>()->getDecl(); 1641dff0c46cSDimitry Andric RecordDecl::field_iterator field = record->field_begin(); 1642dff0c46cSDimitry Andric if (field == record->field_end()) { 1643dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1644dff0c46cSDimitry Andric return 0; 1645dff0c46cSDimitry Andric } 1646dff0c46cSDimitry Andric QualType elementPtr = ctx.getPointerType(elementType.withConst()); 1647dff0c46cSDimitry Andric // Start pointer. 1648dff0c46cSDimitry Andric if (!ctx.hasSameType(field->getType(), elementPtr)) { 1649dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1650dff0c46cSDimitry Andric return 0; 1651dff0c46cSDimitry Andric } 1652dff0c46cSDimitry Andric ++field; 1653dff0c46cSDimitry Andric if (field == record->field_end()) { 1654dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1655dff0c46cSDimitry Andric return 0; 1656dff0c46cSDimitry Andric } 1657dff0c46cSDimitry Andric bool isStartEnd = false; 1658dff0c46cSDimitry Andric if (ctx.hasSameType(field->getType(), elementPtr)) { 1659dff0c46cSDimitry Andric // End pointer. 1660dff0c46cSDimitry Andric isStartEnd = true; 1661dff0c46cSDimitry Andric } else if(!ctx.hasSameType(field->getType(), ctx.getSizeType())) { 1662dff0c46cSDimitry Andric ErrorUnsupported(D, "weird std::initializer_list"); 1663dff0c46cSDimitry Andric return 0; 1664dff0c46cSDimitry Andric } 1665dff0c46cSDimitry Andric 1666dff0c46cSDimitry Andric // Now build an APValue representing the std::initializer_list. 1667dff0c46cSDimitry Andric APValue initListValue(APValue::UninitStruct(), 0, 2); 1668dff0c46cSDimitry Andric APValue &startField = initListValue.getStructField(0); 1669dff0c46cSDimitry Andric APValue::LValuePathEntry startOffsetPathEntry; 1670dff0c46cSDimitry Andric startOffsetPathEntry.ArrayIndex = 0; 1671dff0c46cSDimitry Andric startField = APValue(APValue::LValueBase(backingArray), 1672dff0c46cSDimitry Andric CharUnits::fromQuantity(0), 1673dff0c46cSDimitry Andric llvm::makeArrayRef(startOffsetPathEntry), 1674dff0c46cSDimitry Andric /*IsOnePastTheEnd=*/false, 0); 1675dff0c46cSDimitry Andric 1676dff0c46cSDimitry Andric if (isStartEnd) { 1677dff0c46cSDimitry Andric APValue &endField = initListValue.getStructField(1); 1678dff0c46cSDimitry Andric APValue::LValuePathEntry endOffsetPathEntry; 1679dff0c46cSDimitry Andric endOffsetPathEntry.ArrayIndex = numInits; 1680dff0c46cSDimitry Andric endField = APValue(APValue::LValueBase(backingArray), 1681dff0c46cSDimitry Andric ctx.getTypeSizeInChars(elementType) * numInits, 1682dff0c46cSDimitry Andric llvm::makeArrayRef(endOffsetPathEntry), 1683dff0c46cSDimitry Andric /*IsOnePastTheEnd=*/true, 0); 1684dff0c46cSDimitry Andric } else { 1685dff0c46cSDimitry Andric APValue &sizeField = initListValue.getStructField(1); 1686dff0c46cSDimitry Andric sizeField = APValue(llvm::APSInt(numElements)); 1687dff0c46cSDimitry Andric } 1688dff0c46cSDimitry Andric 1689dff0c46cSDimitry Andric // Emit the constant for the initializer_list. 1690dff0c46cSDimitry Andric llvm::Constant *llvmInit = 1691dff0c46cSDimitry Andric EmitConstantValueForMemory(initListValue, D->getType()); 1692dff0c46cSDimitry Andric assert(llvmInit && "failed to initialize as constant"); 1693dff0c46cSDimitry Andric return llvmInit; 1694dff0c46cSDimitry Andric } 1695dff0c46cSDimitry Andric 16967ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D, 16977ae0e2c9SDimitry Andric unsigned AddrSpace) { 16987ae0e2c9SDimitry Andric if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) { 16997ae0e2c9SDimitry Andric if (D->hasAttr<CUDAConstantAttr>()) 17007ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant); 17017ae0e2c9SDimitry Andric else if (D->hasAttr<CUDASharedAttr>()) 17027ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared); 17037ae0e2c9SDimitry Andric else 17047ae0e2c9SDimitry Andric AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device); 17057ae0e2c9SDimitry Andric } 17067ae0e2c9SDimitry Andric 17077ae0e2c9SDimitry Andric return AddrSpace; 17087ae0e2c9SDimitry Andric } 17097ae0e2c9SDimitry Andric 1710f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 1711f22ef01cSRoman Divacky llvm::Constant *Init = 0; 1712f22ef01cSRoman Divacky QualType ASTTy = D->getType(); 1713dff0c46cSDimitry Andric CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); 1714dff0c46cSDimitry Andric bool NeedsGlobalCtor = false; 1715dff0c46cSDimitry Andric bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor(); 1716f22ef01cSRoman Divacky 1717dff0c46cSDimitry Andric const VarDecl *InitDecl; 1718dff0c46cSDimitry Andric const Expr *InitExpr = D->getAnyInitializer(InitDecl); 1719f22ef01cSRoman Divacky 1720f22ef01cSRoman Divacky if (!InitExpr) { 1721f22ef01cSRoman Divacky // This is a tentative definition; tentative definitions are 1722f22ef01cSRoman Divacky // implicitly initialized with { 0 }. 1723f22ef01cSRoman Divacky // 1724f22ef01cSRoman Divacky // Note that tentative definitions are only emitted at the end of 1725f22ef01cSRoman Divacky // a translation unit, so they should never have incomplete 1726f22ef01cSRoman Divacky // type. In addition, EmitTentativeDefinition makes sure that we 1727f22ef01cSRoman Divacky // never attempt to emit a tentative definition if a real one 1728f22ef01cSRoman Divacky // exists. A use may still exists, however, so we still may need 1729f22ef01cSRoman Divacky // to do a RAUW. 1730f22ef01cSRoman Divacky assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type"); 1731f22ef01cSRoman Divacky Init = EmitNullConstant(D->getType()); 1732f22ef01cSRoman Divacky } else { 1733dff0c46cSDimitry Andric // If this is a std::initializer_list, emit the special initializer. 1734dff0c46cSDimitry Andric Init = MaybeEmitGlobalStdInitializerListInitializer(D, InitExpr); 1735dff0c46cSDimitry Andric // An empty init list will perform zero-initialization, which happens 1736dff0c46cSDimitry Andric // to be exactly what we want. 1737dff0c46cSDimitry Andric // FIXME: It does so in a global constructor, which is *not* what we 1738dff0c46cSDimitry Andric // want. 1739dff0c46cSDimitry Andric 17407ae0e2c9SDimitry Andric if (!Init) { 17417ae0e2c9SDimitry Andric initializedGlobalDecl = GlobalDecl(D); 1742dff0c46cSDimitry Andric Init = EmitConstantInit(*InitDecl); 17437ae0e2c9SDimitry Andric } 1744f22ef01cSRoman Divacky if (!Init) { 1745f22ef01cSRoman Divacky QualType T = InitExpr->getType(); 1746f22ef01cSRoman Divacky if (D->getType()->isReferenceType()) 1747f22ef01cSRoman Divacky T = D->getType(); 1748f22ef01cSRoman Divacky 1749dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus) { 1750f22ef01cSRoman Divacky Init = EmitNullConstant(T); 1751dff0c46cSDimitry Andric NeedsGlobalCtor = true; 1752f22ef01cSRoman Divacky } else { 1753f22ef01cSRoman Divacky ErrorUnsupported(D, "static initializer"); 1754f22ef01cSRoman Divacky Init = llvm::UndefValue::get(getTypes().ConvertType(T)); 1755f22ef01cSRoman Divacky } 1756e580952dSDimitry Andric } else { 1757e580952dSDimitry Andric // We don't need an initializer, so remove the entry for the delayed 1758dff0c46cSDimitry Andric // initializer position (just in case this entry was delayed) if we 1759dff0c46cSDimitry Andric // also don't need to register a destructor. 1760dff0c46cSDimitry Andric if (getLangOpts().CPlusPlus && !NeedsGlobalDtor) 1761e580952dSDimitry Andric DelayedCXXInitPosition.erase(D); 1762f22ef01cSRoman Divacky } 1763f22ef01cSRoman Divacky } 1764f22ef01cSRoman Divacky 17656122f3e6SDimitry Andric llvm::Type* InitType = Init->getType(); 1766f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); 1767f22ef01cSRoman Divacky 1768f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 1769f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 1770f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast || 1771f22ef01cSRoman Divacky // all zero index gep. 1772f22ef01cSRoman Divacky CE->getOpcode() == llvm::Instruction::GetElementPtr); 1773f22ef01cSRoman Divacky Entry = CE->getOperand(0); 1774f22ef01cSRoman Divacky } 1775f22ef01cSRoman Divacky 1776f22ef01cSRoman Divacky // Entry is now either a Function or GlobalVariable. 1777f22ef01cSRoman Divacky llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Entry); 1778f22ef01cSRoman Divacky 1779f22ef01cSRoman Divacky // We have a definition after a declaration with the wrong type. 1780f22ef01cSRoman Divacky // We must make a new GlobalVariable* and update everything that used OldGV 1781f22ef01cSRoman Divacky // (a declaration or tentative definition) with the new GlobalVariable* 1782f22ef01cSRoman Divacky // (which will be a definition). 1783f22ef01cSRoman Divacky // 1784f22ef01cSRoman Divacky // This happens if there is a prototype for a global (e.g. 1785f22ef01cSRoman Divacky // "extern int x[];") and then a definition of a different type (e.g. 1786f22ef01cSRoman Divacky // "int x[10];"). This also happens when an initializer has a different type 1787f22ef01cSRoman Divacky // from the type of the global (this happens with unions). 1788f22ef01cSRoman Divacky if (GV == 0 || 1789f22ef01cSRoman Divacky GV->getType()->getElementType() != InitType || 17903b0f4066SDimitry Andric GV->getType()->getAddressSpace() != 17917ae0e2c9SDimitry Andric GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) { 1792f22ef01cSRoman Divacky 1793f22ef01cSRoman Divacky // Move the old entry aside so that we'll create a new one. 17946122f3e6SDimitry Andric Entry->setName(StringRef()); 1795f22ef01cSRoman Divacky 1796f22ef01cSRoman Divacky // Make a new global with the correct type, this is now guaranteed to work. 1797f22ef01cSRoman Divacky GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType)); 1798f22ef01cSRoman Divacky 1799f22ef01cSRoman Divacky // Replace all uses of the old global with the new global 1800f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 1801f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(GV, Entry->getType()); 1802f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 1803f22ef01cSRoman Divacky 1804f22ef01cSRoman Divacky // Erase the old global, since it is no longer used. 1805f22ef01cSRoman Divacky cast<llvm::GlobalValue>(Entry)->eraseFromParent(); 1806f22ef01cSRoman Divacky } 1807f22ef01cSRoman Divacky 18086122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 18096122f3e6SDimitry Andric AddGlobalAnnotations(D, GV); 1810f22ef01cSRoman Divacky 1811f22ef01cSRoman Divacky GV->setInitializer(Init); 1812f22ef01cSRoman Divacky 1813f22ef01cSRoman Divacky // If it is safe to mark the global 'constant', do so now. 1814dff0c46cSDimitry Andric GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor && 1815dff0c46cSDimitry Andric isTypeConstant(D->getType(), true)); 1816f22ef01cSRoman Divacky 1817f22ef01cSRoman Divacky GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); 1818f22ef01cSRoman Divacky 1819f22ef01cSRoman Divacky // Set the llvm linkage type as appropriate. 18202754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes Linkage = 18212754fe60SDimitry Andric GetLLVMLinkageVarDefinition(D, GV); 18222754fe60SDimitry Andric GV->setLinkage(Linkage); 18232754fe60SDimitry Andric if (Linkage == llvm::GlobalVariable::CommonLinkage) 1824f22ef01cSRoman Divacky // common vars aren't constant even if declared const. 1825f22ef01cSRoman Divacky GV->setConstant(false); 1826f22ef01cSRoman Divacky 1827f22ef01cSRoman Divacky SetCommonAttributes(D, GV); 1828f22ef01cSRoman Divacky 18292754fe60SDimitry Andric // Emit the initializer function if necessary. 1830dff0c46cSDimitry Andric if (NeedsGlobalCtor || NeedsGlobalDtor) 1831dff0c46cSDimitry Andric EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor); 18322754fe60SDimitry Andric 18333861d79fSDimitry Andric // If we are compiling with ASan, add metadata indicating dynamically 18343861d79fSDimitry Andric // initialized globals. 1835139f7f9bSDimitry Andric if (SanOpts.Address && NeedsGlobalCtor) { 18363861d79fSDimitry Andric llvm::Module &M = getModule(); 18373861d79fSDimitry Andric 18383861d79fSDimitry Andric llvm::NamedMDNode *DynamicInitializers = 18393861d79fSDimitry Andric M.getOrInsertNamedMetadata("llvm.asan.dynamically_initialized_globals"); 18403861d79fSDimitry Andric llvm::Value *GlobalToAdd[] = { GV }; 18413861d79fSDimitry Andric llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalToAdd); 18423861d79fSDimitry Andric DynamicInitializers->addOperand(ThisGlobal); 18433861d79fSDimitry Andric } 18443861d79fSDimitry Andric 1845f22ef01cSRoman Divacky // Emit global variable debug information. 18466122f3e6SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 18473861d79fSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 1848f22ef01cSRoman Divacky DI->EmitGlobalVariable(GV, D); 1849f22ef01cSRoman Divacky } 1850f22ef01cSRoman Divacky 18512754fe60SDimitry Andric llvm::GlobalValue::LinkageTypes 18522754fe60SDimitry Andric CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, 18532754fe60SDimitry Andric llvm::GlobalVariable *GV) { 18542754fe60SDimitry Andric GVALinkage Linkage = getContext().GetGVALinkageForVariable(D); 18552754fe60SDimitry Andric if (Linkage == GVA_Internal) 18562754fe60SDimitry Andric return llvm::Function::InternalLinkage; 18572754fe60SDimitry Andric else if (D->hasAttr<DLLImportAttr>()) 18582754fe60SDimitry Andric return llvm::Function::DLLImportLinkage; 18592754fe60SDimitry Andric else if (D->hasAttr<DLLExportAttr>()) 18602754fe60SDimitry Andric return llvm::Function::DLLExportLinkage; 18612754fe60SDimitry Andric else if (D->hasAttr<WeakAttr>()) { 18622754fe60SDimitry Andric if (GV->isConstant()) 18632754fe60SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 18642754fe60SDimitry Andric else 18652754fe60SDimitry Andric return llvm::GlobalVariable::WeakAnyLinkage; 18662754fe60SDimitry Andric } else if (Linkage == GVA_TemplateInstantiation || 18672754fe60SDimitry Andric Linkage == GVA_ExplicitTemplateInstantiation) 18683b0f4066SDimitry Andric return llvm::GlobalVariable::WeakODRLinkage; 1869dff0c46cSDimitry Andric else if (!getLangOpts().CPlusPlus && 18702754fe60SDimitry Andric ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) || 18712754fe60SDimitry Andric D->getAttr<CommonAttr>()) && 18722754fe60SDimitry Andric !D->hasExternalStorage() && !D->getInit() && 187317a519f9SDimitry Andric !D->getAttr<SectionAttr>() && !D->isThreadSpecified() && 187417a519f9SDimitry Andric !D->getAttr<WeakImportAttr>()) { 18752754fe60SDimitry Andric // Thread local vars aren't considered common linkage. 18762754fe60SDimitry Andric return llvm::GlobalVariable::CommonLinkage; 18772754fe60SDimitry Andric } 18782754fe60SDimitry Andric return llvm::GlobalVariable::ExternalLinkage; 18792754fe60SDimitry Andric } 18802754fe60SDimitry Andric 1881139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type. 1882139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites 1883139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old, 1884139f7f9bSDimitry Andric llvm::Function *newFn) { 1885139f7f9bSDimitry Andric // Fast path. 1886139f7f9bSDimitry Andric if (old->use_empty()) return; 1887139f7f9bSDimitry Andric 1888139f7f9bSDimitry Andric llvm::Type *newRetTy = newFn->getReturnType(); 1889139f7f9bSDimitry Andric SmallVector<llvm::Value*, 4> newArgs; 1890139f7f9bSDimitry Andric 1891139f7f9bSDimitry Andric for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end(); 1892139f7f9bSDimitry Andric ui != ue; ) { 1893139f7f9bSDimitry Andric llvm::Value::use_iterator use = ui++; // Increment before the use is erased. 1894139f7f9bSDimitry Andric llvm::User *user = *use; 1895139f7f9bSDimitry Andric 1896139f7f9bSDimitry Andric // Recognize and replace uses of bitcasts. Most calls to 1897139f7f9bSDimitry Andric // unprototyped functions will use bitcasts. 1898139f7f9bSDimitry Andric if (llvm::ConstantExpr *bitcast = dyn_cast<llvm::ConstantExpr>(user)) { 1899139f7f9bSDimitry Andric if (bitcast->getOpcode() == llvm::Instruction::BitCast) 1900139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(bitcast, newFn); 1901139f7f9bSDimitry Andric continue; 1902139f7f9bSDimitry Andric } 1903139f7f9bSDimitry Andric 1904139f7f9bSDimitry Andric // Recognize calls to the function. 1905139f7f9bSDimitry Andric llvm::CallSite callSite(user); 1906139f7f9bSDimitry Andric if (!callSite) continue; 1907139f7f9bSDimitry Andric if (!callSite.isCallee(use)) continue; 1908139f7f9bSDimitry Andric 1909139f7f9bSDimitry Andric // If the return types don't match exactly, then we can't 1910139f7f9bSDimitry Andric // transform this call unless it's dead. 1911139f7f9bSDimitry Andric if (callSite->getType() != newRetTy && !callSite->use_empty()) 1912139f7f9bSDimitry Andric continue; 1913139f7f9bSDimitry Andric 1914139f7f9bSDimitry Andric // Get the call site's attribute list. 1915139f7f9bSDimitry Andric SmallVector<llvm::AttributeSet, 8> newAttrs; 1916139f7f9bSDimitry Andric llvm::AttributeSet oldAttrs = callSite.getAttributes(); 1917139f7f9bSDimitry Andric 1918139f7f9bSDimitry Andric // Collect any return attributes from the call. 1919139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex)) 1920139f7f9bSDimitry Andric newAttrs.push_back( 1921139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), 1922139f7f9bSDimitry Andric oldAttrs.getRetAttributes())); 1923139f7f9bSDimitry Andric 1924139f7f9bSDimitry Andric // If the function was passed too few arguments, don't transform. 1925139f7f9bSDimitry Andric unsigned newNumArgs = newFn->arg_size(); 1926139f7f9bSDimitry Andric if (callSite.arg_size() < newNumArgs) continue; 1927139f7f9bSDimitry Andric 1928139f7f9bSDimitry Andric // If extra arguments were passed, we silently drop them. 1929139f7f9bSDimitry Andric // If any of the types mismatch, we don't transform. 1930139f7f9bSDimitry Andric unsigned argNo = 0; 1931139f7f9bSDimitry Andric bool dontTransform = false; 1932139f7f9bSDimitry Andric for (llvm::Function::arg_iterator ai = newFn->arg_begin(), 1933139f7f9bSDimitry Andric ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) { 1934139f7f9bSDimitry Andric if (callSite.getArgument(argNo)->getType() != ai->getType()) { 1935139f7f9bSDimitry Andric dontTransform = true; 1936139f7f9bSDimitry Andric break; 1937139f7f9bSDimitry Andric } 1938139f7f9bSDimitry Andric 1939139f7f9bSDimitry Andric // Add any parameter attributes. 1940139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(argNo + 1)) 1941139f7f9bSDimitry Andric newAttrs. 1942139f7f9bSDimitry Andric push_back(llvm:: 1943139f7f9bSDimitry Andric AttributeSet::get(newFn->getContext(), 1944139f7f9bSDimitry Andric oldAttrs.getParamAttributes(argNo + 1))); 1945139f7f9bSDimitry Andric } 1946139f7f9bSDimitry Andric if (dontTransform) 1947139f7f9bSDimitry Andric continue; 1948139f7f9bSDimitry Andric 1949139f7f9bSDimitry Andric if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) 1950139f7f9bSDimitry Andric newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(), 1951139f7f9bSDimitry Andric oldAttrs.getFnAttributes())); 1952139f7f9bSDimitry Andric 1953139f7f9bSDimitry Andric // Okay, we can transform this. Create the new call instruction and copy 1954139f7f9bSDimitry Andric // over the required information. 1955139f7f9bSDimitry Andric newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo); 1956139f7f9bSDimitry Andric 1957139f7f9bSDimitry Andric llvm::CallSite newCall; 1958139f7f9bSDimitry Andric if (callSite.isCall()) { 1959139f7f9bSDimitry Andric newCall = llvm::CallInst::Create(newFn, newArgs, "", 1960139f7f9bSDimitry Andric callSite.getInstruction()); 1961139f7f9bSDimitry Andric } else { 1962139f7f9bSDimitry Andric llvm::InvokeInst *oldInvoke = 1963139f7f9bSDimitry Andric cast<llvm::InvokeInst>(callSite.getInstruction()); 1964139f7f9bSDimitry Andric newCall = llvm::InvokeInst::Create(newFn, 1965139f7f9bSDimitry Andric oldInvoke->getNormalDest(), 1966139f7f9bSDimitry Andric oldInvoke->getUnwindDest(), 1967139f7f9bSDimitry Andric newArgs, "", 1968139f7f9bSDimitry Andric callSite.getInstruction()); 1969139f7f9bSDimitry Andric } 1970139f7f9bSDimitry Andric newArgs.clear(); // for the next iteration 1971139f7f9bSDimitry Andric 1972139f7f9bSDimitry Andric if (!newCall->getType()->isVoidTy()) 1973139f7f9bSDimitry Andric newCall->takeName(callSite.getInstruction()); 1974139f7f9bSDimitry Andric newCall.setAttributes( 1975139f7f9bSDimitry Andric llvm::AttributeSet::get(newFn->getContext(), newAttrs)); 1976139f7f9bSDimitry Andric newCall.setCallingConv(callSite.getCallingConv()); 1977139f7f9bSDimitry Andric 1978139f7f9bSDimitry Andric // Finally, remove the old call, replacing any uses with the new one. 1979139f7f9bSDimitry Andric if (!callSite->use_empty()) 1980139f7f9bSDimitry Andric callSite->replaceAllUsesWith(newCall.getInstruction()); 1981139f7f9bSDimitry Andric 1982139f7f9bSDimitry Andric // Copy debug location attached to CI. 1983139f7f9bSDimitry Andric if (!callSite->getDebugLoc().isUnknown()) 1984139f7f9bSDimitry Andric newCall->setDebugLoc(callSite->getDebugLoc()); 1985139f7f9bSDimitry Andric callSite->eraseFromParent(); 1986139f7f9bSDimitry Andric } 1987139f7f9bSDimitry Andric } 1988139f7f9bSDimitry Andric 1989f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we 1990f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}". If there are 1991f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to 1992f22ef01cSRoman Divacky /// call the new function directly. 1993f22ef01cSRoman Divacky /// 1994f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to 1995f22ef01cSRoman Divacky /// functions to be able to inline them. If there is a bitcast in the way, it 1996f22ef01cSRoman Divacky /// won't inline them. Instcombine normally deletes these calls, but it isn't 1997f22ef01cSRoman Divacky /// run at -O0. 1998f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old, 1999f22ef01cSRoman Divacky llvm::Function *NewFn) { 2000f22ef01cSRoman Divacky // If we're redefining a global as a function, don't transform it. 2001139f7f9bSDimitry Andric if (!isa<llvm::Function>(Old)) return; 2002f22ef01cSRoman Divacky 2003139f7f9bSDimitry Andric replaceUsesOfNonProtoConstant(Old, NewFn); 2004f22ef01cSRoman Divacky } 2005f22ef01cSRoman Divacky 2006dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 2007dff0c46cSDimitry Andric TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind(); 2008dff0c46cSDimitry Andric // If we have a definition, this might be a deferred decl. If the 2009dff0c46cSDimitry Andric // instantiation is explicit, make sure we emit it at the end. 2010dff0c46cSDimitry Andric if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition) 2011dff0c46cSDimitry Andric GetAddrOfGlobalVar(VD); 2012139f7f9bSDimitry Andric 2013139f7f9bSDimitry Andric EmitTopLevelDecl(VD); 2014dff0c46cSDimitry Andric } 2015f22ef01cSRoman Divacky 2016f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) { 2017f22ef01cSRoman Divacky const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl()); 20183b0f4066SDimitry Andric 20193b0f4066SDimitry Andric // Compute the function info and LLVM type. 2020dff0c46cSDimitry Andric const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); 2021dff0c46cSDimitry Andric llvm::FunctionType *Ty = getTypes().GetFunctionType(FI); 20223b0f4066SDimitry Andric 2023f22ef01cSRoman Divacky // Get or create the prototype for the function. 2024f22ef01cSRoman Divacky llvm::Constant *Entry = GetAddrOfFunction(GD, Ty); 2025f22ef01cSRoman Divacky 2026f22ef01cSRoman Divacky // Strip off a bitcast if we got one back. 2027f22ef01cSRoman Divacky if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 2028f22ef01cSRoman Divacky assert(CE->getOpcode() == llvm::Instruction::BitCast); 2029f22ef01cSRoman Divacky Entry = CE->getOperand(0); 2030f22ef01cSRoman Divacky } 2031f22ef01cSRoman Divacky 2032f22ef01cSRoman Divacky 2033f22ef01cSRoman Divacky if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() != Ty) { 2034f22ef01cSRoman Divacky llvm::GlobalValue *OldFn = cast<llvm::GlobalValue>(Entry); 2035f22ef01cSRoman Divacky 2036f22ef01cSRoman Divacky // If the types mismatch then we have to rewrite the definition. 2037f22ef01cSRoman Divacky assert(OldFn->isDeclaration() && 2038f22ef01cSRoman Divacky "Shouldn't replace non-declaration"); 2039f22ef01cSRoman Divacky 2040f22ef01cSRoman Divacky // F is the Function* for the one with the wrong type, we must make a new 2041f22ef01cSRoman Divacky // Function* and update everything that used F (a declaration) with the new 2042f22ef01cSRoman Divacky // Function* (which will be a definition). 2043f22ef01cSRoman Divacky // 2044f22ef01cSRoman Divacky // This happens if there is a prototype for a function 2045f22ef01cSRoman Divacky // (e.g. "int f()") and then a definition of a different type 2046f22ef01cSRoman Divacky // (e.g. "int f(int x)"). Move the old function aside so that it 2047f22ef01cSRoman Divacky // doesn't interfere with GetAddrOfFunction. 20486122f3e6SDimitry Andric OldFn->setName(StringRef()); 2049f22ef01cSRoman Divacky llvm::Function *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty)); 2050f22ef01cSRoman Divacky 2051139f7f9bSDimitry Andric // This might be an implementation of a function without a 2052139f7f9bSDimitry Andric // prototype, in which case, try to do special replacement of 2053139f7f9bSDimitry Andric // calls which match the new prototype. The really key thing here 2054139f7f9bSDimitry Andric // is that we also potentially drop arguments from the call site 2055139f7f9bSDimitry Andric // so as to make a direct call, which makes the inliner happier 2056139f7f9bSDimitry Andric // and suppresses a number of optimizer warnings (!) about 2057139f7f9bSDimitry Andric // dropping arguments. 2058139f7f9bSDimitry Andric if (!OldFn->use_empty()) { 2059f22ef01cSRoman Divacky ReplaceUsesOfNonProtoTypeWithRealFunction(OldFn, NewFn); 2060f22ef01cSRoman Divacky OldFn->removeDeadConstantUsers(); 2061f22ef01cSRoman Divacky } 2062f22ef01cSRoman Divacky 2063f22ef01cSRoman Divacky // Replace uses of F with the Function we will endow with a body. 2064f22ef01cSRoman Divacky if (!Entry->use_empty()) { 2065f22ef01cSRoman Divacky llvm::Constant *NewPtrForOldDecl = 2066f22ef01cSRoman Divacky llvm::ConstantExpr::getBitCast(NewFn, Entry->getType()); 2067f22ef01cSRoman Divacky Entry->replaceAllUsesWith(NewPtrForOldDecl); 2068f22ef01cSRoman Divacky } 2069f22ef01cSRoman Divacky 2070f22ef01cSRoman Divacky // Ok, delete the old function now, which is dead. 2071f22ef01cSRoman Divacky OldFn->eraseFromParent(); 2072f22ef01cSRoman Divacky 2073f22ef01cSRoman Divacky Entry = NewFn; 2074f22ef01cSRoman Divacky } 2075f22ef01cSRoman Divacky 20762754fe60SDimitry Andric // We need to set linkage and visibility on the function before 20772754fe60SDimitry Andric // generating code for it because various parts of IR generation 20782754fe60SDimitry Andric // want to propagate this information down (e.g. to local static 20792754fe60SDimitry Andric // declarations). 2080f22ef01cSRoman Divacky llvm::Function *Fn = cast<llvm::Function>(Entry); 2081f22ef01cSRoman Divacky setFunctionLinkage(D, Fn); 2082f22ef01cSRoman Divacky 20832754fe60SDimitry Andric // FIXME: this is redundant with part of SetFunctionDefinitionAttributes 20842754fe60SDimitry Andric setGlobalVisibility(Fn, D); 20852754fe60SDimitry Andric 20863b0f4066SDimitry Andric CodeGenFunction(*this).GenerateCode(D, Fn, FI); 2087f22ef01cSRoman Divacky 2088f22ef01cSRoman Divacky SetFunctionDefinitionAttributes(D, Fn); 2089f22ef01cSRoman Divacky SetLLVMFunctionAttributesForDefinition(D, Fn); 2090f22ef01cSRoman Divacky 2091f22ef01cSRoman Divacky if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) 2092f22ef01cSRoman Divacky AddGlobalCtor(Fn, CA->getPriority()); 2093f22ef01cSRoman Divacky if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) 2094f22ef01cSRoman Divacky AddGlobalDtor(Fn, DA->getPriority()); 20956122f3e6SDimitry Andric if (D->hasAttr<AnnotateAttr>()) 20966122f3e6SDimitry Andric AddGlobalAnnotations(D, Fn); 2097f22ef01cSRoman Divacky } 2098f22ef01cSRoman Divacky 2099f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { 2100f22ef01cSRoman Divacky const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); 2101f22ef01cSRoman Divacky const AliasAttr *AA = D->getAttr<AliasAttr>(); 2102f22ef01cSRoman Divacky assert(AA && "Not an alias?"); 2103f22ef01cSRoman Divacky 21046122f3e6SDimitry Andric StringRef MangledName = getMangledName(GD); 2105f22ef01cSRoman Divacky 2106f22ef01cSRoman Divacky // If there is a definition in the module, then it wins over the alias. 2107f22ef01cSRoman Divacky // This is dubious, but allow it to be safe. Just ignore the alias. 2108f22ef01cSRoman Divacky llvm::GlobalValue *Entry = GetGlobalValue(MangledName); 2109f22ef01cSRoman Divacky if (Entry && !Entry->isDeclaration()) 2110f22ef01cSRoman Divacky return; 2111f22ef01cSRoman Divacky 21126122f3e6SDimitry Andric llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); 2113f22ef01cSRoman Divacky 2114f22ef01cSRoman Divacky // Create a reference to the named value. This ensures that it is emitted 2115f22ef01cSRoman Divacky // if a deferred decl. 2116f22ef01cSRoman Divacky llvm::Constant *Aliasee; 2117f22ef01cSRoman Divacky if (isa<llvm::FunctionType>(DeclTy)) 21183861d79fSDimitry Andric Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, 21192754fe60SDimitry Andric /*ForVTable=*/false); 2120f22ef01cSRoman Divacky else 2121f22ef01cSRoman Divacky Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), 2122f22ef01cSRoman Divacky llvm::PointerType::getUnqual(DeclTy), 0); 2123f22ef01cSRoman Divacky 2124f22ef01cSRoman Divacky // Create the new alias itself, but don't set a name yet. 2125f22ef01cSRoman Divacky llvm::GlobalValue *GA = 2126f22ef01cSRoman Divacky new llvm::GlobalAlias(Aliasee->getType(), 2127f22ef01cSRoman Divacky llvm::Function::ExternalLinkage, 2128f22ef01cSRoman Divacky "", Aliasee, &getModule()); 2129f22ef01cSRoman Divacky 2130f22ef01cSRoman Divacky if (Entry) { 2131f22ef01cSRoman Divacky assert(Entry->isDeclaration()); 2132f22ef01cSRoman Divacky 2133f22ef01cSRoman Divacky // If there is a declaration in the module, then we had an extern followed 2134f22ef01cSRoman Divacky // by the alias, as in: 2135f22ef01cSRoman Divacky // extern int test6(); 2136f22ef01cSRoman Divacky // ... 2137f22ef01cSRoman Divacky // int test6() __attribute__((alias("test7"))); 2138f22ef01cSRoman Divacky // 2139f22ef01cSRoman Divacky // Remove it and replace uses of it with the alias. 2140f22ef01cSRoman Divacky GA->takeName(Entry); 2141f22ef01cSRoman Divacky 2142f22ef01cSRoman Divacky Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, 2143f22ef01cSRoman Divacky Entry->getType())); 2144f22ef01cSRoman Divacky Entry->eraseFromParent(); 2145f22ef01cSRoman Divacky } else { 2146ffd1746dSEd Schouten GA->setName(MangledName); 2147f22ef01cSRoman Divacky } 2148f22ef01cSRoman Divacky 2149f22ef01cSRoman Divacky // Set attributes which are particular to an alias; this is a 2150f22ef01cSRoman Divacky // specialization of the attributes which may be set on a global 2151f22ef01cSRoman Divacky // variable/function. 2152f22ef01cSRoman Divacky if (D->hasAttr<DLLExportAttr>()) { 2153f22ef01cSRoman Divacky if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 2154f22ef01cSRoman Divacky // The dllexport attribute is ignored for undefined symbols. 2155ffd1746dSEd Schouten if (FD->hasBody()) 2156f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2157f22ef01cSRoman Divacky } else { 2158f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::DLLExportLinkage); 2159f22ef01cSRoman Divacky } 2160f22ef01cSRoman Divacky } else if (D->hasAttr<WeakAttr>() || 2161f22ef01cSRoman Divacky D->hasAttr<WeakRefAttr>() || 21623b0f4066SDimitry Andric D->isWeakImported()) { 2163f22ef01cSRoman Divacky GA->setLinkage(llvm::Function::WeakAnyLinkage); 2164f22ef01cSRoman Divacky } 2165f22ef01cSRoman Divacky 2166f22ef01cSRoman Divacky SetCommonAttributes(D, GA); 2167f22ef01cSRoman Divacky } 2168f22ef01cSRoman Divacky 216917a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID, 21706122f3e6SDimitry Andric ArrayRef<llvm::Type*> Tys) { 217117a519f9SDimitry Andric return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID, 217217a519f9SDimitry Andric Tys); 2173f22ef01cSRoman Divacky } 2174f22ef01cSRoman Divacky 2175f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> & 2176f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2177f22ef01cSRoman Divacky const StringLiteral *Literal, 2178f22ef01cSRoman Divacky bool TargetIsLSB, 2179f22ef01cSRoman Divacky bool &IsUTF16, 2180f22ef01cSRoman Divacky unsigned &StringLength) { 21816122f3e6SDimitry Andric StringRef String = Literal->getString(); 2182e580952dSDimitry Andric unsigned NumBytes = String.size(); 2183f22ef01cSRoman Divacky 2184f22ef01cSRoman Divacky // Check for simple case. 2185f22ef01cSRoman Divacky if (!Literal->containsNonAsciiOrNull()) { 2186f22ef01cSRoman Divacky StringLength = NumBytes; 2187e580952dSDimitry Andric return Map.GetOrCreateValue(String); 2188f22ef01cSRoman Divacky } 2189f22ef01cSRoman Divacky 2190dff0c46cSDimitry Andric // Otherwise, convert the UTF8 literals into a string of shorts. 2191dff0c46cSDimitry Andric IsUTF16 = true; 2192dff0c46cSDimitry Andric 2193dff0c46cSDimitry Andric SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls. 21943861d79fSDimitry Andric const UTF8 *FromPtr = (const UTF8 *)String.data(); 2195f22ef01cSRoman Divacky UTF16 *ToPtr = &ToBuf[0]; 2196f22ef01cSRoman Divacky 21972754fe60SDimitry Andric (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes, 2198f22ef01cSRoman Divacky &ToPtr, ToPtr + NumBytes, 2199f22ef01cSRoman Divacky strictConversion); 2200f22ef01cSRoman Divacky 2201f22ef01cSRoman Divacky // ConvertUTF8toUTF16 returns the length in ToPtr. 2202f22ef01cSRoman Divacky StringLength = ToPtr - &ToBuf[0]; 2203f22ef01cSRoman Divacky 2204dff0c46cSDimitry Andric // Add an explicit null. 2205dff0c46cSDimitry Andric *ToPtr = 0; 2206dff0c46cSDimitry Andric return Map. 2207dff0c46cSDimitry Andric GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()), 2208dff0c46cSDimitry Andric (StringLength + 1) * 2)); 2209f22ef01cSRoman Divacky } 2210f22ef01cSRoman Divacky 2211bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> & 2212bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map, 2213bd5abe19SDimitry Andric const StringLiteral *Literal, 2214dff0c46cSDimitry Andric unsigned &StringLength) { 22156122f3e6SDimitry Andric StringRef String = Literal->getString(); 2216bd5abe19SDimitry Andric StringLength = String.size(); 2217bd5abe19SDimitry Andric return Map.GetOrCreateValue(String); 2218bd5abe19SDimitry Andric } 2219bd5abe19SDimitry Andric 2220f22ef01cSRoman Divacky llvm::Constant * 2221f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) { 2222f22ef01cSRoman Divacky unsigned StringLength = 0; 2223f22ef01cSRoman Divacky bool isUTF16 = false; 2224f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2225f22ef01cSRoman Divacky GetConstantCFStringEntry(CFConstantStringMap, Literal, 22263861d79fSDimitry Andric getDataLayout().isLittleEndian(), 2227f22ef01cSRoman Divacky isUTF16, StringLength); 2228f22ef01cSRoman Divacky 2229f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2230f22ef01cSRoman Divacky return C; 2231f22ef01cSRoman Divacky 2232dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2233f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2234f22ef01cSRoman Divacky 2235f22ef01cSRoman Divacky // If we don't already have it, get __CFConstantStringClassReference. 2236f22ef01cSRoman Divacky if (!CFConstantStringClassRef) { 22376122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 2238f22ef01cSRoman Divacky Ty = llvm::ArrayType::get(Ty, 0); 2239f22ef01cSRoman Divacky llvm::Constant *GV = CreateRuntimeVariable(Ty, 2240f22ef01cSRoman Divacky "__CFConstantStringClassReference"); 2241f22ef01cSRoman Divacky // Decay array -> ptr 2242f22ef01cSRoman Divacky CFConstantStringClassRef = 22436122f3e6SDimitry Andric llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2244f22ef01cSRoman Divacky } 2245f22ef01cSRoman Divacky 2246f22ef01cSRoman Divacky QualType CFTy = getContext().getCFConstantStringType(); 2247f22ef01cSRoman Divacky 22486122f3e6SDimitry Andric llvm::StructType *STy = 2249f22ef01cSRoman Divacky cast<llvm::StructType>(getTypes().ConvertType(CFTy)); 2250f22ef01cSRoman Divacky 2251dff0c46cSDimitry Andric llvm::Constant *Fields[4]; 2252f22ef01cSRoman Divacky 2253f22ef01cSRoman Divacky // Class pointer. 2254f22ef01cSRoman Divacky Fields[0] = CFConstantStringClassRef; 2255f22ef01cSRoman Divacky 2256f22ef01cSRoman Divacky // Flags. 22576122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2258f22ef01cSRoman Divacky Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) : 2259f22ef01cSRoman Divacky llvm::ConstantInt::get(Ty, 0x07C8); 2260f22ef01cSRoman Divacky 2261f22ef01cSRoman Divacky // String pointer. 2262dff0c46cSDimitry Andric llvm::Constant *C = 0; 2263dff0c46cSDimitry Andric if (isUTF16) { 2264dff0c46cSDimitry Andric ArrayRef<uint16_t> Arr = 2265139f7f9bSDimitry Andric llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>( 2266139f7f9bSDimitry Andric const_cast<char *>(Entry.getKey().data())), 2267dff0c46cSDimitry Andric Entry.getKey().size() / 2); 2268dff0c46cSDimitry Andric C = llvm::ConstantDataArray::get(VMContext, Arr); 2269dff0c46cSDimitry Andric } else { 2270dff0c46cSDimitry Andric C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2271dff0c46cSDimitry Andric } 2272f22ef01cSRoman Divacky 2273f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2274dff0c46cSDimitry Andric if (isUTF16) 2275f22ef01cSRoman Divacky // FIXME: why do utf strings get "_" labels instead of "L" labels? 2276f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::InternalLinkage; 2277dff0c46cSDimitry Andric else 22783b0f4066SDimitry Andric // FIXME: With OS X ld 123.2 (xcode 4) and LTO we would get a linker error 22793b0f4066SDimitry Andric // when using private linkage. It is not clear if this is a bug in ld 22803b0f4066SDimitry Andric // or a reasonable new restriction. 22813b0f4066SDimitry Andric Linkage = llvm::GlobalValue::LinkerPrivateLinkage; 2282f22ef01cSRoman Divacky 2283dff0c46cSDimitry Andric // Note: -fwritable-strings doesn't make the backing store strings of 2284dff0c46cSDimitry Andric // CFStrings writable. (See <rdar://problem/10657500>) 2285f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2286dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true, 2287dff0c46cSDimitry Andric Linkage, C, ".str"); 22882754fe60SDimitry Andric GV->setUnnamedAddr(true); 2289f22ef01cSRoman Divacky if (isUTF16) { 2290f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy); 2291f22ef01cSRoman Divacky GV->setAlignment(Align.getQuantity()); 22923b0f4066SDimitry Andric } else { 22933b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 22943b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 2295f22ef01cSRoman Divacky } 2296dff0c46cSDimitry Andric 2297dff0c46cSDimitry Andric // String. 22986122f3e6SDimitry Andric Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2299f22ef01cSRoman Divacky 2300dff0c46cSDimitry Andric if (isUTF16) 2301dff0c46cSDimitry Andric // Cast the UTF16 string to the correct type. 2302dff0c46cSDimitry Andric Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy); 2303dff0c46cSDimitry Andric 2304f22ef01cSRoman Divacky // String length. 2305f22ef01cSRoman Divacky Ty = getTypes().ConvertType(getContext().LongTy); 2306f22ef01cSRoman Divacky Fields[3] = llvm::ConstantInt::get(Ty, StringLength); 2307f22ef01cSRoman Divacky 2308f22ef01cSRoman Divacky // The struct. 2309f22ef01cSRoman Divacky C = llvm::ConstantStruct::get(STy, Fields); 2310f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2311f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2312f22ef01cSRoman Divacky "_unnamed_cfstring_"); 23136122f3e6SDimitry Andric if (const char *Sect = getContext().getTargetInfo().getCFStringSection()) 2314f22ef01cSRoman Divacky GV->setSection(Sect); 2315f22ef01cSRoman Divacky Entry.setValue(GV); 2316f22ef01cSRoman Divacky 2317f22ef01cSRoman Divacky return GV; 2318f22ef01cSRoman Divacky } 2319f22ef01cSRoman Divacky 23206122f3e6SDimitry Andric static RecordDecl * 23216122f3e6SDimitry Andric CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 23226122f3e6SDimitry Andric DeclContext *DC, IdentifierInfo *Id) { 23236122f3e6SDimitry Andric SourceLocation Loc; 2324dff0c46cSDimitry Andric if (Ctx.getLangOpts().CPlusPlus) 23256122f3e6SDimitry Andric return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 23266122f3e6SDimitry Andric else 23276122f3e6SDimitry Andric return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 23286122f3e6SDimitry Andric } 23296122f3e6SDimitry Andric 2330f22ef01cSRoman Divacky llvm::Constant * 23312754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) { 2332f22ef01cSRoman Divacky unsigned StringLength = 0; 2333f22ef01cSRoman Divacky llvm::StringMapEntry<llvm::Constant*> &Entry = 2334bd5abe19SDimitry Andric GetConstantStringEntry(CFConstantStringMap, Literal, StringLength); 2335f22ef01cSRoman Divacky 2336f22ef01cSRoman Divacky if (llvm::Constant *C = Entry.getValue()) 2337f22ef01cSRoman Divacky return C; 2338f22ef01cSRoman Divacky 2339dff0c46cSDimitry Andric llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty); 2340f22ef01cSRoman Divacky llvm::Constant *Zeros[] = { Zero, Zero }; 2341f22ef01cSRoman Divacky 2342f22ef01cSRoman Divacky // If we don't already have it, get _NSConstantStringClassReference. 23432754fe60SDimitry Andric if (!ConstantStringClassRef) { 2344dff0c46cSDimitry Andric std::string StringClass(getLangOpts().ObjCConstantStringClass); 23456122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy); 23462754fe60SDimitry Andric llvm::Constant *GV; 23477ae0e2c9SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 2348bd5abe19SDimitry Andric std::string str = 2349bd5abe19SDimitry Andric StringClass.empty() ? "OBJC_CLASS_$_NSConstantString" 2350bd5abe19SDimitry Andric : "OBJC_CLASS_$_" + StringClass; 2351bd5abe19SDimitry Andric GV = getObjCRuntime().GetClassGlobal(str); 2352bd5abe19SDimitry Andric // Make sure the result is of the correct type. 23536122f3e6SDimitry Andric llvm::Type *PTy = llvm::PointerType::getUnqual(Ty); 2354bd5abe19SDimitry Andric ConstantStringClassRef = 2355bd5abe19SDimitry Andric llvm::ConstantExpr::getBitCast(GV, PTy); 2356bd5abe19SDimitry Andric } else { 2357bd5abe19SDimitry Andric std::string str = 2358bd5abe19SDimitry Andric StringClass.empty() ? "_NSConstantStringClassReference" 2359bd5abe19SDimitry Andric : "_" + StringClass + "ClassReference"; 23606122f3e6SDimitry Andric llvm::Type *PTy = llvm::ArrayType::get(Ty, 0); 2361bd5abe19SDimitry Andric GV = CreateRuntimeVariable(PTy, str); 2362f22ef01cSRoman Divacky // Decay array -> ptr 23632754fe60SDimitry Andric ConstantStringClassRef = 23646122f3e6SDimitry Andric llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2365f22ef01cSRoman Divacky } 2366bd5abe19SDimitry Andric } 2367f22ef01cSRoman Divacky 23686122f3e6SDimitry Andric if (!NSConstantStringType) { 23696122f3e6SDimitry Andric // Construct the type for a constant NSString. 23706122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 23716122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 23726122f3e6SDimitry Andric &Context.Idents.get("__builtin_NSString")); 23736122f3e6SDimitry Andric D->startDefinition(); 2374f22ef01cSRoman Divacky 23756122f3e6SDimitry Andric QualType FieldTypes[3]; 23766122f3e6SDimitry Andric 23776122f3e6SDimitry Andric // const int *isa; 23786122f3e6SDimitry Andric FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst()); 23796122f3e6SDimitry Andric // const char *str; 23806122f3e6SDimitry Andric FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst()); 23816122f3e6SDimitry Andric // unsigned int length; 23826122f3e6SDimitry Andric FieldTypes[2] = Context.UnsignedIntTy; 23836122f3e6SDimitry Andric 23846122f3e6SDimitry Andric // Create fields 23856122f3e6SDimitry Andric for (unsigned i = 0; i < 3; ++i) { 23866122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, D, 23876122f3e6SDimitry Andric SourceLocation(), 23886122f3e6SDimitry Andric SourceLocation(), 0, 23896122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 23906122f3e6SDimitry Andric /*BitWidth=*/0, 23916122f3e6SDimitry Andric /*Mutable=*/false, 23927ae0e2c9SDimitry Andric ICIS_NoInit); 23936122f3e6SDimitry Andric Field->setAccess(AS_public); 23946122f3e6SDimitry Andric D->addDecl(Field); 23956122f3e6SDimitry Andric } 23966122f3e6SDimitry Andric 23976122f3e6SDimitry Andric D->completeDefinition(); 23986122f3e6SDimitry Andric QualType NSTy = Context.getTagDeclType(D); 23996122f3e6SDimitry Andric NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy)); 24006122f3e6SDimitry Andric } 2401f22ef01cSRoman Divacky 2402dff0c46cSDimitry Andric llvm::Constant *Fields[3]; 2403f22ef01cSRoman Divacky 2404f22ef01cSRoman Divacky // Class pointer. 24052754fe60SDimitry Andric Fields[0] = ConstantStringClassRef; 2406f22ef01cSRoman Divacky 2407f22ef01cSRoman Divacky // String pointer. 2408dff0c46cSDimitry Andric llvm::Constant *C = 2409dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(VMContext, Entry.getKey()); 2410f22ef01cSRoman Divacky 2411f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes Linkage; 2412f22ef01cSRoman Divacky bool isConstant; 2413f22ef01cSRoman Divacky Linkage = llvm::GlobalValue::PrivateLinkage; 2414dff0c46cSDimitry Andric isConstant = !LangOpts.WritableStrings; 2415f22ef01cSRoman Divacky 2416f22ef01cSRoman Divacky llvm::GlobalVariable *GV = 2417f22ef01cSRoman Divacky new llvm::GlobalVariable(getModule(), C->getType(), isConstant, Linkage, C, 2418f22ef01cSRoman Divacky ".str"); 24192754fe60SDimitry Andric GV->setUnnamedAddr(true); 24203b0f4066SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy); 24213b0f4066SDimitry Andric GV->setAlignment(Align.getQuantity()); 24226122f3e6SDimitry Andric Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros); 2423f22ef01cSRoman Divacky 2424f22ef01cSRoman Divacky // String length. 24256122f3e6SDimitry Andric llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy); 2426f22ef01cSRoman Divacky Fields[2] = llvm::ConstantInt::get(Ty, StringLength); 2427f22ef01cSRoman Divacky 2428f22ef01cSRoman Divacky // The struct. 24296122f3e6SDimitry Andric C = llvm::ConstantStruct::get(NSConstantStringType, Fields); 2430f22ef01cSRoman Divacky GV = new llvm::GlobalVariable(getModule(), C->getType(), true, 2431f22ef01cSRoman Divacky llvm::GlobalVariable::PrivateLinkage, C, 2432f22ef01cSRoman Divacky "_unnamed_nsstring_"); 2433f22ef01cSRoman Divacky // FIXME. Fix section. 2434f22ef01cSRoman Divacky if (const char *Sect = 24357ae0e2c9SDimitry Andric LangOpts.ObjCRuntime.isNonFragile() 24366122f3e6SDimitry Andric ? getContext().getTargetInfo().getNSStringNonFragileABISection() 24376122f3e6SDimitry Andric : getContext().getTargetInfo().getNSStringSection()) 2438f22ef01cSRoman Divacky GV->setSection(Sect); 2439f22ef01cSRoman Divacky Entry.setValue(GV); 2440f22ef01cSRoman Divacky 2441f22ef01cSRoman Divacky return GV; 2442f22ef01cSRoman Divacky } 2443f22ef01cSRoman Divacky 24446122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() { 24456122f3e6SDimitry Andric if (ObjCFastEnumerationStateType.isNull()) { 24466122f3e6SDimitry Andric RecordDecl *D = CreateRecordDecl(Context, TTK_Struct, 24476122f3e6SDimitry Andric Context.getTranslationUnitDecl(), 24486122f3e6SDimitry Andric &Context.Idents.get("__objcFastEnumerationState")); 24496122f3e6SDimitry Andric D->startDefinition(); 24506122f3e6SDimitry Andric 24516122f3e6SDimitry Andric QualType FieldTypes[] = { 24526122f3e6SDimitry Andric Context.UnsignedLongTy, 24536122f3e6SDimitry Andric Context.getPointerType(Context.getObjCIdType()), 24546122f3e6SDimitry Andric Context.getPointerType(Context.UnsignedLongTy), 24556122f3e6SDimitry Andric Context.getConstantArrayType(Context.UnsignedLongTy, 24566122f3e6SDimitry Andric llvm::APInt(32, 5), ArrayType::Normal, 0) 24576122f3e6SDimitry Andric }; 24586122f3e6SDimitry Andric 24596122f3e6SDimitry Andric for (size_t i = 0; i < 4; ++i) { 24606122f3e6SDimitry Andric FieldDecl *Field = FieldDecl::Create(Context, 24616122f3e6SDimitry Andric D, 24626122f3e6SDimitry Andric SourceLocation(), 24636122f3e6SDimitry Andric SourceLocation(), 0, 24646122f3e6SDimitry Andric FieldTypes[i], /*TInfo=*/0, 24656122f3e6SDimitry Andric /*BitWidth=*/0, 24666122f3e6SDimitry Andric /*Mutable=*/false, 24677ae0e2c9SDimitry Andric ICIS_NoInit); 24686122f3e6SDimitry Andric Field->setAccess(AS_public); 24696122f3e6SDimitry Andric D->addDecl(Field); 24706122f3e6SDimitry Andric } 24716122f3e6SDimitry Andric 24726122f3e6SDimitry Andric D->completeDefinition(); 24736122f3e6SDimitry Andric ObjCFastEnumerationStateType = Context.getTagDeclType(D); 24746122f3e6SDimitry Andric } 24756122f3e6SDimitry Andric 24766122f3e6SDimitry Andric return ObjCFastEnumerationStateType; 24776122f3e6SDimitry Andric } 24786122f3e6SDimitry Andric 2479dff0c46cSDimitry Andric llvm::Constant * 2480dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) { 2481dff0c46cSDimitry Andric assert(!E->getType()->isPointerType() && "Strings are always arrays"); 2482f22ef01cSRoman Divacky 2483dff0c46cSDimitry Andric // Don't emit it as the address of the string, emit the string data itself 2484dff0c46cSDimitry Andric // as an inline array. 2485dff0c46cSDimitry Andric if (E->getCharByteWidth() == 1) { 2486dff0c46cSDimitry Andric SmallString<64> Str(E->getString()); 2487f22ef01cSRoman Divacky 2488dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2489dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType()); 2490dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2491dff0c46cSDimitry Andric return llvm::ConstantDataArray::getString(VMContext, Str, false); 24926122f3e6SDimitry Andric } 2493f22ef01cSRoman Divacky 2494dff0c46cSDimitry Andric llvm::ArrayType *AType = 2495dff0c46cSDimitry Andric cast<llvm::ArrayType>(getTypes().ConvertType(E->getType())); 2496dff0c46cSDimitry Andric llvm::Type *ElemTy = AType->getElementType(); 2497dff0c46cSDimitry Andric unsigned NumElements = AType->getNumElements(); 2498f22ef01cSRoman Divacky 2499dff0c46cSDimitry Andric // Wide strings have either 2-byte or 4-byte elements. 2500dff0c46cSDimitry Andric if (ElemTy->getPrimitiveSizeInBits() == 16) { 2501dff0c46cSDimitry Andric SmallVector<uint16_t, 32> Elements; 2502dff0c46cSDimitry Andric Elements.reserve(NumElements); 2503dff0c46cSDimitry Andric 2504dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2505dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2506dff0c46cSDimitry Andric Elements.resize(NumElements); 2507dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2508dff0c46cSDimitry Andric } 2509dff0c46cSDimitry Andric 2510dff0c46cSDimitry Andric assert(ElemTy->getPrimitiveSizeInBits() == 32); 2511dff0c46cSDimitry Andric SmallVector<uint32_t, 32> Elements; 2512dff0c46cSDimitry Andric Elements.reserve(NumElements); 2513dff0c46cSDimitry Andric 2514dff0c46cSDimitry Andric for(unsigned i = 0, e = E->getLength(); i != e; ++i) 2515dff0c46cSDimitry Andric Elements.push_back(E->getCodeUnit(i)); 2516dff0c46cSDimitry Andric Elements.resize(NumElements); 2517dff0c46cSDimitry Andric return llvm::ConstantDataArray::get(VMContext, Elements); 2518f22ef01cSRoman Divacky } 2519f22ef01cSRoman Divacky 2520f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromLiteral - Return a pointer to a 2521f22ef01cSRoman Divacky /// constant array for the given string literal. 2522f22ef01cSRoman Divacky llvm::Constant * 2523f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { 25246122f3e6SDimitry Andric CharUnits Align = getContext().getTypeAlignInChars(S->getType()); 2525dff0c46cSDimitry Andric if (S->isAscii() || S->isUTF8()) { 2526dff0c46cSDimitry Andric SmallString<64> Str(S->getString()); 2527dff0c46cSDimitry Andric 2528dff0c46cSDimitry Andric // Resize the string to the right size, which is indicated by its type. 2529dff0c46cSDimitry Andric const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType()); 2530dff0c46cSDimitry Andric Str.resize(CAT->getSize().getZExtValue()); 2531dff0c46cSDimitry Andric return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity()); 2532f22ef01cSRoman Divacky } 2533dff0c46cSDimitry Andric 2534dff0c46cSDimitry Andric // FIXME: the following does not memoize wide strings. 2535dff0c46cSDimitry Andric llvm::Constant *C = GetConstantArrayFromStringLiteral(S); 2536dff0c46cSDimitry Andric llvm::GlobalVariable *GV = 2537dff0c46cSDimitry Andric new llvm::GlobalVariable(getModule(),C->getType(), 2538dff0c46cSDimitry Andric !LangOpts.WritableStrings, 2539dff0c46cSDimitry Andric llvm::GlobalValue::PrivateLinkage, 2540dff0c46cSDimitry Andric C,".str"); 2541dff0c46cSDimitry Andric 2542dff0c46cSDimitry Andric GV->setAlignment(Align.getQuantity()); 2543dff0c46cSDimitry Andric GV->setUnnamedAddr(true); 2544dff0c46cSDimitry Andric return GV; 2545f22ef01cSRoman Divacky } 2546f22ef01cSRoman Divacky 2547f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant 2548f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node. 2549f22ef01cSRoman Divacky llvm::Constant * 2550f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { 2551f22ef01cSRoman Divacky std::string Str; 2552f22ef01cSRoman Divacky getContext().getObjCEncodingForType(E->getEncodedType(), Str); 2553f22ef01cSRoman Divacky 2554f22ef01cSRoman Divacky return GetAddrOfConstantCString(Str); 2555f22ef01cSRoman Divacky } 2556f22ef01cSRoman Divacky 2557f22ef01cSRoman Divacky 2558f22ef01cSRoman Divacky /// GenerateWritableString -- Creates storage for a string literal. 25596122f3e6SDimitry Andric static llvm::GlobalVariable *GenerateStringLiteral(StringRef str, 2560f22ef01cSRoman Divacky bool constant, 2561f22ef01cSRoman Divacky CodeGenModule &CGM, 25626122f3e6SDimitry Andric const char *GlobalName, 25636122f3e6SDimitry Andric unsigned Alignment) { 2564f22ef01cSRoman Divacky // Create Constant for this string literal. Don't add a '\0'. 2565f22ef01cSRoman Divacky llvm::Constant *C = 2566dff0c46cSDimitry Andric llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false); 2567f22ef01cSRoman Divacky 2568f22ef01cSRoman Divacky // Create a global variable for this string 25692754fe60SDimitry Andric llvm::GlobalVariable *GV = 25702754fe60SDimitry Andric new llvm::GlobalVariable(CGM.getModule(), C->getType(), constant, 2571f22ef01cSRoman Divacky llvm::GlobalValue::PrivateLinkage, 2572f22ef01cSRoman Divacky C, GlobalName); 25736122f3e6SDimitry Andric GV->setAlignment(Alignment); 25742754fe60SDimitry Andric GV->setUnnamedAddr(true); 25752754fe60SDimitry Andric return GV; 2576f22ef01cSRoman Divacky } 2577f22ef01cSRoman Divacky 2578f22ef01cSRoman Divacky /// GetAddrOfConstantString - Returns a pointer to a character array 2579f22ef01cSRoman Divacky /// containing the literal. This contents are exactly that of the 2580f22ef01cSRoman Divacky /// given string, i.e. it will not be null terminated automatically; 2581f22ef01cSRoman Divacky /// see GetAddrOfConstantCString. Note that whether the result is 2582f22ef01cSRoman Divacky /// actually a pointer to an LLVM constant depends on 2583f22ef01cSRoman Divacky /// Feature.WriteableStrings. 2584f22ef01cSRoman Divacky /// 2585f22ef01cSRoman Divacky /// The result has pointer to array type. 25866122f3e6SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantString(StringRef Str, 25876122f3e6SDimitry Andric const char *GlobalName, 25886122f3e6SDimitry Andric unsigned Alignment) { 2589f22ef01cSRoman Divacky // Get the default prefix if a name wasn't specified. 2590f22ef01cSRoman Divacky if (!GlobalName) 2591f22ef01cSRoman Divacky GlobalName = ".str"; 2592f22ef01cSRoman Divacky 2593f22ef01cSRoman Divacky // Don't share any string literals if strings aren't constant. 2594dff0c46cSDimitry Andric if (LangOpts.WritableStrings) 25956122f3e6SDimitry Andric return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment); 2596f22ef01cSRoman Divacky 25976122f3e6SDimitry Andric llvm::StringMapEntry<llvm::GlobalVariable *> &Entry = 25983b0f4066SDimitry Andric ConstantStringMap.GetOrCreateValue(Str); 2599f22ef01cSRoman Divacky 26006122f3e6SDimitry Andric if (llvm::GlobalVariable *GV = Entry.getValue()) { 26016122f3e6SDimitry Andric if (Alignment > GV->getAlignment()) { 26026122f3e6SDimitry Andric GV->setAlignment(Alignment); 26036122f3e6SDimitry Andric } 26046122f3e6SDimitry Andric return GV; 26056122f3e6SDimitry Andric } 2606f22ef01cSRoman Divacky 2607f22ef01cSRoman Divacky // Create a global variable for this. 2608dff0c46cSDimitry Andric llvm::GlobalVariable *GV = GenerateStringLiteral(Str, true, *this, GlobalName, 2609dff0c46cSDimitry Andric Alignment); 26106122f3e6SDimitry Andric Entry.setValue(GV); 26116122f3e6SDimitry Andric return GV; 2612f22ef01cSRoman Divacky } 2613f22ef01cSRoman Divacky 2614f22ef01cSRoman Divacky /// GetAddrOfConstantCString - Returns a pointer to a character 26153b0f4066SDimitry Andric /// array containing the literal and a terminating '\0' 2616f22ef01cSRoman Divacky /// character. The result has pointer to array type. 26173b0f4066SDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &Str, 26186122f3e6SDimitry Andric const char *GlobalName, 26196122f3e6SDimitry Andric unsigned Alignment) { 26206122f3e6SDimitry Andric StringRef StrWithNull(Str.c_str(), Str.size() + 1); 26216122f3e6SDimitry Andric return GetAddrOfConstantString(StrWithNull, GlobalName, Alignment); 2622f22ef01cSRoman Divacky } 2623f22ef01cSRoman Divacky 2624f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized 2625f22ef01cSRoman Divacky /// properties for an implementation. 2626f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const 2627f22ef01cSRoman Divacky ObjCImplementationDecl *D) { 2628f22ef01cSRoman Divacky for (ObjCImplementationDecl::propimpl_iterator 2629f22ef01cSRoman Divacky i = D->propimpl_begin(), e = D->propimpl_end(); i != e; ++i) { 2630f22ef01cSRoman Divacky ObjCPropertyImplDecl *PID = *i; 2631f22ef01cSRoman Divacky 2632f22ef01cSRoman Divacky // Dynamic is just for type-checking. 2633f22ef01cSRoman Divacky if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) { 2634f22ef01cSRoman Divacky ObjCPropertyDecl *PD = PID->getPropertyDecl(); 2635f22ef01cSRoman Divacky 2636f22ef01cSRoman Divacky // Determine which methods need to be implemented, some may have 26373861d79fSDimitry Andric // been overridden. Note that ::isPropertyAccessor is not the method 2638f22ef01cSRoman Divacky // we want, that just indicates if the decl came from a 2639f22ef01cSRoman Divacky // property. What we want to know is if the method is defined in 2640f22ef01cSRoman Divacky // this implementation. 2641f22ef01cSRoman Divacky if (!D->getInstanceMethod(PD->getGetterName())) 2642f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCGetter( 2643f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2644f22ef01cSRoman Divacky if (!PD->isReadOnly() && 2645f22ef01cSRoman Divacky !D->getInstanceMethod(PD->getSetterName())) 2646f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCSetter( 2647f22ef01cSRoman Divacky const_cast<ObjCImplementationDecl *>(D), PID); 2648f22ef01cSRoman Divacky } 2649f22ef01cSRoman Divacky } 2650f22ef01cSRoman Divacky } 2651f22ef01cSRoman Divacky 26523b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) { 26536122f3e6SDimitry Andric const ObjCInterfaceDecl *iface = impl->getClassInterface(); 26546122f3e6SDimitry Andric for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin(); 26553b0f4066SDimitry Andric ivar; ivar = ivar->getNextIvar()) 26563b0f4066SDimitry Andric if (ivar->getType().isDestructedType()) 26573b0f4066SDimitry Andric return true; 26583b0f4066SDimitry Andric 26593b0f4066SDimitry Andric return false; 26603b0f4066SDimitry Andric } 26613b0f4066SDimitry Andric 2662f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization 2663f22ef01cSRoman Divacky /// for an implementation. 2664f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) { 26653b0f4066SDimitry Andric // We might need a .cxx_destruct even if we don't have any ivar initializers. 26663b0f4066SDimitry Andric if (needsDestructMethod(D)) { 2667f22ef01cSRoman Divacky IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct"); 2668f22ef01cSRoman Divacky Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 26693b0f4066SDimitry Andric ObjCMethodDecl *DTORMethod = 26703b0f4066SDimitry Andric ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(), 26716122f3e6SDimitry Andric cxxSelector, getContext().VoidTy, 0, D, 26726122f3e6SDimitry Andric /*isInstance=*/true, /*isVariadic=*/false, 26733861d79fSDimitry Andric /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true, 26746122f3e6SDimitry Andric /*isDefined=*/false, ObjCMethodDecl::Required); 2675f22ef01cSRoman Divacky D->addInstanceMethod(DTORMethod); 2676f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false); 26773861d79fSDimitry Andric D->setHasDestructors(true); 26783b0f4066SDimitry Andric } 2679f22ef01cSRoman Divacky 26803b0f4066SDimitry Andric // If the implementation doesn't have any ivar initializers, we don't need 26813b0f4066SDimitry Andric // a .cxx_construct. 26823b0f4066SDimitry Andric if (D->getNumIvarInitializers() == 0) 26833b0f4066SDimitry Andric return; 26843b0f4066SDimitry Andric 26853b0f4066SDimitry Andric IdentifierInfo *II = &getContext().Idents.get(".cxx_construct"); 26863b0f4066SDimitry Andric Selector cxxSelector = getContext().Selectors.getSelector(0, &II); 2687f22ef01cSRoman Divacky // The constructor returns 'self'. 2688f22ef01cSRoman Divacky ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(), 2689f22ef01cSRoman Divacky D->getLocation(), 26906122f3e6SDimitry Andric D->getLocation(), 26916122f3e6SDimitry Andric cxxSelector, 2692f22ef01cSRoman Divacky getContext().getObjCIdType(), 0, 26936122f3e6SDimitry Andric D, /*isInstance=*/true, 26946122f3e6SDimitry Andric /*isVariadic=*/false, 26953861d79fSDimitry Andric /*isPropertyAccessor=*/true, 26966122f3e6SDimitry Andric /*isImplicitlyDeclared=*/true, 26976122f3e6SDimitry Andric /*isDefined=*/false, 2698f22ef01cSRoman Divacky ObjCMethodDecl::Required); 2699f22ef01cSRoman Divacky D->addInstanceMethod(CTORMethod); 2700f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true); 27013861d79fSDimitry Andric D->setHasNonZeroConstructors(true); 2702f22ef01cSRoman Divacky } 2703f22ef01cSRoman Divacky 2704f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace. 2705f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) { 2706f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = ND->decls_begin(), E = ND->decls_end(); 2707f22ef01cSRoman Divacky I != E; ++I) 2708f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2709f22ef01cSRoman Divacky } 2710f22ef01cSRoman Divacky 2711f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec. 2712f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { 2713f22ef01cSRoman Divacky if (LSD->getLanguage() != LinkageSpecDecl::lang_c && 2714f22ef01cSRoman Divacky LSD->getLanguage() != LinkageSpecDecl::lang_cxx) { 2715f22ef01cSRoman Divacky ErrorUnsupported(LSD, "linkage spec"); 2716f22ef01cSRoman Divacky return; 2717f22ef01cSRoman Divacky } 2718f22ef01cSRoman Divacky 2719f22ef01cSRoman Divacky for (RecordDecl::decl_iterator I = LSD->decls_begin(), E = LSD->decls_end(); 27203861d79fSDimitry Andric I != E; ++I) { 27213861d79fSDimitry Andric // Meta-data for ObjC class includes references to implemented methods. 27223861d79fSDimitry Andric // Generate class's method definitions first. 27233861d79fSDimitry Andric if (ObjCImplDecl *OID = dyn_cast<ObjCImplDecl>(*I)) { 27243861d79fSDimitry Andric for (ObjCContainerDecl::method_iterator M = OID->meth_begin(), 27253861d79fSDimitry Andric MEnd = OID->meth_end(); 27263861d79fSDimitry Andric M != MEnd; ++M) 27273861d79fSDimitry Andric EmitTopLevelDecl(*M); 27283861d79fSDimitry Andric } 2729f22ef01cSRoman Divacky EmitTopLevelDecl(*I); 2730f22ef01cSRoman Divacky } 27313861d79fSDimitry Andric } 2732f22ef01cSRoman Divacky 2733f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration. 2734f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) { 2735f22ef01cSRoman Divacky // If an error has occurred, stop code generation, but continue 2736f22ef01cSRoman Divacky // parsing and semantic analysis (to ensure all warnings and errors 2737f22ef01cSRoman Divacky // are emitted). 2738f22ef01cSRoman Divacky if (Diags.hasErrorOccurred()) 2739f22ef01cSRoman Divacky return; 2740f22ef01cSRoman Divacky 2741f22ef01cSRoman Divacky // Ignore dependent declarations. 2742f22ef01cSRoman Divacky if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) 2743f22ef01cSRoman Divacky return; 2744f22ef01cSRoman Divacky 2745f22ef01cSRoman Divacky switch (D->getKind()) { 2746f22ef01cSRoman Divacky case Decl::CXXConversion: 2747f22ef01cSRoman Divacky case Decl::CXXMethod: 2748f22ef01cSRoman Divacky case Decl::Function: 2749f22ef01cSRoman Divacky // Skip function templates 27503b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 27513b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2752f22ef01cSRoman Divacky return; 2753f22ef01cSRoman Divacky 2754f22ef01cSRoman Divacky EmitGlobal(cast<FunctionDecl>(D)); 2755f22ef01cSRoman Divacky break; 2756f22ef01cSRoman Divacky 2757f22ef01cSRoman Divacky case Decl::Var: 2758f22ef01cSRoman Divacky EmitGlobal(cast<VarDecl>(D)); 2759f22ef01cSRoman Divacky break; 2760f22ef01cSRoman Divacky 27613b0f4066SDimitry Andric // Indirect fields from global anonymous structs and unions can be 27623b0f4066SDimitry Andric // ignored; only the actual variable requires IR gen support. 27633b0f4066SDimitry Andric case Decl::IndirectField: 27643b0f4066SDimitry Andric break; 27653b0f4066SDimitry Andric 2766f22ef01cSRoman Divacky // C++ Decls 2767f22ef01cSRoman Divacky case Decl::Namespace: 2768f22ef01cSRoman Divacky EmitNamespace(cast<NamespaceDecl>(D)); 2769f22ef01cSRoman Divacky break; 2770f22ef01cSRoman Divacky // No code generation needed. 2771f22ef01cSRoman Divacky case Decl::UsingShadow: 2772f22ef01cSRoman Divacky case Decl::Using: 2773f22ef01cSRoman Divacky case Decl::UsingDirective: 2774f22ef01cSRoman Divacky case Decl::ClassTemplate: 2775f22ef01cSRoman Divacky case Decl::FunctionTemplate: 2776bd5abe19SDimitry Andric case Decl::TypeAliasTemplate: 2777f22ef01cSRoman Divacky case Decl::NamespaceAlias: 2778bd5abe19SDimitry Andric case Decl::Block: 2779139f7f9bSDimitry Andric case Decl::Empty: 2780f22ef01cSRoman Divacky break; 2781f22ef01cSRoman Divacky case Decl::CXXConstructor: 2782f22ef01cSRoman Divacky // Skip function templates 27833b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || 27843b0f4066SDimitry Andric cast<FunctionDecl>(D)->isLateTemplateParsed()) 2785f22ef01cSRoman Divacky return; 2786f22ef01cSRoman Divacky 2787f22ef01cSRoman Divacky EmitCXXConstructors(cast<CXXConstructorDecl>(D)); 2788f22ef01cSRoman Divacky break; 2789f22ef01cSRoman Divacky case Decl::CXXDestructor: 27903b0f4066SDimitry Andric if (cast<FunctionDecl>(D)->isLateTemplateParsed()) 27913b0f4066SDimitry Andric return; 2792f22ef01cSRoman Divacky EmitCXXDestructors(cast<CXXDestructorDecl>(D)); 2793f22ef01cSRoman Divacky break; 2794f22ef01cSRoman Divacky 2795f22ef01cSRoman Divacky case Decl::StaticAssert: 2796f22ef01cSRoman Divacky // Nothing to do. 2797f22ef01cSRoman Divacky break; 2798f22ef01cSRoman Divacky 2799f22ef01cSRoman Divacky // Objective-C Decls 2800f22ef01cSRoman Divacky 2801f22ef01cSRoman Divacky // Forward declarations, no (immediate) code generation. 2802f22ef01cSRoman Divacky case Decl::ObjCInterface: 28037ae0e2c9SDimitry Andric case Decl::ObjCCategory: 2804f22ef01cSRoman Divacky break; 2805f22ef01cSRoman Divacky 2806dff0c46cSDimitry Andric case Decl::ObjCProtocol: { 2807dff0c46cSDimitry Andric ObjCProtocolDecl *Proto = cast<ObjCProtocolDecl>(D); 2808dff0c46cSDimitry Andric if (Proto->isThisDeclarationADefinition()) 2809dff0c46cSDimitry Andric ObjCRuntime->GenerateProtocol(Proto); 2810f22ef01cSRoman Divacky break; 2811dff0c46cSDimitry Andric } 2812f22ef01cSRoman Divacky 2813f22ef01cSRoman Divacky case Decl::ObjCCategoryImpl: 2814f22ef01cSRoman Divacky // Categories have properties but don't support synthesize so we 2815f22ef01cSRoman Divacky // can ignore them here. 28166122f3e6SDimitry Andric ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D)); 2817f22ef01cSRoman Divacky break; 2818f22ef01cSRoman Divacky 2819f22ef01cSRoman Divacky case Decl::ObjCImplementation: { 2820f22ef01cSRoman Divacky ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D); 2821f22ef01cSRoman Divacky EmitObjCPropertyImplementations(OMD); 2822f22ef01cSRoman Divacky EmitObjCIvarInitializations(OMD); 28236122f3e6SDimitry Andric ObjCRuntime->GenerateClass(OMD); 2824dff0c46cSDimitry Andric // Emit global variable debug information. 2825dff0c46cSDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo()) 2826139f7f9bSDimitry Andric if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) 2827139f7f9bSDimitry Andric DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( 2828139f7f9bSDimitry Andric OMD->getClassInterface()), OMD->getLocation()); 2829f22ef01cSRoman Divacky break; 2830f22ef01cSRoman Divacky } 2831f22ef01cSRoman Divacky case Decl::ObjCMethod: { 2832f22ef01cSRoman Divacky ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D); 2833f22ef01cSRoman Divacky // If this is not a prototype, emit the body. 2834f22ef01cSRoman Divacky if (OMD->getBody()) 2835f22ef01cSRoman Divacky CodeGenFunction(*this).GenerateObjCMethod(OMD); 2836f22ef01cSRoman Divacky break; 2837f22ef01cSRoman Divacky } 2838f22ef01cSRoman Divacky case Decl::ObjCCompatibleAlias: 2839dff0c46cSDimitry Andric ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D)); 2840f22ef01cSRoman Divacky break; 2841f22ef01cSRoman Divacky 2842f22ef01cSRoman Divacky case Decl::LinkageSpec: 2843f22ef01cSRoman Divacky EmitLinkageSpec(cast<LinkageSpecDecl>(D)); 2844f22ef01cSRoman Divacky break; 2845f22ef01cSRoman Divacky 2846f22ef01cSRoman Divacky case Decl::FileScopeAsm: { 2847f22ef01cSRoman Divacky FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D); 28486122f3e6SDimitry Andric StringRef AsmString = AD->getAsmString()->getString(); 2849f22ef01cSRoman Divacky 2850f22ef01cSRoman Divacky const std::string &S = getModule().getModuleInlineAsm(); 2851f22ef01cSRoman Divacky if (S.empty()) 2852f22ef01cSRoman Divacky getModule().setModuleInlineAsm(AsmString); 28537ae0e2c9SDimitry Andric else if (S.end()[-1] == '\n') 28546122f3e6SDimitry Andric getModule().setModuleInlineAsm(S + AsmString.str()); 2855f22ef01cSRoman Divacky else 2856f22ef01cSRoman Divacky getModule().setModuleInlineAsm(S + '\n' + AsmString.str()); 2857f22ef01cSRoman Divacky break; 2858f22ef01cSRoman Divacky } 2859f22ef01cSRoman Divacky 2860139f7f9bSDimitry Andric case Decl::Import: { 2861139f7f9bSDimitry Andric ImportDecl *Import = cast<ImportDecl>(D); 2862139f7f9bSDimitry Andric 2863139f7f9bSDimitry Andric // Ignore import declarations that come from imported modules. 2864139f7f9bSDimitry Andric if (clang::Module *Owner = Import->getOwningModule()) { 2865139f7f9bSDimitry Andric if (getLangOpts().CurrentModule.empty() || 2866139f7f9bSDimitry Andric Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) 2867139f7f9bSDimitry Andric break; 2868139f7f9bSDimitry Andric } 2869139f7f9bSDimitry Andric 2870139f7f9bSDimitry Andric ImportedModules.insert(Import->getImportedModule()); 2871139f7f9bSDimitry Andric break; 2872139f7f9bSDimitry Andric } 2873139f7f9bSDimitry Andric 2874f22ef01cSRoman Divacky default: 2875f22ef01cSRoman Divacky // Make sure we handled everything we should, every other kind is a 2876f22ef01cSRoman Divacky // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind 2877f22ef01cSRoman Divacky // function. Need to recode Decl::Kind to do that easily. 2878f22ef01cSRoman Divacky assert(isa<TypeDecl>(D) && "Unsupported decl kind"); 2879f22ef01cSRoman Divacky } 2880f22ef01cSRoman Divacky } 2881ffd1746dSEd Schouten 2882ffd1746dSEd Schouten /// Turns the given pointer into a constant. 2883ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context, 2884ffd1746dSEd Schouten const void *Ptr) { 2885ffd1746dSEd Schouten uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr); 28866122f3e6SDimitry Andric llvm::Type *i64 = llvm::Type::getInt64Ty(Context); 2887ffd1746dSEd Schouten return llvm::ConstantInt::get(i64, PtrInt); 2888ffd1746dSEd Schouten } 2889ffd1746dSEd Schouten 2890ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM, 2891ffd1746dSEd Schouten llvm::NamedMDNode *&GlobalMetadata, 2892ffd1746dSEd Schouten GlobalDecl D, 2893ffd1746dSEd Schouten llvm::GlobalValue *Addr) { 2894ffd1746dSEd Schouten if (!GlobalMetadata) 2895ffd1746dSEd Schouten GlobalMetadata = 2896ffd1746dSEd Schouten CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs"); 2897ffd1746dSEd Schouten 2898ffd1746dSEd Schouten // TODO: should we report variant information for ctors/dtors? 2899ffd1746dSEd Schouten llvm::Value *Ops[] = { 2900ffd1746dSEd Schouten Addr, 2901ffd1746dSEd Schouten GetPointerConstant(CGM.getLLVMContext(), D.getDecl()) 2902ffd1746dSEd Schouten }; 29033b0f4066SDimitry Andric GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops)); 2904ffd1746dSEd Schouten } 2905ffd1746dSEd Schouten 2906ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the 2907ffd1746dSEd Schouten /// current module with the Decls they came from. This is useful for 2908ffd1746dSEd Schouten /// projects using IR gen as a subroutine. 2909ffd1746dSEd Schouten /// 2910ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly 2911ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata 2912ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'. 2913ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() { 2914ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 2915ffd1746dSEd Schouten 2916ffd1746dSEd Schouten // StaticLocalDeclMap 29176122f3e6SDimitry Andric for (llvm::DenseMap<GlobalDecl,StringRef>::iterator 2918ffd1746dSEd Schouten I = MangledDeclNames.begin(), E = MangledDeclNames.end(); 2919ffd1746dSEd Schouten I != E; ++I) { 2920ffd1746dSEd Schouten llvm::GlobalValue *Addr = getModule().getNamedValue(I->second); 2921ffd1746dSEd Schouten EmitGlobalDeclMetadata(*this, GlobalMetadata, I->first, Addr); 2922ffd1746dSEd Schouten } 2923ffd1746dSEd Schouten } 2924ffd1746dSEd Schouten 2925ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current 2926ffd1746dSEd Schouten /// function. 2927ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() { 2928ffd1746dSEd Schouten if (LocalDeclMap.empty()) return; 2929ffd1746dSEd Schouten 2930ffd1746dSEd Schouten llvm::LLVMContext &Context = getLLVMContext(); 2931ffd1746dSEd Schouten 2932ffd1746dSEd Schouten // Find the unique metadata ID for this name. 2933ffd1746dSEd Schouten unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr"); 2934ffd1746dSEd Schouten 2935ffd1746dSEd Schouten llvm::NamedMDNode *GlobalMetadata = 0; 2936ffd1746dSEd Schouten 2937ffd1746dSEd Schouten for (llvm::DenseMap<const Decl*, llvm::Value*>::iterator 2938ffd1746dSEd Schouten I = LocalDeclMap.begin(), E = LocalDeclMap.end(); I != E; ++I) { 2939ffd1746dSEd Schouten const Decl *D = I->first; 2940ffd1746dSEd Schouten llvm::Value *Addr = I->second; 2941ffd1746dSEd Schouten 2942ffd1746dSEd Schouten if (llvm::AllocaInst *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) { 2943ffd1746dSEd Schouten llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D); 29443b0f4066SDimitry Andric Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr)); 2945ffd1746dSEd Schouten } else if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Addr)) { 2946ffd1746dSEd Schouten GlobalDecl GD = GlobalDecl(cast<VarDecl>(D)); 2947ffd1746dSEd Schouten EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV); 2948ffd1746dSEd Schouten } 2949ffd1746dSEd Schouten } 2950ffd1746dSEd Schouten } 2951e580952dSDimitry Andric 2952bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() { 2953bd5abe19SDimitry Andric if (!getCodeGenOpts().CoverageFile.empty()) { 2954bd5abe19SDimitry Andric if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { 2955bd5abe19SDimitry Andric llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); 2956bd5abe19SDimitry Andric llvm::LLVMContext &Ctx = TheModule.getContext(); 2957bd5abe19SDimitry Andric llvm::MDString *CoverageFile = 2958bd5abe19SDimitry Andric llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); 2959bd5abe19SDimitry Andric for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { 2960bd5abe19SDimitry Andric llvm::MDNode *CU = CUNode->getOperand(i); 2961bd5abe19SDimitry Andric llvm::Value *node[] = { CoverageFile, CU }; 2962bd5abe19SDimitry Andric llvm::MDNode *N = llvm::MDNode::get(Ctx, node); 2963bd5abe19SDimitry Andric GCov->addOperand(N); 2964bd5abe19SDimitry Andric } 2965bd5abe19SDimitry Andric } 2966bd5abe19SDimitry Andric } 2967bd5abe19SDimitry Andric } 29683861d79fSDimitry Andric 29693861d79fSDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid, 29703861d79fSDimitry Andric QualType GuidType) { 29713861d79fSDimitry Andric // Sema has checked that all uuid strings are of the form 29723861d79fSDimitry Andric // "12345678-1234-1234-1234-1234567890ab". 29733861d79fSDimitry Andric assert(Uuid.size() == 36); 29743861d79fSDimitry Andric const char *Uuidstr = Uuid.data(); 29753861d79fSDimitry Andric for (int i = 0; i < 36; ++i) { 29763861d79fSDimitry Andric if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuidstr[i] == '-'); 2977139f7f9bSDimitry Andric else assert(isHexDigit(Uuidstr[i])); 29783861d79fSDimitry Andric } 29793861d79fSDimitry Andric 29803861d79fSDimitry Andric llvm::APInt Field0(32, StringRef(Uuidstr , 8), 16); 29813861d79fSDimitry Andric llvm::APInt Field1(16, StringRef(Uuidstr + 9, 4), 16); 29823861d79fSDimitry Andric llvm::APInt Field2(16, StringRef(Uuidstr + 14, 4), 16); 29833861d79fSDimitry Andric static const int Field3ValueOffsets[] = { 19, 21, 24, 26, 28, 30, 32, 34 }; 29843861d79fSDimitry Andric 29853861d79fSDimitry Andric APValue InitStruct(APValue::UninitStruct(), /*NumBases=*/0, /*NumFields=*/4); 29863861d79fSDimitry Andric InitStruct.getStructField(0) = APValue(llvm::APSInt(Field0)); 29873861d79fSDimitry Andric InitStruct.getStructField(1) = APValue(llvm::APSInt(Field1)); 29883861d79fSDimitry Andric InitStruct.getStructField(2) = APValue(llvm::APSInt(Field2)); 29893861d79fSDimitry Andric APValue& Arr = InitStruct.getStructField(3); 29903861d79fSDimitry Andric Arr = APValue(APValue::UninitArray(), 8, 8); 29913861d79fSDimitry Andric for (int t = 0; t < 8; ++t) 29923861d79fSDimitry Andric Arr.getArrayInitializedElt(t) = APValue(llvm::APSInt( 29933861d79fSDimitry Andric llvm::APInt(8, StringRef(Uuidstr + Field3ValueOffsets[t], 2), 16))); 29943861d79fSDimitry Andric 29953861d79fSDimitry Andric return EmitConstantValue(InitStruct, GuidType); 29963861d79fSDimitry Andric } 2997