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