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