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"
2159d1ed5bSDimitry Andric #include "CGOpenMPRuntime.h"
22139f7f9bSDimitry Andric #include "CodeGenFunction.h"
2359d1ed5bSDimitry Andric #include "CodeGenPGO.h"
24139f7f9bSDimitry Andric #include "CodeGenTBAA.h"
2539d628a0SDimitry Andric #include "CoverageMappingGen.h"
26f22ef01cSRoman Divacky #include "TargetInfo.h"
27f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h"
28f22ef01cSRoman Divacky #include "clang/AST/CharUnits.h"
29f22ef01cSRoman Divacky #include "clang/AST/DeclCXX.h"
30139f7f9bSDimitry Andric #include "clang/AST/DeclObjC.h"
31ffd1746dSEd Schouten #include "clang/AST/DeclTemplate.h"
322754fe60SDimitry Andric #include "clang/AST/Mangle.h"
33f22ef01cSRoman Divacky #include "clang/AST/RecordLayout.h"
34f8254f43SDimitry Andric #include "clang/AST/RecursiveASTVisitor.h"
35dff0c46cSDimitry Andric #include "clang/Basic/Builtins.h"
36139f7f9bSDimitry Andric #include "clang/Basic/CharInfo.h"
37f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h"
38139f7f9bSDimitry Andric #include "clang/Basic/Module.h"
39f22ef01cSRoman Divacky #include "clang/Basic/SourceManager.h"
40f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h"
41f785676fSDimitry Andric #include "clang/Basic/Version.h"
42139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h"
43f785676fSDimitry Andric #include "clang/Sema/SemaDiagnostic.h"
44dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h"
45f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h"
4659d1ed5bSDimitry Andric #include "llvm/IR/CallSite.h"
47139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h"
48139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h"
49139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h"
50139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h"
51139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
5259d1ed5bSDimitry Andric #include "llvm/ProfileData/InstrProfReader.h"
53139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h"
54f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
55139f7f9bSDimitry Andric 
56f22ef01cSRoman Divacky using namespace clang;
57f22ef01cSRoman Divacky using namespace CodeGen;
58f22ef01cSRoman Divacky 
596122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata";
606122f3e6SDimitry Andric 
6159d1ed5bSDimitry Andric static CGCXXABI *createCXXABI(CodeGenModule &CGM) {
62284c1978SDimitry Andric   switch (CGM.getTarget().getCXXABI().getKind()) {
63139f7f9bSDimitry Andric   case TargetCXXABI::GenericAArch64:
64139f7f9bSDimitry Andric   case TargetCXXABI::GenericARM:
65139f7f9bSDimitry Andric   case TargetCXXABI::iOS:
6659d1ed5bSDimitry Andric   case TargetCXXABI::iOS64:
67ef6fa9e2SDimitry Andric   case TargetCXXABI::GenericMIPS:
68139f7f9bSDimitry Andric   case TargetCXXABI::GenericItanium:
6959d1ed5bSDimitry Andric     return CreateItaniumCXXABI(CGM);
70139f7f9bSDimitry Andric   case TargetCXXABI::Microsoft:
7159d1ed5bSDimitry Andric     return CreateMicrosoftCXXABI(CGM);
72e580952dSDimitry Andric   }
73e580952dSDimitry Andric 
74e580952dSDimitry Andric   llvm_unreachable("invalid C++ ABI kind");
75e580952dSDimitry Andric }
76e580952dSDimitry Andric 
77f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
78284c1978SDimitry Andric                              llvm::Module &M, const llvm::DataLayout &TD,
7939d628a0SDimitry Andric                              DiagnosticsEngine &diags,
8039d628a0SDimitry Andric                              CoverageSourceInfo *CoverageInfo)
81284c1978SDimitry Andric     : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M),
82284c1978SDimitry Andric       Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()),
8359d1ed5bSDimitry Andric       ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(nullptr),
8459d1ed5bSDimitry Andric       TheTargetCodeGenInfo(nullptr), Types(*this), VTables(*this),
8559d1ed5bSDimitry Andric       ObjCRuntime(nullptr), OpenCLRuntime(nullptr), OpenMPRuntime(nullptr),
8659d1ed5bSDimitry Andric       CUDARuntime(nullptr), DebugInfo(nullptr), ARCData(nullptr),
8759d1ed5bSDimitry Andric       NoObjCARCExceptionsMetadata(nullptr), RRData(nullptr), PGOReader(nullptr),
8859d1ed5bSDimitry Andric       CFConstantStringClassRef(nullptr), ConstantStringClassRef(nullptr),
8959d1ed5bSDimitry Andric       NSConstantStringType(nullptr), NSConcreteGlobalBlock(nullptr),
9059d1ed5bSDimitry Andric       NSConcreteStackBlock(nullptr), BlockObjectAssign(nullptr),
9159d1ed5bSDimitry Andric       BlockObjectDispose(nullptr), BlockDescriptorType(nullptr),
9259d1ed5bSDimitry Andric       GenericBlockLiteralType(nullptr), LifetimeStartFn(nullptr),
9339d628a0SDimitry Andric       LifetimeEndFn(nullptr), SanitizerMD(new SanitizerMetadata(*this)) {
94dff0c46cSDimitry Andric 
95dff0c46cSDimitry Andric   // Initialize the type cache.
96dff0c46cSDimitry Andric   llvm::LLVMContext &LLVMContext = M.getContext();
97dff0c46cSDimitry Andric   VoidTy = llvm::Type::getVoidTy(LLVMContext);
98dff0c46cSDimitry Andric   Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
99dff0c46cSDimitry Andric   Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
100dff0c46cSDimitry Andric   Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
101dff0c46cSDimitry Andric   Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
102dff0c46cSDimitry Andric   FloatTy = llvm::Type::getFloatTy(LLVMContext);
103dff0c46cSDimitry Andric   DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
104dff0c46cSDimitry Andric   PointerWidthInBits = C.getTargetInfo().getPointerWidth(0);
105dff0c46cSDimitry Andric   PointerAlignInBytes =
106dff0c46cSDimitry Andric   C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity();
107dff0c46cSDimitry Andric   IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth());
108dff0c46cSDimitry Andric   IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits);
109dff0c46cSDimitry Andric   Int8PtrTy = Int8Ty->getPointerTo(0);
110dff0c46cSDimitry Andric   Int8PtrPtrTy = Int8PtrTy->getPointerTo(0);
111dff0c46cSDimitry Andric 
112139f7f9bSDimitry Andric   RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC();
11339d628a0SDimitry Andric   BuiltinCC = getTargetCodeGenInfo().getABIInfo().getBuiltinCC();
114139f7f9bSDimitry Andric 
115dff0c46cSDimitry Andric   if (LangOpts.ObjC1)
1163b0f4066SDimitry Andric     createObjCRuntime();
117dff0c46cSDimitry Andric   if (LangOpts.OpenCL)
1186122f3e6SDimitry Andric     createOpenCLRuntime();
11959d1ed5bSDimitry Andric   if (LangOpts.OpenMP)
12059d1ed5bSDimitry Andric     createOpenMPRuntime();
121dff0c46cSDimitry Andric   if (LangOpts.CUDA)
1226122f3e6SDimitry Andric     createCUDARuntime();
123f22ef01cSRoman Divacky 
1247ae0e2c9SDimitry Andric   // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0.
12539d628a0SDimitry Andric   if (LangOpts.Sanitize.has(SanitizerKind::Thread) ||
1267ae0e2c9SDimitry Andric       (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
1277ae0e2c9SDimitry Andric     TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(),
12859d1ed5bSDimitry Andric                            getCXXABI().getMangleContext());
1292754fe60SDimitry Andric 
1303b0f4066SDimitry Andric   // If debug info or coverage generation is enabled, create the CGDebugInfo
1313b0f4066SDimitry Andric   // object.
1323861d79fSDimitry Andric   if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo ||
1337ae0e2c9SDimitry Andric       CodeGenOpts.EmitGcovArcs ||
1343b0f4066SDimitry Andric       CodeGenOpts.EmitGcovNotes)
1353b0f4066SDimitry Andric     DebugInfo = new CGDebugInfo(*this);
1362754fe60SDimitry Andric 
1372754fe60SDimitry Andric   Block.GlobalUniqueCount = 0;
1382754fe60SDimitry Andric 
139dff0c46cSDimitry Andric   if (C.getLangOpts().ObjCAutoRefCount)
14017a519f9SDimitry Andric     ARCData = new ARCEntrypoints();
14117a519f9SDimitry Andric   RRData = new RREntrypoints();
14259d1ed5bSDimitry Andric 
14359d1ed5bSDimitry Andric   if (!CodeGenOpts.InstrProfileInput.empty()) {
14459d1ed5bSDimitry Andric     if (std::error_code EC = llvm::IndexedInstrProfReader::create(
14559d1ed5bSDimitry Andric             CodeGenOpts.InstrProfileInput, PGOReader)) {
14659d1ed5bSDimitry Andric       unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
14759d1ed5bSDimitry Andric                                               "Could not read profile: %0");
14859d1ed5bSDimitry Andric       getDiags().Report(DiagID) << EC.message();
14959d1ed5bSDimitry Andric     }
15059d1ed5bSDimitry Andric   }
15139d628a0SDimitry Andric 
15239d628a0SDimitry Andric   // If coverage mapping generation is enabled, create the
15339d628a0SDimitry Andric   // CoverageMappingModuleGen object.
15439d628a0SDimitry Andric   if (CodeGenOpts.CoverageMapping)
15539d628a0SDimitry Andric     CoverageMapping.reset(new CoverageMappingModuleGen(*this, *CoverageInfo));
156f22ef01cSRoman Divacky }
157f22ef01cSRoman Divacky 
158f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() {
1596122f3e6SDimitry Andric   delete ObjCRuntime;
1606122f3e6SDimitry Andric   delete OpenCLRuntime;
16159d1ed5bSDimitry Andric   delete OpenMPRuntime;
1626122f3e6SDimitry Andric   delete CUDARuntime;
1636122f3e6SDimitry Andric   delete TheTargetCodeGenInfo;
1642754fe60SDimitry Andric   delete TBAA;
165f22ef01cSRoman Divacky   delete DebugInfo;
16617a519f9SDimitry Andric   delete ARCData;
16717a519f9SDimitry Andric   delete RRData;
168f22ef01cSRoman Divacky }
169f22ef01cSRoman Divacky 
170f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() {
1717ae0e2c9SDimitry Andric   // This is just isGNUFamily(), but we want to force implementors of
1727ae0e2c9SDimitry Andric   // new ABIs to decide how best to do this.
1737ae0e2c9SDimitry Andric   switch (LangOpts.ObjCRuntime.getKind()) {
1747ae0e2c9SDimitry Andric   case ObjCRuntime::GNUstep:
1757ae0e2c9SDimitry Andric   case ObjCRuntime::GCC:
1767ae0e2c9SDimitry Andric   case ObjCRuntime::ObjFW:
1776122f3e6SDimitry Andric     ObjCRuntime = CreateGNUObjCRuntime(*this);
1787ae0e2c9SDimitry Andric     return;
1797ae0e2c9SDimitry Andric 
1807ae0e2c9SDimitry Andric   case ObjCRuntime::FragileMacOSX:
1817ae0e2c9SDimitry Andric   case ObjCRuntime::MacOSX:
1827ae0e2c9SDimitry Andric   case ObjCRuntime::iOS:
1836122f3e6SDimitry Andric     ObjCRuntime = CreateMacObjCRuntime(*this);
1847ae0e2c9SDimitry Andric     return;
1857ae0e2c9SDimitry Andric   }
1867ae0e2c9SDimitry Andric   llvm_unreachable("bad runtime kind");
1876122f3e6SDimitry Andric }
1886122f3e6SDimitry Andric 
1896122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() {
1906122f3e6SDimitry Andric   OpenCLRuntime = new CGOpenCLRuntime(*this);
1916122f3e6SDimitry Andric }
1926122f3e6SDimitry Andric 
19359d1ed5bSDimitry Andric void CodeGenModule::createOpenMPRuntime() {
19459d1ed5bSDimitry Andric   OpenMPRuntime = new CGOpenMPRuntime(*this);
19559d1ed5bSDimitry Andric }
19659d1ed5bSDimitry Andric 
1976122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() {
1986122f3e6SDimitry Andric   CUDARuntime = CreateNVCUDARuntime(*this);
199f22ef01cSRoman Divacky }
200f22ef01cSRoman Divacky 
20139d628a0SDimitry Andric void CodeGenModule::addReplacement(StringRef Name, llvm::Constant *C) {
20239d628a0SDimitry Andric   Replacements[Name] = C;
20339d628a0SDimitry Andric }
20439d628a0SDimitry Andric 
205f785676fSDimitry Andric void CodeGenModule::applyReplacements() {
206f785676fSDimitry Andric   for (ReplacementsTy::iterator I = Replacements.begin(),
207f785676fSDimitry Andric                                 E = Replacements.end();
208f785676fSDimitry Andric        I != E; ++I) {
209f785676fSDimitry Andric     StringRef MangledName = I->first();
210f785676fSDimitry Andric     llvm::Constant *Replacement = I->second;
211f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
212f785676fSDimitry Andric     if (!Entry)
213f785676fSDimitry Andric       continue;
21459d1ed5bSDimitry Andric     auto *OldF = cast<llvm::Function>(Entry);
21559d1ed5bSDimitry Andric     auto *NewF = dyn_cast<llvm::Function>(Replacement);
216f785676fSDimitry Andric     if (!NewF) {
21759d1ed5bSDimitry Andric       if (auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
21859d1ed5bSDimitry Andric         NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
21959d1ed5bSDimitry Andric       } else {
22059d1ed5bSDimitry Andric         auto *CE = cast<llvm::ConstantExpr>(Replacement);
221f785676fSDimitry Andric         assert(CE->getOpcode() == llvm::Instruction::BitCast ||
222f785676fSDimitry Andric                CE->getOpcode() == llvm::Instruction::GetElementPtr);
223f785676fSDimitry Andric         NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
224f785676fSDimitry Andric       }
22559d1ed5bSDimitry Andric     }
226f785676fSDimitry Andric 
227f785676fSDimitry Andric     // Replace old with new, but keep the old order.
228f785676fSDimitry Andric     OldF->replaceAllUsesWith(Replacement);
229f785676fSDimitry Andric     if (NewF) {
230f785676fSDimitry Andric       NewF->removeFromParent();
231f785676fSDimitry Andric       OldF->getParent()->getFunctionList().insertAfter(OldF, NewF);
232f785676fSDimitry Andric     }
233f785676fSDimitry Andric     OldF->eraseFromParent();
234f785676fSDimitry Andric   }
235f785676fSDimitry Andric }
236f785676fSDimitry Andric 
23759d1ed5bSDimitry Andric // This is only used in aliases that we created and we know they have a
23859d1ed5bSDimitry Andric // linear structure.
23959d1ed5bSDimitry Andric static const llvm::GlobalObject *getAliasedGlobal(const llvm::GlobalAlias &GA) {
24059d1ed5bSDimitry Andric   llvm::SmallPtrSet<const llvm::GlobalAlias*, 4> Visited;
24159d1ed5bSDimitry Andric   const llvm::Constant *C = &GA;
24259d1ed5bSDimitry Andric   for (;;) {
24359d1ed5bSDimitry Andric     C = C->stripPointerCasts();
24459d1ed5bSDimitry Andric     if (auto *GO = dyn_cast<llvm::GlobalObject>(C))
24559d1ed5bSDimitry Andric       return GO;
24659d1ed5bSDimitry Andric     // stripPointerCasts will not walk over weak aliases.
24759d1ed5bSDimitry Andric     auto *GA2 = dyn_cast<llvm::GlobalAlias>(C);
24859d1ed5bSDimitry Andric     if (!GA2)
24959d1ed5bSDimitry Andric       return nullptr;
25039d628a0SDimitry Andric     if (!Visited.insert(GA2).second)
25159d1ed5bSDimitry Andric       return nullptr;
25259d1ed5bSDimitry Andric     C = GA2->getAliasee();
25359d1ed5bSDimitry Andric   }
25459d1ed5bSDimitry Andric }
25559d1ed5bSDimitry Andric 
256f785676fSDimitry Andric void CodeGenModule::checkAliases() {
25759d1ed5bSDimitry Andric   // Check if the constructed aliases are well formed. It is really unfortunate
25859d1ed5bSDimitry Andric   // that we have to do this in CodeGen, but we only construct mangled names
25959d1ed5bSDimitry Andric   // and aliases during codegen.
260f785676fSDimitry Andric   bool Error = false;
26159d1ed5bSDimitry Andric   DiagnosticsEngine &Diags = getDiags();
262f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
263f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
264f785676fSDimitry Andric     const GlobalDecl &GD = *I;
26559d1ed5bSDimitry Andric     const auto *D = cast<ValueDecl>(GD.getDecl());
266f785676fSDimitry Andric     const AliasAttr *AA = D->getAttr<AliasAttr>();
267f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
268f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
26959d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
27059d1ed5bSDimitry Andric     const llvm::GlobalValue *GV = getAliasedGlobal(*Alias);
27159d1ed5bSDimitry Andric     if (!GV) {
272f785676fSDimitry Andric       Error = true;
27359d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
27459d1ed5bSDimitry Andric     } else if (GV->isDeclaration()) {
275f785676fSDimitry Andric       Error = true;
27659d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_alias_to_undefined);
27759d1ed5bSDimitry Andric     }
27859d1ed5bSDimitry Andric 
27959d1ed5bSDimitry Andric     llvm::Constant *Aliasee = Alias->getAliasee();
28059d1ed5bSDimitry Andric     llvm::GlobalValue *AliaseeGV;
28159d1ed5bSDimitry Andric     if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
28259d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
28359d1ed5bSDimitry Andric     else
28459d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
28559d1ed5bSDimitry Andric 
28659d1ed5bSDimitry Andric     if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
28759d1ed5bSDimitry Andric       StringRef AliasSection = SA->getName();
28859d1ed5bSDimitry Andric       if (AliasSection != AliaseeGV->getSection())
28959d1ed5bSDimitry Andric         Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
29059d1ed5bSDimitry Andric             << AliasSection;
29159d1ed5bSDimitry Andric     }
29259d1ed5bSDimitry Andric 
29359d1ed5bSDimitry Andric     // We have to handle alias to weak aliases in here. LLVM itself disallows
29459d1ed5bSDimitry Andric     // this since the object semantics would not match the IL one. For
29559d1ed5bSDimitry Andric     // compatibility with gcc we implement it by just pointing the alias
29659d1ed5bSDimitry Andric     // to its aliasee's aliasee. We also warn, since the user is probably
29759d1ed5bSDimitry Andric     // expecting the link to be weak.
29859d1ed5bSDimitry Andric     if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
29959d1ed5bSDimitry Andric       if (GA->mayBeOverridden()) {
30059d1ed5bSDimitry Andric         Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias)
30159d1ed5bSDimitry Andric             << GV->getName() << GA->getName();
30259d1ed5bSDimitry Andric         Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
30359d1ed5bSDimitry Andric             GA->getAliasee(), Alias->getType());
30459d1ed5bSDimitry Andric         Alias->setAliasee(Aliasee);
30559d1ed5bSDimitry Andric       }
306f785676fSDimitry Andric     }
307f785676fSDimitry Andric   }
308f785676fSDimitry Andric   if (!Error)
309f785676fSDimitry Andric     return;
310f785676fSDimitry Andric 
311f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
312f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
313f785676fSDimitry Andric     const GlobalDecl &GD = *I;
314f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
315f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
31659d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
317f785676fSDimitry Andric     Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
318f785676fSDimitry Andric     Alias->eraseFromParent();
319f785676fSDimitry Andric   }
320f785676fSDimitry Andric }
321f785676fSDimitry Andric 
32259d1ed5bSDimitry Andric void CodeGenModule::clear() {
32359d1ed5bSDimitry Andric   DeferredDeclsToEmit.clear();
32459d1ed5bSDimitry Andric }
32559d1ed5bSDimitry Andric 
32659d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags,
32759d1ed5bSDimitry Andric                                        StringRef MainFile) {
32859d1ed5bSDimitry Andric   if (!hasDiagnostics())
32959d1ed5bSDimitry Andric     return;
33059d1ed5bSDimitry Andric   if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
33159d1ed5bSDimitry Andric     if (MainFile.empty())
33259d1ed5bSDimitry Andric       MainFile = "<stdin>";
33359d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_unprofiled) << MainFile;
33459d1ed5bSDimitry Andric   } else
33559d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing
33659d1ed5bSDimitry Andric                                                       << Mismatched;
33759d1ed5bSDimitry Andric }
33859d1ed5bSDimitry Andric 
339f22ef01cSRoman Divacky void CodeGenModule::Release() {
340f22ef01cSRoman Divacky   EmitDeferred();
341f785676fSDimitry Andric   applyReplacements();
342f785676fSDimitry Andric   checkAliases();
343f22ef01cSRoman Divacky   EmitCXXGlobalInitFunc();
344f22ef01cSRoman Divacky   EmitCXXGlobalDtorFunc();
345284c1978SDimitry Andric   EmitCXXThreadLocalInitFunc();
3466122f3e6SDimitry Andric   if (ObjCRuntime)
3476122f3e6SDimitry Andric     if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
348f22ef01cSRoman Divacky       AddGlobalCtor(ObjCInitFunction);
34959d1ed5bSDimitry Andric   if (PGOReader && PGOStats.hasDiagnostics())
35059d1ed5bSDimitry Andric     PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName);
351f22ef01cSRoman Divacky   EmitCtorList(GlobalCtors, "llvm.global_ctors");
352f22ef01cSRoman Divacky   EmitCtorList(GlobalDtors, "llvm.global_dtors");
3536122f3e6SDimitry Andric   EmitGlobalAnnotations();
354284c1978SDimitry Andric   EmitStaticExternCAliases();
35539d628a0SDimitry Andric   EmitDeferredUnusedCoverageMappings();
35639d628a0SDimitry Andric   if (CoverageMapping)
35739d628a0SDimitry Andric     CoverageMapping->emit();
35859d1ed5bSDimitry Andric   emitLLVMUsed();
359ffd1746dSEd Schouten 
360f785676fSDimitry Andric   if (CodeGenOpts.Autolink &&
361f785676fSDimitry Andric       (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
362139f7f9bSDimitry Andric     EmitModuleLinkOptions();
363139f7f9bSDimitry Andric   }
364f785676fSDimitry Andric   if (CodeGenOpts.DwarfVersion)
365f785676fSDimitry Andric     // We actually want the latest version when there are conflicts.
366f785676fSDimitry Andric     // We can change from Warning to Latest if such mode is supported.
367f785676fSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
368f785676fSDimitry Andric                               CodeGenOpts.DwarfVersion);
369f785676fSDimitry Andric   if (DebugInfo)
37059d1ed5bSDimitry Andric     // We support a single version in the linked module. The LLVM
37159d1ed5bSDimitry Andric     // parser will drop debug info with a different version number
37259d1ed5bSDimitry Andric     // (and warn about it, too).
37359d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version",
374f785676fSDimitry Andric                               llvm::DEBUG_METADATA_VERSION);
375139f7f9bSDimitry Andric 
37659d1ed5bSDimitry Andric   // We need to record the widths of enums and wchar_t, so that we can generate
37759d1ed5bSDimitry Andric   // the correct build attributes in the ARM backend.
37859d1ed5bSDimitry Andric   llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch();
37959d1ed5bSDimitry Andric   if (   Arch == llvm::Triple::arm
38059d1ed5bSDimitry Andric       || Arch == llvm::Triple::armeb
38159d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumb
38259d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumbeb) {
38359d1ed5bSDimitry Andric     // Width of wchar_t in bytes
38459d1ed5bSDimitry Andric     uint64_t WCharWidth =
38559d1ed5bSDimitry Andric         Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
38659d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth);
38759d1ed5bSDimitry Andric 
38859d1ed5bSDimitry Andric     // The minimum width of an enum in bytes
38959d1ed5bSDimitry Andric     uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
39059d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth);
39159d1ed5bSDimitry Andric   }
39259d1ed5bSDimitry Andric 
39339d628a0SDimitry Andric   if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
39439d628a0SDimitry Andric     llvm::PICLevel::Level PL = llvm::PICLevel::Default;
39539d628a0SDimitry Andric     switch (PLevel) {
39639d628a0SDimitry Andric     case 0: break;
39739d628a0SDimitry Andric     case 1: PL = llvm::PICLevel::Small; break;
39839d628a0SDimitry Andric     case 2: PL = llvm::PICLevel::Large; break;
39939d628a0SDimitry Andric     default: llvm_unreachable("Invalid PIC Level");
40039d628a0SDimitry Andric     }
40139d628a0SDimitry Andric 
40239d628a0SDimitry Andric     getModule().setPICLevel(PL);
40339d628a0SDimitry Andric   }
40439d628a0SDimitry Andric 
4052754fe60SDimitry Andric   SimplifyPersonality();
4062754fe60SDimitry Andric 
407ffd1746dSEd Schouten   if (getCodeGenOpts().EmitDeclMetadata)
408ffd1746dSEd Schouten     EmitDeclMetadata();
409bd5abe19SDimitry Andric 
410bd5abe19SDimitry Andric   if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
411bd5abe19SDimitry Andric     EmitCoverageFile();
4126122f3e6SDimitry Andric 
4136122f3e6SDimitry Andric   if (DebugInfo)
4146122f3e6SDimitry Andric     DebugInfo->finalize();
415f785676fSDimitry Andric 
416f785676fSDimitry Andric   EmitVersionIdentMetadata();
41759d1ed5bSDimitry Andric 
41859d1ed5bSDimitry Andric   EmitTargetMetadata();
419f22ef01cSRoman Divacky }
420f22ef01cSRoman Divacky 
4213b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
4223b0f4066SDimitry Andric   // Make sure that this type is translated.
4233b0f4066SDimitry Andric   Types.UpdateCompletedType(TD);
4243b0f4066SDimitry Andric }
4253b0f4066SDimitry Andric 
4262754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
4272754fe60SDimitry Andric   if (!TBAA)
42859d1ed5bSDimitry Andric     return nullptr;
4292754fe60SDimitry Andric   return TBAA->getTBAAInfo(QTy);
4302754fe60SDimitry Andric }
4312754fe60SDimitry Andric 
432dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
433dff0c46cSDimitry Andric   if (!TBAA)
43459d1ed5bSDimitry Andric     return nullptr;
435dff0c46cSDimitry Andric   return TBAA->getTBAAInfoForVTablePtr();
436dff0c46cSDimitry Andric }
437dff0c46cSDimitry Andric 
4383861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) {
4393861d79fSDimitry Andric   if (!TBAA)
44059d1ed5bSDimitry Andric     return nullptr;
4413861d79fSDimitry Andric   return TBAA->getTBAAStructInfo(QTy);
4423861d79fSDimitry Andric }
4433861d79fSDimitry Andric 
444139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
445139f7f9bSDimitry Andric   if (!TBAA)
44659d1ed5bSDimitry Andric     return nullptr;
447139f7f9bSDimitry Andric   return TBAA->getTBAAStructTypeInfo(QTy);
448139f7f9bSDimitry Andric }
449139f7f9bSDimitry Andric 
450139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
451139f7f9bSDimitry Andric                                                   llvm::MDNode *AccessN,
452139f7f9bSDimitry Andric                                                   uint64_t O) {
453139f7f9bSDimitry Andric   if (!TBAA)
45459d1ed5bSDimitry Andric     return nullptr;
455139f7f9bSDimitry Andric   return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
456139f7f9bSDimitry Andric }
457139f7f9bSDimitry Andric 
458f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA
459f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format:
460f785676fSDimitry Andric /// base type, access type and offset.
461284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type.
4622754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
463284c1978SDimitry Andric                                         llvm::MDNode *TBAAInfo,
464284c1978SDimitry Andric                                         bool ConvertTypeToTag) {
465f785676fSDimitry Andric   if (ConvertTypeToTag && TBAA)
466284c1978SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa,
467284c1978SDimitry Andric                       TBAA->getTBAAScalarTagInfo(TBAAInfo));
468284c1978SDimitry Andric   else
4692754fe60SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
4702754fe60SDimitry Andric }
4712754fe60SDimitry Andric 
47259d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) {
47359d1ed5bSDimitry Andric   unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0");
47459d1ed5bSDimitry Andric   getDiags().Report(Context.getFullLoc(loc), diagID) << message;
475f22ef01cSRoman Divacky }
476f22ef01cSRoman Divacky 
477f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
478f22ef01cSRoman Divacky /// specified stmt yet.
479f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
4806122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
481f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
482f22ef01cSRoman Divacky   std::string Msg = Type;
483f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
484f22ef01cSRoman Divacky     << Msg << S->getSourceRange();
485f22ef01cSRoman Divacky }
486f22ef01cSRoman Divacky 
487f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
488f22ef01cSRoman Divacky /// specified decl yet.
489f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
4906122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
491f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
492f22ef01cSRoman Divacky   std::string Msg = Type;
493f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
494f22ef01cSRoman Divacky }
495f22ef01cSRoman Divacky 
49617a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
49717a519f9SDimitry Andric   return llvm::ConstantInt::get(SizeTy, size.getQuantity());
49817a519f9SDimitry Andric }
49917a519f9SDimitry Andric 
500f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
5012754fe60SDimitry Andric                                         const NamedDecl *D) const {
502f22ef01cSRoman Divacky   // Internal definitions always have default visibility.
503f22ef01cSRoman Divacky   if (GV->hasLocalLinkage()) {
504f22ef01cSRoman Divacky     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
505f22ef01cSRoman Divacky     return;
506f22ef01cSRoman Divacky   }
507f22ef01cSRoman Divacky 
5082754fe60SDimitry Andric   // Set visibility for definitions.
509139f7f9bSDimitry Andric   LinkageInfo LV = D->getLinkageAndVisibility();
510139f7f9bSDimitry Andric   if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
511139f7f9bSDimitry Andric     GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
512f22ef01cSRoman Divacky }
513f22ef01cSRoman Divacky 
5147ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) {
5157ae0e2c9SDimitry Andric   return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
5167ae0e2c9SDimitry Andric       .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
5177ae0e2c9SDimitry Andric       .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
5187ae0e2c9SDimitry Andric       .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
5197ae0e2c9SDimitry Andric       .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel);
5207ae0e2c9SDimitry Andric }
5217ae0e2c9SDimitry Andric 
5227ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(
5237ae0e2c9SDimitry Andric     CodeGenOptions::TLSModel M) {
5247ae0e2c9SDimitry Andric   switch (M) {
5257ae0e2c9SDimitry Andric   case CodeGenOptions::GeneralDynamicTLSModel:
5267ae0e2c9SDimitry Andric     return llvm::GlobalVariable::GeneralDynamicTLSModel;
5277ae0e2c9SDimitry Andric   case CodeGenOptions::LocalDynamicTLSModel:
5287ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalDynamicTLSModel;
5297ae0e2c9SDimitry Andric   case CodeGenOptions::InitialExecTLSModel:
5307ae0e2c9SDimitry Andric     return llvm::GlobalVariable::InitialExecTLSModel;
5317ae0e2c9SDimitry Andric   case CodeGenOptions::LocalExecTLSModel:
5327ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalExecTLSModel;
5337ae0e2c9SDimitry Andric   }
5347ae0e2c9SDimitry Andric   llvm_unreachable("Invalid TLS model!");
5357ae0e2c9SDimitry Andric }
5367ae0e2c9SDimitry Andric 
53739d628a0SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const {
538284c1978SDimitry Andric   assert(D.getTLSKind() && "setting TLS mode on non-TLS var!");
5397ae0e2c9SDimitry Andric 
54039d628a0SDimitry Andric   llvm::GlobalValue::ThreadLocalMode TLM;
5413861d79fSDimitry Andric   TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
5427ae0e2c9SDimitry Andric 
5437ae0e2c9SDimitry Andric   // Override the TLS model if it is explicitly specified.
54459d1ed5bSDimitry Andric   if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) {
5457ae0e2c9SDimitry Andric     TLM = GetLLVMTLSModel(Attr->getModel());
5467ae0e2c9SDimitry Andric   }
5477ae0e2c9SDimitry Andric 
5487ae0e2c9SDimitry Andric   GV->setThreadLocalMode(TLM);
5497ae0e2c9SDimitry Andric }
5507ae0e2c9SDimitry Andric 
5516122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
55259d1ed5bSDimitry Andric   StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()];
55359d1ed5bSDimitry Andric   if (!FoundStr.empty())
55459d1ed5bSDimitry Andric     return FoundStr;
555f22ef01cSRoman Divacky 
55659d1ed5bSDimitry Andric   const auto *ND = cast<NamedDecl>(GD.getDecl());
557dff0c46cSDimitry Andric   SmallString<256> Buffer;
55859d1ed5bSDimitry Andric   StringRef Str;
55959d1ed5bSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) {
5602754fe60SDimitry Andric     llvm::raw_svector_ostream Out(Buffer);
56159d1ed5bSDimitry Andric     if (const auto *D = dyn_cast<CXXConstructorDecl>(ND))
5622754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out);
56359d1ed5bSDimitry Andric     else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND))
5642754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out);
565ffd1746dSEd Schouten     else
5662754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleName(ND, Out);
56759d1ed5bSDimitry Andric     Str = Out.str();
56859d1ed5bSDimitry Andric   } else {
56959d1ed5bSDimitry Andric     IdentifierInfo *II = ND->getIdentifier();
57059d1ed5bSDimitry Andric     assert(II && "Attempt to mangle unnamed decl.");
57159d1ed5bSDimitry Andric     Str = II->getName();
572ffd1746dSEd Schouten   }
573ffd1746dSEd Schouten 
57439d628a0SDimitry Andric   // Keep the first result in the case of a mangling collision.
57539d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Str, GD));
57639d628a0SDimitry Andric   return FoundStr = Result.first->first();
57759d1ed5bSDimitry Andric }
57859d1ed5bSDimitry Andric 
57959d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD,
580ffd1746dSEd Schouten                                              const BlockDecl *BD) {
5812754fe60SDimitry Andric   MangleContext &MangleCtx = getCXXABI().getMangleContext();
5822754fe60SDimitry Andric   const Decl *D = GD.getDecl();
58359d1ed5bSDimitry Andric 
58459d1ed5bSDimitry Andric   SmallString<256> Buffer;
58559d1ed5bSDimitry Andric   llvm::raw_svector_ostream Out(Buffer);
58659d1ed5bSDimitry Andric   if (!D)
5877ae0e2c9SDimitry Andric     MangleCtx.mangleGlobalBlock(BD,
5887ae0e2c9SDimitry Andric       dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
58959d1ed5bSDimitry Andric   else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D))
5902754fe60SDimitry Andric     MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out);
59159d1ed5bSDimitry Andric   else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D))
5922754fe60SDimitry Andric     MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out);
5932754fe60SDimitry Andric   else
5942754fe60SDimitry Andric     MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out);
59559d1ed5bSDimitry Andric 
59639d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
59739d628a0SDimitry Andric   return Result.first->first();
598f22ef01cSRoman Divacky }
599f22ef01cSRoman Divacky 
6006122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) {
601f22ef01cSRoman Divacky   return getModule().getNamedValue(Name);
602f22ef01cSRoman Divacky }
603f22ef01cSRoman Divacky 
604f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before
605f22ef01cSRoman Divacky /// main() runs.
60659d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority,
60759d1ed5bSDimitry Andric                                   llvm::Constant *AssociatedData) {
608f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
60959d1ed5bSDimitry Andric   GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData));
610f22ef01cSRoman Divacky }
611f22ef01cSRoman Divacky 
612f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called
613f22ef01cSRoman Divacky /// when the module is unloaded.
614f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) {
615f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
61659d1ed5bSDimitry Andric   GlobalDtors.push_back(Structor(Priority, Dtor, nullptr));
617f22ef01cSRoman Divacky }
618f22ef01cSRoman Divacky 
619f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
620f22ef01cSRoman Divacky   // Ctor function type is void()*.
621bd5abe19SDimitry Andric   llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
622f22ef01cSRoman Divacky   llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
623f22ef01cSRoman Divacky 
62459d1ed5bSDimitry Andric   // Get the type of a ctor entry, { i32, void ()*, i8* }.
62559d1ed5bSDimitry Andric   llvm::StructType *CtorStructTy = llvm::StructType::get(
62639d628a0SDimitry Andric       Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, nullptr);
627f22ef01cSRoman Divacky 
628f22ef01cSRoman Divacky   // Construct the constructor and destructor arrays.
629dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> Ctors;
630f22ef01cSRoman Divacky   for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
631dff0c46cSDimitry Andric     llvm::Constant *S[] = {
63259d1ed5bSDimitry Andric       llvm::ConstantInt::get(Int32Ty, I->Priority, false),
63359d1ed5bSDimitry Andric       llvm::ConstantExpr::getBitCast(I->Initializer, CtorPFTy),
63459d1ed5bSDimitry Andric       (I->AssociatedData
63559d1ed5bSDimitry Andric            ? llvm::ConstantExpr::getBitCast(I->AssociatedData, VoidPtrTy)
63659d1ed5bSDimitry Andric            : llvm::Constant::getNullValue(VoidPtrTy))
637dff0c46cSDimitry Andric     };
638f22ef01cSRoman Divacky     Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
639f22ef01cSRoman Divacky   }
640f22ef01cSRoman Divacky 
641f22ef01cSRoman Divacky   if (!Ctors.empty()) {
642f22ef01cSRoman Divacky     llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
643f22ef01cSRoman Divacky     new llvm::GlobalVariable(TheModule, AT, false,
644f22ef01cSRoman Divacky                              llvm::GlobalValue::AppendingLinkage,
645f22ef01cSRoman Divacky                              llvm::ConstantArray::get(AT, Ctors),
646f22ef01cSRoman Divacky                              GlobalName);
647f22ef01cSRoman Divacky   }
648f22ef01cSRoman Divacky }
649f22ef01cSRoman Divacky 
650f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes
651f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
65259d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
653f785676fSDimitry Andric 
654e580952dSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
655f22ef01cSRoman Divacky 
65659d1ed5bSDimitry Andric   if (isa<CXXDestructorDecl>(D) &&
65759d1ed5bSDimitry Andric       getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
65859d1ed5bSDimitry Andric                                          GD.getDtorType())) {
65959d1ed5bSDimitry Andric     // Destructor variants in the Microsoft C++ ABI are always internal or
66059d1ed5bSDimitry Andric     // linkonce_odr thunks emitted on an as-needed basis.
66159d1ed5bSDimitry Andric     return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
66259d1ed5bSDimitry Andric                                    : llvm::GlobalValue::LinkOnceODRLinkage;
663f22ef01cSRoman Divacky   }
664f22ef01cSRoman Divacky 
66559d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false);
66659d1ed5bSDimitry Andric }
667f22ef01cSRoman Divacky 
66859d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D,
66959d1ed5bSDimitry Andric                                                     llvm::Function *F) {
67059d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
671f22ef01cSRoman Divacky }
672f22ef01cSRoman Divacky 
673f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D,
674f22ef01cSRoman Divacky                                               const CGFunctionInfo &Info,
675f22ef01cSRoman Divacky                                               llvm::Function *F) {
676f22ef01cSRoman Divacky   unsigned CallingConv;
677f22ef01cSRoman Divacky   AttributeListType AttributeList;
678139f7f9bSDimitry Andric   ConstructAttributeList(Info, D, AttributeList, CallingConv, false);
679139f7f9bSDimitry Andric   F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList));
680f22ef01cSRoman Divacky   F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
681f22ef01cSRoman Divacky }
682f22ef01cSRoman Divacky 
6836122f3e6SDimitry Andric /// Determines whether the language options require us to model
6846122f3e6SDimitry Andric /// unwind exceptions.  We treat -fexceptions as mandating this
6856122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions
6866122f3e6SDimitry Andric /// enabled.  This means, for example, that C with -fexceptions
6876122f3e6SDimitry Andric /// enables this.
688dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) {
6896122f3e6SDimitry Andric   // If exceptions are completely disabled, obviously this is false.
690dff0c46cSDimitry Andric   if (!LangOpts.Exceptions) return false;
6916122f3e6SDimitry Andric 
6926122f3e6SDimitry Andric   // If C++ exceptions are enabled, this is true.
693dff0c46cSDimitry Andric   if (LangOpts.CXXExceptions) return true;
6946122f3e6SDimitry Andric 
6956122f3e6SDimitry Andric   // If ObjC exceptions are enabled, this depends on the ABI.
696dff0c46cSDimitry Andric   if (LangOpts.ObjCExceptions) {
6977ae0e2c9SDimitry Andric     return LangOpts.ObjCRuntime.hasUnwindExceptions();
6986122f3e6SDimitry Andric   }
6996122f3e6SDimitry Andric 
7006122f3e6SDimitry Andric   return true;
7016122f3e6SDimitry Andric }
7026122f3e6SDimitry Andric 
703f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
704f22ef01cSRoman Divacky                                                            llvm::Function *F) {
705f785676fSDimitry Andric   llvm::AttrBuilder B;
706f785676fSDimitry Andric 
707bd5abe19SDimitry Andric   if (CodeGenOpts.UnwindTables)
708f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::UWTable);
709bd5abe19SDimitry Andric 
710dff0c46cSDimitry Andric   if (!hasUnwindExceptions(LangOpts))
711f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoUnwind);
712f22ef01cSRoman Divacky 
7136122f3e6SDimitry Andric   if (D->hasAttr<NakedAttr>()) {
7146122f3e6SDimitry Andric     // Naked implies noinline: we should not be inlining such functions.
715f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Naked);
716f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
71759d1ed5bSDimitry Andric   } else if (D->hasAttr<NoDuplicateAttr>()) {
71859d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::NoDuplicate);
719f785676fSDimitry Andric   } else if (D->hasAttr<NoInlineAttr>()) {
720f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
72159d1ed5bSDimitry Andric   } else if (D->hasAttr<AlwaysInlineAttr>() &&
722f785676fSDimitry Andric              !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
723f785676fSDimitry Andric                                               llvm::Attribute::NoInline)) {
724f785676fSDimitry Andric     // (noinline wins over always_inline, and we can't specify both in IR)
725f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::AlwaysInline);
7266122f3e6SDimitry Andric   }
7272754fe60SDimitry Andric 
728f785676fSDimitry Andric   if (D->hasAttr<ColdAttr>()) {
72939d628a0SDimitry Andric     if (!D->hasAttr<OptimizeNoneAttr>())
730f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::OptimizeForSize);
731f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Cold);
732f785676fSDimitry Andric   }
7333861d79fSDimitry Andric 
7343861d79fSDimitry Andric   if (D->hasAttr<MinSizeAttr>())
735f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::MinSize);
736f22ef01cSRoman Divacky 
7373861d79fSDimitry Andric   if (LangOpts.getStackProtector() == LangOptions::SSPOn)
738f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtect);
73959d1ed5bSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
74059d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectStrong);
7413861d79fSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
742f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectReq);
7433861d79fSDimitry Andric 
744139f7f9bSDimitry Andric   // Add sanitizer attributes if function is not blacklisted.
74539d628a0SDimitry Andric   if (!isInSanitizerBlacklist(F, D->getLocation())) {
746139f7f9bSDimitry Andric     // When AddressSanitizer is enabled, set SanitizeAddress attribute
747139f7f9bSDimitry Andric     // unless __attribute__((no_sanitize_address)) is used.
74839d628a0SDimitry Andric     if (LangOpts.Sanitize.has(SanitizerKind::Address) &&
74939d628a0SDimitry Andric         !D->hasAttr<NoSanitizeAddressAttr>())
750f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeAddress);
751139f7f9bSDimitry Andric     // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
75239d628a0SDimitry Andric     if (LangOpts.Sanitize.has(SanitizerKind::Thread) &&
75339d628a0SDimitry Andric         !D->hasAttr<NoSanitizeThreadAttr>())
754f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeThread);
755139f7f9bSDimitry Andric     // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
75639d628a0SDimitry Andric     if (LangOpts.Sanitize.has(SanitizerKind::Memory) &&
75739d628a0SDimitry Andric         !D->hasAttr<NoSanitizeMemoryAttr>())
758f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeMemory);
759dff0c46cSDimitry Andric   }
760dff0c46cSDimitry Andric 
761f785676fSDimitry Andric   F->addAttributes(llvm::AttributeSet::FunctionIndex,
762f785676fSDimitry Andric                    llvm::AttributeSet::get(
763f785676fSDimitry Andric                        F->getContext(), llvm::AttributeSet::FunctionIndex, B));
764f785676fSDimitry Andric 
76539d628a0SDimitry Andric   if (D->hasAttr<OptimizeNoneAttr>()) {
76639d628a0SDimitry Andric     // OptimizeNone implies noinline; we should not be inlining such functions.
76739d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::OptimizeNone);
76839d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::NoInline);
76939d628a0SDimitry Andric 
77039d628a0SDimitry Andric     // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline.
77139d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) &&
77239d628a0SDimitry Andric            "OptimizeNone and OptimizeForSize on same function!");
77339d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::MinSize) &&
77439d628a0SDimitry Andric            "OptimizeNone and MinSize on same function!");
77539d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
77639d628a0SDimitry Andric            "OptimizeNone and AlwaysInline on same function!");
77739d628a0SDimitry Andric 
77839d628a0SDimitry Andric     // Attribute 'inlinehint' has no effect on 'optnone' functions.
77939d628a0SDimitry Andric     // Explicitly remove it from the set of function attributes.
78039d628a0SDimitry Andric     F->removeFnAttr(llvm::Attribute::InlineHint);
78139d628a0SDimitry Andric   }
78239d628a0SDimitry Andric 
783f785676fSDimitry Andric   if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
784f785676fSDimitry Andric     F->setUnnamedAddr(true);
78559d1ed5bSDimitry Andric   else if (const auto *MD = dyn_cast<CXXMethodDecl>(D))
786f785676fSDimitry Andric     if (MD->isVirtual())
787f785676fSDimitry Andric       F->setUnnamedAddr(true);
788f785676fSDimitry Andric 
789e580952dSDimitry Andric   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
790e580952dSDimitry Andric   if (alignment)
791e580952dSDimitry Andric     F->setAlignment(alignment);
792e580952dSDimitry Andric 
793f22ef01cSRoman Divacky   // C++ ABI requires 2-byte alignment for member functions.
794f22ef01cSRoman Divacky   if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D))
795f22ef01cSRoman Divacky     F->setAlignment(2);
796f22ef01cSRoman Divacky }
797f22ef01cSRoman Divacky 
798f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D,
799f22ef01cSRoman Divacky                                         llvm::GlobalValue *GV) {
80059d1ed5bSDimitry Andric   if (const auto *ND = dyn_cast<NamedDecl>(D))
8012754fe60SDimitry Andric     setGlobalVisibility(GV, ND);
8022754fe60SDimitry Andric   else
8032754fe60SDimitry Andric     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
804f22ef01cSRoman Divacky 
805f22ef01cSRoman Divacky   if (D->hasAttr<UsedAttr>())
80659d1ed5bSDimitry Andric     addUsedGlobal(GV);
80759d1ed5bSDimitry Andric }
80859d1ed5bSDimitry Andric 
80939d628a0SDimitry Andric void CodeGenModule::setAliasAttributes(const Decl *D,
81039d628a0SDimitry Andric                                        llvm::GlobalValue *GV) {
81139d628a0SDimitry Andric   SetCommonAttributes(D, GV);
81239d628a0SDimitry Andric 
81339d628a0SDimitry Andric   // Process the dllexport attribute based on whether the original definition
81439d628a0SDimitry Andric   // (not necessarily the aliasee) was exported.
81539d628a0SDimitry Andric   if (D->hasAttr<DLLExportAttr>())
81639d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
81739d628a0SDimitry Andric }
81839d628a0SDimitry Andric 
81959d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D,
82059d1ed5bSDimitry Andric                                           llvm::GlobalObject *GO) {
82159d1ed5bSDimitry Andric   SetCommonAttributes(D, GO);
822f22ef01cSRoman Divacky 
823f22ef01cSRoman Divacky   if (const SectionAttr *SA = D->getAttr<SectionAttr>())
82459d1ed5bSDimitry Andric     GO->setSection(SA->getName());
825f22ef01cSRoman Divacky 
82659d1ed5bSDimitry Andric   getTargetCodeGenInfo().SetTargetAttributes(D, GO, *this);
827f22ef01cSRoman Divacky }
828f22ef01cSRoman Divacky 
829f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
830f22ef01cSRoman Divacky                                                   llvm::Function *F,
831f22ef01cSRoman Divacky                                                   const CGFunctionInfo &FI) {
832f22ef01cSRoman Divacky   SetLLVMFunctionAttributes(D, FI, F);
833f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, F);
834f22ef01cSRoman Divacky 
835f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::InternalLinkage);
836f22ef01cSRoman Divacky 
83759d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
83859d1ed5bSDimitry Andric }
83959d1ed5bSDimitry Andric 
84059d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
84159d1ed5bSDimitry Andric                                          const NamedDecl *ND) {
84259d1ed5bSDimitry Andric   // Set linkage and visibility in case we never see a definition.
84359d1ed5bSDimitry Andric   LinkageInfo LV = ND->getLinkageAndVisibility();
84459d1ed5bSDimitry Andric   if (LV.getLinkage() != ExternalLinkage) {
84559d1ed5bSDimitry Andric     // Don't set internal linkage on declarations.
84659d1ed5bSDimitry Andric   } else {
84759d1ed5bSDimitry Andric     if (ND->hasAttr<DLLImportAttr>()) {
84859d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
84959d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
85059d1ed5bSDimitry Andric     } else if (ND->hasAttr<DLLExportAttr>()) {
85159d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
85259d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
85359d1ed5bSDimitry Andric     } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) {
85459d1ed5bSDimitry Andric       // "extern_weak" is overloaded in LLVM; we probably should have
85559d1ed5bSDimitry Andric       // separate linkage types for this.
85659d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
85759d1ed5bSDimitry Andric     }
85859d1ed5bSDimitry Andric 
85959d1ed5bSDimitry Andric     // Set visibility on a declaration only if it's explicit.
86059d1ed5bSDimitry Andric     if (LV.isVisibilityExplicit())
86159d1ed5bSDimitry Andric       GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
86259d1ed5bSDimitry Andric   }
863f22ef01cSRoman Divacky }
864f22ef01cSRoman Divacky 
86539d628a0SDimitry Andric void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
86639d628a0SDimitry Andric                                           bool IsIncompleteFunction,
86739d628a0SDimitry Andric                                           bool IsThunk) {
8683b0f4066SDimitry Andric   if (unsigned IID = F->getIntrinsicID()) {
8693b0f4066SDimitry Andric     // If this is an intrinsic function, set the function's attributes
8703b0f4066SDimitry Andric     // to the intrinsic's attributes.
8713861d79fSDimitry Andric     F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(),
8723861d79fSDimitry Andric                                                     (llvm::Intrinsic::ID)IID));
8733b0f4066SDimitry Andric     return;
8743b0f4066SDimitry Andric   }
8753b0f4066SDimitry Andric 
87659d1ed5bSDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
877f22ef01cSRoman Divacky 
878f22ef01cSRoman Divacky   if (!IsIncompleteFunction)
879dff0c46cSDimitry Andric     SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F);
880f22ef01cSRoman Divacky 
88159d1ed5bSDimitry Andric   // Add the Returned attribute for "this", except for iOS 5 and earlier
88259d1ed5bSDimitry Andric   // where substantial code, including the libstdc++ dylib, was compiled with
88359d1ed5bSDimitry Andric   // GCC and does not actually return "this".
88439d628a0SDimitry Andric   if (!IsThunk && getCXXABI().HasThisReturn(GD) &&
88559d1ed5bSDimitry Andric       !(getTarget().getTriple().isiOS() &&
88659d1ed5bSDimitry Andric         getTarget().getTriple().isOSVersionLT(6))) {
887f785676fSDimitry Andric     assert(!F->arg_empty() &&
888f785676fSDimitry Andric            F->arg_begin()->getType()
889f785676fSDimitry Andric              ->canLosslesslyBitCastTo(F->getReturnType()) &&
890f785676fSDimitry Andric            "unexpected this return");
891f785676fSDimitry Andric     F->addAttribute(1, llvm::Attribute::Returned);
892f785676fSDimitry Andric   }
893f785676fSDimitry Andric 
894f22ef01cSRoman Divacky   // Only a few attributes are set on declarations; these may later be
895f22ef01cSRoman Divacky   // overridden by a definition.
896f22ef01cSRoman Divacky 
89759d1ed5bSDimitry Andric   setLinkageAndVisibilityForGV(F, FD);
8982754fe60SDimitry Andric 
89959d1ed5bSDimitry Andric   if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
90059d1ed5bSDimitry Andric     if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
90159d1ed5bSDimitry Andric       // Don't dllexport/import destructor thunks.
90259d1ed5bSDimitry Andric       F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
9032754fe60SDimitry Andric     }
904f22ef01cSRoman Divacky   }
905f22ef01cSRoman Divacky 
906f22ef01cSRoman Divacky   if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
907f22ef01cSRoman Divacky     F->setSection(SA->getName());
908f785676fSDimitry Andric 
909f785676fSDimitry Andric   // A replaceable global allocation function does not act like a builtin by
910f785676fSDimitry Andric   // default, only if it is invoked by a new-expression or delete-expression.
911f785676fSDimitry Andric   if (FD->isReplaceableGlobalAllocationFunction())
912f785676fSDimitry Andric     F->addAttribute(llvm::AttributeSet::FunctionIndex,
913f785676fSDimitry Andric                     llvm::Attribute::NoBuiltin);
914f22ef01cSRoman Divacky }
915f22ef01cSRoman Divacky 
91659d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
917f22ef01cSRoman Divacky   assert(!GV->isDeclaration() &&
918f22ef01cSRoman Divacky          "Only globals with definition can force usage.");
919f22ef01cSRoman Divacky   LLVMUsed.push_back(GV);
920f22ef01cSRoman Divacky }
921f22ef01cSRoman Divacky 
92259d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) {
92359d1ed5bSDimitry Andric   assert(!GV->isDeclaration() &&
92459d1ed5bSDimitry Andric          "Only globals with definition can force usage.");
92559d1ed5bSDimitry Andric   LLVMCompilerUsed.push_back(GV);
92659d1ed5bSDimitry Andric }
92759d1ed5bSDimitry Andric 
92859d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name,
92959d1ed5bSDimitry Andric                      std::vector<llvm::WeakVH> &List) {
930f22ef01cSRoman Divacky   // Don't create llvm.used if there is no need.
93159d1ed5bSDimitry Andric   if (List.empty())
932f22ef01cSRoman Divacky     return;
933f22ef01cSRoman Divacky 
93459d1ed5bSDimitry Andric   // Convert List to what ConstantArray needs.
935dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> UsedArray;
93659d1ed5bSDimitry Andric   UsedArray.resize(List.size());
93759d1ed5bSDimitry Andric   for (unsigned i = 0, e = List.size(); i != e; ++i) {
938f22ef01cSRoman Divacky     UsedArray[i] =
93944f7b0dcSDimitry Andric         llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
94044f7b0dcSDimitry Andric             cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy);
941f22ef01cSRoman Divacky   }
942f22ef01cSRoman Divacky 
943f22ef01cSRoman Divacky   if (UsedArray.empty())
944f22ef01cSRoman Divacky     return;
94559d1ed5bSDimitry Andric   llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
946f22ef01cSRoman Divacky 
94759d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
94859d1ed5bSDimitry Andric       CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,
94959d1ed5bSDimitry Andric       llvm::ConstantArray::get(ATy, UsedArray), Name);
950f22ef01cSRoman Divacky 
951f22ef01cSRoman Divacky   GV->setSection("llvm.metadata");
952f22ef01cSRoman Divacky }
953f22ef01cSRoman Divacky 
95459d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() {
95559d1ed5bSDimitry Andric   emitUsed(*this, "llvm.used", LLVMUsed);
95659d1ed5bSDimitry Andric   emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed);
95759d1ed5bSDimitry Andric }
95859d1ed5bSDimitry Andric 
959f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
96039d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
961f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
962f785676fSDimitry Andric }
963f785676fSDimitry Andric 
964f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) {
965f785676fSDimitry Andric   llvm::SmallString<32> Opt;
966f785676fSDimitry Andric   getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt);
96739d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
968f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
969f785676fSDimitry Andric }
970f785676fSDimitry Andric 
971f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) {
972f785676fSDimitry Andric   llvm::SmallString<24> Opt;
973f785676fSDimitry Andric   getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
97439d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
975f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
976f785676fSDimitry Andric }
977f785676fSDimitry Andric 
978139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules
979139f7f9bSDimitry Andric /// it depends on, using a postorder walk.
98039d628a0SDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod,
98139d628a0SDimitry Andric                                     SmallVectorImpl<llvm::Metadata *> &Metadata,
982139f7f9bSDimitry Andric                                     llvm::SmallPtrSet<Module *, 16> &Visited) {
983139f7f9bSDimitry Andric   // Import this module's parent.
98439d628a0SDimitry Andric   if (Mod->Parent && Visited.insert(Mod->Parent).second) {
985f785676fSDimitry Andric     addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited);
986139f7f9bSDimitry Andric   }
987139f7f9bSDimitry Andric 
988139f7f9bSDimitry Andric   // Import this module's dependencies.
989139f7f9bSDimitry Andric   for (unsigned I = Mod->Imports.size(); I > 0; --I) {
99039d628a0SDimitry Andric     if (Visited.insert(Mod->Imports[I - 1]).second)
991f785676fSDimitry Andric       addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited);
992139f7f9bSDimitry Andric   }
993139f7f9bSDimitry Andric 
994139f7f9bSDimitry Andric   // Add linker options to link against the libraries/frameworks
995139f7f9bSDimitry Andric   // described by this module.
996f785676fSDimitry Andric   llvm::LLVMContext &Context = CGM.getLLVMContext();
997139f7f9bSDimitry Andric   for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) {
998f785676fSDimitry Andric     // Link against a framework.  Frameworks are currently Darwin only, so we
999f785676fSDimitry Andric     // don't to ask TargetCodeGenInfo for the spelling of the linker option.
1000139f7f9bSDimitry Andric     if (Mod->LinkLibraries[I-1].IsFramework) {
100139d628a0SDimitry Andric       llvm::Metadata *Args[2] = {
1002139f7f9bSDimitry Andric           llvm::MDString::get(Context, "-framework"),
100339d628a0SDimitry Andric           llvm::MDString::get(Context, Mod->LinkLibraries[I - 1].Library)};
1004139f7f9bSDimitry Andric 
1005139f7f9bSDimitry Andric       Metadata.push_back(llvm::MDNode::get(Context, Args));
1006139f7f9bSDimitry Andric       continue;
1007139f7f9bSDimitry Andric     }
1008139f7f9bSDimitry Andric 
1009139f7f9bSDimitry Andric     // Link against a library.
1010f785676fSDimitry Andric     llvm::SmallString<24> Opt;
1011f785676fSDimitry Andric     CGM.getTargetCodeGenInfo().getDependentLibraryOption(
1012f785676fSDimitry Andric       Mod->LinkLibraries[I-1].Library, Opt);
101339d628a0SDimitry Andric     auto *OptString = llvm::MDString::get(Context, Opt);
1014139f7f9bSDimitry Andric     Metadata.push_back(llvm::MDNode::get(Context, OptString));
1015139f7f9bSDimitry Andric   }
1016139f7f9bSDimitry Andric }
1017139f7f9bSDimitry Andric 
1018139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() {
1019139f7f9bSDimitry Andric   // Collect the set of all of the modules we want to visit to emit link
1020139f7f9bSDimitry Andric   // options, which is essentially the imported modules and all of their
1021139f7f9bSDimitry Andric   // non-explicit child modules.
1022139f7f9bSDimitry Andric   llvm::SetVector<clang::Module *> LinkModules;
1023139f7f9bSDimitry Andric   llvm::SmallPtrSet<clang::Module *, 16> Visited;
1024139f7f9bSDimitry Andric   SmallVector<clang::Module *, 16> Stack;
1025139f7f9bSDimitry Andric 
1026139f7f9bSDimitry Andric   // Seed the stack with imported modules.
1027139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(),
1028139f7f9bSDimitry Andric                                                MEnd = ImportedModules.end();
1029139f7f9bSDimitry Andric        M != MEnd; ++M) {
103039d628a0SDimitry Andric     if (Visited.insert(*M).second)
1031139f7f9bSDimitry Andric       Stack.push_back(*M);
1032139f7f9bSDimitry Andric   }
1033139f7f9bSDimitry Andric 
1034139f7f9bSDimitry Andric   // Find all of the modules to import, making a little effort to prune
1035139f7f9bSDimitry Andric   // non-leaf modules.
1036139f7f9bSDimitry Andric   while (!Stack.empty()) {
1037f785676fSDimitry Andric     clang::Module *Mod = Stack.pop_back_val();
1038139f7f9bSDimitry Andric 
1039139f7f9bSDimitry Andric     bool AnyChildren = false;
1040139f7f9bSDimitry Andric 
1041139f7f9bSDimitry Andric     // Visit the submodules of this module.
1042139f7f9bSDimitry Andric     for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(),
1043139f7f9bSDimitry Andric                                         SubEnd = Mod->submodule_end();
1044139f7f9bSDimitry Andric          Sub != SubEnd; ++Sub) {
1045139f7f9bSDimitry Andric       // Skip explicit children; they need to be explicitly imported to be
1046139f7f9bSDimitry Andric       // linked against.
1047139f7f9bSDimitry Andric       if ((*Sub)->IsExplicit)
1048139f7f9bSDimitry Andric         continue;
1049139f7f9bSDimitry Andric 
105039d628a0SDimitry Andric       if (Visited.insert(*Sub).second) {
1051139f7f9bSDimitry Andric         Stack.push_back(*Sub);
1052139f7f9bSDimitry Andric         AnyChildren = true;
1053139f7f9bSDimitry Andric       }
1054139f7f9bSDimitry Andric     }
1055139f7f9bSDimitry Andric 
1056139f7f9bSDimitry Andric     // We didn't find any children, so add this module to the list of
1057139f7f9bSDimitry Andric     // modules to link against.
1058139f7f9bSDimitry Andric     if (!AnyChildren) {
1059139f7f9bSDimitry Andric       LinkModules.insert(Mod);
1060139f7f9bSDimitry Andric     }
1061139f7f9bSDimitry Andric   }
1062139f7f9bSDimitry Andric 
1063139f7f9bSDimitry Andric   // Add link options for all of the imported modules in reverse topological
1064f785676fSDimitry Andric   // order.  We don't do anything to try to order import link flags with respect
1065f785676fSDimitry Andric   // to linker options inserted by things like #pragma comment().
106639d628a0SDimitry Andric   SmallVector<llvm::Metadata *, 16> MetadataArgs;
1067139f7f9bSDimitry Andric   Visited.clear();
1068139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(),
1069139f7f9bSDimitry Andric                                                MEnd = LinkModules.end();
1070139f7f9bSDimitry Andric        M != MEnd; ++M) {
107139d628a0SDimitry Andric     if (Visited.insert(*M).second)
1072f785676fSDimitry Andric       addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited);
1073139f7f9bSDimitry Andric   }
1074139f7f9bSDimitry Andric   std::reverse(MetadataArgs.begin(), MetadataArgs.end());
1075f785676fSDimitry Andric   LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
1076139f7f9bSDimitry Andric 
1077139f7f9bSDimitry Andric   // Add the linker options metadata flag.
1078139f7f9bSDimitry Andric   getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options",
1079f785676fSDimitry Andric                             llvm::MDNode::get(getLLVMContext(),
1080f785676fSDimitry Andric                                               LinkerOptionsMetadata));
1081139f7f9bSDimitry Andric }
1082139f7f9bSDimitry Andric 
1083f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() {
1084f22ef01cSRoman Divacky   // Emit code for any potentially referenced deferred decls.  Since a
1085f22ef01cSRoman Divacky   // previously unused static decl may become used during the generation of code
1086f22ef01cSRoman Divacky   // for a static function, iterate until no changes are made.
1087f22ef01cSRoman Divacky 
1088139f7f9bSDimitry Andric   while (true) {
1089f22ef01cSRoman Divacky     if (!DeferredVTables.empty()) {
1090139f7f9bSDimitry Andric       EmitDeferredVTables();
1091139f7f9bSDimitry Andric 
1092139f7f9bSDimitry Andric       // Emitting a v-table doesn't directly cause more v-tables to
1093139f7f9bSDimitry Andric       // become deferred, although it can cause functions to be
1094139f7f9bSDimitry Andric       // emitted that then need those v-tables.
1095139f7f9bSDimitry Andric       assert(DeferredVTables.empty());
1096f22ef01cSRoman Divacky     }
1097f22ef01cSRoman Divacky 
1098139f7f9bSDimitry Andric     // Stop if we're out of both deferred v-tables and deferred declarations.
1099139f7f9bSDimitry Andric     if (DeferredDeclsToEmit.empty()) break;
1100139f7f9bSDimitry Andric 
110159d1ed5bSDimitry Andric     DeferredGlobal &G = DeferredDeclsToEmit.back();
110259d1ed5bSDimitry Andric     GlobalDecl D = G.GD;
110359d1ed5bSDimitry Andric     llvm::GlobalValue *GV = G.GV;
1104f22ef01cSRoman Divacky     DeferredDeclsToEmit.pop_back();
1105f22ef01cSRoman Divacky 
110639d628a0SDimitry Andric     assert(!GV || GV == GetGlobalValue(getMangledName(D)));
110739d628a0SDimitry Andric     if (!GV)
110839d628a0SDimitry Andric       GV = GetGlobalValue(getMangledName(D));
110939d628a0SDimitry Andric 
111039d628a0SDimitry Andric 
1111f22ef01cSRoman Divacky     // Check to see if we've already emitted this.  This is necessary
1112f22ef01cSRoman Divacky     // for a couple of reasons: first, decls can end up in the
1113f22ef01cSRoman Divacky     // deferred-decls queue multiple times, and second, decls can end
1114f22ef01cSRoman Divacky     // up with definitions in unusual ways (e.g. by an extern inline
1115f22ef01cSRoman Divacky     // function acquiring a strong function redefinition).  Just
1116f22ef01cSRoman Divacky     // ignore these cases.
111739d628a0SDimitry Andric     if (GV && !GV->isDeclaration())
1118f22ef01cSRoman Divacky       continue;
1119f22ef01cSRoman Divacky 
1120f22ef01cSRoman Divacky     // Otherwise, emit the definition and move on to the next one.
112159d1ed5bSDimitry Andric     EmitGlobalDefinition(D, GV);
1122f22ef01cSRoman Divacky   }
1123f22ef01cSRoman Divacky }
1124f22ef01cSRoman Divacky 
11256122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() {
11266122f3e6SDimitry Andric   if (Annotations.empty())
11276122f3e6SDimitry Andric     return;
11286122f3e6SDimitry Andric 
11296122f3e6SDimitry Andric   // Create a new global variable for the ConstantStruct in the Module.
11306122f3e6SDimitry Andric   llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
11316122f3e6SDimitry Andric     Annotations[0]->getType(), Annotations.size()), Annotations);
113259d1ed5bSDimitry Andric   auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false,
113359d1ed5bSDimitry Andric                                       llvm::GlobalValue::AppendingLinkage,
113459d1ed5bSDimitry Andric                                       Array, "llvm.global.annotations");
11356122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11366122f3e6SDimitry Andric }
11376122f3e6SDimitry Andric 
1138139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) {
1139f785676fSDimitry Andric   llvm::Constant *&AStr = AnnotationStrings[Str];
1140f785676fSDimitry Andric   if (AStr)
1141f785676fSDimitry Andric     return AStr;
11426122f3e6SDimitry Andric 
11436122f3e6SDimitry Andric   // Not found yet, create a new global.
1144dff0c46cSDimitry Andric   llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
114559d1ed5bSDimitry Andric   auto *gv =
114659d1ed5bSDimitry Andric       new llvm::GlobalVariable(getModule(), s->getType(), true,
114759d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, s, ".str");
11486122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11496122f3e6SDimitry Andric   gv->setUnnamedAddr(true);
1150f785676fSDimitry Andric   AStr = gv;
11516122f3e6SDimitry Andric   return gv;
11526122f3e6SDimitry Andric }
11536122f3e6SDimitry Andric 
11546122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) {
11556122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11566122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(Loc);
11576122f3e6SDimitry Andric   if (PLoc.isValid())
11586122f3e6SDimitry Andric     return EmitAnnotationString(PLoc.getFilename());
11596122f3e6SDimitry Andric   return EmitAnnotationString(SM.getBufferName(Loc));
11606122f3e6SDimitry Andric }
11616122f3e6SDimitry Andric 
11626122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) {
11636122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11646122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(L);
11656122f3e6SDimitry Andric   unsigned LineNo = PLoc.isValid() ? PLoc.getLine() :
11666122f3e6SDimitry Andric     SM.getExpansionLineNumber(L);
11676122f3e6SDimitry Andric   return llvm::ConstantInt::get(Int32Ty, LineNo);
11686122f3e6SDimitry Andric }
11696122f3e6SDimitry Andric 
1170f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
1171f22ef01cSRoman Divacky                                                 const AnnotateAttr *AA,
11726122f3e6SDimitry Andric                                                 SourceLocation L) {
11736122f3e6SDimitry Andric   // Get the globals for file name, annotation, and the line number.
11746122f3e6SDimitry Andric   llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()),
11756122f3e6SDimitry Andric                  *UnitGV = EmitAnnotationUnit(L),
11766122f3e6SDimitry Andric                  *LineNoCst = EmitAnnotationLineNo(L);
1177f22ef01cSRoman Divacky 
1178f22ef01cSRoman Divacky   // Create the ConstantStruct for the global annotation.
1179f22ef01cSRoman Divacky   llvm::Constant *Fields[4] = {
11806122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
11816122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
11826122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
11836122f3e6SDimitry Andric     LineNoCst
1184f22ef01cSRoman Divacky   };
118517a519f9SDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
1186f22ef01cSRoman Divacky }
1187f22ef01cSRoman Divacky 
11886122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
11896122f3e6SDimitry Andric                                          llvm::GlobalValue *GV) {
11906122f3e6SDimitry Andric   assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
11916122f3e6SDimitry Andric   // Get the struct elements for these annotations.
119259d1ed5bSDimitry Andric   for (const auto *I : D->specific_attrs<AnnotateAttr>())
119359d1ed5bSDimitry Andric     Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation()));
11946122f3e6SDimitry Andric }
11956122f3e6SDimitry Andric 
119639d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::Function *Fn,
119739d628a0SDimitry Andric                                            SourceLocation Loc) const {
119839d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
119939d628a0SDimitry Andric   // Blacklist by function name.
120039d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedFunction(Fn->getName()))
120139d628a0SDimitry Andric     return true;
120239d628a0SDimitry Andric   // Blacklist by location.
120339d628a0SDimitry Andric   if (!Loc.isInvalid())
120439d628a0SDimitry Andric     return SanitizerBL.isBlacklistedLocation(Loc);
120539d628a0SDimitry Andric   // If location is unknown, this may be a compiler-generated function. Assume
120639d628a0SDimitry Andric   // it's located in the main file.
120739d628a0SDimitry Andric   auto &SM = Context.getSourceManager();
120839d628a0SDimitry Andric   if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
120939d628a0SDimitry Andric     return SanitizerBL.isBlacklistedFile(MainFile->getName());
121039d628a0SDimitry Andric   }
121139d628a0SDimitry Andric   return false;
121239d628a0SDimitry Andric }
121339d628a0SDimitry Andric 
121439d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::GlobalVariable *GV,
121539d628a0SDimitry Andric                                            SourceLocation Loc, QualType Ty,
121639d628a0SDimitry Andric                                            StringRef Category) const {
121739d628a0SDimitry Andric   // For now globals can be blacklisted only in ASan.
121839d628a0SDimitry Andric   if (!LangOpts.Sanitize.has(SanitizerKind::Address))
121939d628a0SDimitry Andric     return false;
122039d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
122139d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedGlobal(GV->getName(), Category))
122239d628a0SDimitry Andric     return true;
122339d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedLocation(Loc, Category))
122439d628a0SDimitry Andric     return true;
122539d628a0SDimitry Andric   // Check global type.
122639d628a0SDimitry Andric   if (!Ty.isNull()) {
122739d628a0SDimitry Andric     // Drill down the array types: if global variable of a fixed type is
122839d628a0SDimitry Andric     // blacklisted, we also don't instrument arrays of them.
122939d628a0SDimitry Andric     while (auto AT = dyn_cast<ArrayType>(Ty.getTypePtr()))
123039d628a0SDimitry Andric       Ty = AT->getElementType();
123139d628a0SDimitry Andric     Ty = Ty.getCanonicalType().getUnqualifiedType();
123239d628a0SDimitry Andric     // We allow to blacklist only record types (classes, structs etc.)
123339d628a0SDimitry Andric     if (Ty->isRecordType()) {
123439d628a0SDimitry Andric       std::string TypeStr = Ty.getAsString(getContext().getPrintingPolicy());
123539d628a0SDimitry Andric       if (SanitizerBL.isBlacklistedType(TypeStr, Category))
123639d628a0SDimitry Andric         return true;
123739d628a0SDimitry Andric     }
123839d628a0SDimitry Andric   }
123939d628a0SDimitry Andric   return false;
124039d628a0SDimitry Andric }
124139d628a0SDimitry Andric 
124239d628a0SDimitry Andric bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) {
1243e580952dSDimitry Andric   // Never defer when EmitAllDecls is specified.
1244dff0c46cSDimitry Andric   if (LangOpts.EmitAllDecls)
124539d628a0SDimitry Andric     return true;
124639d628a0SDimitry Andric 
124739d628a0SDimitry Andric   return getContext().DeclMustBeEmitted(Global);
124839d628a0SDimitry Andric }
124939d628a0SDimitry Andric 
125039d628a0SDimitry Andric bool CodeGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
125139d628a0SDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global))
125239d628a0SDimitry Andric     if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
125339d628a0SDimitry Andric       // Implicit template instantiations may change linkage if they are later
125439d628a0SDimitry Andric       // explicitly instantiated, so they should not be emitted eagerly.
1255f22ef01cSRoman Divacky       return false;
1256f22ef01cSRoman Divacky 
125739d628a0SDimitry Andric   return true;
1258f22ef01cSRoman Divacky }
1259f22ef01cSRoman Divacky 
12603861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
12613861d79fSDimitry Andric     const CXXUuidofExpr* E) {
12623861d79fSDimitry Andric   // Sema has verified that IIDSource has a __declspec(uuid()), and that its
12633861d79fSDimitry Andric   // well-formed.
1264f785676fSDimitry Andric   StringRef Uuid = E->getUuidAsStringRef(Context);
1265f785676fSDimitry Andric   std::string Name = "_GUID_" + Uuid.lower();
1266f785676fSDimitry Andric   std::replace(Name.begin(), Name.end(), '-', '_');
12673861d79fSDimitry Andric 
12683861d79fSDimitry Andric   // Look for an existing global.
12693861d79fSDimitry Andric   if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
12703861d79fSDimitry Andric     return GV;
12713861d79fSDimitry Andric 
127239d628a0SDimitry Andric   llvm::Constant *Init = EmitUuidofInitializer(Uuid);
12733861d79fSDimitry Andric   assert(Init && "failed to initialize as constant");
12743861d79fSDimitry Andric 
127559d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
1276f785676fSDimitry Andric       getModule(), Init->getType(),
1277f785676fSDimitry Andric       /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
12783861d79fSDimitry Andric   return GV;
12793861d79fSDimitry Andric }
12803861d79fSDimitry Andric 
1281f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
1282f22ef01cSRoman Divacky   const AliasAttr *AA = VD->getAttr<AliasAttr>();
1283f22ef01cSRoman Divacky   assert(AA && "No alias?");
1284f22ef01cSRoman Divacky 
12856122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType());
1286f22ef01cSRoman Divacky 
1287f22ef01cSRoman Divacky   // See if there is already something with the target's name in the module.
1288f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
12893861d79fSDimitry Andric   if (Entry) {
12903861d79fSDimitry Andric     unsigned AS = getContext().getTargetAddressSpace(VD->getType());
12913861d79fSDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
12923861d79fSDimitry Andric   }
1293f22ef01cSRoman Divacky 
1294f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
1295f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
12963861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
12973861d79fSDimitry Andric                                       GlobalDecl(cast<FunctionDecl>(VD)),
12982754fe60SDimitry Andric                                       /*ForVTable=*/false);
1299f22ef01cSRoman Divacky   else
1300f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
130159d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
130259d1ed5bSDimitry Andric                                     nullptr);
13033861d79fSDimitry Andric 
130459d1ed5bSDimitry Andric   auto *F = cast<llvm::GlobalValue>(Aliasee);
1305f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::ExternalWeakLinkage);
1306f22ef01cSRoman Divacky   WeakRefReferences.insert(F);
1307f22ef01cSRoman Divacky 
1308f22ef01cSRoman Divacky   return Aliasee;
1309f22ef01cSRoman Divacky }
1310f22ef01cSRoman Divacky 
1311f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) {
131259d1ed5bSDimitry Andric   const auto *Global = cast<ValueDecl>(GD.getDecl());
1313f22ef01cSRoman Divacky 
1314f22ef01cSRoman Divacky   // Weak references don't produce any output by themselves.
1315f22ef01cSRoman Divacky   if (Global->hasAttr<WeakRefAttr>())
1316f22ef01cSRoman Divacky     return;
1317f22ef01cSRoman Divacky 
1318f22ef01cSRoman Divacky   // If this is an alias definition (which otherwise looks like a declaration)
1319f22ef01cSRoman Divacky   // emit it now.
1320f22ef01cSRoman Divacky   if (Global->hasAttr<AliasAttr>())
1321f22ef01cSRoman Divacky     return EmitAliasDefinition(GD);
1322f22ef01cSRoman Divacky 
13236122f3e6SDimitry Andric   // If this is CUDA, be selective about which declarations we emit.
1324dff0c46cSDimitry Andric   if (LangOpts.CUDA) {
13256122f3e6SDimitry Andric     if (CodeGenOpts.CUDAIsDevice) {
13266122f3e6SDimitry Andric       if (!Global->hasAttr<CUDADeviceAttr>() &&
13276122f3e6SDimitry Andric           !Global->hasAttr<CUDAGlobalAttr>() &&
13286122f3e6SDimitry Andric           !Global->hasAttr<CUDAConstantAttr>() &&
13296122f3e6SDimitry Andric           !Global->hasAttr<CUDASharedAttr>())
13306122f3e6SDimitry Andric         return;
13316122f3e6SDimitry Andric     } else {
13326122f3e6SDimitry Andric       if (!Global->hasAttr<CUDAHostAttr>() && (
13336122f3e6SDimitry Andric             Global->hasAttr<CUDADeviceAttr>() ||
13346122f3e6SDimitry Andric             Global->hasAttr<CUDAConstantAttr>() ||
13356122f3e6SDimitry Andric             Global->hasAttr<CUDASharedAttr>()))
13366122f3e6SDimitry Andric         return;
1337e580952dSDimitry Andric     }
1338e580952dSDimitry Andric   }
1339e580952dSDimitry Andric 
13406122f3e6SDimitry Andric   // Ignore declarations, they will be emitted on their first use.
134159d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
1342f22ef01cSRoman Divacky     // Forward declarations are emitted lazily on first use.
13436122f3e6SDimitry Andric     if (!FD->doesThisDeclarationHaveABody()) {
13446122f3e6SDimitry Andric       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
1345f22ef01cSRoman Divacky         return;
13466122f3e6SDimitry Andric 
13476122f3e6SDimitry Andric       StringRef MangledName = getMangledName(GD);
134859d1ed5bSDimitry Andric 
134959d1ed5bSDimitry Andric       // Compute the function info and LLVM type.
135059d1ed5bSDimitry Andric       const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
135159d1ed5bSDimitry Andric       llvm::Type *Ty = getTypes().GetFunctionType(FI);
135259d1ed5bSDimitry Andric 
135359d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false,
135459d1ed5bSDimitry Andric                               /*DontDefer=*/false);
13556122f3e6SDimitry Andric       return;
13566122f3e6SDimitry Andric     }
1357f22ef01cSRoman Divacky   } else {
135859d1ed5bSDimitry Andric     const auto *VD = cast<VarDecl>(Global);
1359f22ef01cSRoman Divacky     assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
1360f22ef01cSRoman Divacky 
136159d1ed5bSDimitry Andric     if (VD->isThisDeclarationADefinition() != VarDecl::Definition &&
136259d1ed5bSDimitry Andric         !Context.isMSStaticDataMemberInlineDefinition(VD))
1363f22ef01cSRoman Divacky       return;
1364f22ef01cSRoman Divacky   }
1365f22ef01cSRoman Divacky 
136639d628a0SDimitry Andric   // Defer code generation to first use when possible, e.g. if this is an inline
136739d628a0SDimitry Andric   // function. If the global must always be emitted, do it eagerly if possible
136839d628a0SDimitry Andric   // to benefit from cache locality.
136939d628a0SDimitry Andric   if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) {
1370f22ef01cSRoman Divacky     // Emit the definition if it can't be deferred.
1371f22ef01cSRoman Divacky     EmitGlobalDefinition(GD);
1372f22ef01cSRoman Divacky     return;
1373f22ef01cSRoman Divacky   }
1374f22ef01cSRoman Divacky 
1375e580952dSDimitry Andric   // If we're deferring emission of a C++ variable with an
1376e580952dSDimitry Andric   // initializer, remember the order in which it appeared in the file.
1377dff0c46cSDimitry Andric   if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) &&
1378e580952dSDimitry Andric       cast<VarDecl>(Global)->hasInit()) {
1379e580952dSDimitry Andric     DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
138059d1ed5bSDimitry Andric     CXXGlobalInits.push_back(nullptr);
1381e580952dSDimitry Andric   }
1382e580952dSDimitry Andric 
13836122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
138439d628a0SDimitry Andric   if (llvm::GlobalValue *GV = GetGlobalValue(MangledName)) {
138539d628a0SDimitry Andric     // The value has already been used and should therefore be emitted.
138659d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, GD);
138739d628a0SDimitry Andric   } else if (MustBeEmitted(Global)) {
138839d628a0SDimitry Andric     // The value must be emitted, but cannot be emitted eagerly.
138939d628a0SDimitry Andric     assert(!MayBeEmittedEagerly(Global));
139039d628a0SDimitry Andric     addDeferredDeclToEmit(/*GV=*/nullptr, GD);
139139d628a0SDimitry Andric   } else {
1392f22ef01cSRoman Divacky     // Otherwise, remember that we saw a deferred decl with this name.  The
1393f22ef01cSRoman Divacky     // first use of the mangled name will cause it to move into
1394f22ef01cSRoman Divacky     // DeferredDeclsToEmit.
1395f22ef01cSRoman Divacky     DeferredDecls[MangledName] = GD;
1396f22ef01cSRoman Divacky   }
1397f22ef01cSRoman Divacky }
1398f22ef01cSRoman Divacky 
1399f8254f43SDimitry Andric namespace {
1400f8254f43SDimitry Andric   struct FunctionIsDirectlyRecursive :
1401f8254f43SDimitry Andric     public RecursiveASTVisitor<FunctionIsDirectlyRecursive> {
1402f8254f43SDimitry Andric     const StringRef Name;
1403dff0c46cSDimitry Andric     const Builtin::Context &BI;
1404f8254f43SDimitry Andric     bool Result;
1405dff0c46cSDimitry Andric     FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) :
1406dff0c46cSDimitry Andric       Name(N), BI(C), Result(false) {
1407f8254f43SDimitry Andric     }
1408f8254f43SDimitry Andric     typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base;
1409f8254f43SDimitry Andric 
1410f8254f43SDimitry Andric     bool TraverseCallExpr(CallExpr *E) {
1411dff0c46cSDimitry Andric       const FunctionDecl *FD = E->getDirectCallee();
1412dff0c46cSDimitry Andric       if (!FD)
1413f8254f43SDimitry Andric         return true;
1414dff0c46cSDimitry Andric       AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1415dff0c46cSDimitry Andric       if (Attr && Name == Attr->getLabel()) {
1416dff0c46cSDimitry Andric         Result = true;
1417dff0c46cSDimitry Andric         return false;
1418dff0c46cSDimitry Andric       }
1419dff0c46cSDimitry Andric       unsigned BuiltinID = FD->getBuiltinID();
1420dff0c46cSDimitry Andric       if (!BuiltinID)
1421f8254f43SDimitry Andric         return true;
1422dff0c46cSDimitry Andric       StringRef BuiltinName = BI.GetName(BuiltinID);
1423dff0c46cSDimitry Andric       if (BuiltinName.startswith("__builtin_") &&
1424dff0c46cSDimitry Andric           Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) {
1425f8254f43SDimitry Andric         Result = true;
1426f8254f43SDimitry Andric         return false;
1427f8254f43SDimitry Andric       }
1428f8254f43SDimitry Andric       return true;
1429f8254f43SDimitry Andric     }
1430f8254f43SDimitry Andric   };
1431f8254f43SDimitry Andric }
1432f8254f43SDimitry Andric 
1433dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another
1434dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin,
1435dff0c46cSDimitry Andric // ends up pointing to itself.
1436f8254f43SDimitry Andric bool
1437dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) {
1438dff0c46cSDimitry Andric   StringRef Name;
1439dff0c46cSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
1440dff0c46cSDimitry Andric     // asm labels are a special kind of mangling we have to support.
1441dff0c46cSDimitry Andric     AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1442dff0c46cSDimitry Andric     if (!Attr)
1443f8254f43SDimitry Andric       return false;
1444dff0c46cSDimitry Andric     Name = Attr->getLabel();
1445dff0c46cSDimitry Andric   } else {
1446dff0c46cSDimitry Andric     Name = FD->getName();
1447dff0c46cSDimitry Andric   }
1448f8254f43SDimitry Andric 
1449dff0c46cSDimitry Andric   FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
1450dff0c46cSDimitry Andric   Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
1451f8254f43SDimitry Andric   return Walker.Result;
1452f8254f43SDimitry Andric }
1453f8254f43SDimitry Andric 
1454f8254f43SDimitry Andric bool
1455f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
1456f785676fSDimitry Andric   if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage)
1457f8254f43SDimitry Andric     return true;
145859d1ed5bSDimitry Andric   const auto *F = cast<FunctionDecl>(GD.getDecl());
145959d1ed5bSDimitry Andric   if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
1460f8254f43SDimitry Andric     return false;
1461f8254f43SDimitry Andric   // PR9614. Avoid cases where the source code is lying to us. An available
1462f8254f43SDimitry Andric   // externally function should have an equivalent function somewhere else,
1463f8254f43SDimitry Andric   // but a function that calls itself is clearly not equivalent to the real
1464f8254f43SDimitry Andric   // implementation.
1465f8254f43SDimitry Andric   // This happens in glibc's btowc and in some configure checks.
1466dff0c46cSDimitry Andric   return !isTriviallyRecursive(F);
1467f8254f43SDimitry Andric }
1468f8254f43SDimitry Andric 
1469f785676fSDimitry Andric /// If the type for the method's class was generated by
1470f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a
1471f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart()
1472f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need
1473f785676fSDimitry Andric /// to construct the complete type prior to emitting the method.
1474f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) {
1475f785676fSDimitry Andric   if (!D->isInstance())
1476f785676fSDimitry Andric     return;
1477f785676fSDimitry Andric 
1478f785676fSDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
1479f785676fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
148059d1ed5bSDimitry Andric       const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext()));
1481f785676fSDimitry Andric       DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation());
1482f785676fSDimitry Andric     }
1483f785676fSDimitry Andric }
1484f785676fSDimitry Andric 
148559d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
148659d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
1487f22ef01cSRoman Divacky 
1488f22ef01cSRoman Divacky   PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(),
1489f22ef01cSRoman Divacky                                  Context.getSourceManager(),
1490f22ef01cSRoman Divacky                                  "Generating code for declaration");
1491f22ef01cSRoman Divacky 
1492f785676fSDimitry Andric   if (isa<FunctionDecl>(D)) {
1493ffd1746dSEd Schouten     // At -O0, don't generate IR for functions with available_externally
1494ffd1746dSEd Schouten     // linkage.
1495f785676fSDimitry Andric     if (!shouldEmitFunction(GD))
1496ffd1746dSEd Schouten       return;
1497ffd1746dSEd Schouten 
149859d1ed5bSDimitry Andric     if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
1499f785676fSDimitry Andric       CompleteDIClassType(Method);
1500bd5abe19SDimitry Andric       // Make sure to emit the definition(s) before we emit the thunks.
1501bd5abe19SDimitry Andric       // This is necessary for the generation of certain thunks.
150259d1ed5bSDimitry Andric       if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method))
150339d628a0SDimitry Andric         ABI->emitCXXStructor(CD, getFromCtorType(GD.getCtorType()));
150459d1ed5bSDimitry Andric       else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method))
150539d628a0SDimitry Andric         ABI->emitCXXStructor(DD, getFromDtorType(GD.getDtorType()));
1506bd5abe19SDimitry Andric       else
150759d1ed5bSDimitry Andric         EmitGlobalFunctionDefinition(GD, GV);
1508bd5abe19SDimitry Andric 
1509f22ef01cSRoman Divacky       if (Method->isVirtual())
1510f22ef01cSRoman Divacky         getVTables().EmitThunks(GD);
1511f22ef01cSRoman Divacky 
1512bd5abe19SDimitry Andric       return;
1513ffd1746dSEd Schouten     }
1514f22ef01cSRoman Divacky 
151559d1ed5bSDimitry Andric     return EmitGlobalFunctionDefinition(GD, GV);
1516ffd1746dSEd Schouten   }
1517f22ef01cSRoman Divacky 
151859d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
1519f22ef01cSRoman Divacky     return EmitGlobalVarDefinition(VD);
1520f22ef01cSRoman Divacky 
15216122f3e6SDimitry Andric   llvm_unreachable("Invalid argument to EmitGlobalDefinition()");
1522f22ef01cSRoman Divacky }
1523f22ef01cSRoman Divacky 
1524f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the
1525f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there
1526f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1527f22ef01cSRoman Divacky /// bitcasted to the right type.
1528f22ef01cSRoman Divacky ///
1529f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1530f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created.
1531f22ef01cSRoman Divacky llvm::Constant *
15326122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
15336122f3e6SDimitry Andric                                        llvm::Type *Ty,
1534f785676fSDimitry Andric                                        GlobalDecl GD, bool ForVTable,
153539d628a0SDimitry Andric                                        bool DontDefer, bool IsThunk,
1536139f7f9bSDimitry Andric                                        llvm::AttributeSet ExtraAttrs) {
1537f785676fSDimitry Andric   const Decl *D = GD.getDecl();
1538f785676fSDimitry Andric 
1539f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1540f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1541f22ef01cSRoman Divacky   if (Entry) {
15423861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1543f785676fSDimitry Andric       const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
1544f22ef01cSRoman Divacky       if (FD && !FD->hasAttr<WeakAttr>())
1545f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1546f22ef01cSRoman Divacky     }
1547f22ef01cSRoman Divacky 
154839d628a0SDimitry Andric     // Handle dropped DLL attributes.
154939d628a0SDimitry Andric     if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
155039d628a0SDimitry Andric       Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
155139d628a0SDimitry Andric 
1552f22ef01cSRoman Divacky     if (Entry->getType()->getElementType() == Ty)
1553f22ef01cSRoman Divacky       return Entry;
1554f22ef01cSRoman Divacky 
1555f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
155617a519f9SDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
1557f22ef01cSRoman Divacky   }
1558f22ef01cSRoman Divacky 
1559f22ef01cSRoman Divacky   // This function doesn't have a complete type (for example, the return
1560f22ef01cSRoman Divacky   // type is an incomplete struct). Use a fake type instead, and make
1561f22ef01cSRoman Divacky   // sure not to try to set attributes.
1562f22ef01cSRoman Divacky   bool IsIncompleteFunction = false;
1563f22ef01cSRoman Divacky 
15646122f3e6SDimitry Andric   llvm::FunctionType *FTy;
1565f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(Ty)) {
1566f22ef01cSRoman Divacky     FTy = cast<llvm::FunctionType>(Ty);
1567f22ef01cSRoman Divacky   } else {
1568bd5abe19SDimitry Andric     FTy = llvm::FunctionType::get(VoidTy, false);
1569f22ef01cSRoman Divacky     IsIncompleteFunction = true;
1570f22ef01cSRoman Divacky   }
1571ffd1746dSEd Schouten 
1572f22ef01cSRoman Divacky   llvm::Function *F = llvm::Function::Create(FTy,
1573f22ef01cSRoman Divacky                                              llvm::Function::ExternalLinkage,
1574f22ef01cSRoman Divacky                                              MangledName, &getModule());
1575f22ef01cSRoman Divacky   assert(F->getName() == MangledName && "name was uniqued!");
1576f785676fSDimitry Andric   if (D)
157739d628a0SDimitry Andric     SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
1578139f7f9bSDimitry Andric   if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) {
1579139f7f9bSDimitry Andric     llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex);
1580139f7f9bSDimitry Andric     F->addAttributes(llvm::AttributeSet::FunctionIndex,
1581139f7f9bSDimitry Andric                      llvm::AttributeSet::get(VMContext,
1582139f7f9bSDimitry Andric                                              llvm::AttributeSet::FunctionIndex,
1583139f7f9bSDimitry Andric                                              B));
1584139f7f9bSDimitry Andric   }
1585f22ef01cSRoman Divacky 
158659d1ed5bSDimitry Andric   if (!DontDefer) {
158759d1ed5bSDimitry Andric     // All MSVC dtors other than the base dtor are linkonce_odr and delegate to
158859d1ed5bSDimitry Andric     // each other bottoming out with the base dtor.  Therefore we emit non-base
158959d1ed5bSDimitry Andric     // dtors on usage, even if there is no dtor definition in the TU.
159059d1ed5bSDimitry Andric     if (D && isa<CXXDestructorDecl>(D) &&
159159d1ed5bSDimitry Andric         getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
159259d1ed5bSDimitry Andric                                            GD.getDtorType()))
159359d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
159459d1ed5bSDimitry Andric 
1595f22ef01cSRoman Divacky     // This is the first use or definition of a mangled name.  If there is a
1596f22ef01cSRoman Divacky     // deferred decl with this name, remember that we need to emit it at the end
1597f22ef01cSRoman Divacky     // of the file.
159859d1ed5bSDimitry Andric     auto DDI = DeferredDecls.find(MangledName);
1599f22ef01cSRoman Divacky     if (DDI != DeferredDecls.end()) {
160059d1ed5bSDimitry Andric       // Move the potentially referenced deferred decl to the
160159d1ed5bSDimitry Andric       // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we
160259d1ed5bSDimitry Andric       // don't need it anymore).
160359d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, DDI->second);
1604f22ef01cSRoman Divacky       DeferredDecls.erase(DDI);
16052754fe60SDimitry Andric 
160659d1ed5bSDimitry Andric       // Otherwise, if this is a sized deallocation function, emit a weak
160759d1ed5bSDimitry Andric       // definition
1608f785676fSDimitry Andric       // for it at the end of the translation unit.
1609f785676fSDimitry Andric     } else if (D && cast<FunctionDecl>(D)
1610f785676fSDimitry Andric                         ->getCorrespondingUnsizedGlobalDeallocationFunction()) {
161159d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
1612f785676fSDimitry Andric 
16132754fe60SDimitry Andric       // Otherwise, there are cases we have to worry about where we're
16142754fe60SDimitry Andric       // using a declaration for which we must emit a definition but where
16152754fe60SDimitry Andric       // we might not find a top-level definition:
16162754fe60SDimitry Andric       //   - member functions defined inline in their classes
16172754fe60SDimitry Andric       //   - friend functions defined inline in some class
16182754fe60SDimitry Andric       //   - special member functions with implicit definitions
16192754fe60SDimitry Andric       // If we ever change our AST traversal to walk into class methods,
16202754fe60SDimitry Andric       // this will be unnecessary.
16212754fe60SDimitry Andric       //
162259d1ed5bSDimitry Andric       // We also don't emit a definition for a function if it's going to be an
162339d628a0SDimitry Andric       // entry in a vtable, unless it's already marked as used.
1624f785676fSDimitry Andric     } else if (getLangOpts().CPlusPlus && D) {
16252754fe60SDimitry Andric       // Look for a declaration that's lexically in a record.
162639d628a0SDimitry Andric       for (const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD;
162739d628a0SDimitry Andric            FD = FD->getPreviousDecl()) {
16282754fe60SDimitry Andric         if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
162939d628a0SDimitry Andric           if (FD->doesThisDeclarationHaveABody()) {
163059d1ed5bSDimitry Andric             addDeferredDeclToEmit(F, GD.getWithDecl(FD));
16312754fe60SDimitry Andric             break;
1632f22ef01cSRoman Divacky           }
1633f22ef01cSRoman Divacky         }
163439d628a0SDimitry Andric       }
1635f22ef01cSRoman Divacky     }
163659d1ed5bSDimitry Andric   }
1637f22ef01cSRoman Divacky 
1638f22ef01cSRoman Divacky   // Make sure the result is of the requested type.
1639f22ef01cSRoman Divacky   if (!IsIncompleteFunction) {
1640f22ef01cSRoman Divacky     assert(F->getType()->getElementType() == Ty);
1641f22ef01cSRoman Divacky     return F;
1642f22ef01cSRoman Divacky   }
1643f22ef01cSRoman Divacky 
164417a519f9SDimitry Andric   llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
1645f22ef01cSRoman Divacky   return llvm::ConstantExpr::getBitCast(F, PTy);
1646f22ef01cSRoman Divacky }
1647f22ef01cSRoman Divacky 
1648f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function.  If Ty is
1649f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to
1650f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function).
1651f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
16526122f3e6SDimitry Andric                                                  llvm::Type *Ty,
165359d1ed5bSDimitry Andric                                                  bool ForVTable,
165459d1ed5bSDimitry Andric                                                  bool DontDefer) {
1655f22ef01cSRoman Divacky   // If there was no specific requested type, just convert it now.
1656f22ef01cSRoman Divacky   if (!Ty)
1657f22ef01cSRoman Divacky     Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
1658ffd1746dSEd Schouten 
16596122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
166059d1ed5bSDimitry Andric   return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer);
1661f22ef01cSRoman Divacky }
1662f22ef01cSRoman Divacky 
1663f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified
1664f22ef01cSRoman Divacky /// type and name.
1665f22ef01cSRoman Divacky llvm::Constant *
16666122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy,
16676122f3e6SDimitry Andric                                      StringRef Name,
1668139f7f9bSDimitry Andric                                      llvm::AttributeSet ExtraAttrs) {
166959d1ed5bSDimitry Andric   llvm::Constant *C =
167059d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
167139d628a0SDimitry Andric                               /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs);
167259d1ed5bSDimitry Andric   if (auto *F = dyn_cast<llvm::Function>(C))
1673139f7f9bSDimitry Andric     if (F->empty())
1674139f7f9bSDimitry Andric       F->setCallingConv(getRuntimeCC());
1675139f7f9bSDimitry Andric   return C;
1676f22ef01cSRoman Divacky }
1677f22ef01cSRoman Divacky 
167839d628a0SDimitry Andric /// CreateBuiltinFunction - Create a new builtin function with the specified
167939d628a0SDimitry Andric /// type and name.
168039d628a0SDimitry Andric llvm::Constant *
168139d628a0SDimitry Andric CodeGenModule::CreateBuiltinFunction(llvm::FunctionType *FTy,
168239d628a0SDimitry Andric                                      StringRef Name,
168339d628a0SDimitry Andric                                      llvm::AttributeSet ExtraAttrs) {
168439d628a0SDimitry Andric   llvm::Constant *C =
168539d628a0SDimitry Andric       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
168639d628a0SDimitry Andric                               /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs);
168739d628a0SDimitry Andric   if (auto *F = dyn_cast<llvm::Function>(C))
168839d628a0SDimitry Andric     if (F->empty())
168939d628a0SDimitry Andric       F->setCallingConv(getBuiltinCC());
169039d628a0SDimitry Andric   return C;
169139d628a0SDimitry Andric }
169239d628a0SDimitry Andric 
1693dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted
1694dff0c46cSDimitry Andric /// as a constant.
1695dff0c46cSDimitry Andric ///
1696dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs
1697dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is
1698dff0c46cSDimitry Andric /// not written to during its construction.
1699dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) {
1700dff0c46cSDimitry Andric   if (!Ty.isConstant(Context) && !Ty->isReferenceType())
1701f22ef01cSRoman Divacky     return false;
1702bd5abe19SDimitry Andric 
1703dff0c46cSDimitry Andric   if (Context.getLangOpts().CPlusPlus) {
1704dff0c46cSDimitry Andric     if (const CXXRecordDecl *Record
1705dff0c46cSDimitry Andric           = Context.getBaseElementType(Ty)->getAsCXXRecordDecl())
1706dff0c46cSDimitry Andric       return ExcludeCtor && !Record->hasMutableFields() &&
1707dff0c46cSDimitry Andric              Record->hasTrivialDestructor();
1708f22ef01cSRoman Divacky   }
1709bd5abe19SDimitry Andric 
1710f22ef01cSRoman Divacky   return true;
1711f22ef01cSRoman Divacky }
1712f22ef01cSRoman Divacky 
1713f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module,
1714f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type.  If there
1715f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1716f22ef01cSRoman Divacky /// bitcasted to the right type.
1717f22ef01cSRoman Divacky ///
1718f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1719f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created.
1720f22ef01cSRoman Divacky llvm::Constant *
17216122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
17226122f3e6SDimitry Andric                                      llvm::PointerType *Ty,
172359d1ed5bSDimitry Andric                                      const VarDecl *D) {
1724f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1725f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1726f22ef01cSRoman Divacky   if (Entry) {
17273861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1728f22ef01cSRoman Divacky       if (D && !D->hasAttr<WeakAttr>())
1729f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1730f22ef01cSRoman Divacky     }
1731f22ef01cSRoman Divacky 
173239d628a0SDimitry Andric     // Handle dropped DLL attributes.
173339d628a0SDimitry Andric     if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
173439d628a0SDimitry Andric       Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
173539d628a0SDimitry Andric 
1736f22ef01cSRoman Divacky     if (Entry->getType() == Ty)
1737f22ef01cSRoman Divacky       return Entry;
1738f22ef01cSRoman Divacky 
1739f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
1740f785676fSDimitry Andric     if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace())
1741f785676fSDimitry Andric       return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty);
1742f785676fSDimitry Andric 
1743f22ef01cSRoman Divacky     return llvm::ConstantExpr::getBitCast(Entry, Ty);
1744f22ef01cSRoman Divacky   }
1745f22ef01cSRoman Divacky 
174659d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace());
174759d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
174859d1ed5bSDimitry Andric       getModule(), Ty->getElementType(), false,
174959d1ed5bSDimitry Andric       llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, nullptr,
175059d1ed5bSDimitry Andric       llvm::GlobalVariable::NotThreadLocal, AddrSpace);
175159d1ed5bSDimitry Andric 
1752f22ef01cSRoman Divacky   // This is the first use or definition of a mangled name.  If there is a
1753f22ef01cSRoman Divacky   // deferred decl with this name, remember that we need to emit it at the end
1754f22ef01cSRoman Divacky   // of the file.
175559d1ed5bSDimitry Andric   auto DDI = DeferredDecls.find(MangledName);
1756f22ef01cSRoman Divacky   if (DDI != DeferredDecls.end()) {
1757f22ef01cSRoman Divacky     // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
1758f22ef01cSRoman Divacky     // list, and remove it from DeferredDecls (since we don't need it anymore).
175959d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, DDI->second);
1760f22ef01cSRoman Divacky     DeferredDecls.erase(DDI);
1761f22ef01cSRoman Divacky   }
1762f22ef01cSRoman Divacky 
1763f22ef01cSRoman Divacky   // Handle things which are present even on external declarations.
1764f22ef01cSRoman Divacky   if (D) {
1765f22ef01cSRoman Divacky     // FIXME: This code is overly simple and should be merged with other global
1766f22ef01cSRoman Divacky     // handling.
1767dff0c46cSDimitry Andric     GV->setConstant(isTypeConstant(D->getType(), false));
1768f22ef01cSRoman Divacky 
176959d1ed5bSDimitry Andric     setLinkageAndVisibilityForGV(GV, D);
17702754fe60SDimitry Andric 
1771284c1978SDimitry Andric     if (D->getTLSKind()) {
1772284c1978SDimitry Andric       if (D->getTLSKind() == VarDecl::TLS_Dynamic)
1773284c1978SDimitry Andric         CXXThreadLocals.push_back(std::make_pair(D, GV));
17747ae0e2c9SDimitry Andric       setTLSMode(GV, *D);
1775f22ef01cSRoman Divacky     }
1776f785676fSDimitry Andric 
1777f785676fSDimitry Andric     // If required by the ABI, treat declarations of static data members with
1778f785676fSDimitry Andric     // inline initializers as definitions.
177959d1ed5bSDimitry Andric     if (getContext().isMSStaticDataMemberInlineDefinition(D)) {
1780f785676fSDimitry Andric       EmitGlobalVarDefinition(D);
1781284c1978SDimitry Andric     }
1782f22ef01cSRoman Divacky 
178359d1ed5bSDimitry Andric     // Handle XCore specific ABI requirements.
178459d1ed5bSDimitry Andric     if (getTarget().getTriple().getArch() == llvm::Triple::xcore &&
178559d1ed5bSDimitry Andric         D->getLanguageLinkage() == CLanguageLinkage &&
178659d1ed5bSDimitry Andric         D->getType().isConstant(Context) &&
178759d1ed5bSDimitry Andric         isExternallyVisible(D->getLinkageAndVisibility().getLinkage()))
178859d1ed5bSDimitry Andric       GV->setSection(".cp.rodata");
178959d1ed5bSDimitry Andric   }
179059d1ed5bSDimitry Andric 
17917ae0e2c9SDimitry Andric   if (AddrSpace != Ty->getAddressSpace())
1792f785676fSDimitry Andric     return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty);
1793f785676fSDimitry Andric 
1794f22ef01cSRoman Divacky   return GV;
1795f22ef01cSRoman Divacky }
1796f22ef01cSRoman Divacky 
1797f22ef01cSRoman Divacky 
17982754fe60SDimitry Andric llvm::GlobalVariable *
17996122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
18006122f3e6SDimitry Andric                                       llvm::Type *Ty,
18012754fe60SDimitry Andric                                       llvm::GlobalValue::LinkageTypes Linkage) {
18022754fe60SDimitry Andric   llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name);
180359d1ed5bSDimitry Andric   llvm::GlobalVariable *OldGV = nullptr;
18042754fe60SDimitry Andric 
18052754fe60SDimitry Andric   if (GV) {
18062754fe60SDimitry Andric     // Check if the variable has the right type.
18072754fe60SDimitry Andric     if (GV->getType()->getElementType() == Ty)
18082754fe60SDimitry Andric       return GV;
18092754fe60SDimitry Andric 
18102754fe60SDimitry Andric     // Because C++ name mangling, the only way we can end up with an already
18112754fe60SDimitry Andric     // existing global with the same name is if it has been declared extern "C".
18122754fe60SDimitry Andric     assert(GV->isDeclaration() && "Declaration has wrong type!");
18132754fe60SDimitry Andric     OldGV = GV;
18142754fe60SDimitry Andric   }
18152754fe60SDimitry Andric 
18162754fe60SDimitry Andric   // Create a new variable.
18172754fe60SDimitry Andric   GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true,
181859d1ed5bSDimitry Andric                                 Linkage, nullptr, Name);
18192754fe60SDimitry Andric 
18202754fe60SDimitry Andric   if (OldGV) {
18212754fe60SDimitry Andric     // Replace occurrences of the old variable if needed.
18222754fe60SDimitry Andric     GV->takeName(OldGV);
18232754fe60SDimitry Andric 
18242754fe60SDimitry Andric     if (!OldGV->use_empty()) {
18252754fe60SDimitry Andric       llvm::Constant *NewPtrForOldDecl =
18262754fe60SDimitry Andric       llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
18272754fe60SDimitry Andric       OldGV->replaceAllUsesWith(NewPtrForOldDecl);
18282754fe60SDimitry Andric     }
18292754fe60SDimitry Andric 
18302754fe60SDimitry Andric     OldGV->eraseFromParent();
18312754fe60SDimitry Andric   }
18322754fe60SDimitry Andric 
18332754fe60SDimitry Andric   return GV;
18342754fe60SDimitry Andric }
18352754fe60SDimitry Andric 
1836f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the
1837f22ef01cSRoman Divacky /// given global variable.  If Ty is non-null and if the global doesn't exist,
1838cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the
1839f22ef01cSRoman Divacky /// normal requested type would be.
1840f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
18416122f3e6SDimitry Andric                                                   llvm::Type *Ty) {
1842f22ef01cSRoman Divacky   assert(D->hasGlobalStorage() && "Not a global variable");
1843f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
184459d1ed5bSDimitry Andric   if (!Ty)
1845f22ef01cSRoman Divacky     Ty = getTypes().ConvertTypeForMem(ASTTy);
1846f22ef01cSRoman Divacky 
18476122f3e6SDimitry Andric   llvm::PointerType *PTy =
18483b0f4066SDimitry Andric     llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy));
1849f22ef01cSRoman Divacky 
18506122f3e6SDimitry Andric   StringRef MangledName = getMangledName(D);
1851f22ef01cSRoman Divacky   return GetOrCreateLLVMGlobal(MangledName, PTy, D);
1852f22ef01cSRoman Divacky }
1853f22ef01cSRoman Divacky 
1854f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the
1855f22ef01cSRoman Divacky /// specified type and name.
1856f22ef01cSRoman Divacky llvm::Constant *
18576122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty,
18586122f3e6SDimitry Andric                                      StringRef Name) {
185959d1ed5bSDimitry Andric   return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr);
1860f22ef01cSRoman Divacky }
1861f22ef01cSRoman Divacky 
1862f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) {
1863f22ef01cSRoman Divacky   assert(!D->getInit() && "Cannot emit definite definitions here!");
1864f22ef01cSRoman Divacky 
186539d628a0SDimitry Andric   if (!MustBeEmitted(D)) {
1866f22ef01cSRoman Divacky     // If we have not seen a reference to this variable yet, place it
1867f22ef01cSRoman Divacky     // into the deferred declarations table to be emitted if needed
1868f22ef01cSRoman Divacky     // later.
18696122f3e6SDimitry Andric     StringRef MangledName = getMangledName(D);
1870f22ef01cSRoman Divacky     if (!GetGlobalValue(MangledName)) {
1871f22ef01cSRoman Divacky       DeferredDecls[MangledName] = D;
1872f22ef01cSRoman Divacky       return;
1873f22ef01cSRoman Divacky     }
1874f22ef01cSRoman Divacky   }
1875f22ef01cSRoman Divacky 
1876f22ef01cSRoman Divacky   // The tentative definition is the only definition.
1877f22ef01cSRoman Divacky   EmitGlobalVarDefinition(D);
1878f22ef01cSRoman Divacky }
1879f22ef01cSRoman Divacky 
18806122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const {
18812754fe60SDimitry Andric     return Context.toCharUnitsFromBits(
18823861d79fSDimitry Andric       TheDataLayout.getTypeStoreSizeInBits(Ty));
1883f22ef01cSRoman Divacky }
1884f22ef01cSRoman Divacky 
18857ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D,
18867ae0e2c9SDimitry Andric                                                  unsigned AddrSpace) {
18877ae0e2c9SDimitry Andric   if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) {
18887ae0e2c9SDimitry Andric     if (D->hasAttr<CUDAConstantAttr>())
18897ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant);
18907ae0e2c9SDimitry Andric     else if (D->hasAttr<CUDASharedAttr>())
18917ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared);
18927ae0e2c9SDimitry Andric     else
18937ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device);
18947ae0e2c9SDimitry Andric   }
18957ae0e2c9SDimitry Andric 
18967ae0e2c9SDimitry Andric   return AddrSpace;
18977ae0e2c9SDimitry Andric }
18987ae0e2c9SDimitry Andric 
1899284c1978SDimitry Andric template<typename SomeDecl>
1900284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
1901284c1978SDimitry Andric                                                llvm::GlobalValue *GV) {
1902284c1978SDimitry Andric   if (!getLangOpts().CPlusPlus)
1903284c1978SDimitry Andric     return;
1904284c1978SDimitry Andric 
1905284c1978SDimitry Andric   // Must have 'used' attribute, or else inline assembly can't rely on
1906284c1978SDimitry Andric   // the name existing.
1907284c1978SDimitry Andric   if (!D->template hasAttr<UsedAttr>())
1908284c1978SDimitry Andric     return;
1909284c1978SDimitry Andric 
1910284c1978SDimitry Andric   // Must have internal linkage and an ordinary name.
1911f785676fSDimitry Andric   if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage)
1912284c1978SDimitry Andric     return;
1913284c1978SDimitry Andric 
1914284c1978SDimitry Andric   // Must be in an extern "C" context. Entities declared directly within
1915284c1978SDimitry Andric   // a record are not extern "C" even if the record is in such a context.
1916f785676fSDimitry Andric   const SomeDecl *First = D->getFirstDecl();
1917284c1978SDimitry Andric   if (First->getDeclContext()->isRecord() || !First->isInExternCContext())
1918284c1978SDimitry Andric     return;
1919284c1978SDimitry Andric 
1920284c1978SDimitry Andric   // OK, this is an internal linkage entity inside an extern "C" linkage
1921284c1978SDimitry Andric   // specification. Make a note of that so we can give it the "expected"
1922284c1978SDimitry Andric   // mangled name if nothing else is using that name.
1923284c1978SDimitry Andric   std::pair<StaticExternCMap::iterator, bool> R =
1924284c1978SDimitry Andric       StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
1925284c1978SDimitry Andric 
1926284c1978SDimitry Andric   // If we have multiple internal linkage entities with the same name
1927284c1978SDimitry Andric   // in extern "C" regions, none of them gets that name.
1928284c1978SDimitry Andric   if (!R.second)
192959d1ed5bSDimitry Andric     R.first->second = nullptr;
1930284c1978SDimitry Andric }
1931284c1978SDimitry Andric 
1932f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
193359d1ed5bSDimitry Andric   llvm::Constant *Init = nullptr;
1934f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
1935dff0c46cSDimitry Andric   CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1936dff0c46cSDimitry Andric   bool NeedsGlobalCtor = false;
1937dff0c46cSDimitry Andric   bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor();
1938f22ef01cSRoman Divacky 
1939dff0c46cSDimitry Andric   const VarDecl *InitDecl;
1940dff0c46cSDimitry Andric   const Expr *InitExpr = D->getAnyInitializer(InitDecl);
1941f22ef01cSRoman Divacky 
1942f22ef01cSRoman Divacky   if (!InitExpr) {
1943f22ef01cSRoman Divacky     // This is a tentative definition; tentative definitions are
1944f22ef01cSRoman Divacky     // implicitly initialized with { 0 }.
1945f22ef01cSRoman Divacky     //
1946f22ef01cSRoman Divacky     // Note that tentative definitions are only emitted at the end of
1947f22ef01cSRoman Divacky     // a translation unit, so they should never have incomplete
1948f22ef01cSRoman Divacky     // type. In addition, EmitTentativeDefinition makes sure that we
1949f22ef01cSRoman Divacky     // never attempt to emit a tentative definition if a real one
1950f22ef01cSRoman Divacky     // exists. A use may still exists, however, so we still may need
1951f22ef01cSRoman Divacky     // to do a RAUW.
1952f22ef01cSRoman Divacky     assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
1953f22ef01cSRoman Divacky     Init = EmitNullConstant(D->getType());
1954f22ef01cSRoman Divacky   } else {
19557ae0e2c9SDimitry Andric     initializedGlobalDecl = GlobalDecl(D);
1956dff0c46cSDimitry Andric     Init = EmitConstantInit(*InitDecl);
1957f785676fSDimitry Andric 
1958f22ef01cSRoman Divacky     if (!Init) {
1959f22ef01cSRoman Divacky       QualType T = InitExpr->getType();
1960f22ef01cSRoman Divacky       if (D->getType()->isReferenceType())
1961f22ef01cSRoman Divacky         T = D->getType();
1962f22ef01cSRoman Divacky 
1963dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus) {
1964f22ef01cSRoman Divacky         Init = EmitNullConstant(T);
1965dff0c46cSDimitry Andric         NeedsGlobalCtor = true;
1966f22ef01cSRoman Divacky       } else {
1967f22ef01cSRoman Divacky         ErrorUnsupported(D, "static initializer");
1968f22ef01cSRoman Divacky         Init = llvm::UndefValue::get(getTypes().ConvertType(T));
1969f22ef01cSRoman Divacky       }
1970e580952dSDimitry Andric     } else {
1971e580952dSDimitry Andric       // We don't need an initializer, so remove the entry for the delayed
1972dff0c46cSDimitry Andric       // initializer position (just in case this entry was delayed) if we
1973dff0c46cSDimitry Andric       // also don't need to register a destructor.
1974dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus && !NeedsGlobalDtor)
1975e580952dSDimitry Andric         DelayedCXXInitPosition.erase(D);
1976f22ef01cSRoman Divacky     }
1977f22ef01cSRoman Divacky   }
1978f22ef01cSRoman Divacky 
19796122f3e6SDimitry Andric   llvm::Type* InitType = Init->getType();
1980f22ef01cSRoman Divacky   llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType);
1981f22ef01cSRoman Divacky 
1982f22ef01cSRoman Divacky   // Strip off a bitcast if we got one back.
198359d1ed5bSDimitry Andric   if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
1984f22ef01cSRoman Divacky     assert(CE->getOpcode() == llvm::Instruction::BitCast ||
1985f785676fSDimitry Andric            CE->getOpcode() == llvm::Instruction::AddrSpaceCast ||
1986f785676fSDimitry Andric            // All zero index gep.
1987f22ef01cSRoman Divacky            CE->getOpcode() == llvm::Instruction::GetElementPtr);
1988f22ef01cSRoman Divacky     Entry = CE->getOperand(0);
1989f22ef01cSRoman Divacky   }
1990f22ef01cSRoman Divacky 
1991f22ef01cSRoman Divacky   // Entry is now either a Function or GlobalVariable.
199259d1ed5bSDimitry Andric   auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
1993f22ef01cSRoman Divacky 
1994f22ef01cSRoman Divacky   // We have a definition after a declaration with the wrong type.
1995f22ef01cSRoman Divacky   // We must make a new GlobalVariable* and update everything that used OldGV
1996f22ef01cSRoman Divacky   // (a declaration or tentative definition) with the new GlobalVariable*
1997f22ef01cSRoman Divacky   // (which will be a definition).
1998f22ef01cSRoman Divacky   //
1999f22ef01cSRoman Divacky   // This happens if there is a prototype for a global (e.g.
2000f22ef01cSRoman Divacky   // "extern int x[];") and then a definition of a different type (e.g.
2001f22ef01cSRoman Divacky   // "int x[10];"). This also happens when an initializer has a different type
2002f22ef01cSRoman Divacky   // from the type of the global (this happens with unions).
200359d1ed5bSDimitry Andric   if (!GV ||
2004f22ef01cSRoman Divacky       GV->getType()->getElementType() != InitType ||
20053b0f4066SDimitry Andric       GV->getType()->getAddressSpace() !=
20067ae0e2c9SDimitry Andric        GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) {
2007f22ef01cSRoman Divacky 
2008f22ef01cSRoman Divacky     // Move the old entry aside so that we'll create a new one.
20096122f3e6SDimitry Andric     Entry->setName(StringRef());
2010f22ef01cSRoman Divacky 
2011f22ef01cSRoman Divacky     // Make a new global with the correct type, this is now guaranteed to work.
2012f22ef01cSRoman Divacky     GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType));
2013f22ef01cSRoman Divacky 
2014f22ef01cSRoman Divacky     // Replace all uses of the old global with the new global
2015f22ef01cSRoman Divacky     llvm::Constant *NewPtrForOldDecl =
2016f22ef01cSRoman Divacky         llvm::ConstantExpr::getBitCast(GV, Entry->getType());
2017f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(NewPtrForOldDecl);
2018f22ef01cSRoman Divacky 
2019f22ef01cSRoman Divacky     // Erase the old global, since it is no longer used.
2020f22ef01cSRoman Divacky     cast<llvm::GlobalValue>(Entry)->eraseFromParent();
2021f22ef01cSRoman Divacky   }
2022f22ef01cSRoman Divacky 
2023284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, GV);
2024284c1978SDimitry Andric 
20256122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
20266122f3e6SDimitry Andric     AddGlobalAnnotations(D, GV);
2027f22ef01cSRoman Divacky 
2028f22ef01cSRoman Divacky   GV->setInitializer(Init);
2029f22ef01cSRoman Divacky 
2030f22ef01cSRoman Divacky   // If it is safe to mark the global 'constant', do so now.
2031dff0c46cSDimitry Andric   GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
2032dff0c46cSDimitry Andric                   isTypeConstant(D->getType(), true));
2033f22ef01cSRoman Divacky 
203439d628a0SDimitry Andric   // If it is in a read-only section, mark it 'constant'.
203539d628a0SDimitry Andric   if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
203639d628a0SDimitry Andric     const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
203739d628a0SDimitry Andric     if ((SI.SectionFlags & ASTContext::PSF_Write) == 0)
203839d628a0SDimitry Andric       GV->setConstant(true);
203939d628a0SDimitry Andric   }
204039d628a0SDimitry Andric 
2041f22ef01cSRoman Divacky   GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
2042f22ef01cSRoman Divacky 
2043f22ef01cSRoman Divacky   // Set the llvm linkage type as appropriate.
20442754fe60SDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
204559d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(D, GV->isConstant());
2046f785676fSDimitry Andric 
204759d1ed5bSDimitry Andric   // On Darwin, the backing variable for a C++11 thread_local variable always
204859d1ed5bSDimitry Andric   // has internal linkage; all accesses should just be calls to the
204959d1ed5bSDimitry Andric   // Itanium-specified entry point, which has the normal linkage of the
205059d1ed5bSDimitry Andric   // variable.
205139d628a0SDimitry Andric   if (!D->isStaticLocal() && D->getTLSKind() == VarDecl::TLS_Dynamic &&
205259d1ed5bSDimitry Andric       Context.getTargetInfo().getTriple().isMacOSX())
205359d1ed5bSDimitry Andric     Linkage = llvm::GlobalValue::InternalLinkage;
205459d1ed5bSDimitry Andric 
205559d1ed5bSDimitry Andric   GV->setLinkage(Linkage);
205659d1ed5bSDimitry Andric   if (D->hasAttr<DLLImportAttr>())
205759d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
205859d1ed5bSDimitry Andric   else if (D->hasAttr<DLLExportAttr>())
205959d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
206039d628a0SDimitry Andric   else
206139d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
2062f785676fSDimitry Andric 
20632754fe60SDimitry Andric   if (Linkage == llvm::GlobalVariable::CommonLinkage)
2064f22ef01cSRoman Divacky     // common vars aren't constant even if declared const.
2065f22ef01cSRoman Divacky     GV->setConstant(false);
2066f22ef01cSRoman Divacky 
206759d1ed5bSDimitry Andric   setNonAliasAttributes(D, GV);
2068f22ef01cSRoman Divacky 
206939d628a0SDimitry Andric   if (D->getTLSKind() && !GV->isThreadLocal()) {
207039d628a0SDimitry Andric     if (D->getTLSKind() == VarDecl::TLS_Dynamic)
207139d628a0SDimitry Andric       CXXThreadLocals.push_back(std::make_pair(D, GV));
207239d628a0SDimitry Andric     setTLSMode(GV, *D);
207339d628a0SDimitry Andric   }
207439d628a0SDimitry Andric 
20752754fe60SDimitry Andric   // Emit the initializer function if necessary.
2076dff0c46cSDimitry Andric   if (NeedsGlobalCtor || NeedsGlobalDtor)
2077dff0c46cSDimitry Andric     EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
20782754fe60SDimitry Andric 
207939d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, *D, NeedsGlobalCtor);
20803861d79fSDimitry Andric 
2081f22ef01cSRoman Divacky   // Emit global variable debug information.
20826122f3e6SDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
20833861d79fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
2084f22ef01cSRoman Divacky       DI->EmitGlobalVariable(GV, D);
2085f22ef01cSRoman Divacky }
2086f22ef01cSRoman Divacky 
208739d628a0SDimitry Andric static bool isVarDeclStrongDefinition(const ASTContext &Context,
208839d628a0SDimitry Andric                                       const VarDecl *D, bool NoCommon) {
208959d1ed5bSDimitry Andric   // Don't give variables common linkage if -fno-common was specified unless it
209059d1ed5bSDimitry Andric   // was overridden by a NoCommon attribute.
209159d1ed5bSDimitry Andric   if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>())
209259d1ed5bSDimitry Andric     return true;
209359d1ed5bSDimitry Andric 
209459d1ed5bSDimitry Andric   // C11 6.9.2/2:
209559d1ed5bSDimitry Andric   //   A declaration of an identifier for an object that has file scope without
209659d1ed5bSDimitry Andric   //   an initializer, and without a storage-class specifier or with the
209759d1ed5bSDimitry Andric   //   storage-class specifier static, constitutes a tentative definition.
209859d1ed5bSDimitry Andric   if (D->getInit() || D->hasExternalStorage())
209959d1ed5bSDimitry Andric     return true;
210059d1ed5bSDimitry Andric 
210159d1ed5bSDimitry Andric   // A variable cannot be both common and exist in a section.
210259d1ed5bSDimitry Andric   if (D->hasAttr<SectionAttr>())
210359d1ed5bSDimitry Andric     return true;
210459d1ed5bSDimitry Andric 
210559d1ed5bSDimitry Andric   // Thread local vars aren't considered common linkage.
210659d1ed5bSDimitry Andric   if (D->getTLSKind())
210759d1ed5bSDimitry Andric     return true;
210859d1ed5bSDimitry Andric 
210959d1ed5bSDimitry Andric   // Tentative definitions marked with WeakImportAttr are true definitions.
211059d1ed5bSDimitry Andric   if (D->hasAttr<WeakImportAttr>())
211159d1ed5bSDimitry Andric     return true;
211259d1ed5bSDimitry Andric 
211339d628a0SDimitry Andric   // Declarations with a required alignment do not have common linakge in MSVC
211439d628a0SDimitry Andric   // mode.
211539d628a0SDimitry Andric   if (Context.getLangOpts().MSVCCompat &&
211639d628a0SDimitry Andric       (Context.isAlignmentRequired(D->getType()) || D->hasAttr<AlignedAttr>()))
211739d628a0SDimitry Andric     return true;
211839d628a0SDimitry Andric 
211959d1ed5bSDimitry Andric   return false;
212059d1ed5bSDimitry Andric }
212159d1ed5bSDimitry Andric 
212259d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
212359d1ed5bSDimitry Andric     const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) {
21242754fe60SDimitry Andric   if (Linkage == GVA_Internal)
21252754fe60SDimitry Andric     return llvm::Function::InternalLinkage;
212659d1ed5bSDimitry Andric 
212759d1ed5bSDimitry Andric   if (D->hasAttr<WeakAttr>()) {
212859d1ed5bSDimitry Andric     if (IsConstantVariable)
212959d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakODRLinkage;
213059d1ed5bSDimitry Andric     else
213159d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakAnyLinkage;
213259d1ed5bSDimitry Andric   }
213359d1ed5bSDimitry Andric 
213459d1ed5bSDimitry Andric   // We are guaranteed to have a strong definition somewhere else,
213559d1ed5bSDimitry Andric   // so we can use available_externally linkage.
213659d1ed5bSDimitry Andric   if (Linkage == GVA_AvailableExternally)
213759d1ed5bSDimitry Andric     return llvm::Function::AvailableExternallyLinkage;
213859d1ed5bSDimitry Andric 
213959d1ed5bSDimitry Andric   // Note that Apple's kernel linker doesn't support symbol
214059d1ed5bSDimitry Andric   // coalescing, so we need to avoid linkonce and weak linkages there.
214159d1ed5bSDimitry Andric   // Normally, this means we just map to internal, but for explicit
214259d1ed5bSDimitry Andric   // instantiations we'll map to external.
214359d1ed5bSDimitry Andric 
214459d1ed5bSDimitry Andric   // In C++, the compiler has to emit a definition in every translation unit
214559d1ed5bSDimitry Andric   // that references the function.  We should use linkonce_odr because
214659d1ed5bSDimitry Andric   // a) if all references in this translation unit are optimized away, we
214759d1ed5bSDimitry Andric   // don't need to codegen it.  b) if the function persists, it needs to be
214859d1ed5bSDimitry Andric   // merged with other definitions. c) C++ has the ODR, so we know the
214959d1ed5bSDimitry Andric   // definition is dependable.
215059d1ed5bSDimitry Andric   if (Linkage == GVA_DiscardableODR)
215159d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
215259d1ed5bSDimitry Andric                                             : llvm::Function::InternalLinkage;
215359d1ed5bSDimitry Andric 
215459d1ed5bSDimitry Andric   // An explicit instantiation of a template has weak linkage, since
215559d1ed5bSDimitry Andric   // explicit instantiations can occur in multiple translation units
215659d1ed5bSDimitry Andric   // and must all be equivalent. However, we are not allowed to
215759d1ed5bSDimitry Andric   // throw away these explicit instantiations.
215859d1ed5bSDimitry Andric   if (Linkage == GVA_StrongODR)
215959d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage
216059d1ed5bSDimitry Andric                                             : llvm::Function::ExternalLinkage;
216159d1ed5bSDimitry Andric 
216259d1ed5bSDimitry Andric   // C++ doesn't have tentative definitions and thus cannot have common
216359d1ed5bSDimitry Andric   // linkage.
216459d1ed5bSDimitry Andric   if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) &&
216539d628a0SDimitry Andric       !isVarDeclStrongDefinition(Context, cast<VarDecl>(D),
216639d628a0SDimitry Andric                                  CodeGenOpts.NoCommon))
216759d1ed5bSDimitry Andric     return llvm::GlobalVariable::CommonLinkage;
216859d1ed5bSDimitry Andric 
2169f785676fSDimitry Andric   // selectany symbols are externally visible, so use weak instead of
2170f785676fSDimitry Andric   // linkonce.  MSVC optimizes away references to const selectany globals, so
2171f785676fSDimitry Andric   // all definitions should be the same and ODR linkage should be used.
2172f785676fSDimitry Andric   // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx
217359d1ed5bSDimitry Andric   if (D->hasAttr<SelectAnyAttr>())
2174f785676fSDimitry Andric     return llvm::GlobalVariable::WeakODRLinkage;
217559d1ed5bSDimitry Andric 
217659d1ed5bSDimitry Andric   // Otherwise, we have strong external linkage.
217759d1ed5bSDimitry Andric   assert(Linkage == GVA_StrongExternal);
21782754fe60SDimitry Andric   return llvm::GlobalVariable::ExternalLinkage;
21792754fe60SDimitry Andric }
21802754fe60SDimitry Andric 
218159d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition(
218259d1ed5bSDimitry Andric     const VarDecl *VD, bool IsConstant) {
218359d1ed5bSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD);
218459d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant);
218559d1ed5bSDimitry Andric }
218659d1ed5bSDimitry Andric 
2187139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type.
2188139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites
2189139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old,
2190139f7f9bSDimitry Andric                                           llvm::Function *newFn) {
2191139f7f9bSDimitry Andric   // Fast path.
2192139f7f9bSDimitry Andric   if (old->use_empty()) return;
2193139f7f9bSDimitry Andric 
2194139f7f9bSDimitry Andric   llvm::Type *newRetTy = newFn->getReturnType();
2195139f7f9bSDimitry Andric   SmallVector<llvm::Value*, 4> newArgs;
2196139f7f9bSDimitry Andric 
2197139f7f9bSDimitry Andric   for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
2198139f7f9bSDimitry Andric          ui != ue; ) {
2199139f7f9bSDimitry Andric     llvm::Value::use_iterator use = ui++; // Increment before the use is erased.
220059d1ed5bSDimitry Andric     llvm::User *user = use->getUser();
2201139f7f9bSDimitry Andric 
2202139f7f9bSDimitry Andric     // Recognize and replace uses of bitcasts.  Most calls to
2203139f7f9bSDimitry Andric     // unprototyped functions will use bitcasts.
220459d1ed5bSDimitry Andric     if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
2205139f7f9bSDimitry Andric       if (bitcast->getOpcode() == llvm::Instruction::BitCast)
2206139f7f9bSDimitry Andric         replaceUsesOfNonProtoConstant(bitcast, newFn);
2207139f7f9bSDimitry Andric       continue;
2208139f7f9bSDimitry Andric     }
2209139f7f9bSDimitry Andric 
2210139f7f9bSDimitry Andric     // Recognize calls to the function.
2211139f7f9bSDimitry Andric     llvm::CallSite callSite(user);
2212139f7f9bSDimitry Andric     if (!callSite) continue;
221359d1ed5bSDimitry Andric     if (!callSite.isCallee(&*use)) continue;
2214139f7f9bSDimitry Andric 
2215139f7f9bSDimitry Andric     // If the return types don't match exactly, then we can't
2216139f7f9bSDimitry Andric     // transform this call unless it's dead.
2217139f7f9bSDimitry Andric     if (callSite->getType() != newRetTy && !callSite->use_empty())
2218139f7f9bSDimitry Andric       continue;
2219139f7f9bSDimitry Andric 
2220139f7f9bSDimitry Andric     // Get the call site's attribute list.
2221139f7f9bSDimitry Andric     SmallVector<llvm::AttributeSet, 8> newAttrs;
2222139f7f9bSDimitry Andric     llvm::AttributeSet oldAttrs = callSite.getAttributes();
2223139f7f9bSDimitry Andric 
2224139f7f9bSDimitry Andric     // Collect any return attributes from the call.
2225139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex))
2226139f7f9bSDimitry Andric       newAttrs.push_back(
2227139f7f9bSDimitry Andric         llvm::AttributeSet::get(newFn->getContext(),
2228139f7f9bSDimitry Andric                                 oldAttrs.getRetAttributes()));
2229139f7f9bSDimitry Andric 
2230139f7f9bSDimitry Andric     // If the function was passed too few arguments, don't transform.
2231139f7f9bSDimitry Andric     unsigned newNumArgs = newFn->arg_size();
2232139f7f9bSDimitry Andric     if (callSite.arg_size() < newNumArgs) continue;
2233139f7f9bSDimitry Andric 
2234139f7f9bSDimitry Andric     // If extra arguments were passed, we silently drop them.
2235139f7f9bSDimitry Andric     // If any of the types mismatch, we don't transform.
2236139f7f9bSDimitry Andric     unsigned argNo = 0;
2237139f7f9bSDimitry Andric     bool dontTransform = false;
2238139f7f9bSDimitry Andric     for (llvm::Function::arg_iterator ai = newFn->arg_begin(),
2239139f7f9bSDimitry Andric            ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) {
2240139f7f9bSDimitry Andric       if (callSite.getArgument(argNo)->getType() != ai->getType()) {
2241139f7f9bSDimitry Andric         dontTransform = true;
2242139f7f9bSDimitry Andric         break;
2243139f7f9bSDimitry Andric       }
2244139f7f9bSDimitry Andric 
2245139f7f9bSDimitry Andric       // Add any parameter attributes.
2246139f7f9bSDimitry Andric       if (oldAttrs.hasAttributes(argNo + 1))
2247139f7f9bSDimitry Andric         newAttrs.
2248139f7f9bSDimitry Andric           push_back(llvm::
2249139f7f9bSDimitry Andric                     AttributeSet::get(newFn->getContext(),
2250139f7f9bSDimitry Andric                                       oldAttrs.getParamAttributes(argNo + 1)));
2251139f7f9bSDimitry Andric     }
2252139f7f9bSDimitry Andric     if (dontTransform)
2253139f7f9bSDimitry Andric       continue;
2254139f7f9bSDimitry Andric 
2255139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex))
2256139f7f9bSDimitry Andric       newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(),
2257139f7f9bSDimitry Andric                                                  oldAttrs.getFnAttributes()));
2258139f7f9bSDimitry Andric 
2259139f7f9bSDimitry Andric     // Okay, we can transform this.  Create the new call instruction and copy
2260139f7f9bSDimitry Andric     // over the required information.
2261139f7f9bSDimitry Andric     newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo);
2262139f7f9bSDimitry Andric 
2263139f7f9bSDimitry Andric     llvm::CallSite newCall;
2264139f7f9bSDimitry Andric     if (callSite.isCall()) {
2265139f7f9bSDimitry Andric       newCall = llvm::CallInst::Create(newFn, newArgs, "",
2266139f7f9bSDimitry Andric                                        callSite.getInstruction());
2267139f7f9bSDimitry Andric     } else {
226859d1ed5bSDimitry Andric       auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction());
2269139f7f9bSDimitry Andric       newCall = llvm::InvokeInst::Create(newFn,
2270139f7f9bSDimitry Andric                                          oldInvoke->getNormalDest(),
2271139f7f9bSDimitry Andric                                          oldInvoke->getUnwindDest(),
2272139f7f9bSDimitry Andric                                          newArgs, "",
2273139f7f9bSDimitry Andric                                          callSite.getInstruction());
2274139f7f9bSDimitry Andric     }
2275139f7f9bSDimitry Andric     newArgs.clear(); // for the next iteration
2276139f7f9bSDimitry Andric 
2277139f7f9bSDimitry Andric     if (!newCall->getType()->isVoidTy())
2278139f7f9bSDimitry Andric       newCall->takeName(callSite.getInstruction());
2279139f7f9bSDimitry Andric     newCall.setAttributes(
2280139f7f9bSDimitry Andric                      llvm::AttributeSet::get(newFn->getContext(), newAttrs));
2281139f7f9bSDimitry Andric     newCall.setCallingConv(callSite.getCallingConv());
2282139f7f9bSDimitry Andric 
2283139f7f9bSDimitry Andric     // Finally, remove the old call, replacing any uses with the new one.
2284139f7f9bSDimitry Andric     if (!callSite->use_empty())
2285139f7f9bSDimitry Andric       callSite->replaceAllUsesWith(newCall.getInstruction());
2286139f7f9bSDimitry Andric 
2287139f7f9bSDimitry Andric     // Copy debug location attached to CI.
2288139f7f9bSDimitry Andric     if (!callSite->getDebugLoc().isUnknown())
2289139f7f9bSDimitry Andric       newCall->setDebugLoc(callSite->getDebugLoc());
2290139f7f9bSDimitry Andric     callSite->eraseFromParent();
2291139f7f9bSDimitry Andric   }
2292139f7f9bSDimitry Andric }
2293139f7f9bSDimitry Andric 
2294f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we
2295f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}".  If there are
2296f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to
2297f22ef01cSRoman Divacky /// call the new function directly.
2298f22ef01cSRoman Divacky ///
2299f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to
2300f22ef01cSRoman Divacky /// functions to be able to inline them.  If there is a bitcast in the way, it
2301f22ef01cSRoman Divacky /// won't inline them.  Instcombine normally deletes these calls, but it isn't
2302f22ef01cSRoman Divacky /// run at -O0.
2303f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
2304f22ef01cSRoman Divacky                                                       llvm::Function *NewFn) {
2305f22ef01cSRoman Divacky   // If we're redefining a global as a function, don't transform it.
2306139f7f9bSDimitry Andric   if (!isa<llvm::Function>(Old)) return;
2307f22ef01cSRoman Divacky 
2308139f7f9bSDimitry Andric   replaceUsesOfNonProtoConstant(Old, NewFn);
2309f22ef01cSRoman Divacky }
2310f22ef01cSRoman Divacky 
2311dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2312dff0c46cSDimitry Andric   TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
2313dff0c46cSDimitry Andric   // If we have a definition, this might be a deferred decl. If the
2314dff0c46cSDimitry Andric   // instantiation is explicit, make sure we emit it at the end.
2315dff0c46cSDimitry Andric   if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
2316dff0c46cSDimitry Andric     GetAddrOfGlobalVar(VD);
2317139f7f9bSDimitry Andric 
2318139f7f9bSDimitry Andric   EmitTopLevelDecl(VD);
2319dff0c46cSDimitry Andric }
2320f22ef01cSRoman Divacky 
232159d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
232259d1ed5bSDimitry Andric                                                  llvm::GlobalValue *GV) {
232359d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
23243b0f4066SDimitry Andric 
23253b0f4066SDimitry Andric   // Compute the function info and LLVM type.
2326dff0c46cSDimitry Andric   const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
2327dff0c46cSDimitry Andric   llvm::FunctionType *Ty = getTypes().GetFunctionType(FI);
23283b0f4066SDimitry Andric 
2329f22ef01cSRoman Divacky   // Get or create the prototype for the function.
233059d1ed5bSDimitry Andric   if (!GV) {
233159d1ed5bSDimitry Andric     llvm::Constant *C =
233259d1ed5bSDimitry Andric         GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true);
2333f22ef01cSRoman Divacky 
2334f22ef01cSRoman Divacky     // Strip off a bitcast if we got one back.
233559d1ed5bSDimitry Andric     if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) {
2336f22ef01cSRoman Divacky       assert(CE->getOpcode() == llvm::Instruction::BitCast);
233759d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(CE->getOperand(0));
233859d1ed5bSDimitry Andric     } else {
233959d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(C);
234059d1ed5bSDimitry Andric     }
2341f22ef01cSRoman Divacky   }
2342f22ef01cSRoman Divacky 
234359d1ed5bSDimitry Andric   if (!GV->isDeclaration()) {
2344f785676fSDimitry Andric     getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name);
234539d628a0SDimitry Andric     GlobalDecl OldGD = Manglings.lookup(GV->getName());
234639d628a0SDimitry Andric     if (auto *Prev = OldGD.getDecl())
234739d628a0SDimitry Andric       getDiags().Report(Prev->getLocation(), diag::note_previous_definition);
2348f785676fSDimitry Andric     return;
2349f785676fSDimitry Andric   }
2350f22ef01cSRoman Divacky 
235159d1ed5bSDimitry Andric   if (GV->getType()->getElementType() != Ty) {
2352f22ef01cSRoman Divacky     // If the types mismatch then we have to rewrite the definition.
235359d1ed5bSDimitry Andric     assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
2354f22ef01cSRoman Divacky 
2355f22ef01cSRoman Divacky     // F is the Function* for the one with the wrong type, we must make a new
2356f22ef01cSRoman Divacky     // Function* and update everything that used F (a declaration) with the new
2357f22ef01cSRoman Divacky     // Function* (which will be a definition).
2358f22ef01cSRoman Divacky     //
2359f22ef01cSRoman Divacky     // This happens if there is a prototype for a function
2360f22ef01cSRoman Divacky     // (e.g. "int f()") and then a definition of a different type
2361f22ef01cSRoman Divacky     // (e.g. "int f(int x)").  Move the old function aside so that it
2362f22ef01cSRoman Divacky     // doesn't interfere with GetAddrOfFunction.
236359d1ed5bSDimitry Andric     GV->setName(StringRef());
236459d1ed5bSDimitry Andric     auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
2365f22ef01cSRoman Divacky 
2366139f7f9bSDimitry Andric     // This might be an implementation of a function without a
2367139f7f9bSDimitry Andric     // prototype, in which case, try to do special replacement of
2368139f7f9bSDimitry Andric     // calls which match the new prototype.  The really key thing here
2369139f7f9bSDimitry Andric     // is that we also potentially drop arguments from the call site
2370139f7f9bSDimitry Andric     // so as to make a direct call, which makes the inliner happier
2371139f7f9bSDimitry Andric     // and suppresses a number of optimizer warnings (!) about
2372139f7f9bSDimitry Andric     // dropping arguments.
237359d1ed5bSDimitry Andric     if (!GV->use_empty()) {
237459d1ed5bSDimitry Andric       ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn);
237559d1ed5bSDimitry Andric       GV->removeDeadConstantUsers();
2376f22ef01cSRoman Divacky     }
2377f22ef01cSRoman Divacky 
2378f22ef01cSRoman Divacky     // Replace uses of F with the Function we will endow with a body.
237959d1ed5bSDimitry Andric     if (!GV->use_empty()) {
2380f22ef01cSRoman Divacky       llvm::Constant *NewPtrForOldDecl =
238159d1ed5bSDimitry Andric           llvm::ConstantExpr::getBitCast(NewFn, GV->getType());
238259d1ed5bSDimitry Andric       GV->replaceAllUsesWith(NewPtrForOldDecl);
2383f22ef01cSRoman Divacky     }
2384f22ef01cSRoman Divacky 
2385f22ef01cSRoman Divacky     // Ok, delete the old function now, which is dead.
238659d1ed5bSDimitry Andric     GV->eraseFromParent();
2387f22ef01cSRoman Divacky 
238859d1ed5bSDimitry Andric     GV = NewFn;
2389f22ef01cSRoman Divacky   }
2390f22ef01cSRoman Divacky 
23912754fe60SDimitry Andric   // We need to set linkage and visibility on the function before
23922754fe60SDimitry Andric   // generating code for it because various parts of IR generation
23932754fe60SDimitry Andric   // want to propagate this information down (e.g. to local static
23942754fe60SDimitry Andric   // declarations).
239559d1ed5bSDimitry Andric   auto *Fn = cast<llvm::Function>(GV);
2396f785676fSDimitry Andric   setFunctionLinkage(GD, Fn);
239739d628a0SDimitry Andric   if (D->hasAttr<DLLImportAttr>())
239839d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
239939d628a0SDimitry Andric   else if (D->hasAttr<DLLExportAttr>())
240039d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
240139d628a0SDimitry Andric   else
240239d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
2403f22ef01cSRoman Divacky 
240459d1ed5bSDimitry Andric   // FIXME: this is redundant with part of setFunctionDefinitionAttributes
24052754fe60SDimitry Andric   setGlobalVisibility(Fn, D);
24062754fe60SDimitry Andric 
2407284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, Fn);
2408284c1978SDimitry Andric 
24093b0f4066SDimitry Andric   CodeGenFunction(*this).GenerateCode(D, Fn, FI);
2410f22ef01cSRoman Divacky 
241159d1ed5bSDimitry Andric   setFunctionDefinitionAttributes(D, Fn);
2412f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, Fn);
2413f22ef01cSRoman Divacky 
2414f22ef01cSRoman Divacky   if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>())
2415f22ef01cSRoman Divacky     AddGlobalCtor(Fn, CA->getPriority());
2416f22ef01cSRoman Divacky   if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
2417f22ef01cSRoman Divacky     AddGlobalDtor(Fn, DA->getPriority());
24186122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
24196122f3e6SDimitry Andric     AddGlobalAnnotations(D, Fn);
2420f22ef01cSRoman Divacky }
2421f22ef01cSRoman Divacky 
2422f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
242359d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
2424f22ef01cSRoman Divacky   const AliasAttr *AA = D->getAttr<AliasAttr>();
2425f22ef01cSRoman Divacky   assert(AA && "Not an alias?");
2426f22ef01cSRoman Divacky 
24276122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
2428f22ef01cSRoman Divacky 
2429f22ef01cSRoman Divacky   // If there is a definition in the module, then it wins over the alias.
2430f22ef01cSRoman Divacky   // This is dubious, but allow it to be safe.  Just ignore the alias.
2431f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2432f22ef01cSRoman Divacky   if (Entry && !Entry->isDeclaration())
2433f22ef01cSRoman Divacky     return;
2434f22ef01cSRoman Divacky 
2435f785676fSDimitry Andric   Aliases.push_back(GD);
2436f785676fSDimitry Andric 
24376122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType());
2438f22ef01cSRoman Divacky 
2439f22ef01cSRoman Divacky   // Create a reference to the named value.  This ensures that it is emitted
2440f22ef01cSRoman Divacky   // if a deferred decl.
2441f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
2442f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
24433861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
24442754fe60SDimitry Andric                                       /*ForVTable=*/false);
2445f22ef01cSRoman Divacky   else
2446f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
244759d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
244839d628a0SDimitry Andric                                     /*D=*/nullptr);
2449f22ef01cSRoman Divacky 
2450f22ef01cSRoman Divacky   // Create the new alias itself, but don't set a name yet.
245159d1ed5bSDimitry Andric   auto *GA = llvm::GlobalAlias::create(
245259d1ed5bSDimitry Andric       cast<llvm::PointerType>(Aliasee->getType())->getElementType(), 0,
245359d1ed5bSDimitry Andric       llvm::Function::ExternalLinkage, "", Aliasee, &getModule());
2454f22ef01cSRoman Divacky 
2455f22ef01cSRoman Divacky   if (Entry) {
245659d1ed5bSDimitry Andric     if (GA->getAliasee() == Entry) {
245759d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
245859d1ed5bSDimitry Andric       return;
245959d1ed5bSDimitry Andric     }
246059d1ed5bSDimitry Andric 
2461f22ef01cSRoman Divacky     assert(Entry->isDeclaration());
2462f22ef01cSRoman Divacky 
2463f22ef01cSRoman Divacky     // If there is a declaration in the module, then we had an extern followed
2464f22ef01cSRoman Divacky     // by the alias, as in:
2465f22ef01cSRoman Divacky     //   extern int test6();
2466f22ef01cSRoman Divacky     //   ...
2467f22ef01cSRoman Divacky     //   int test6() __attribute__((alias("test7")));
2468f22ef01cSRoman Divacky     //
2469f22ef01cSRoman Divacky     // Remove it and replace uses of it with the alias.
2470f22ef01cSRoman Divacky     GA->takeName(Entry);
2471f22ef01cSRoman Divacky 
2472f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA,
2473f22ef01cSRoman Divacky                                                           Entry->getType()));
2474f22ef01cSRoman Divacky     Entry->eraseFromParent();
2475f22ef01cSRoman Divacky   } else {
2476ffd1746dSEd Schouten     GA->setName(MangledName);
2477f22ef01cSRoman Divacky   }
2478f22ef01cSRoman Divacky 
2479f22ef01cSRoman Divacky   // Set attributes which are particular to an alias; this is a
2480f22ef01cSRoman Divacky   // specialization of the attributes which may be set on a global
2481f22ef01cSRoman Divacky   // variable/function.
248239d628a0SDimitry Andric   if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakRefAttr>() ||
24833b0f4066SDimitry Andric       D->isWeakImported()) {
2484f22ef01cSRoman Divacky     GA->setLinkage(llvm::Function::WeakAnyLinkage);
2485f22ef01cSRoman Divacky   }
2486f22ef01cSRoman Divacky 
248739d628a0SDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
248839d628a0SDimitry Andric     if (VD->getTLSKind())
248939d628a0SDimitry Andric       setTLSMode(GA, *VD);
249039d628a0SDimitry Andric 
249139d628a0SDimitry Andric   setAliasAttributes(D, GA);
2492f22ef01cSRoman Divacky }
2493f22ef01cSRoman Divacky 
249417a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
24956122f3e6SDimitry Andric                                             ArrayRef<llvm::Type*> Tys) {
249617a519f9SDimitry Andric   return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
249717a519f9SDimitry Andric                                          Tys);
2498f22ef01cSRoman Divacky }
2499f22ef01cSRoman Divacky 
2500f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> &
2501f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map,
2502f22ef01cSRoman Divacky                          const StringLiteral *Literal,
2503f22ef01cSRoman Divacky                          bool TargetIsLSB,
2504f22ef01cSRoman Divacky                          bool &IsUTF16,
2505f22ef01cSRoman Divacky                          unsigned &StringLength) {
25066122f3e6SDimitry Andric   StringRef String = Literal->getString();
2507e580952dSDimitry Andric   unsigned NumBytes = String.size();
2508f22ef01cSRoman Divacky 
2509f22ef01cSRoman Divacky   // Check for simple case.
2510f22ef01cSRoman Divacky   if (!Literal->containsNonAsciiOrNull()) {
2511f22ef01cSRoman Divacky     StringLength = NumBytes;
251239d628a0SDimitry Andric     return *Map.insert(std::make_pair(String, nullptr)).first;
2513f22ef01cSRoman Divacky   }
2514f22ef01cSRoman Divacky 
2515dff0c46cSDimitry Andric   // Otherwise, convert the UTF8 literals into a string of shorts.
2516dff0c46cSDimitry Andric   IsUTF16 = true;
2517dff0c46cSDimitry Andric 
2518dff0c46cSDimitry Andric   SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls.
25193861d79fSDimitry Andric   const UTF8 *FromPtr = (const UTF8 *)String.data();
2520f22ef01cSRoman Divacky   UTF16 *ToPtr = &ToBuf[0];
2521f22ef01cSRoman Divacky 
25222754fe60SDimitry Andric   (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes,
2523f22ef01cSRoman Divacky                            &ToPtr, ToPtr + NumBytes,
2524f22ef01cSRoman Divacky                            strictConversion);
2525f22ef01cSRoman Divacky 
2526f22ef01cSRoman Divacky   // ConvertUTF8toUTF16 returns the length in ToPtr.
2527f22ef01cSRoman Divacky   StringLength = ToPtr - &ToBuf[0];
2528f22ef01cSRoman Divacky 
2529dff0c46cSDimitry Andric   // Add an explicit null.
2530dff0c46cSDimitry Andric   *ToPtr = 0;
253139d628a0SDimitry Andric   return *Map.insert(std::make_pair(
253239d628a0SDimitry Andric                          StringRef(reinterpret_cast<const char *>(ToBuf.data()),
253339d628a0SDimitry Andric                                    (StringLength + 1) * 2),
253439d628a0SDimitry Andric                          nullptr)).first;
2535f22ef01cSRoman Divacky }
2536f22ef01cSRoman Divacky 
2537bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> &
2538bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map,
2539bd5abe19SDimitry Andric                        const StringLiteral *Literal,
2540dff0c46cSDimitry Andric                        unsigned &StringLength) {
25416122f3e6SDimitry Andric   StringRef String = Literal->getString();
2542bd5abe19SDimitry Andric   StringLength = String.size();
254339d628a0SDimitry Andric   return *Map.insert(std::make_pair(String, nullptr)).first;
2544bd5abe19SDimitry Andric }
2545bd5abe19SDimitry Andric 
2546f22ef01cSRoman Divacky llvm::Constant *
2547f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
2548f22ef01cSRoman Divacky   unsigned StringLength = 0;
2549f22ef01cSRoman Divacky   bool isUTF16 = false;
2550f22ef01cSRoman Divacky   llvm::StringMapEntry<llvm::Constant*> &Entry =
2551f22ef01cSRoman Divacky     GetConstantCFStringEntry(CFConstantStringMap, Literal,
25523861d79fSDimitry Andric                              getDataLayout().isLittleEndian(),
2553f22ef01cSRoman Divacky                              isUTF16, StringLength);
2554f22ef01cSRoman Divacky 
255539d628a0SDimitry Andric   if (auto *C = Entry.second)
2556f22ef01cSRoman Divacky     return C;
2557f22ef01cSRoman Divacky 
2558dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2559f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2560284c1978SDimitry Andric   llvm::Value *V;
2561f22ef01cSRoman Divacky 
2562f22ef01cSRoman Divacky   // If we don't already have it, get __CFConstantStringClassReference.
2563f22ef01cSRoman Divacky   if (!CFConstantStringClassRef) {
25646122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
2565f22ef01cSRoman Divacky     Ty = llvm::ArrayType::get(Ty, 0);
2566f22ef01cSRoman Divacky     llvm::Constant *GV = CreateRuntimeVariable(Ty,
2567f22ef01cSRoman Divacky                                            "__CFConstantStringClassReference");
2568f22ef01cSRoman Divacky     // Decay array -> ptr
2569284c1978SDimitry Andric     V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2570284c1978SDimitry Andric     CFConstantStringClassRef = V;
2571f22ef01cSRoman Divacky   }
2572284c1978SDimitry Andric   else
2573284c1978SDimitry Andric     V = CFConstantStringClassRef;
2574f22ef01cSRoman Divacky 
2575f22ef01cSRoman Divacky   QualType CFTy = getContext().getCFConstantStringType();
2576f22ef01cSRoman Divacky 
257759d1ed5bSDimitry Andric   auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy));
2578f22ef01cSRoman Divacky 
2579dff0c46cSDimitry Andric   llvm::Constant *Fields[4];
2580f22ef01cSRoman Divacky 
2581f22ef01cSRoman Divacky   // Class pointer.
2582284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2583f22ef01cSRoman Divacky 
2584f22ef01cSRoman Divacky   // Flags.
25856122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2586f22ef01cSRoman Divacky   Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) :
2587f22ef01cSRoman Divacky     llvm::ConstantInt::get(Ty, 0x07C8);
2588f22ef01cSRoman Divacky 
2589f22ef01cSRoman Divacky   // String pointer.
259059d1ed5bSDimitry Andric   llvm::Constant *C = nullptr;
2591dff0c46cSDimitry Andric   if (isUTF16) {
259239d628a0SDimitry Andric     ArrayRef<uint16_t> Arr = llvm::makeArrayRef<uint16_t>(
259339d628a0SDimitry Andric         reinterpret_cast<uint16_t *>(const_cast<char *>(Entry.first().data())),
259439d628a0SDimitry Andric         Entry.first().size() / 2);
2595dff0c46cSDimitry Andric     C = llvm::ConstantDataArray::get(VMContext, Arr);
2596dff0c46cSDimitry Andric   } else {
259739d628a0SDimitry Andric     C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
2598dff0c46cSDimitry Andric   }
2599f22ef01cSRoman Divacky 
2600dff0c46cSDimitry Andric   // Note: -fwritable-strings doesn't make the backing store strings of
2601dff0c46cSDimitry Andric   // CFStrings writable. (See <rdar://problem/10657500>)
260259d1ed5bSDimitry Andric   auto *GV =
2603dff0c46cSDimitry Andric       new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true,
260459d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, C, ".str");
26052754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2606284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2607284c1978SDimitry Andric   // of the string is via this class initializer.
260859d1ed5bSDimitry Andric   // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without
260959d1ed5bSDimitry Andric   // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing
261059d1ed5bSDimitry Andric   // that changes the section it ends in, which surprises ld64.
2611f22ef01cSRoman Divacky   if (isUTF16) {
2612f22ef01cSRoman Divacky     CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy);
2613f22ef01cSRoman Divacky     GV->setAlignment(Align.getQuantity());
261459d1ed5bSDimitry Andric     GV->setSection("__TEXT,__ustring");
26153b0f4066SDimitry Andric   } else {
26163b0f4066SDimitry Andric     CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
26173b0f4066SDimitry Andric     GV->setAlignment(Align.getQuantity());
261859d1ed5bSDimitry Andric     GV->setSection("__TEXT,__cstring,cstring_literals");
2619f22ef01cSRoman Divacky   }
2620dff0c46cSDimitry Andric 
2621dff0c46cSDimitry Andric   // String.
26226122f3e6SDimitry Andric   Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2623f22ef01cSRoman Divacky 
2624dff0c46cSDimitry Andric   if (isUTF16)
2625dff0c46cSDimitry Andric     // Cast the UTF16 string to the correct type.
2626dff0c46cSDimitry Andric     Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy);
2627dff0c46cSDimitry Andric 
2628f22ef01cSRoman Divacky   // String length.
2629f22ef01cSRoman Divacky   Ty = getTypes().ConvertType(getContext().LongTy);
2630f22ef01cSRoman Divacky   Fields[3] = llvm::ConstantInt::get(Ty, StringLength);
2631f22ef01cSRoman Divacky 
2632f22ef01cSRoman Divacky   // The struct.
2633f22ef01cSRoman Divacky   C = llvm::ConstantStruct::get(STy, Fields);
2634f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2635f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2636f22ef01cSRoman Divacky                                 "_unnamed_cfstring_");
263759d1ed5bSDimitry Andric   GV->setSection("__DATA,__cfstring");
263839d628a0SDimitry Andric   Entry.second = GV;
2639f22ef01cSRoman Divacky 
2640f22ef01cSRoman Divacky   return GV;
2641f22ef01cSRoman Divacky }
2642f22ef01cSRoman Divacky 
2643f22ef01cSRoman Divacky llvm::Constant *
26442754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
2645f22ef01cSRoman Divacky   unsigned StringLength = 0;
2646f22ef01cSRoman Divacky   llvm::StringMapEntry<llvm::Constant*> &Entry =
2647bd5abe19SDimitry Andric     GetConstantStringEntry(CFConstantStringMap, Literal, StringLength);
2648f22ef01cSRoman Divacky 
264939d628a0SDimitry Andric   if (auto *C = Entry.second)
2650f22ef01cSRoman Divacky     return C;
2651f22ef01cSRoman Divacky 
2652dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2653f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2654284c1978SDimitry Andric   llvm::Value *V;
2655f22ef01cSRoman Divacky   // If we don't already have it, get _NSConstantStringClassReference.
26562754fe60SDimitry Andric   if (!ConstantStringClassRef) {
2657dff0c46cSDimitry Andric     std::string StringClass(getLangOpts().ObjCConstantStringClass);
26586122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
26592754fe60SDimitry Andric     llvm::Constant *GV;
26607ae0e2c9SDimitry Andric     if (LangOpts.ObjCRuntime.isNonFragile()) {
2661bd5abe19SDimitry Andric       std::string str =
2662bd5abe19SDimitry Andric         StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
2663bd5abe19SDimitry Andric                             : "OBJC_CLASS_$_" + StringClass;
2664bd5abe19SDimitry Andric       GV = getObjCRuntime().GetClassGlobal(str);
2665bd5abe19SDimitry Andric       // Make sure the result is of the correct type.
26666122f3e6SDimitry Andric       llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
2667284c1978SDimitry Andric       V = llvm::ConstantExpr::getBitCast(GV, PTy);
2668284c1978SDimitry Andric       ConstantStringClassRef = V;
2669bd5abe19SDimitry Andric     } else {
2670bd5abe19SDimitry Andric       std::string str =
2671bd5abe19SDimitry Andric         StringClass.empty() ? "_NSConstantStringClassReference"
2672bd5abe19SDimitry Andric                             : "_" + StringClass + "ClassReference";
26736122f3e6SDimitry Andric       llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
2674bd5abe19SDimitry Andric       GV = CreateRuntimeVariable(PTy, str);
2675f22ef01cSRoman Divacky       // Decay array -> ptr
2676284c1978SDimitry Andric       V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2677284c1978SDimitry Andric       ConstantStringClassRef = V;
2678f22ef01cSRoman Divacky     }
2679bd5abe19SDimitry Andric   }
2680284c1978SDimitry Andric   else
2681284c1978SDimitry Andric     V = ConstantStringClassRef;
2682f22ef01cSRoman Divacky 
26836122f3e6SDimitry Andric   if (!NSConstantStringType) {
26846122f3e6SDimitry Andric     // Construct the type for a constant NSString.
268559d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString");
26866122f3e6SDimitry Andric     D->startDefinition();
2687f22ef01cSRoman Divacky 
26886122f3e6SDimitry Andric     QualType FieldTypes[3];
26896122f3e6SDimitry Andric 
26906122f3e6SDimitry Andric     // const int *isa;
26916122f3e6SDimitry Andric     FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst());
26926122f3e6SDimitry Andric     // const char *str;
26936122f3e6SDimitry Andric     FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst());
26946122f3e6SDimitry Andric     // unsigned int length;
26956122f3e6SDimitry Andric     FieldTypes[2] = Context.UnsignedIntTy;
26966122f3e6SDimitry Andric 
26976122f3e6SDimitry Andric     // Create fields
26986122f3e6SDimitry Andric     for (unsigned i = 0; i < 3; ++i) {
26996122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context, D,
27006122f3e6SDimitry Andric                                            SourceLocation(),
270159d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
270259d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
270359d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
27046122f3e6SDimitry Andric                                            /*Mutable=*/false,
27057ae0e2c9SDimitry Andric                                            ICIS_NoInit);
27066122f3e6SDimitry Andric       Field->setAccess(AS_public);
27076122f3e6SDimitry Andric       D->addDecl(Field);
27086122f3e6SDimitry Andric     }
27096122f3e6SDimitry Andric 
27106122f3e6SDimitry Andric     D->completeDefinition();
27116122f3e6SDimitry Andric     QualType NSTy = Context.getTagDeclType(D);
27126122f3e6SDimitry Andric     NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy));
27136122f3e6SDimitry Andric   }
2714f22ef01cSRoman Divacky 
2715dff0c46cSDimitry Andric   llvm::Constant *Fields[3];
2716f22ef01cSRoman Divacky 
2717f22ef01cSRoman Divacky   // Class pointer.
2718284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2719f22ef01cSRoman Divacky 
2720f22ef01cSRoman Divacky   // String pointer.
2721dff0c46cSDimitry Andric   llvm::Constant *C =
272239d628a0SDimitry Andric       llvm::ConstantDataArray::getString(VMContext, Entry.first());
2723f22ef01cSRoman Divacky 
2724f22ef01cSRoman Divacky   llvm::GlobalValue::LinkageTypes Linkage;
2725f22ef01cSRoman Divacky   bool isConstant;
2726f22ef01cSRoman Divacky   Linkage = llvm::GlobalValue::PrivateLinkage;
2727dff0c46cSDimitry Andric   isConstant = !LangOpts.WritableStrings;
2728f22ef01cSRoman Divacky 
272959d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant,
273059d1ed5bSDimitry Andric                                       Linkage, C, ".str");
27312754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2732284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2733284c1978SDimitry Andric   // of the string is via this class initializer.
27343b0f4066SDimitry Andric   CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
27353b0f4066SDimitry Andric   GV->setAlignment(Align.getQuantity());
27366122f3e6SDimitry Andric   Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2737f22ef01cSRoman Divacky 
2738f22ef01cSRoman Divacky   // String length.
27396122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2740f22ef01cSRoman Divacky   Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
2741f22ef01cSRoman Divacky 
2742f22ef01cSRoman Divacky   // The struct.
27436122f3e6SDimitry Andric   C = llvm::ConstantStruct::get(NSConstantStringType, Fields);
2744f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2745f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2746f22ef01cSRoman Divacky                                 "_unnamed_nsstring_");
274759d1ed5bSDimitry Andric   const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
274859d1ed5bSDimitry Andric   const char *NSStringNonFragileABISection =
274959d1ed5bSDimitry Andric       "__DATA,__objc_stringobj,regular,no_dead_strip";
2750f22ef01cSRoman Divacky   // FIXME. Fix section.
275159d1ed5bSDimitry Andric   GV->setSection(LangOpts.ObjCRuntime.isNonFragile()
275259d1ed5bSDimitry Andric                      ? NSStringNonFragileABISection
275359d1ed5bSDimitry Andric                      : NSStringSection);
275439d628a0SDimitry Andric   Entry.second = GV;
2755f22ef01cSRoman Divacky 
2756f22ef01cSRoman Divacky   return GV;
2757f22ef01cSRoman Divacky }
2758f22ef01cSRoman Divacky 
27596122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() {
27606122f3e6SDimitry Andric   if (ObjCFastEnumerationStateType.isNull()) {
276159d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState");
27626122f3e6SDimitry Andric     D->startDefinition();
27636122f3e6SDimitry Andric 
27646122f3e6SDimitry Andric     QualType FieldTypes[] = {
27656122f3e6SDimitry Andric       Context.UnsignedLongTy,
27666122f3e6SDimitry Andric       Context.getPointerType(Context.getObjCIdType()),
27676122f3e6SDimitry Andric       Context.getPointerType(Context.UnsignedLongTy),
27686122f3e6SDimitry Andric       Context.getConstantArrayType(Context.UnsignedLongTy,
27696122f3e6SDimitry Andric                            llvm::APInt(32, 5), ArrayType::Normal, 0)
27706122f3e6SDimitry Andric     };
27716122f3e6SDimitry Andric 
27726122f3e6SDimitry Andric     for (size_t i = 0; i < 4; ++i) {
27736122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context,
27746122f3e6SDimitry Andric                                            D,
27756122f3e6SDimitry Andric                                            SourceLocation(),
277659d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
277759d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
277859d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
27796122f3e6SDimitry Andric                                            /*Mutable=*/false,
27807ae0e2c9SDimitry Andric                                            ICIS_NoInit);
27816122f3e6SDimitry Andric       Field->setAccess(AS_public);
27826122f3e6SDimitry Andric       D->addDecl(Field);
27836122f3e6SDimitry Andric     }
27846122f3e6SDimitry Andric 
27856122f3e6SDimitry Andric     D->completeDefinition();
27866122f3e6SDimitry Andric     ObjCFastEnumerationStateType = Context.getTagDeclType(D);
27876122f3e6SDimitry Andric   }
27886122f3e6SDimitry Andric 
27896122f3e6SDimitry Andric   return ObjCFastEnumerationStateType;
27906122f3e6SDimitry Andric }
27916122f3e6SDimitry Andric 
2792dff0c46cSDimitry Andric llvm::Constant *
2793dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
2794dff0c46cSDimitry Andric   assert(!E->getType()->isPointerType() && "Strings are always arrays");
2795f22ef01cSRoman Divacky 
2796dff0c46cSDimitry Andric   // Don't emit it as the address of the string, emit the string data itself
2797dff0c46cSDimitry Andric   // as an inline array.
2798dff0c46cSDimitry Andric   if (E->getCharByteWidth() == 1) {
2799dff0c46cSDimitry Andric     SmallString<64> Str(E->getString());
2800f22ef01cSRoman Divacky 
2801dff0c46cSDimitry Andric     // Resize the string to the right size, which is indicated by its type.
2802dff0c46cSDimitry Andric     const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType());
2803dff0c46cSDimitry Andric     Str.resize(CAT->getSize().getZExtValue());
2804dff0c46cSDimitry Andric     return llvm::ConstantDataArray::getString(VMContext, Str, false);
28056122f3e6SDimitry Andric   }
2806f22ef01cSRoman Divacky 
280759d1ed5bSDimitry Andric   auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
2808dff0c46cSDimitry Andric   llvm::Type *ElemTy = AType->getElementType();
2809dff0c46cSDimitry Andric   unsigned NumElements = AType->getNumElements();
2810f22ef01cSRoman Divacky 
2811dff0c46cSDimitry Andric   // Wide strings have either 2-byte or 4-byte elements.
2812dff0c46cSDimitry Andric   if (ElemTy->getPrimitiveSizeInBits() == 16) {
2813dff0c46cSDimitry Andric     SmallVector<uint16_t, 32> Elements;
2814dff0c46cSDimitry Andric     Elements.reserve(NumElements);
2815dff0c46cSDimitry Andric 
2816dff0c46cSDimitry Andric     for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2817dff0c46cSDimitry Andric       Elements.push_back(E->getCodeUnit(i));
2818dff0c46cSDimitry Andric     Elements.resize(NumElements);
2819dff0c46cSDimitry Andric     return llvm::ConstantDataArray::get(VMContext, Elements);
2820dff0c46cSDimitry Andric   }
2821dff0c46cSDimitry Andric 
2822dff0c46cSDimitry Andric   assert(ElemTy->getPrimitiveSizeInBits() == 32);
2823dff0c46cSDimitry Andric   SmallVector<uint32_t, 32> Elements;
2824dff0c46cSDimitry Andric   Elements.reserve(NumElements);
2825dff0c46cSDimitry Andric 
2826dff0c46cSDimitry Andric   for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2827dff0c46cSDimitry Andric     Elements.push_back(E->getCodeUnit(i));
2828dff0c46cSDimitry Andric   Elements.resize(NumElements);
2829dff0c46cSDimitry Andric   return llvm::ConstantDataArray::get(VMContext, Elements);
2830f22ef01cSRoman Divacky }
2831f22ef01cSRoman Divacky 
283259d1ed5bSDimitry Andric static llvm::GlobalVariable *
283359d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT,
283459d1ed5bSDimitry Andric                       CodeGenModule &CGM, StringRef GlobalName,
283559d1ed5bSDimitry Andric                       unsigned Alignment) {
283659d1ed5bSDimitry Andric   // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
283759d1ed5bSDimitry Andric   unsigned AddrSpace = 0;
283859d1ed5bSDimitry Andric   if (CGM.getLangOpts().OpenCL)
283959d1ed5bSDimitry Andric     AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
2840dff0c46cSDimitry Andric 
284159d1ed5bSDimitry Andric   // Create a global variable for this string
284259d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
284359d1ed5bSDimitry Andric       CGM.getModule(), C->getType(), !CGM.getLangOpts().WritableStrings, LT, C,
284459d1ed5bSDimitry Andric       GlobalName, nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
284559d1ed5bSDimitry Andric   GV->setAlignment(Alignment);
284659d1ed5bSDimitry Andric   GV->setUnnamedAddr(true);
284759d1ed5bSDimitry Andric   return GV;
2848f22ef01cSRoman Divacky }
2849dff0c46cSDimitry Andric 
285059d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a
285159d1ed5bSDimitry Andric /// constant array for the given string literal.
285259d1ed5bSDimitry Andric llvm::GlobalVariable *
285339d628a0SDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S,
285439d628a0SDimitry Andric                                                   StringRef Name) {
285559d1ed5bSDimitry Andric   auto Alignment =
285659d1ed5bSDimitry Andric       getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
2857dff0c46cSDimitry Andric 
285859d1ed5bSDimitry Andric   llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
285959d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
286059d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
286159d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
286259d1ed5bSDimitry Andric     if (auto GV = *Entry) {
286359d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
286459d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
286559d1ed5bSDimitry Andric       return GV;
286659d1ed5bSDimitry Andric     }
286759d1ed5bSDimitry Andric   }
286859d1ed5bSDimitry Andric 
286959d1ed5bSDimitry Andric   SmallString<256> MangledNameBuffer;
287059d1ed5bSDimitry Andric   StringRef GlobalVariableName;
287159d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes LT;
287259d1ed5bSDimitry Andric 
287359d1ed5bSDimitry Andric   // Mangle the string literal if the ABI allows for it.  However, we cannot
287459d1ed5bSDimitry Andric   // do this if  we are compiling with ASan or -fwritable-strings because they
287559d1ed5bSDimitry Andric   // rely on strings having normal linkage.
287639d628a0SDimitry Andric   if (!LangOpts.WritableStrings &&
287739d628a0SDimitry Andric       !LangOpts.Sanitize.has(SanitizerKind::Address) &&
287859d1ed5bSDimitry Andric       getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) {
287959d1ed5bSDimitry Andric     llvm::raw_svector_ostream Out(MangledNameBuffer);
288059d1ed5bSDimitry Andric     getCXXABI().getMangleContext().mangleStringLiteral(S, Out);
288159d1ed5bSDimitry Andric     Out.flush();
288259d1ed5bSDimitry Andric 
288359d1ed5bSDimitry Andric     LT = llvm::GlobalValue::LinkOnceODRLinkage;
288459d1ed5bSDimitry Andric     GlobalVariableName = MangledNameBuffer;
288559d1ed5bSDimitry Andric   } else {
288659d1ed5bSDimitry Andric     LT = llvm::GlobalValue::PrivateLinkage;
288739d628a0SDimitry Andric     GlobalVariableName = Name;
288859d1ed5bSDimitry Andric   }
288959d1ed5bSDimitry Andric 
289059d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
289159d1ed5bSDimitry Andric   if (Entry)
289259d1ed5bSDimitry Andric     *Entry = GV;
289359d1ed5bSDimitry Andric 
289439d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>",
289539d628a0SDimitry Andric                                   QualType());
2896dff0c46cSDimitry Andric   return GV;
2897f22ef01cSRoman Divacky }
2898f22ef01cSRoman Divacky 
2899f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant
2900f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node.
290159d1ed5bSDimitry Andric llvm::GlobalVariable *
2902f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
2903f22ef01cSRoman Divacky   std::string Str;
2904f22ef01cSRoman Divacky   getContext().getObjCEncodingForType(E->getEncodedType(), Str);
2905f22ef01cSRoman Divacky 
2906f22ef01cSRoman Divacky   return GetAddrOfConstantCString(Str);
2907f22ef01cSRoman Divacky }
2908f22ef01cSRoman Divacky 
290959d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing
291059d1ed5bSDimitry Andric /// the literal and a terminating '\0' character.
291159d1ed5bSDimitry Andric /// The result has pointer to array type.
291259d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
291359d1ed5bSDimitry Andric     const std::string &Str, const char *GlobalName, unsigned Alignment) {
291459d1ed5bSDimitry Andric   StringRef StrWithNull(Str.c_str(), Str.size() + 1);
291559d1ed5bSDimitry Andric   if (Alignment == 0) {
291659d1ed5bSDimitry Andric     Alignment = getContext()
291759d1ed5bSDimitry Andric                     .getAlignOfGlobalVarInChars(getContext().CharTy)
291859d1ed5bSDimitry Andric                     .getQuantity();
2919f22ef01cSRoman Divacky   }
2920f22ef01cSRoman Divacky 
292159d1ed5bSDimitry Andric   llvm::Constant *C =
292259d1ed5bSDimitry Andric       llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
292359d1ed5bSDimitry Andric 
292459d1ed5bSDimitry Andric   // Don't share any string literals if strings aren't constant.
292559d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
292659d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
292759d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
292859d1ed5bSDimitry Andric     if (auto GV = *Entry) {
292959d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
293059d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
293159d1ed5bSDimitry Andric       return GV;
293259d1ed5bSDimitry Andric     }
293359d1ed5bSDimitry Andric   }
293459d1ed5bSDimitry Andric 
2935f22ef01cSRoman Divacky   // Get the default prefix if a name wasn't specified.
2936f22ef01cSRoman Divacky   if (!GlobalName)
2937f22ef01cSRoman Divacky     GlobalName = ".str";
2938f22ef01cSRoman Divacky   // Create a global variable for this.
293959d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
294059d1ed5bSDimitry Andric                                   GlobalName, Alignment);
294159d1ed5bSDimitry Andric   if (Entry)
294259d1ed5bSDimitry Andric     *Entry = GV;
29436122f3e6SDimitry Andric   return GV;
2944f22ef01cSRoman Divacky }
2945f22ef01cSRoman Divacky 
2946f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
2947f785676fSDimitry Andric     const MaterializeTemporaryExpr *E, const Expr *Init) {
2948f785676fSDimitry Andric   assert((E->getStorageDuration() == SD_Static ||
2949f785676fSDimitry Andric           E->getStorageDuration() == SD_Thread) && "not a global temporary");
295059d1ed5bSDimitry Andric   const auto *VD = cast<VarDecl>(E->getExtendingDecl());
2951f785676fSDimitry Andric 
2952f785676fSDimitry Andric   // If we're not materializing a subobject of the temporary, keep the
2953f785676fSDimitry Andric   // cv-qualifiers from the type of the MaterializeTemporaryExpr.
2954f785676fSDimitry Andric   QualType MaterializedType = Init->getType();
2955f785676fSDimitry Andric   if (Init == E->GetTemporaryExpr())
2956f785676fSDimitry Andric     MaterializedType = E->getType();
2957f785676fSDimitry Andric 
2958f785676fSDimitry Andric   llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E];
2959f785676fSDimitry Andric   if (Slot)
2960f785676fSDimitry Andric     return Slot;
2961f785676fSDimitry Andric 
2962f785676fSDimitry Andric   // FIXME: If an externally-visible declaration extends multiple temporaries,
2963f785676fSDimitry Andric   // we need to give each temporary the same name in every translation unit (and
2964f785676fSDimitry Andric   // we also need to make the temporaries externally-visible).
2965f785676fSDimitry Andric   SmallString<256> Name;
2966f785676fSDimitry Andric   llvm::raw_svector_ostream Out(Name);
296759d1ed5bSDimitry Andric   getCXXABI().getMangleContext().mangleReferenceTemporary(
296859d1ed5bSDimitry Andric       VD, E->getManglingNumber(), Out);
2969f785676fSDimitry Andric   Out.flush();
2970f785676fSDimitry Andric 
297159d1ed5bSDimitry Andric   APValue *Value = nullptr;
2972f785676fSDimitry Andric   if (E->getStorageDuration() == SD_Static) {
2973f785676fSDimitry Andric     // We might have a cached constant initializer for this temporary. Note
2974f785676fSDimitry Andric     // that this might have a different value from the value computed by
2975f785676fSDimitry Andric     // evaluating the initializer if the surrounding constant expression
2976f785676fSDimitry Andric     // modifies the temporary.
2977f785676fSDimitry Andric     Value = getContext().getMaterializedTemporaryValue(E, false);
2978f785676fSDimitry Andric     if (Value && Value->isUninit())
297959d1ed5bSDimitry Andric       Value = nullptr;
2980f785676fSDimitry Andric   }
2981f785676fSDimitry Andric 
2982f785676fSDimitry Andric   // Try evaluating it now, it might have a constant initializer.
2983f785676fSDimitry Andric   Expr::EvalResult EvalResult;
2984f785676fSDimitry Andric   if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) &&
2985f785676fSDimitry Andric       !EvalResult.hasSideEffects())
2986f785676fSDimitry Andric     Value = &EvalResult.Val;
2987f785676fSDimitry Andric 
298859d1ed5bSDimitry Andric   llvm::Constant *InitialValue = nullptr;
2989f785676fSDimitry Andric   bool Constant = false;
2990f785676fSDimitry Andric   llvm::Type *Type;
2991f785676fSDimitry Andric   if (Value) {
2992f785676fSDimitry Andric     // The temporary has a constant initializer, use it.
299359d1ed5bSDimitry Andric     InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr);
2994f785676fSDimitry Andric     Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value);
2995f785676fSDimitry Andric     Type = InitialValue->getType();
2996f785676fSDimitry Andric   } else {
2997f785676fSDimitry Andric     // No initializer, the initialization will be provided when we
2998f785676fSDimitry Andric     // initialize the declaration which performed lifetime extension.
2999f785676fSDimitry Andric     Type = getTypes().ConvertTypeForMem(MaterializedType);
3000f785676fSDimitry Andric   }
3001f785676fSDimitry Andric 
3002f785676fSDimitry Andric   // Create a global variable for this lifetime-extended temporary.
300359d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
300459d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(VD, Constant);
300559d1ed5bSDimitry Andric   // There is no need for this temporary to have global linkage if the global
300659d1ed5bSDimitry Andric   // variable has external linkage.
300759d1ed5bSDimitry Andric   if (Linkage == llvm::GlobalVariable::ExternalLinkage)
300859d1ed5bSDimitry Andric     Linkage = llvm::GlobalVariable::PrivateLinkage;
300959d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(
301059d1ed5bSDimitry Andric       VD, getContext().getTargetAddressSpace(MaterializedType));
301159d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
301259d1ed5bSDimitry Andric       getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
301359d1ed5bSDimitry Andric       /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal,
301459d1ed5bSDimitry Andric       AddrSpace);
301559d1ed5bSDimitry Andric   setGlobalVisibility(GV, VD);
3016f785676fSDimitry Andric   GV->setAlignment(
3017f785676fSDimitry Andric       getContext().getTypeAlignInChars(MaterializedType).getQuantity());
3018f785676fSDimitry Andric   if (VD->getTLSKind())
3019f785676fSDimitry Andric     setTLSMode(GV, *VD);
3020f785676fSDimitry Andric   Slot = GV;
3021f785676fSDimitry Andric   return GV;
3022f785676fSDimitry Andric }
3023f785676fSDimitry Andric 
3024f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized
3025f22ef01cSRoman Divacky /// properties for an implementation.
3026f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const
3027f22ef01cSRoman Divacky                                                     ObjCImplementationDecl *D) {
302859d1ed5bSDimitry Andric   for (const auto *PID : D->property_impls()) {
3029f22ef01cSRoman Divacky     // Dynamic is just for type-checking.
3030f22ef01cSRoman Divacky     if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3031f22ef01cSRoman Divacky       ObjCPropertyDecl *PD = PID->getPropertyDecl();
3032f22ef01cSRoman Divacky 
3033f22ef01cSRoman Divacky       // Determine which methods need to be implemented, some may have
30343861d79fSDimitry Andric       // been overridden. Note that ::isPropertyAccessor is not the method
3035f22ef01cSRoman Divacky       // we want, that just indicates if the decl came from a
3036f22ef01cSRoman Divacky       // property. What we want to know is if the method is defined in
3037f22ef01cSRoman Divacky       // this implementation.
3038f22ef01cSRoman Divacky       if (!D->getInstanceMethod(PD->getGetterName()))
3039f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCGetter(
3040f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3041f22ef01cSRoman Divacky       if (!PD->isReadOnly() &&
3042f22ef01cSRoman Divacky           !D->getInstanceMethod(PD->getSetterName()))
3043f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCSetter(
3044f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3045f22ef01cSRoman Divacky     }
3046f22ef01cSRoman Divacky   }
3047f22ef01cSRoman Divacky }
3048f22ef01cSRoman Divacky 
30493b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) {
30506122f3e6SDimitry Andric   const ObjCInterfaceDecl *iface = impl->getClassInterface();
30516122f3e6SDimitry Andric   for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
30523b0f4066SDimitry Andric        ivar; ivar = ivar->getNextIvar())
30533b0f4066SDimitry Andric     if (ivar->getType().isDestructedType())
30543b0f4066SDimitry Andric       return true;
30553b0f4066SDimitry Andric 
30563b0f4066SDimitry Andric   return false;
30573b0f4066SDimitry Andric }
30583b0f4066SDimitry Andric 
305939d628a0SDimitry Andric static bool AllTrivialInitializers(CodeGenModule &CGM,
306039d628a0SDimitry Andric                                    ObjCImplementationDecl *D) {
306139d628a0SDimitry Andric   CodeGenFunction CGF(CGM);
306239d628a0SDimitry Andric   for (ObjCImplementationDecl::init_iterator B = D->init_begin(),
306339d628a0SDimitry Andric        E = D->init_end(); B != E; ++B) {
306439d628a0SDimitry Andric     CXXCtorInitializer *CtorInitExp = *B;
306539d628a0SDimitry Andric     Expr *Init = CtorInitExp->getInit();
306639d628a0SDimitry Andric     if (!CGF.isTrivialInitializer(Init))
306739d628a0SDimitry Andric       return false;
306839d628a0SDimitry Andric   }
306939d628a0SDimitry Andric   return true;
307039d628a0SDimitry Andric }
307139d628a0SDimitry Andric 
3072f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization
3073f22ef01cSRoman Divacky /// for an implementation.
3074f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
30753b0f4066SDimitry Andric   // We might need a .cxx_destruct even if we don't have any ivar initializers.
30763b0f4066SDimitry Andric   if (needsDestructMethod(D)) {
3077f22ef01cSRoman Divacky     IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
3078f22ef01cSRoman Divacky     Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
30793b0f4066SDimitry Andric     ObjCMethodDecl *DTORMethod =
30803b0f4066SDimitry Andric       ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
308159d1ed5bSDimitry Andric                              cxxSelector, getContext().VoidTy, nullptr, D,
30826122f3e6SDimitry Andric                              /*isInstance=*/true, /*isVariadic=*/false,
30833861d79fSDimitry Andric                           /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true,
30846122f3e6SDimitry Andric                              /*isDefined=*/false, ObjCMethodDecl::Required);
3085f22ef01cSRoman Divacky     D->addInstanceMethod(DTORMethod);
3086f22ef01cSRoman Divacky     CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
30873861d79fSDimitry Andric     D->setHasDestructors(true);
30883b0f4066SDimitry Andric   }
3089f22ef01cSRoman Divacky 
30903b0f4066SDimitry Andric   // If the implementation doesn't have any ivar initializers, we don't need
30913b0f4066SDimitry Andric   // a .cxx_construct.
309239d628a0SDimitry Andric   if (D->getNumIvarInitializers() == 0 ||
309339d628a0SDimitry Andric       AllTrivialInitializers(*this, D))
30943b0f4066SDimitry Andric     return;
30953b0f4066SDimitry Andric 
30963b0f4066SDimitry Andric   IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
30973b0f4066SDimitry Andric   Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
3098f22ef01cSRoman Divacky   // The constructor returns 'self'.
3099f22ef01cSRoman Divacky   ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
3100f22ef01cSRoman Divacky                                                 D->getLocation(),
31016122f3e6SDimitry Andric                                                 D->getLocation(),
31026122f3e6SDimitry Andric                                                 cxxSelector,
310359d1ed5bSDimitry Andric                                                 getContext().getObjCIdType(),
310459d1ed5bSDimitry Andric                                                 nullptr, D, /*isInstance=*/true,
31056122f3e6SDimitry Andric                                                 /*isVariadic=*/false,
31063861d79fSDimitry Andric                                                 /*isPropertyAccessor=*/true,
31076122f3e6SDimitry Andric                                                 /*isImplicitlyDeclared=*/true,
31086122f3e6SDimitry Andric                                                 /*isDefined=*/false,
3109f22ef01cSRoman Divacky                                                 ObjCMethodDecl::Required);
3110f22ef01cSRoman Divacky   D->addInstanceMethod(CTORMethod);
3111f22ef01cSRoman Divacky   CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
31123861d79fSDimitry Andric   D->setHasNonZeroConstructors(true);
3113f22ef01cSRoman Divacky }
3114f22ef01cSRoman Divacky 
3115f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace.
3116f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) {
311759d1ed5bSDimitry Andric   for (auto *I : ND->decls()) {
311859d1ed5bSDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(I))
3119f785676fSDimitry Andric       if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
3120f785676fSDimitry Andric           VD->getTemplateSpecializationKind() != TSK_Undeclared)
3121f785676fSDimitry Andric         continue;
312259d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3123f22ef01cSRoman Divacky   }
3124f785676fSDimitry Andric }
3125f22ef01cSRoman Divacky 
3126f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec.
3127f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
3128f22ef01cSRoman Divacky   if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
3129f22ef01cSRoman Divacky       LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
3130f22ef01cSRoman Divacky     ErrorUnsupported(LSD, "linkage spec");
3131f22ef01cSRoman Divacky     return;
3132f22ef01cSRoman Divacky   }
3133f22ef01cSRoman Divacky 
313459d1ed5bSDimitry Andric   for (auto *I : LSD->decls()) {
31353861d79fSDimitry Andric     // Meta-data for ObjC class includes references to implemented methods.
31363861d79fSDimitry Andric     // Generate class's method definitions first.
313759d1ed5bSDimitry Andric     if (auto *OID = dyn_cast<ObjCImplDecl>(I)) {
313859d1ed5bSDimitry Andric       for (auto *M : OID->methods())
313959d1ed5bSDimitry Andric         EmitTopLevelDecl(M);
31403861d79fSDimitry Andric     }
314159d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3142f22ef01cSRoman Divacky   }
31433861d79fSDimitry Andric }
3144f22ef01cSRoman Divacky 
3145f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration.
3146f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) {
3147f22ef01cSRoman Divacky   // Ignore dependent declarations.
3148f22ef01cSRoman Divacky   if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
3149f22ef01cSRoman Divacky     return;
3150f22ef01cSRoman Divacky 
3151f22ef01cSRoman Divacky   switch (D->getKind()) {
3152f22ef01cSRoman Divacky   case Decl::CXXConversion:
3153f22ef01cSRoman Divacky   case Decl::CXXMethod:
3154f22ef01cSRoman Divacky   case Decl::Function:
3155f22ef01cSRoman Divacky     // Skip function templates
31563b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
31573b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3158f22ef01cSRoman Divacky       return;
3159f22ef01cSRoman Divacky 
3160f22ef01cSRoman Divacky     EmitGlobal(cast<FunctionDecl>(D));
316139d628a0SDimitry Andric     // Always provide some coverage mapping
316239d628a0SDimitry Andric     // even for the functions that aren't emitted.
316339d628a0SDimitry Andric     AddDeferredUnusedCoverageMapping(D);
3164f22ef01cSRoman Divacky     break;
3165f22ef01cSRoman Divacky 
3166f22ef01cSRoman Divacky   case Decl::Var:
3167f785676fSDimitry Andric     // Skip variable templates
3168f785676fSDimitry Andric     if (cast<VarDecl>(D)->getDescribedVarTemplate())
3169f785676fSDimitry Andric       return;
3170f785676fSDimitry Andric   case Decl::VarTemplateSpecialization:
3171f22ef01cSRoman Divacky     EmitGlobal(cast<VarDecl>(D));
3172f22ef01cSRoman Divacky     break;
3173f22ef01cSRoman Divacky 
31743b0f4066SDimitry Andric   // Indirect fields from global anonymous structs and unions can be
31753b0f4066SDimitry Andric   // ignored; only the actual variable requires IR gen support.
31763b0f4066SDimitry Andric   case Decl::IndirectField:
31773b0f4066SDimitry Andric     break;
31783b0f4066SDimitry Andric 
3179f22ef01cSRoman Divacky   // C++ Decls
3180f22ef01cSRoman Divacky   case Decl::Namespace:
3181f22ef01cSRoman Divacky     EmitNamespace(cast<NamespaceDecl>(D));
3182f22ef01cSRoman Divacky     break;
3183f22ef01cSRoman Divacky     // No code generation needed.
3184f22ef01cSRoman Divacky   case Decl::UsingShadow:
3185f22ef01cSRoman Divacky   case Decl::ClassTemplate:
3186f785676fSDimitry Andric   case Decl::VarTemplate:
3187f785676fSDimitry Andric   case Decl::VarTemplatePartialSpecialization:
3188f22ef01cSRoman Divacky   case Decl::FunctionTemplate:
3189bd5abe19SDimitry Andric   case Decl::TypeAliasTemplate:
3190bd5abe19SDimitry Andric   case Decl::Block:
3191139f7f9bSDimitry Andric   case Decl::Empty:
3192f22ef01cSRoman Divacky     break;
319359d1ed5bSDimitry Andric   case Decl::Using:          // using X; [C++]
319459d1ed5bSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
319559d1ed5bSDimitry Andric         DI->EmitUsingDecl(cast<UsingDecl>(*D));
319659d1ed5bSDimitry Andric     return;
3197f785676fSDimitry Andric   case Decl::NamespaceAlias:
3198f785676fSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3199f785676fSDimitry Andric         DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D));
3200f785676fSDimitry Andric     return;
3201284c1978SDimitry Andric   case Decl::UsingDirective: // using namespace X; [C++]
3202284c1978SDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3203284c1978SDimitry Andric       DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D));
3204284c1978SDimitry Andric     return;
3205f22ef01cSRoman Divacky   case Decl::CXXConstructor:
3206f22ef01cSRoman Divacky     // Skip function templates
32073b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
32083b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3209f22ef01cSRoman Divacky       return;
3210f22ef01cSRoman Divacky 
3211f785676fSDimitry Andric     getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D));
3212f22ef01cSRoman Divacky     break;
3213f22ef01cSRoman Divacky   case Decl::CXXDestructor:
32143b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->isLateTemplateParsed())
32153b0f4066SDimitry Andric       return;
3216f785676fSDimitry Andric     getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D));
3217f22ef01cSRoman Divacky     break;
3218f22ef01cSRoman Divacky 
3219f22ef01cSRoman Divacky   case Decl::StaticAssert:
3220f22ef01cSRoman Divacky     // Nothing to do.
3221f22ef01cSRoman Divacky     break;
3222f22ef01cSRoman Divacky 
3223f22ef01cSRoman Divacky   // Objective-C Decls
3224f22ef01cSRoman Divacky 
3225f22ef01cSRoman Divacky   // Forward declarations, no (immediate) code generation.
3226f22ef01cSRoman Divacky   case Decl::ObjCInterface:
32277ae0e2c9SDimitry Andric   case Decl::ObjCCategory:
3228f22ef01cSRoman Divacky     break;
3229f22ef01cSRoman Divacky 
3230dff0c46cSDimitry Andric   case Decl::ObjCProtocol: {
323159d1ed5bSDimitry Andric     auto *Proto = cast<ObjCProtocolDecl>(D);
3232dff0c46cSDimitry Andric     if (Proto->isThisDeclarationADefinition())
3233dff0c46cSDimitry Andric       ObjCRuntime->GenerateProtocol(Proto);
3234f22ef01cSRoman Divacky     break;
3235dff0c46cSDimitry Andric   }
3236f22ef01cSRoman Divacky 
3237f22ef01cSRoman Divacky   case Decl::ObjCCategoryImpl:
3238f22ef01cSRoman Divacky     // Categories have properties but don't support synthesize so we
3239f22ef01cSRoman Divacky     // can ignore them here.
32406122f3e6SDimitry Andric     ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
3241f22ef01cSRoman Divacky     break;
3242f22ef01cSRoman Divacky 
3243f22ef01cSRoman Divacky   case Decl::ObjCImplementation: {
324459d1ed5bSDimitry Andric     auto *OMD = cast<ObjCImplementationDecl>(D);
3245f22ef01cSRoman Divacky     EmitObjCPropertyImplementations(OMD);
3246f22ef01cSRoman Divacky     EmitObjCIvarInitializations(OMD);
32476122f3e6SDimitry Andric     ObjCRuntime->GenerateClass(OMD);
3248dff0c46cSDimitry Andric     // Emit global variable debug information.
3249dff0c46cSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3250139f7f9bSDimitry Andric       if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
3251139f7f9bSDimitry Andric         DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
3252139f7f9bSDimitry Andric             OMD->getClassInterface()), OMD->getLocation());
3253f22ef01cSRoman Divacky     break;
3254f22ef01cSRoman Divacky   }
3255f22ef01cSRoman Divacky   case Decl::ObjCMethod: {
325659d1ed5bSDimitry Andric     auto *OMD = cast<ObjCMethodDecl>(D);
3257f22ef01cSRoman Divacky     // If this is not a prototype, emit the body.
3258f22ef01cSRoman Divacky     if (OMD->getBody())
3259f22ef01cSRoman Divacky       CodeGenFunction(*this).GenerateObjCMethod(OMD);
3260f22ef01cSRoman Divacky     break;
3261f22ef01cSRoman Divacky   }
3262f22ef01cSRoman Divacky   case Decl::ObjCCompatibleAlias:
3263dff0c46cSDimitry Andric     ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D));
3264f22ef01cSRoman Divacky     break;
3265f22ef01cSRoman Divacky 
3266f22ef01cSRoman Divacky   case Decl::LinkageSpec:
3267f22ef01cSRoman Divacky     EmitLinkageSpec(cast<LinkageSpecDecl>(D));
3268f22ef01cSRoman Divacky     break;
3269f22ef01cSRoman Divacky 
3270f22ef01cSRoman Divacky   case Decl::FileScopeAsm: {
327159d1ed5bSDimitry Andric     auto *AD = cast<FileScopeAsmDecl>(D);
32726122f3e6SDimitry Andric     StringRef AsmString = AD->getAsmString()->getString();
3273f22ef01cSRoman Divacky 
3274f22ef01cSRoman Divacky     const std::string &S = getModule().getModuleInlineAsm();
3275f22ef01cSRoman Divacky     if (S.empty())
3276f22ef01cSRoman Divacky       getModule().setModuleInlineAsm(AsmString);
32777ae0e2c9SDimitry Andric     else if (S.end()[-1] == '\n')
32786122f3e6SDimitry Andric       getModule().setModuleInlineAsm(S + AsmString.str());
3279f22ef01cSRoman Divacky     else
3280f22ef01cSRoman Divacky       getModule().setModuleInlineAsm(S + '\n' + AsmString.str());
3281f22ef01cSRoman Divacky     break;
3282f22ef01cSRoman Divacky   }
3283f22ef01cSRoman Divacky 
3284139f7f9bSDimitry Andric   case Decl::Import: {
328559d1ed5bSDimitry Andric     auto *Import = cast<ImportDecl>(D);
3286139f7f9bSDimitry Andric 
3287139f7f9bSDimitry Andric     // Ignore import declarations that come from imported modules.
3288139f7f9bSDimitry Andric     if (clang::Module *Owner = Import->getOwningModule()) {
3289139f7f9bSDimitry Andric       if (getLangOpts().CurrentModule.empty() ||
3290139f7f9bSDimitry Andric           Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)
3291139f7f9bSDimitry Andric         break;
3292139f7f9bSDimitry Andric     }
3293139f7f9bSDimitry Andric 
3294139f7f9bSDimitry Andric     ImportedModules.insert(Import->getImportedModule());
3295139f7f9bSDimitry Andric     break;
3296139f7f9bSDimitry Andric   }
3297139f7f9bSDimitry Andric 
329839d628a0SDimitry Andric   case Decl::OMPThreadPrivate:
329939d628a0SDimitry Andric     EmitOMPThreadPrivateDecl(cast<OMPThreadPrivateDecl>(D));
330039d628a0SDimitry Andric     break;
330139d628a0SDimitry Andric 
330259d1ed5bSDimitry Andric   case Decl::ClassTemplateSpecialization: {
330359d1ed5bSDimitry Andric     const auto *Spec = cast<ClassTemplateSpecializationDecl>(D);
330459d1ed5bSDimitry Andric     if (DebugInfo &&
330539d628a0SDimitry Andric         Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition &&
330639d628a0SDimitry Andric         Spec->hasDefinition())
330759d1ed5bSDimitry Andric       DebugInfo->completeTemplateDefinition(*Spec);
330839d628a0SDimitry Andric     break;
330959d1ed5bSDimitry Andric   }
331059d1ed5bSDimitry Andric 
3311f22ef01cSRoman Divacky   default:
3312f22ef01cSRoman Divacky     // Make sure we handled everything we should, every other kind is a
3313f22ef01cSRoman Divacky     // non-top-level decl.  FIXME: Would be nice to have an isTopLevelDeclKind
3314f22ef01cSRoman Divacky     // function. Need to recode Decl::Kind to do that easily.
3315f22ef01cSRoman Divacky     assert(isa<TypeDecl>(D) && "Unsupported decl kind");
331639d628a0SDimitry Andric     break;
331739d628a0SDimitry Andric   }
331839d628a0SDimitry Andric }
331939d628a0SDimitry Andric 
332039d628a0SDimitry Andric void CodeGenModule::AddDeferredUnusedCoverageMapping(Decl *D) {
332139d628a0SDimitry Andric   // Do we need to generate coverage mapping?
332239d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
332339d628a0SDimitry Andric     return;
332439d628a0SDimitry Andric   switch (D->getKind()) {
332539d628a0SDimitry Andric   case Decl::CXXConversion:
332639d628a0SDimitry Andric   case Decl::CXXMethod:
332739d628a0SDimitry Andric   case Decl::Function:
332839d628a0SDimitry Andric   case Decl::ObjCMethod:
332939d628a0SDimitry Andric   case Decl::CXXConstructor:
333039d628a0SDimitry Andric   case Decl::CXXDestructor: {
333139d628a0SDimitry Andric     if (!cast<FunctionDecl>(D)->hasBody())
333239d628a0SDimitry Andric       return;
333339d628a0SDimitry Andric     auto I = DeferredEmptyCoverageMappingDecls.find(D);
333439d628a0SDimitry Andric     if (I == DeferredEmptyCoverageMappingDecls.end())
333539d628a0SDimitry Andric       DeferredEmptyCoverageMappingDecls[D] = true;
333639d628a0SDimitry Andric     break;
333739d628a0SDimitry Andric   }
333839d628a0SDimitry Andric   default:
333939d628a0SDimitry Andric     break;
334039d628a0SDimitry Andric   };
334139d628a0SDimitry Andric }
334239d628a0SDimitry Andric 
334339d628a0SDimitry Andric void CodeGenModule::ClearUnusedCoverageMapping(const Decl *D) {
334439d628a0SDimitry Andric   // Do we need to generate coverage mapping?
334539d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
334639d628a0SDimitry Andric     return;
334739d628a0SDimitry Andric   if (const auto *Fn = dyn_cast<FunctionDecl>(D)) {
334839d628a0SDimitry Andric     if (Fn->isTemplateInstantiation())
334939d628a0SDimitry Andric       ClearUnusedCoverageMapping(Fn->getTemplateInstantiationPattern());
335039d628a0SDimitry Andric   }
335139d628a0SDimitry Andric   auto I = DeferredEmptyCoverageMappingDecls.find(D);
335239d628a0SDimitry Andric   if (I == DeferredEmptyCoverageMappingDecls.end())
335339d628a0SDimitry Andric     DeferredEmptyCoverageMappingDecls[D] = false;
335439d628a0SDimitry Andric   else
335539d628a0SDimitry Andric     I->second = false;
335639d628a0SDimitry Andric }
335739d628a0SDimitry Andric 
335839d628a0SDimitry Andric void CodeGenModule::EmitDeferredUnusedCoverageMappings() {
335939d628a0SDimitry Andric   std::vector<const Decl *> DeferredDecls;
336039d628a0SDimitry Andric   for (const auto I : DeferredEmptyCoverageMappingDecls) {
336139d628a0SDimitry Andric     if (!I.second)
336239d628a0SDimitry Andric       continue;
336339d628a0SDimitry Andric     DeferredDecls.push_back(I.first);
336439d628a0SDimitry Andric   }
336539d628a0SDimitry Andric   // Sort the declarations by their location to make sure that the tests get a
336639d628a0SDimitry Andric   // predictable order for the coverage mapping for the unused declarations.
336739d628a0SDimitry Andric   if (CodeGenOpts.DumpCoverageMapping)
336839d628a0SDimitry Andric     std::sort(DeferredDecls.begin(), DeferredDecls.end(),
336939d628a0SDimitry Andric               [] (const Decl *LHS, const Decl *RHS) {
337039d628a0SDimitry Andric       return LHS->getLocStart() < RHS->getLocStart();
337139d628a0SDimitry Andric     });
337239d628a0SDimitry Andric   for (const auto *D : DeferredDecls) {
337339d628a0SDimitry Andric     switch (D->getKind()) {
337439d628a0SDimitry Andric     case Decl::CXXConversion:
337539d628a0SDimitry Andric     case Decl::CXXMethod:
337639d628a0SDimitry Andric     case Decl::Function:
337739d628a0SDimitry Andric     case Decl::ObjCMethod: {
337839d628a0SDimitry Andric       CodeGenPGO PGO(*this);
337939d628a0SDimitry Andric       GlobalDecl GD(cast<FunctionDecl>(D));
338039d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
338139d628a0SDimitry Andric                                   getFunctionLinkage(GD));
338239d628a0SDimitry Andric       break;
338339d628a0SDimitry Andric     }
338439d628a0SDimitry Andric     case Decl::CXXConstructor: {
338539d628a0SDimitry Andric       CodeGenPGO PGO(*this);
338639d628a0SDimitry Andric       GlobalDecl GD(cast<CXXConstructorDecl>(D), Ctor_Base);
338739d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
338839d628a0SDimitry Andric                                   getFunctionLinkage(GD));
338939d628a0SDimitry Andric       break;
339039d628a0SDimitry Andric     }
339139d628a0SDimitry Andric     case Decl::CXXDestructor: {
339239d628a0SDimitry Andric       CodeGenPGO PGO(*this);
339339d628a0SDimitry Andric       GlobalDecl GD(cast<CXXDestructorDecl>(D), Dtor_Base);
339439d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
339539d628a0SDimitry Andric                                   getFunctionLinkage(GD));
339639d628a0SDimitry Andric       break;
339739d628a0SDimitry Andric     }
339839d628a0SDimitry Andric     default:
339939d628a0SDimitry Andric       break;
340039d628a0SDimitry Andric     };
3401f22ef01cSRoman Divacky   }
3402f22ef01cSRoman Divacky }
3403ffd1746dSEd Schouten 
3404ffd1746dSEd Schouten /// Turns the given pointer into a constant.
3405ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context,
3406ffd1746dSEd Schouten                                           const void *Ptr) {
3407ffd1746dSEd Schouten   uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr);
34086122f3e6SDimitry Andric   llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
3409ffd1746dSEd Schouten   return llvm::ConstantInt::get(i64, PtrInt);
3410ffd1746dSEd Schouten }
3411ffd1746dSEd Schouten 
3412ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
3413ffd1746dSEd Schouten                                    llvm::NamedMDNode *&GlobalMetadata,
3414ffd1746dSEd Schouten                                    GlobalDecl D,
3415ffd1746dSEd Schouten                                    llvm::GlobalValue *Addr) {
3416ffd1746dSEd Schouten   if (!GlobalMetadata)
3417ffd1746dSEd Schouten     GlobalMetadata =
3418ffd1746dSEd Schouten       CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
3419ffd1746dSEd Schouten 
3420ffd1746dSEd Schouten   // TODO: should we report variant information for ctors/dtors?
342139d628a0SDimitry Andric   llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
342239d628a0SDimitry Andric                            llvm::ConstantAsMetadata::get(GetPointerConstant(
342339d628a0SDimitry Andric                                CGM.getLLVMContext(), D.getDecl()))};
34243b0f4066SDimitry Andric   GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
3425ffd1746dSEd Schouten }
3426ffd1746dSEd Schouten 
3427284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked
3428284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled
3429284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer
3430284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the
3431284c1978SDimitry Andric /// same translation unit.
3432284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() {
3433284c1978SDimitry Andric   for (StaticExternCMap::iterator I = StaticExternCValues.begin(),
3434284c1978SDimitry Andric                                   E = StaticExternCValues.end();
3435284c1978SDimitry Andric        I != E; ++I) {
3436284c1978SDimitry Andric     IdentifierInfo *Name = I->first;
3437284c1978SDimitry Andric     llvm::GlobalValue *Val = I->second;
3438284c1978SDimitry Andric     if (Val && !getModule().getNamedValue(Name->getName()))
343959d1ed5bSDimitry Andric       addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val));
3440284c1978SDimitry Andric   }
3441284c1978SDimitry Andric }
3442284c1978SDimitry Andric 
344359d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName,
344459d1ed5bSDimitry Andric                                              GlobalDecl &Result) const {
344559d1ed5bSDimitry Andric   auto Res = Manglings.find(MangledName);
344659d1ed5bSDimitry Andric   if (Res == Manglings.end())
344759d1ed5bSDimitry Andric     return false;
344859d1ed5bSDimitry Andric   Result = Res->getValue();
344959d1ed5bSDimitry Andric   return true;
345059d1ed5bSDimitry Andric }
345159d1ed5bSDimitry Andric 
3452ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the
3453ffd1746dSEd Schouten /// current module with the Decls they came from.  This is useful for
3454ffd1746dSEd Schouten /// projects using IR gen as a subroutine.
3455ffd1746dSEd Schouten ///
3456ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly
3457ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata
3458ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'.
3459ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() {
346059d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3461ffd1746dSEd Schouten 
3462ffd1746dSEd Schouten   // StaticLocalDeclMap
346359d1ed5bSDimitry Andric   for (auto &I : MangledDeclNames) {
346459d1ed5bSDimitry Andric     llvm::GlobalValue *Addr = getModule().getNamedValue(I.second);
346559d1ed5bSDimitry Andric     EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr);
3466ffd1746dSEd Schouten   }
3467ffd1746dSEd Schouten }
3468ffd1746dSEd Schouten 
3469ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current
3470ffd1746dSEd Schouten /// function.
3471ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() {
3472ffd1746dSEd Schouten   if (LocalDeclMap.empty()) return;
3473ffd1746dSEd Schouten 
3474ffd1746dSEd Schouten   llvm::LLVMContext &Context = getLLVMContext();
3475ffd1746dSEd Schouten 
3476ffd1746dSEd Schouten   // Find the unique metadata ID for this name.
3477ffd1746dSEd Schouten   unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr");
3478ffd1746dSEd Schouten 
347959d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3480ffd1746dSEd Schouten 
348159d1ed5bSDimitry Andric   for (auto &I : LocalDeclMap) {
348259d1ed5bSDimitry Andric     const Decl *D = I.first;
348359d1ed5bSDimitry Andric     llvm::Value *Addr = I.second;
348459d1ed5bSDimitry Andric     if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
3485ffd1746dSEd Schouten       llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D);
348639d628a0SDimitry Andric       Alloca->setMetadata(
348739d628a0SDimitry Andric           DeclPtrKind, llvm::MDNode::get(
348839d628a0SDimitry Andric                            Context, llvm::ValueAsMetadata::getConstant(DAddr)));
348959d1ed5bSDimitry Andric     } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
3490ffd1746dSEd Schouten       GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
3491ffd1746dSEd Schouten       EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
3492ffd1746dSEd Schouten     }
3493ffd1746dSEd Schouten   }
3494ffd1746dSEd Schouten }
3495e580952dSDimitry Andric 
3496f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() {
3497f785676fSDimitry Andric   llvm::NamedMDNode *IdentMetadata =
3498f785676fSDimitry Andric     TheModule.getOrInsertNamedMetadata("llvm.ident");
3499f785676fSDimitry Andric   std::string Version = getClangFullVersion();
3500f785676fSDimitry Andric   llvm::LLVMContext &Ctx = TheModule.getContext();
3501f785676fSDimitry Andric 
350239d628a0SDimitry Andric   llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
3503f785676fSDimitry Andric   IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
3504f785676fSDimitry Andric }
3505f785676fSDimitry Andric 
350659d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() {
350739d628a0SDimitry Andric   // Warning, new MangledDeclNames may be appended within this loop.
350839d628a0SDimitry Andric   // We rely on MapVector insertions adding new elements to the end
350939d628a0SDimitry Andric   // of the container.
351039d628a0SDimitry Andric   // FIXME: Move this loop into the one target that needs it, and only
351139d628a0SDimitry Andric   // loop over those declarations for which we couldn't emit the target
351239d628a0SDimitry Andric   // metadata when we emitted the declaration.
351339d628a0SDimitry Andric   for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
351439d628a0SDimitry Andric     auto Val = *(MangledDeclNames.begin() + I);
351539d628a0SDimitry Andric     const Decl *D = Val.first.getDecl()->getMostRecentDecl();
351639d628a0SDimitry Andric     llvm::GlobalValue *GV = GetGlobalValue(Val.second);
351759d1ed5bSDimitry Andric     getTargetCodeGenInfo().emitTargetMD(D, GV, *this);
351859d1ed5bSDimitry Andric   }
351959d1ed5bSDimitry Andric }
352059d1ed5bSDimitry Andric 
3521bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() {
3522bd5abe19SDimitry Andric   if (!getCodeGenOpts().CoverageFile.empty()) {
3523bd5abe19SDimitry Andric     if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
3524bd5abe19SDimitry Andric       llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov");
3525bd5abe19SDimitry Andric       llvm::LLVMContext &Ctx = TheModule.getContext();
3526bd5abe19SDimitry Andric       llvm::MDString *CoverageFile =
3527bd5abe19SDimitry Andric           llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile);
3528bd5abe19SDimitry Andric       for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
3529bd5abe19SDimitry Andric         llvm::MDNode *CU = CUNode->getOperand(i);
353039d628a0SDimitry Andric         llvm::Metadata *Elts[] = {CoverageFile, CU};
353139d628a0SDimitry Andric         GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
3532bd5abe19SDimitry Andric       }
3533bd5abe19SDimitry Andric     }
3534bd5abe19SDimitry Andric   }
3535bd5abe19SDimitry Andric }
35363861d79fSDimitry Andric 
353739d628a0SDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) {
35383861d79fSDimitry Andric   // Sema has checked that all uuid strings are of the form
35393861d79fSDimitry Andric   // "12345678-1234-1234-1234-1234567890ab".
35403861d79fSDimitry Andric   assert(Uuid.size() == 36);
3541f785676fSDimitry Andric   for (unsigned i = 0; i < 36; ++i) {
3542f785676fSDimitry Andric     if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-');
3543f785676fSDimitry Andric     else                                         assert(isHexDigit(Uuid[i]));
35443861d79fSDimitry Andric   }
35453861d79fSDimitry Andric 
354639d628a0SDimitry Andric   // The starts of all bytes of Field3 in Uuid. Field 3 is "1234-1234567890ab".
3547f785676fSDimitry Andric   const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 };
35483861d79fSDimitry Andric 
3549f785676fSDimitry Andric   llvm::Constant *Field3[8];
3550f785676fSDimitry Andric   for (unsigned Idx = 0; Idx < 8; ++Idx)
3551f785676fSDimitry Andric     Field3[Idx] = llvm::ConstantInt::get(
3552f785676fSDimitry Andric         Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16);
35533861d79fSDimitry Andric 
3554f785676fSDimitry Andric   llvm::Constant *Fields[4] = {
3555f785676fSDimitry Andric     llvm::ConstantInt::get(Int32Ty, Uuid.substr(0,  8), 16),
3556f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(9,  4), 16),
3557f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16),
3558f785676fSDimitry Andric     llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3)
3559f785676fSDimitry Andric   };
3560f785676fSDimitry Andric 
3561f785676fSDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
35623861d79fSDimitry Andric }
356359d1ed5bSDimitry Andric 
356459d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty,
356559d1ed5bSDimitry Andric                                                        bool ForEH) {
356659d1ed5bSDimitry Andric   // Return a bogus pointer if RTTI is disabled, unless it's for EH.
356759d1ed5bSDimitry Andric   // FIXME: should we even be calling this method if RTTI is disabled
356859d1ed5bSDimitry Andric   // and it's not for EH?
356959d1ed5bSDimitry Andric   if (!ForEH && !getLangOpts().RTTI)
357059d1ed5bSDimitry Andric     return llvm::Constant::getNullValue(Int8PtrTy);
357159d1ed5bSDimitry Andric 
357259d1ed5bSDimitry Andric   if (ForEH && Ty->isObjCObjectPointerType() &&
357359d1ed5bSDimitry Andric       LangOpts.ObjCRuntime.isGNUFamily())
357459d1ed5bSDimitry Andric     return ObjCRuntime->GetEHType(Ty);
357559d1ed5bSDimitry Andric 
357659d1ed5bSDimitry Andric   return getCXXABI().getAddrOfRTTIDescriptor(Ty);
357759d1ed5bSDimitry Andric }
357859d1ed5bSDimitry Andric 
357939d628a0SDimitry Andric void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
358039d628a0SDimitry Andric   for (auto RefExpr : D->varlists()) {
358139d628a0SDimitry Andric     auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());
358239d628a0SDimitry Andric     bool PerformInit =
358339d628a0SDimitry Andric         VD->getAnyInitializer() &&
358439d628a0SDimitry Andric         !VD->getAnyInitializer()->isConstantInitializer(getContext(),
358539d628a0SDimitry Andric                                                         /*ForRef=*/false);
358639d628a0SDimitry Andric     if (auto InitFunction =
358739d628a0SDimitry Andric             getOpenMPRuntime().EmitOMPThreadPrivateVarDefinition(
358839d628a0SDimitry Andric                 VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(),
358939d628a0SDimitry Andric                 PerformInit))
359039d628a0SDimitry Andric       CXXGlobalInits.push_back(InitFunction);
359139d628a0SDimitry Andric   }
359239d628a0SDimitry Andric }
359339d628a0SDimitry Andric 
3594