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