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()) {
14433956c43SDimitry Andric     auto ReaderOrErr =
14533956c43SDimitry Andric         llvm::IndexedInstrProfReader::create(CodeGenOpts.InstrProfileInput);
14633956c43SDimitry Andric     if (std::error_code EC = ReaderOrErr.getError()) {
14759d1ed5bSDimitry Andric       unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
14859d1ed5bSDimitry Andric                                               "Could not read profile: %0");
14959d1ed5bSDimitry Andric       getDiags().Report(DiagID) << EC.message();
15033956c43SDimitry Andric     } else
15133956c43SDimitry Andric       PGOReader = std::move(ReaderOrErr.get());
15259d1ed5bSDimitry Andric   }
15339d628a0SDimitry Andric 
15439d628a0SDimitry Andric   // If coverage mapping generation is enabled, create the
15539d628a0SDimitry Andric   // CoverageMappingModuleGen object.
15639d628a0SDimitry Andric   if (CodeGenOpts.CoverageMapping)
15739d628a0SDimitry Andric     CoverageMapping.reset(new CoverageMappingModuleGen(*this, *CoverageInfo));
158f22ef01cSRoman Divacky }
159f22ef01cSRoman Divacky 
160f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() {
1616122f3e6SDimitry Andric   delete ObjCRuntime;
1626122f3e6SDimitry Andric   delete OpenCLRuntime;
16359d1ed5bSDimitry Andric   delete OpenMPRuntime;
1646122f3e6SDimitry Andric   delete CUDARuntime;
1656122f3e6SDimitry Andric   delete TheTargetCodeGenInfo;
1662754fe60SDimitry Andric   delete TBAA;
167f22ef01cSRoman Divacky   delete DebugInfo;
16817a519f9SDimitry Andric   delete ARCData;
16917a519f9SDimitry Andric   delete RRData;
170f22ef01cSRoman Divacky }
171f22ef01cSRoman Divacky 
172f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() {
1737ae0e2c9SDimitry Andric   // This is just isGNUFamily(), but we want to force implementors of
1747ae0e2c9SDimitry Andric   // new ABIs to decide how best to do this.
1757ae0e2c9SDimitry Andric   switch (LangOpts.ObjCRuntime.getKind()) {
1767ae0e2c9SDimitry Andric   case ObjCRuntime::GNUstep:
1777ae0e2c9SDimitry Andric   case ObjCRuntime::GCC:
1787ae0e2c9SDimitry Andric   case ObjCRuntime::ObjFW:
1796122f3e6SDimitry Andric     ObjCRuntime = CreateGNUObjCRuntime(*this);
1807ae0e2c9SDimitry Andric     return;
1817ae0e2c9SDimitry Andric 
1827ae0e2c9SDimitry Andric   case ObjCRuntime::FragileMacOSX:
1837ae0e2c9SDimitry Andric   case ObjCRuntime::MacOSX:
1847ae0e2c9SDimitry Andric   case ObjCRuntime::iOS:
1856122f3e6SDimitry Andric     ObjCRuntime = CreateMacObjCRuntime(*this);
1867ae0e2c9SDimitry Andric     return;
1877ae0e2c9SDimitry Andric   }
1887ae0e2c9SDimitry Andric   llvm_unreachable("bad runtime kind");
1896122f3e6SDimitry Andric }
1906122f3e6SDimitry Andric 
1916122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() {
1926122f3e6SDimitry Andric   OpenCLRuntime = new CGOpenCLRuntime(*this);
1936122f3e6SDimitry Andric }
1946122f3e6SDimitry Andric 
19559d1ed5bSDimitry Andric void CodeGenModule::createOpenMPRuntime() {
19659d1ed5bSDimitry Andric   OpenMPRuntime = new CGOpenMPRuntime(*this);
19759d1ed5bSDimitry Andric }
19859d1ed5bSDimitry Andric 
1996122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() {
2006122f3e6SDimitry Andric   CUDARuntime = CreateNVCUDARuntime(*this);
201f22ef01cSRoman Divacky }
202f22ef01cSRoman Divacky 
20339d628a0SDimitry Andric void CodeGenModule::addReplacement(StringRef Name, llvm::Constant *C) {
20439d628a0SDimitry Andric   Replacements[Name] = C;
20539d628a0SDimitry Andric }
20639d628a0SDimitry Andric 
207f785676fSDimitry Andric void CodeGenModule::applyReplacements() {
2088f0fd8f6SDimitry Andric   for (auto &I : Replacements) {
2098f0fd8f6SDimitry Andric     StringRef MangledName = I.first();
2108f0fd8f6SDimitry 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();
2628f0fd8f6SDimitry Andric   for (const GlobalDecl &GD : Aliases) {
26359d1ed5bSDimitry Andric     const auto *D = cast<ValueDecl>(GD.getDecl());
264f785676fSDimitry Andric     const AliasAttr *AA = D->getAttr<AliasAttr>();
265f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
266f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
26759d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
26859d1ed5bSDimitry Andric     const llvm::GlobalValue *GV = getAliasedGlobal(*Alias);
26959d1ed5bSDimitry Andric     if (!GV) {
270f785676fSDimitry Andric       Error = true;
27159d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
27259d1ed5bSDimitry Andric     } else if (GV->isDeclaration()) {
273f785676fSDimitry Andric       Error = true;
27459d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_alias_to_undefined);
27559d1ed5bSDimitry Andric     }
27659d1ed5bSDimitry Andric 
27759d1ed5bSDimitry Andric     llvm::Constant *Aliasee = Alias->getAliasee();
27859d1ed5bSDimitry Andric     llvm::GlobalValue *AliaseeGV;
27959d1ed5bSDimitry Andric     if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
28059d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
28159d1ed5bSDimitry Andric     else
28259d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
28359d1ed5bSDimitry Andric 
28459d1ed5bSDimitry Andric     if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
28559d1ed5bSDimitry Andric       StringRef AliasSection = SA->getName();
28659d1ed5bSDimitry Andric       if (AliasSection != AliaseeGV->getSection())
28759d1ed5bSDimitry Andric         Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
28859d1ed5bSDimitry Andric             << AliasSection;
28959d1ed5bSDimitry Andric     }
29059d1ed5bSDimitry Andric 
29159d1ed5bSDimitry Andric     // We have to handle alias to weak aliases in here. LLVM itself disallows
29259d1ed5bSDimitry Andric     // this since the object semantics would not match the IL one. For
29359d1ed5bSDimitry Andric     // compatibility with gcc we implement it by just pointing the alias
29459d1ed5bSDimitry Andric     // to its aliasee's aliasee. We also warn, since the user is probably
29559d1ed5bSDimitry Andric     // expecting the link to be weak.
29659d1ed5bSDimitry Andric     if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
29759d1ed5bSDimitry Andric       if (GA->mayBeOverridden()) {
29859d1ed5bSDimitry Andric         Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias)
29959d1ed5bSDimitry Andric             << GV->getName() << GA->getName();
30059d1ed5bSDimitry Andric         Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
30159d1ed5bSDimitry Andric             GA->getAliasee(), Alias->getType());
30259d1ed5bSDimitry Andric         Alias->setAliasee(Aliasee);
30359d1ed5bSDimitry Andric       }
304f785676fSDimitry Andric     }
305f785676fSDimitry Andric   }
306f785676fSDimitry Andric   if (!Error)
307f785676fSDimitry Andric     return;
308f785676fSDimitry Andric 
3098f0fd8f6SDimitry Andric   for (const GlobalDecl &GD : Aliases) {
310f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
311f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
31259d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
313f785676fSDimitry Andric     Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
314f785676fSDimitry Andric     Alias->eraseFromParent();
315f785676fSDimitry Andric   }
316f785676fSDimitry Andric }
317f785676fSDimitry Andric 
31859d1ed5bSDimitry Andric void CodeGenModule::clear() {
31959d1ed5bSDimitry Andric   DeferredDeclsToEmit.clear();
32033956c43SDimitry Andric   if (OpenMPRuntime)
32133956c43SDimitry Andric     OpenMPRuntime->clear();
32259d1ed5bSDimitry Andric }
32359d1ed5bSDimitry Andric 
32459d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags,
32559d1ed5bSDimitry Andric                                        StringRef MainFile) {
32659d1ed5bSDimitry Andric   if (!hasDiagnostics())
32759d1ed5bSDimitry Andric     return;
32859d1ed5bSDimitry Andric   if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
32959d1ed5bSDimitry Andric     if (MainFile.empty())
33059d1ed5bSDimitry Andric       MainFile = "<stdin>";
33159d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_unprofiled) << MainFile;
33259d1ed5bSDimitry Andric   } else
33359d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing
33459d1ed5bSDimitry Andric                                                       << Mismatched;
33559d1ed5bSDimitry Andric }
33659d1ed5bSDimitry Andric 
337f22ef01cSRoman Divacky void CodeGenModule::Release() {
338f22ef01cSRoman Divacky   EmitDeferred();
339f785676fSDimitry Andric   applyReplacements();
340f785676fSDimitry Andric   checkAliases();
341f22ef01cSRoman Divacky   EmitCXXGlobalInitFunc();
342f22ef01cSRoman Divacky   EmitCXXGlobalDtorFunc();
343284c1978SDimitry Andric   EmitCXXThreadLocalInitFunc();
3446122f3e6SDimitry Andric   if (ObjCRuntime)
3456122f3e6SDimitry Andric     if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
346f22ef01cSRoman Divacky       AddGlobalCtor(ObjCInitFunction);
34733956c43SDimitry Andric   if (Context.getLangOpts().CUDA && !Context.getLangOpts().CUDAIsDevice &&
34833956c43SDimitry Andric       CUDARuntime) {
34933956c43SDimitry Andric     if (llvm::Function *CudaCtorFunction = CUDARuntime->makeModuleCtorFunction())
35033956c43SDimitry Andric       AddGlobalCtor(CudaCtorFunction);
35133956c43SDimitry Andric     if (llvm::Function *CudaDtorFunction = CUDARuntime->makeModuleDtorFunction())
35233956c43SDimitry Andric       AddGlobalDtor(CudaDtorFunction);
35333956c43SDimitry Andric   }
35459d1ed5bSDimitry Andric   if (PGOReader && PGOStats.hasDiagnostics())
35559d1ed5bSDimitry Andric     PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName);
356f22ef01cSRoman Divacky   EmitCtorList(GlobalCtors, "llvm.global_ctors");
357f22ef01cSRoman Divacky   EmitCtorList(GlobalDtors, "llvm.global_dtors");
3586122f3e6SDimitry Andric   EmitGlobalAnnotations();
359284c1978SDimitry Andric   EmitStaticExternCAliases();
36039d628a0SDimitry Andric   EmitDeferredUnusedCoverageMappings();
36139d628a0SDimitry Andric   if (CoverageMapping)
36239d628a0SDimitry Andric     CoverageMapping->emit();
36359d1ed5bSDimitry Andric   emitLLVMUsed();
364ffd1746dSEd Schouten 
365f785676fSDimitry Andric   if (CodeGenOpts.Autolink &&
366f785676fSDimitry Andric       (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
367139f7f9bSDimitry Andric     EmitModuleLinkOptions();
368139f7f9bSDimitry Andric   }
369f785676fSDimitry Andric   if (CodeGenOpts.DwarfVersion)
370f785676fSDimitry Andric     // We actually want the latest version when there are conflicts.
371f785676fSDimitry Andric     // We can change from Warning to Latest if such mode is supported.
372f785676fSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
373f785676fSDimitry Andric                               CodeGenOpts.DwarfVersion);
374f785676fSDimitry Andric   if (DebugInfo)
37559d1ed5bSDimitry Andric     // We support a single version in the linked module. The LLVM
37659d1ed5bSDimitry Andric     // parser will drop debug info with a different version number
37759d1ed5bSDimitry Andric     // (and warn about it, too).
37859d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version",
379f785676fSDimitry Andric                               llvm::DEBUG_METADATA_VERSION);
380139f7f9bSDimitry Andric 
38159d1ed5bSDimitry Andric   // We need to record the widths of enums and wchar_t, so that we can generate
38259d1ed5bSDimitry Andric   // the correct build attributes in the ARM backend.
38359d1ed5bSDimitry Andric   llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch();
38459d1ed5bSDimitry Andric   if (   Arch == llvm::Triple::arm
38559d1ed5bSDimitry Andric       || Arch == llvm::Triple::armeb
38659d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumb
38759d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumbeb) {
38859d1ed5bSDimitry Andric     // Width of wchar_t in bytes
38959d1ed5bSDimitry Andric     uint64_t WCharWidth =
39059d1ed5bSDimitry Andric         Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
39159d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth);
39259d1ed5bSDimitry Andric 
39359d1ed5bSDimitry Andric     // The minimum width of an enum in bytes
39459d1ed5bSDimitry Andric     uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
39559d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth);
39659d1ed5bSDimitry Andric   }
39759d1ed5bSDimitry Andric 
39839d628a0SDimitry Andric   if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
39939d628a0SDimitry Andric     llvm::PICLevel::Level PL = llvm::PICLevel::Default;
40039d628a0SDimitry Andric     switch (PLevel) {
40139d628a0SDimitry Andric     case 0: break;
40239d628a0SDimitry Andric     case 1: PL = llvm::PICLevel::Small; break;
40339d628a0SDimitry Andric     case 2: PL = llvm::PICLevel::Large; break;
40439d628a0SDimitry Andric     default: llvm_unreachable("Invalid PIC Level");
40539d628a0SDimitry Andric     }
40639d628a0SDimitry Andric 
40739d628a0SDimitry Andric     getModule().setPICLevel(PL);
40839d628a0SDimitry Andric   }
40939d628a0SDimitry Andric 
4102754fe60SDimitry Andric   SimplifyPersonality();
4112754fe60SDimitry Andric 
412ffd1746dSEd Schouten   if (getCodeGenOpts().EmitDeclMetadata)
413ffd1746dSEd Schouten     EmitDeclMetadata();
414bd5abe19SDimitry Andric 
415bd5abe19SDimitry Andric   if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
416bd5abe19SDimitry Andric     EmitCoverageFile();
4176122f3e6SDimitry Andric 
4186122f3e6SDimitry Andric   if (DebugInfo)
4196122f3e6SDimitry Andric     DebugInfo->finalize();
420f785676fSDimitry Andric 
421f785676fSDimitry Andric   EmitVersionIdentMetadata();
42259d1ed5bSDimitry Andric 
42359d1ed5bSDimitry Andric   EmitTargetMetadata();
424f22ef01cSRoman Divacky }
425f22ef01cSRoman Divacky 
4263b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
4273b0f4066SDimitry Andric   // Make sure that this type is translated.
4283b0f4066SDimitry Andric   Types.UpdateCompletedType(TD);
4293b0f4066SDimitry Andric }
4303b0f4066SDimitry Andric 
4312754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
4322754fe60SDimitry Andric   if (!TBAA)
43359d1ed5bSDimitry Andric     return nullptr;
4342754fe60SDimitry Andric   return TBAA->getTBAAInfo(QTy);
4352754fe60SDimitry Andric }
4362754fe60SDimitry Andric 
437dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
438dff0c46cSDimitry Andric   if (!TBAA)
43959d1ed5bSDimitry Andric     return nullptr;
440dff0c46cSDimitry Andric   return TBAA->getTBAAInfoForVTablePtr();
441dff0c46cSDimitry Andric }
442dff0c46cSDimitry Andric 
4433861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) {
4443861d79fSDimitry Andric   if (!TBAA)
44559d1ed5bSDimitry Andric     return nullptr;
4463861d79fSDimitry Andric   return TBAA->getTBAAStructInfo(QTy);
4473861d79fSDimitry Andric }
4483861d79fSDimitry Andric 
449139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
450139f7f9bSDimitry Andric   if (!TBAA)
45159d1ed5bSDimitry Andric     return nullptr;
452139f7f9bSDimitry Andric   return TBAA->getTBAAStructTypeInfo(QTy);
453139f7f9bSDimitry Andric }
454139f7f9bSDimitry Andric 
455139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
456139f7f9bSDimitry Andric                                                   llvm::MDNode *AccessN,
457139f7f9bSDimitry Andric                                                   uint64_t O) {
458139f7f9bSDimitry Andric   if (!TBAA)
45959d1ed5bSDimitry Andric     return nullptr;
460139f7f9bSDimitry Andric   return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
461139f7f9bSDimitry Andric }
462139f7f9bSDimitry Andric 
463f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA
464f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format:
465f785676fSDimitry Andric /// base type, access type and offset.
466284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type.
4672754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
468284c1978SDimitry Andric                                         llvm::MDNode *TBAAInfo,
469284c1978SDimitry Andric                                         bool ConvertTypeToTag) {
470f785676fSDimitry Andric   if (ConvertTypeToTag && TBAA)
471284c1978SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa,
472284c1978SDimitry Andric                       TBAA->getTBAAScalarTagInfo(TBAAInfo));
473284c1978SDimitry Andric   else
4742754fe60SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
4752754fe60SDimitry Andric }
4762754fe60SDimitry Andric 
47759d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) {
47859d1ed5bSDimitry Andric   unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0");
47959d1ed5bSDimitry Andric   getDiags().Report(Context.getFullLoc(loc), diagID) << message;
480f22ef01cSRoman Divacky }
481f22ef01cSRoman Divacky 
482f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
483f22ef01cSRoman Divacky /// specified stmt yet.
484f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
4856122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
486f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
487f22ef01cSRoman Divacky   std::string Msg = Type;
488f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
489f22ef01cSRoman Divacky     << Msg << S->getSourceRange();
490f22ef01cSRoman Divacky }
491f22ef01cSRoman Divacky 
492f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
493f22ef01cSRoman Divacky /// specified decl yet.
494f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
4956122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
496f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
497f22ef01cSRoman Divacky   std::string Msg = Type;
498f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
499f22ef01cSRoman Divacky }
500f22ef01cSRoman Divacky 
50117a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
50217a519f9SDimitry Andric   return llvm::ConstantInt::get(SizeTy, size.getQuantity());
50317a519f9SDimitry Andric }
50417a519f9SDimitry Andric 
505f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
5062754fe60SDimitry Andric                                         const NamedDecl *D) const {
507f22ef01cSRoman Divacky   // Internal definitions always have default visibility.
508f22ef01cSRoman Divacky   if (GV->hasLocalLinkage()) {
509f22ef01cSRoman Divacky     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
510f22ef01cSRoman Divacky     return;
511f22ef01cSRoman Divacky   }
512f22ef01cSRoman Divacky 
5132754fe60SDimitry Andric   // Set visibility for definitions.
514139f7f9bSDimitry Andric   LinkageInfo LV = D->getLinkageAndVisibility();
515139f7f9bSDimitry Andric   if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
516139f7f9bSDimitry Andric     GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
517f22ef01cSRoman Divacky }
518f22ef01cSRoman Divacky 
5197ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) {
5207ae0e2c9SDimitry Andric   return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
5217ae0e2c9SDimitry Andric       .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
5227ae0e2c9SDimitry Andric       .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
5237ae0e2c9SDimitry Andric       .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
5247ae0e2c9SDimitry Andric       .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel);
5257ae0e2c9SDimitry Andric }
5267ae0e2c9SDimitry Andric 
5277ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(
5287ae0e2c9SDimitry Andric     CodeGenOptions::TLSModel M) {
5297ae0e2c9SDimitry Andric   switch (M) {
5307ae0e2c9SDimitry Andric   case CodeGenOptions::GeneralDynamicTLSModel:
5317ae0e2c9SDimitry Andric     return llvm::GlobalVariable::GeneralDynamicTLSModel;
5327ae0e2c9SDimitry Andric   case CodeGenOptions::LocalDynamicTLSModel:
5337ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalDynamicTLSModel;
5347ae0e2c9SDimitry Andric   case CodeGenOptions::InitialExecTLSModel:
5357ae0e2c9SDimitry Andric     return llvm::GlobalVariable::InitialExecTLSModel;
5367ae0e2c9SDimitry Andric   case CodeGenOptions::LocalExecTLSModel:
5377ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalExecTLSModel;
5387ae0e2c9SDimitry Andric   }
5397ae0e2c9SDimitry Andric   llvm_unreachable("Invalid TLS model!");
5407ae0e2c9SDimitry Andric }
5417ae0e2c9SDimitry Andric 
54239d628a0SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const {
543284c1978SDimitry Andric   assert(D.getTLSKind() && "setting TLS mode on non-TLS var!");
5447ae0e2c9SDimitry Andric 
54539d628a0SDimitry Andric   llvm::GlobalValue::ThreadLocalMode TLM;
5463861d79fSDimitry Andric   TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
5477ae0e2c9SDimitry Andric 
5487ae0e2c9SDimitry Andric   // Override the TLS model if it is explicitly specified.
54959d1ed5bSDimitry Andric   if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) {
5507ae0e2c9SDimitry Andric     TLM = GetLLVMTLSModel(Attr->getModel());
5517ae0e2c9SDimitry Andric   }
5527ae0e2c9SDimitry Andric 
5537ae0e2c9SDimitry Andric   GV->setThreadLocalMode(TLM);
5547ae0e2c9SDimitry Andric }
5557ae0e2c9SDimitry Andric 
5566122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
55759d1ed5bSDimitry Andric   StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()];
55859d1ed5bSDimitry Andric   if (!FoundStr.empty())
55959d1ed5bSDimitry Andric     return FoundStr;
560f22ef01cSRoman Divacky 
56159d1ed5bSDimitry Andric   const auto *ND = cast<NamedDecl>(GD.getDecl());
562dff0c46cSDimitry Andric   SmallString<256> Buffer;
56359d1ed5bSDimitry Andric   StringRef Str;
56459d1ed5bSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) {
5652754fe60SDimitry Andric     llvm::raw_svector_ostream Out(Buffer);
56659d1ed5bSDimitry Andric     if (const auto *D = dyn_cast<CXXConstructorDecl>(ND))
5672754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out);
56859d1ed5bSDimitry Andric     else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND))
5692754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out);
570ffd1746dSEd Schouten     else
5712754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleName(ND, Out);
57259d1ed5bSDimitry Andric     Str = Out.str();
57359d1ed5bSDimitry Andric   } else {
57459d1ed5bSDimitry Andric     IdentifierInfo *II = ND->getIdentifier();
57559d1ed5bSDimitry Andric     assert(II && "Attempt to mangle unnamed decl.");
57659d1ed5bSDimitry Andric     Str = II->getName();
577ffd1746dSEd Schouten   }
578ffd1746dSEd Schouten 
57939d628a0SDimitry Andric   // Keep the first result in the case of a mangling collision.
58039d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Str, GD));
58139d628a0SDimitry Andric   return FoundStr = Result.first->first();
58259d1ed5bSDimitry Andric }
58359d1ed5bSDimitry Andric 
58459d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD,
585ffd1746dSEd Schouten                                              const BlockDecl *BD) {
5862754fe60SDimitry Andric   MangleContext &MangleCtx = getCXXABI().getMangleContext();
5872754fe60SDimitry Andric   const Decl *D = GD.getDecl();
58859d1ed5bSDimitry Andric 
58959d1ed5bSDimitry Andric   SmallString<256> Buffer;
59059d1ed5bSDimitry Andric   llvm::raw_svector_ostream Out(Buffer);
59159d1ed5bSDimitry Andric   if (!D)
5927ae0e2c9SDimitry Andric     MangleCtx.mangleGlobalBlock(BD,
5937ae0e2c9SDimitry Andric       dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
59459d1ed5bSDimitry Andric   else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D))
5952754fe60SDimitry Andric     MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out);
59659d1ed5bSDimitry Andric   else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D))
5972754fe60SDimitry Andric     MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out);
5982754fe60SDimitry Andric   else
5992754fe60SDimitry Andric     MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out);
60059d1ed5bSDimitry Andric 
60139d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
60239d628a0SDimitry Andric   return Result.first->first();
603f22ef01cSRoman Divacky }
604f22ef01cSRoman Divacky 
6056122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) {
606f22ef01cSRoman Divacky   return getModule().getNamedValue(Name);
607f22ef01cSRoman Divacky }
608f22ef01cSRoman Divacky 
609f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before
610f22ef01cSRoman Divacky /// main() runs.
61159d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority,
61259d1ed5bSDimitry Andric                                   llvm::Constant *AssociatedData) {
613f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
61459d1ed5bSDimitry Andric   GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData));
615f22ef01cSRoman Divacky }
616f22ef01cSRoman Divacky 
617f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called
618f22ef01cSRoman Divacky /// when the module is unloaded.
619f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) {
620f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
62159d1ed5bSDimitry Andric   GlobalDtors.push_back(Structor(Priority, Dtor, nullptr));
622f22ef01cSRoman Divacky }
623f22ef01cSRoman Divacky 
624f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
625f22ef01cSRoman Divacky   // Ctor function type is void()*.
626bd5abe19SDimitry Andric   llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
627f22ef01cSRoman Divacky   llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
628f22ef01cSRoman Divacky 
62959d1ed5bSDimitry Andric   // Get the type of a ctor entry, { i32, void ()*, i8* }.
63059d1ed5bSDimitry Andric   llvm::StructType *CtorStructTy = llvm::StructType::get(
63139d628a0SDimitry Andric       Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, nullptr);
632f22ef01cSRoman Divacky 
633f22ef01cSRoman Divacky   // Construct the constructor and destructor arrays.
634dff0c46cSDimitry Andric   SmallVector<llvm::Constant *, 8> Ctors;
6358f0fd8f6SDimitry Andric   for (const auto &I : Fns) {
636dff0c46cSDimitry Andric     llvm::Constant *S[] = {
6378f0fd8f6SDimitry Andric         llvm::ConstantInt::get(Int32Ty, I.Priority, false),
6388f0fd8f6SDimitry Andric         llvm::ConstantExpr::getBitCast(I.Initializer, CtorPFTy),
6398f0fd8f6SDimitry Andric         (I.AssociatedData
6408f0fd8f6SDimitry Andric              ? llvm::ConstantExpr::getBitCast(I.AssociatedData, VoidPtrTy)
6418f0fd8f6SDimitry Andric              : llvm::Constant::getNullValue(VoidPtrTy))};
642f22ef01cSRoman Divacky     Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
643f22ef01cSRoman Divacky   }
644f22ef01cSRoman Divacky 
645f22ef01cSRoman Divacky   if (!Ctors.empty()) {
646f22ef01cSRoman Divacky     llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
647f22ef01cSRoman Divacky     new llvm::GlobalVariable(TheModule, AT, false,
648f22ef01cSRoman Divacky                              llvm::GlobalValue::AppendingLinkage,
649f22ef01cSRoman Divacky                              llvm::ConstantArray::get(AT, Ctors),
650f22ef01cSRoman Divacky                              GlobalName);
651f22ef01cSRoman Divacky   }
652f22ef01cSRoman Divacky }
653f22ef01cSRoman Divacky 
654f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes
655f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
65659d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
657f785676fSDimitry Andric 
658e580952dSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
659f22ef01cSRoman Divacky 
66059d1ed5bSDimitry Andric   if (isa<CXXDestructorDecl>(D) &&
66159d1ed5bSDimitry Andric       getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
66259d1ed5bSDimitry Andric                                          GD.getDtorType())) {
66359d1ed5bSDimitry Andric     // Destructor variants in the Microsoft C++ ABI are always internal or
66459d1ed5bSDimitry Andric     // linkonce_odr thunks emitted on an as-needed basis.
66559d1ed5bSDimitry Andric     return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
66659d1ed5bSDimitry Andric                                    : llvm::GlobalValue::LinkOnceODRLinkage;
667f22ef01cSRoman Divacky   }
668f22ef01cSRoman Divacky 
66959d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false);
67059d1ed5bSDimitry Andric }
671f22ef01cSRoman Divacky 
67297bc6c73SDimitry Andric void CodeGenModule::setFunctionDLLStorageClass(GlobalDecl GD, llvm::Function *F) {
67397bc6c73SDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
67497bc6c73SDimitry Andric 
67597bc6c73SDimitry Andric   if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
67697bc6c73SDimitry Andric     if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
67797bc6c73SDimitry Andric       // Don't dllexport/import destructor thunks.
67897bc6c73SDimitry Andric       F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
67997bc6c73SDimitry Andric       return;
68097bc6c73SDimitry Andric     }
68197bc6c73SDimitry Andric   }
68297bc6c73SDimitry Andric 
68397bc6c73SDimitry Andric   if (FD->hasAttr<DLLImportAttr>())
68497bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
68597bc6c73SDimitry Andric   else if (FD->hasAttr<DLLExportAttr>())
68697bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
68797bc6c73SDimitry Andric   else
68897bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
68997bc6c73SDimitry Andric }
69097bc6c73SDimitry Andric 
69159d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D,
69259d1ed5bSDimitry Andric                                                     llvm::Function *F) {
69359d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
694f22ef01cSRoman Divacky }
695f22ef01cSRoman Divacky 
696f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D,
697f22ef01cSRoman Divacky                                               const CGFunctionInfo &Info,
698f22ef01cSRoman Divacky                                               llvm::Function *F) {
699f22ef01cSRoman Divacky   unsigned CallingConv;
700f22ef01cSRoman Divacky   AttributeListType AttributeList;
701139f7f9bSDimitry Andric   ConstructAttributeList(Info, D, AttributeList, CallingConv, false);
702139f7f9bSDimitry Andric   F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList));
703f22ef01cSRoman Divacky   F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
704f22ef01cSRoman Divacky }
705f22ef01cSRoman Divacky 
7066122f3e6SDimitry Andric /// Determines whether the language options require us to model
7076122f3e6SDimitry Andric /// unwind exceptions.  We treat -fexceptions as mandating this
7086122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions
7096122f3e6SDimitry Andric /// enabled.  This means, for example, that C with -fexceptions
7106122f3e6SDimitry Andric /// enables this.
711dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) {
7126122f3e6SDimitry Andric   // If exceptions are completely disabled, obviously this is false.
713dff0c46cSDimitry Andric   if (!LangOpts.Exceptions) return false;
7146122f3e6SDimitry Andric 
7156122f3e6SDimitry Andric   // If C++ exceptions are enabled, this is true.
716dff0c46cSDimitry Andric   if (LangOpts.CXXExceptions) return true;
7176122f3e6SDimitry Andric 
7186122f3e6SDimitry Andric   // If ObjC exceptions are enabled, this depends on the ABI.
719dff0c46cSDimitry Andric   if (LangOpts.ObjCExceptions) {
7207ae0e2c9SDimitry Andric     return LangOpts.ObjCRuntime.hasUnwindExceptions();
7216122f3e6SDimitry Andric   }
7226122f3e6SDimitry Andric 
7236122f3e6SDimitry Andric   return true;
7246122f3e6SDimitry Andric }
7256122f3e6SDimitry Andric 
726f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
727f22ef01cSRoman Divacky                                                            llvm::Function *F) {
728f785676fSDimitry Andric   llvm::AttrBuilder B;
729f785676fSDimitry Andric 
730bd5abe19SDimitry Andric   if (CodeGenOpts.UnwindTables)
731f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::UWTable);
732bd5abe19SDimitry Andric 
733dff0c46cSDimitry Andric   if (!hasUnwindExceptions(LangOpts))
734f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoUnwind);
735f22ef01cSRoman Divacky 
7366122f3e6SDimitry Andric   if (D->hasAttr<NakedAttr>()) {
7376122f3e6SDimitry Andric     // Naked implies noinline: we should not be inlining such functions.
738f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Naked);
739f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
74059d1ed5bSDimitry Andric   } else if (D->hasAttr<NoDuplicateAttr>()) {
74159d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::NoDuplicate);
742f785676fSDimitry Andric   } else if (D->hasAttr<NoInlineAttr>()) {
743f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
74459d1ed5bSDimitry Andric   } else if (D->hasAttr<AlwaysInlineAttr>() &&
745f785676fSDimitry Andric              !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
746f785676fSDimitry Andric                                               llvm::Attribute::NoInline)) {
747f785676fSDimitry Andric     // (noinline wins over always_inline, and we can't specify both in IR)
748f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::AlwaysInline);
7496122f3e6SDimitry Andric   }
7502754fe60SDimitry Andric 
751f785676fSDimitry Andric   if (D->hasAttr<ColdAttr>()) {
75239d628a0SDimitry Andric     if (!D->hasAttr<OptimizeNoneAttr>())
753f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::OptimizeForSize);
754f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Cold);
755f785676fSDimitry Andric   }
7563861d79fSDimitry Andric 
7573861d79fSDimitry Andric   if (D->hasAttr<MinSizeAttr>())
758f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::MinSize);
759f22ef01cSRoman Divacky 
7603861d79fSDimitry Andric   if (LangOpts.getStackProtector() == LangOptions::SSPOn)
761f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtect);
76259d1ed5bSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
76359d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectStrong);
7643861d79fSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
765f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectReq);
7663861d79fSDimitry Andric 
767f785676fSDimitry Andric   F->addAttributes(llvm::AttributeSet::FunctionIndex,
768f785676fSDimitry Andric                    llvm::AttributeSet::get(
769f785676fSDimitry Andric                        F->getContext(), llvm::AttributeSet::FunctionIndex, B));
770f785676fSDimitry Andric 
77139d628a0SDimitry Andric   if (D->hasAttr<OptimizeNoneAttr>()) {
77239d628a0SDimitry Andric     // OptimizeNone implies noinline; we should not be inlining such functions.
77339d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::OptimizeNone);
77439d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::NoInline);
77539d628a0SDimitry Andric 
77639d628a0SDimitry Andric     // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline.
77739d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) &&
77839d628a0SDimitry Andric            "OptimizeNone and OptimizeForSize on same function!");
77939d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::MinSize) &&
78039d628a0SDimitry Andric            "OptimizeNone and MinSize on same function!");
78139d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
78239d628a0SDimitry Andric            "OptimizeNone and AlwaysInline on same function!");
78339d628a0SDimitry Andric 
78439d628a0SDimitry Andric     // Attribute 'inlinehint' has no effect on 'optnone' functions.
78539d628a0SDimitry Andric     // Explicitly remove it from the set of function attributes.
78639d628a0SDimitry Andric     F->removeFnAttr(llvm::Attribute::InlineHint);
78739d628a0SDimitry Andric   }
78839d628a0SDimitry Andric 
789f785676fSDimitry Andric   if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
790f785676fSDimitry Andric     F->setUnnamedAddr(true);
79159d1ed5bSDimitry Andric   else if (const auto *MD = dyn_cast<CXXMethodDecl>(D))
792f785676fSDimitry Andric     if (MD->isVirtual())
793f785676fSDimitry Andric       F->setUnnamedAddr(true);
794f785676fSDimitry Andric 
795e580952dSDimitry Andric   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
796e580952dSDimitry Andric   if (alignment)
797e580952dSDimitry Andric     F->setAlignment(alignment);
798e580952dSDimitry Andric 
799f22ef01cSRoman Divacky   // C++ ABI requires 2-byte alignment for member functions.
800f22ef01cSRoman Divacky   if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D))
801f22ef01cSRoman Divacky     F->setAlignment(2);
802f22ef01cSRoman Divacky }
803f22ef01cSRoman Divacky 
804f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D,
805f22ef01cSRoman Divacky                                         llvm::GlobalValue *GV) {
80659d1ed5bSDimitry Andric   if (const auto *ND = dyn_cast<NamedDecl>(D))
8072754fe60SDimitry Andric     setGlobalVisibility(GV, ND);
8082754fe60SDimitry Andric   else
8092754fe60SDimitry Andric     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
810f22ef01cSRoman Divacky 
811f22ef01cSRoman Divacky   if (D->hasAttr<UsedAttr>())
81259d1ed5bSDimitry Andric     addUsedGlobal(GV);
81359d1ed5bSDimitry Andric }
81459d1ed5bSDimitry Andric 
81539d628a0SDimitry Andric void CodeGenModule::setAliasAttributes(const Decl *D,
81639d628a0SDimitry Andric                                        llvm::GlobalValue *GV) {
81739d628a0SDimitry Andric   SetCommonAttributes(D, GV);
81839d628a0SDimitry Andric 
81939d628a0SDimitry Andric   // Process the dllexport attribute based on whether the original definition
82039d628a0SDimitry Andric   // (not necessarily the aliasee) was exported.
82139d628a0SDimitry Andric   if (D->hasAttr<DLLExportAttr>())
82239d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
82339d628a0SDimitry Andric }
82439d628a0SDimitry Andric 
82559d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D,
82659d1ed5bSDimitry Andric                                           llvm::GlobalObject *GO) {
82759d1ed5bSDimitry Andric   SetCommonAttributes(D, GO);
828f22ef01cSRoman Divacky 
829f22ef01cSRoman Divacky   if (const SectionAttr *SA = D->getAttr<SectionAttr>())
83059d1ed5bSDimitry Andric     GO->setSection(SA->getName());
831f22ef01cSRoman Divacky 
83297bc6c73SDimitry Andric   getTargetCodeGenInfo().setTargetAttributes(D, GO, *this);
833f22ef01cSRoman Divacky }
834f22ef01cSRoman Divacky 
835f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
836f22ef01cSRoman Divacky                                                   llvm::Function *F,
837f22ef01cSRoman Divacky                                                   const CGFunctionInfo &FI) {
838f22ef01cSRoman Divacky   SetLLVMFunctionAttributes(D, FI, F);
839f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, F);
840f22ef01cSRoman Divacky 
841f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::InternalLinkage);
842f22ef01cSRoman Divacky 
84359d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
84459d1ed5bSDimitry Andric }
84559d1ed5bSDimitry Andric 
84659d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
84759d1ed5bSDimitry Andric                                          const NamedDecl *ND) {
84859d1ed5bSDimitry Andric   // Set linkage and visibility in case we never see a definition.
84959d1ed5bSDimitry Andric   LinkageInfo LV = ND->getLinkageAndVisibility();
85059d1ed5bSDimitry Andric   if (LV.getLinkage() != ExternalLinkage) {
85159d1ed5bSDimitry Andric     // Don't set internal linkage on declarations.
85259d1ed5bSDimitry Andric   } else {
85359d1ed5bSDimitry Andric     if (ND->hasAttr<DLLImportAttr>()) {
85459d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
85559d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
85659d1ed5bSDimitry Andric     } else if (ND->hasAttr<DLLExportAttr>()) {
85759d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
85859d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
85959d1ed5bSDimitry Andric     } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) {
86059d1ed5bSDimitry Andric       // "extern_weak" is overloaded in LLVM; we probably should have
86159d1ed5bSDimitry Andric       // separate linkage types for this.
86259d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
86359d1ed5bSDimitry Andric     }
86459d1ed5bSDimitry Andric 
86559d1ed5bSDimitry Andric     // Set visibility on a declaration only if it's explicit.
86659d1ed5bSDimitry Andric     if (LV.isVisibilityExplicit())
86759d1ed5bSDimitry Andric       GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
86859d1ed5bSDimitry Andric   }
869f22ef01cSRoman Divacky }
870f22ef01cSRoman Divacky 
87139d628a0SDimitry Andric void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
87239d628a0SDimitry Andric                                           bool IsIncompleteFunction,
87339d628a0SDimitry Andric                                           bool IsThunk) {
87433956c43SDimitry Andric   if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) {
8753b0f4066SDimitry Andric     // If this is an intrinsic function, set the function's attributes
8763b0f4066SDimitry Andric     // to the intrinsic's attributes.
87733956c43SDimitry Andric     F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), IID));
8783b0f4066SDimitry Andric     return;
8793b0f4066SDimitry Andric   }
8803b0f4066SDimitry Andric 
88159d1ed5bSDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
882f22ef01cSRoman Divacky 
883f22ef01cSRoman Divacky   if (!IsIncompleteFunction)
884dff0c46cSDimitry Andric     SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F);
885f22ef01cSRoman Divacky 
88659d1ed5bSDimitry Andric   // Add the Returned attribute for "this", except for iOS 5 and earlier
88759d1ed5bSDimitry Andric   // where substantial code, including the libstdc++ dylib, was compiled with
88859d1ed5bSDimitry Andric   // GCC and does not actually return "this".
88939d628a0SDimitry Andric   if (!IsThunk && getCXXABI().HasThisReturn(GD) &&
89059d1ed5bSDimitry Andric       !(getTarget().getTriple().isiOS() &&
89159d1ed5bSDimitry Andric         getTarget().getTriple().isOSVersionLT(6))) {
892f785676fSDimitry Andric     assert(!F->arg_empty() &&
893f785676fSDimitry Andric            F->arg_begin()->getType()
894f785676fSDimitry Andric              ->canLosslesslyBitCastTo(F->getReturnType()) &&
895f785676fSDimitry Andric            "unexpected this return");
896f785676fSDimitry Andric     F->addAttribute(1, llvm::Attribute::Returned);
897f785676fSDimitry Andric   }
898f785676fSDimitry Andric 
899f22ef01cSRoman Divacky   // Only a few attributes are set on declarations; these may later be
900f22ef01cSRoman Divacky   // overridden by a definition.
901f22ef01cSRoman Divacky 
90259d1ed5bSDimitry Andric   setLinkageAndVisibilityForGV(F, FD);
9032754fe60SDimitry Andric 
904f22ef01cSRoman Divacky   if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
905f22ef01cSRoman Divacky     F->setSection(SA->getName());
906f785676fSDimitry Andric 
907f785676fSDimitry Andric   // A replaceable global allocation function does not act like a builtin by
908f785676fSDimitry Andric   // default, only if it is invoked by a new-expression or delete-expression.
909f785676fSDimitry Andric   if (FD->isReplaceableGlobalAllocationFunction())
910f785676fSDimitry Andric     F->addAttribute(llvm::AttributeSet::FunctionIndex,
911f785676fSDimitry Andric                     llvm::Attribute::NoBuiltin);
912f22ef01cSRoman Divacky }
913f22ef01cSRoman Divacky 
91459d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
915f22ef01cSRoman Divacky   assert(!GV->isDeclaration() &&
916f22ef01cSRoman Divacky          "Only globals with definition can force usage.");
91797bc6c73SDimitry Andric   LLVMUsed.emplace_back(GV);
918f22ef01cSRoman Divacky }
919f22ef01cSRoman Divacky 
92059d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) {
92159d1ed5bSDimitry Andric   assert(!GV->isDeclaration() &&
92259d1ed5bSDimitry Andric          "Only globals with definition can force usage.");
92397bc6c73SDimitry Andric   LLVMCompilerUsed.emplace_back(GV);
92459d1ed5bSDimitry Andric }
92559d1ed5bSDimitry Andric 
92659d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name,
92759d1ed5bSDimitry Andric                      std::vector<llvm::WeakVH> &List) {
928f22ef01cSRoman Divacky   // Don't create llvm.used if there is no need.
92959d1ed5bSDimitry Andric   if (List.empty())
930f22ef01cSRoman Divacky     return;
931f22ef01cSRoman Divacky 
93259d1ed5bSDimitry Andric   // Convert List to what ConstantArray needs.
933dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> UsedArray;
93459d1ed5bSDimitry Andric   UsedArray.resize(List.size());
93559d1ed5bSDimitry Andric   for (unsigned i = 0, e = List.size(); i != e; ++i) {
936f22ef01cSRoman Divacky     UsedArray[i] =
93744f7b0dcSDimitry Andric         llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
93844f7b0dcSDimitry Andric             cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy);
939f22ef01cSRoman Divacky   }
940f22ef01cSRoman Divacky 
941f22ef01cSRoman Divacky   if (UsedArray.empty())
942f22ef01cSRoman Divacky     return;
94359d1ed5bSDimitry Andric   llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
944f22ef01cSRoman Divacky 
94559d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
94659d1ed5bSDimitry Andric       CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,
94759d1ed5bSDimitry Andric       llvm::ConstantArray::get(ATy, UsedArray), Name);
948f22ef01cSRoman Divacky 
949f22ef01cSRoman Divacky   GV->setSection("llvm.metadata");
950f22ef01cSRoman Divacky }
951f22ef01cSRoman Divacky 
95259d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() {
95359d1ed5bSDimitry Andric   emitUsed(*this, "llvm.used", LLVMUsed);
95459d1ed5bSDimitry Andric   emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed);
95559d1ed5bSDimitry Andric }
95659d1ed5bSDimitry Andric 
957f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
95839d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
959f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
960f785676fSDimitry Andric }
961f785676fSDimitry Andric 
962f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) {
963f785676fSDimitry Andric   llvm::SmallString<32> Opt;
964f785676fSDimitry Andric   getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt);
96539d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
966f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
967f785676fSDimitry Andric }
968f785676fSDimitry Andric 
969f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) {
970f785676fSDimitry Andric   llvm::SmallString<24> Opt;
971f785676fSDimitry Andric   getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
97239d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
973f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
974f785676fSDimitry Andric }
975f785676fSDimitry Andric 
976139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules
977139f7f9bSDimitry Andric /// it depends on, using a postorder walk.
97839d628a0SDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod,
97939d628a0SDimitry Andric                                     SmallVectorImpl<llvm::Metadata *> &Metadata,
980139f7f9bSDimitry Andric                                     llvm::SmallPtrSet<Module *, 16> &Visited) {
981139f7f9bSDimitry Andric   // Import this module's parent.
98239d628a0SDimitry Andric   if (Mod->Parent && Visited.insert(Mod->Parent).second) {
983f785676fSDimitry Andric     addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited);
984139f7f9bSDimitry Andric   }
985139f7f9bSDimitry Andric 
986139f7f9bSDimitry Andric   // Import this module's dependencies.
987139f7f9bSDimitry Andric   for (unsigned I = Mod->Imports.size(); I > 0; --I) {
98839d628a0SDimitry Andric     if (Visited.insert(Mod->Imports[I - 1]).second)
989f785676fSDimitry Andric       addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited);
990139f7f9bSDimitry Andric   }
991139f7f9bSDimitry Andric 
992139f7f9bSDimitry Andric   // Add linker options to link against the libraries/frameworks
993139f7f9bSDimitry Andric   // described by this module.
994f785676fSDimitry Andric   llvm::LLVMContext &Context = CGM.getLLVMContext();
995139f7f9bSDimitry Andric   for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) {
996f785676fSDimitry Andric     // Link against a framework.  Frameworks are currently Darwin only, so we
997f785676fSDimitry Andric     // don't to ask TargetCodeGenInfo for the spelling of the linker option.
998139f7f9bSDimitry Andric     if (Mod->LinkLibraries[I-1].IsFramework) {
99939d628a0SDimitry Andric       llvm::Metadata *Args[2] = {
1000139f7f9bSDimitry Andric           llvm::MDString::get(Context, "-framework"),
100139d628a0SDimitry Andric           llvm::MDString::get(Context, Mod->LinkLibraries[I - 1].Library)};
1002139f7f9bSDimitry Andric 
1003139f7f9bSDimitry Andric       Metadata.push_back(llvm::MDNode::get(Context, Args));
1004139f7f9bSDimitry Andric       continue;
1005139f7f9bSDimitry Andric     }
1006139f7f9bSDimitry Andric 
1007139f7f9bSDimitry Andric     // Link against a library.
1008f785676fSDimitry Andric     llvm::SmallString<24> Opt;
1009f785676fSDimitry Andric     CGM.getTargetCodeGenInfo().getDependentLibraryOption(
1010f785676fSDimitry Andric       Mod->LinkLibraries[I-1].Library, Opt);
101139d628a0SDimitry Andric     auto *OptString = llvm::MDString::get(Context, Opt);
1012139f7f9bSDimitry Andric     Metadata.push_back(llvm::MDNode::get(Context, OptString));
1013139f7f9bSDimitry Andric   }
1014139f7f9bSDimitry Andric }
1015139f7f9bSDimitry Andric 
1016139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() {
1017139f7f9bSDimitry Andric   // Collect the set of all of the modules we want to visit to emit link
1018139f7f9bSDimitry Andric   // options, which is essentially the imported modules and all of their
1019139f7f9bSDimitry Andric   // non-explicit child modules.
1020139f7f9bSDimitry Andric   llvm::SetVector<clang::Module *> LinkModules;
1021139f7f9bSDimitry Andric   llvm::SmallPtrSet<clang::Module *, 16> Visited;
1022139f7f9bSDimitry Andric   SmallVector<clang::Module *, 16> Stack;
1023139f7f9bSDimitry Andric 
1024139f7f9bSDimitry Andric   // Seed the stack with imported modules.
10258f0fd8f6SDimitry Andric   for (Module *M : ImportedModules)
10268f0fd8f6SDimitry Andric     if (Visited.insert(M).second)
10278f0fd8f6SDimitry Andric       Stack.push_back(M);
1028139f7f9bSDimitry Andric 
1029139f7f9bSDimitry Andric   // Find all of the modules to import, making a little effort to prune
1030139f7f9bSDimitry Andric   // non-leaf modules.
1031139f7f9bSDimitry Andric   while (!Stack.empty()) {
1032f785676fSDimitry Andric     clang::Module *Mod = Stack.pop_back_val();
1033139f7f9bSDimitry Andric 
1034139f7f9bSDimitry Andric     bool AnyChildren = false;
1035139f7f9bSDimitry Andric 
1036139f7f9bSDimitry Andric     // Visit the submodules of this module.
1037139f7f9bSDimitry Andric     for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(),
1038139f7f9bSDimitry Andric                                         SubEnd = Mod->submodule_end();
1039139f7f9bSDimitry Andric          Sub != SubEnd; ++Sub) {
1040139f7f9bSDimitry Andric       // Skip explicit children; they need to be explicitly imported to be
1041139f7f9bSDimitry Andric       // linked against.
1042139f7f9bSDimitry Andric       if ((*Sub)->IsExplicit)
1043139f7f9bSDimitry Andric         continue;
1044139f7f9bSDimitry Andric 
104539d628a0SDimitry Andric       if (Visited.insert(*Sub).second) {
1046139f7f9bSDimitry Andric         Stack.push_back(*Sub);
1047139f7f9bSDimitry Andric         AnyChildren = true;
1048139f7f9bSDimitry Andric       }
1049139f7f9bSDimitry Andric     }
1050139f7f9bSDimitry Andric 
1051139f7f9bSDimitry Andric     // We didn't find any children, so add this module to the list of
1052139f7f9bSDimitry Andric     // modules to link against.
1053139f7f9bSDimitry Andric     if (!AnyChildren) {
1054139f7f9bSDimitry Andric       LinkModules.insert(Mod);
1055139f7f9bSDimitry Andric     }
1056139f7f9bSDimitry Andric   }
1057139f7f9bSDimitry Andric 
1058139f7f9bSDimitry Andric   // Add link options for all of the imported modules in reverse topological
1059f785676fSDimitry Andric   // order.  We don't do anything to try to order import link flags with respect
1060f785676fSDimitry Andric   // to linker options inserted by things like #pragma comment().
106139d628a0SDimitry Andric   SmallVector<llvm::Metadata *, 16> MetadataArgs;
1062139f7f9bSDimitry Andric   Visited.clear();
10638f0fd8f6SDimitry Andric   for (Module *M : LinkModules)
10648f0fd8f6SDimitry Andric     if (Visited.insert(M).second)
10658f0fd8f6SDimitry Andric       addLinkOptionsPostorder(*this, M, MetadataArgs, Visited);
1066139f7f9bSDimitry Andric   std::reverse(MetadataArgs.begin(), MetadataArgs.end());
1067f785676fSDimitry Andric   LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
1068139f7f9bSDimitry Andric 
1069139f7f9bSDimitry Andric   // Add the linker options metadata flag.
1070139f7f9bSDimitry Andric   getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options",
1071f785676fSDimitry Andric                             llvm::MDNode::get(getLLVMContext(),
1072f785676fSDimitry Andric                                               LinkerOptionsMetadata));
1073139f7f9bSDimitry Andric }
1074139f7f9bSDimitry Andric 
1075f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() {
1076f22ef01cSRoman Divacky   // Emit code for any potentially referenced deferred decls.  Since a
1077f22ef01cSRoman Divacky   // previously unused static decl may become used during the generation of code
1078f22ef01cSRoman Divacky   // for a static function, iterate until no changes are made.
1079f22ef01cSRoman Divacky 
1080f22ef01cSRoman Divacky   if (!DeferredVTables.empty()) {
1081139f7f9bSDimitry Andric     EmitDeferredVTables();
1082139f7f9bSDimitry Andric 
1083139f7f9bSDimitry Andric     // Emitting a v-table doesn't directly cause more v-tables to
1084139f7f9bSDimitry Andric     // become deferred, although it can cause functions to be
1085139f7f9bSDimitry Andric     // emitted that then need those v-tables.
1086139f7f9bSDimitry Andric     assert(DeferredVTables.empty());
1087f22ef01cSRoman Divacky   }
1088f22ef01cSRoman Divacky 
1089139f7f9bSDimitry Andric   // Stop if we're out of both deferred v-tables and deferred declarations.
109033956c43SDimitry Andric   if (DeferredDeclsToEmit.empty())
109133956c43SDimitry Andric     return;
1092139f7f9bSDimitry Andric 
109333956c43SDimitry Andric   // Grab the list of decls to emit. If EmitGlobalDefinition schedules more
109433956c43SDimitry Andric   // work, it will not interfere with this.
109533956c43SDimitry Andric   std::vector<DeferredGlobal> CurDeclsToEmit;
109633956c43SDimitry Andric   CurDeclsToEmit.swap(DeferredDeclsToEmit);
109733956c43SDimitry Andric 
109833956c43SDimitry Andric   for (DeferredGlobal &G : CurDeclsToEmit) {
109959d1ed5bSDimitry Andric     GlobalDecl D = G.GD;
110059d1ed5bSDimitry Andric     llvm::GlobalValue *GV = G.GV;
110133956c43SDimitry Andric     G.GV = nullptr;
1102f22ef01cSRoman Divacky 
110339d628a0SDimitry Andric     assert(!GV || GV == GetGlobalValue(getMangledName(D)));
110439d628a0SDimitry Andric     if (!GV)
110539d628a0SDimitry Andric       GV = GetGlobalValue(getMangledName(D));
110639d628a0SDimitry Andric 
1107f22ef01cSRoman Divacky     // Check to see if we've already emitted this.  This is necessary
1108f22ef01cSRoman Divacky     // for a couple of reasons: first, decls can end up in the
1109f22ef01cSRoman Divacky     // deferred-decls queue multiple times, and second, decls can end
1110f22ef01cSRoman Divacky     // up with definitions in unusual ways (e.g. by an extern inline
1111f22ef01cSRoman Divacky     // function acquiring a strong function redefinition).  Just
1112f22ef01cSRoman Divacky     // ignore these cases.
111339d628a0SDimitry Andric     if (GV && !GV->isDeclaration())
1114f22ef01cSRoman Divacky       continue;
1115f22ef01cSRoman Divacky 
1116f22ef01cSRoman Divacky     // Otherwise, emit the definition and move on to the next one.
111759d1ed5bSDimitry Andric     EmitGlobalDefinition(D, GV);
111833956c43SDimitry Andric 
111933956c43SDimitry Andric     // If we found out that we need to emit more decls, do that recursively.
112033956c43SDimitry Andric     // This has the advantage that the decls are emitted in a DFS and related
112133956c43SDimitry Andric     // ones are close together, which is convenient for testing.
112233956c43SDimitry Andric     if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
112333956c43SDimitry Andric       EmitDeferred();
112433956c43SDimitry Andric       assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
112533956c43SDimitry Andric     }
1126f22ef01cSRoman Divacky   }
1127f22ef01cSRoman Divacky }
1128f22ef01cSRoman Divacky 
11296122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() {
11306122f3e6SDimitry Andric   if (Annotations.empty())
11316122f3e6SDimitry Andric     return;
11326122f3e6SDimitry Andric 
11336122f3e6SDimitry Andric   // Create a new global variable for the ConstantStruct in the Module.
11346122f3e6SDimitry Andric   llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
11356122f3e6SDimitry Andric     Annotations[0]->getType(), Annotations.size()), Annotations);
113659d1ed5bSDimitry Andric   auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false,
113759d1ed5bSDimitry Andric                                       llvm::GlobalValue::AppendingLinkage,
113859d1ed5bSDimitry Andric                                       Array, "llvm.global.annotations");
11396122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11406122f3e6SDimitry Andric }
11416122f3e6SDimitry Andric 
1142139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) {
1143f785676fSDimitry Andric   llvm::Constant *&AStr = AnnotationStrings[Str];
1144f785676fSDimitry Andric   if (AStr)
1145f785676fSDimitry Andric     return AStr;
11466122f3e6SDimitry Andric 
11476122f3e6SDimitry Andric   // Not found yet, create a new global.
1148dff0c46cSDimitry Andric   llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
114959d1ed5bSDimitry Andric   auto *gv =
115059d1ed5bSDimitry Andric       new llvm::GlobalVariable(getModule(), s->getType(), true,
115159d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, s, ".str");
11526122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11536122f3e6SDimitry Andric   gv->setUnnamedAddr(true);
1154f785676fSDimitry Andric   AStr = gv;
11556122f3e6SDimitry Andric   return gv;
11566122f3e6SDimitry Andric }
11576122f3e6SDimitry Andric 
11586122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) {
11596122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11606122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(Loc);
11616122f3e6SDimitry Andric   if (PLoc.isValid())
11626122f3e6SDimitry Andric     return EmitAnnotationString(PLoc.getFilename());
11636122f3e6SDimitry Andric   return EmitAnnotationString(SM.getBufferName(Loc));
11646122f3e6SDimitry Andric }
11656122f3e6SDimitry Andric 
11666122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) {
11676122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11686122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(L);
11696122f3e6SDimitry Andric   unsigned LineNo = PLoc.isValid() ? PLoc.getLine() :
11706122f3e6SDimitry Andric     SM.getExpansionLineNumber(L);
11716122f3e6SDimitry Andric   return llvm::ConstantInt::get(Int32Ty, LineNo);
11726122f3e6SDimitry Andric }
11736122f3e6SDimitry Andric 
1174f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
1175f22ef01cSRoman Divacky                                                 const AnnotateAttr *AA,
11766122f3e6SDimitry Andric                                                 SourceLocation L) {
11776122f3e6SDimitry Andric   // Get the globals for file name, annotation, and the line number.
11786122f3e6SDimitry Andric   llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()),
11796122f3e6SDimitry Andric                  *UnitGV = EmitAnnotationUnit(L),
11806122f3e6SDimitry Andric                  *LineNoCst = EmitAnnotationLineNo(L);
1181f22ef01cSRoman Divacky 
1182f22ef01cSRoman Divacky   // Create the ConstantStruct for the global annotation.
1183f22ef01cSRoman Divacky   llvm::Constant *Fields[4] = {
11846122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
11856122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
11866122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
11876122f3e6SDimitry Andric     LineNoCst
1188f22ef01cSRoman Divacky   };
118917a519f9SDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
1190f22ef01cSRoman Divacky }
1191f22ef01cSRoman Divacky 
11926122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
11936122f3e6SDimitry Andric                                          llvm::GlobalValue *GV) {
11946122f3e6SDimitry Andric   assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
11956122f3e6SDimitry Andric   // Get the struct elements for these annotations.
119659d1ed5bSDimitry Andric   for (const auto *I : D->specific_attrs<AnnotateAttr>())
119759d1ed5bSDimitry Andric     Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation()));
11986122f3e6SDimitry Andric }
11996122f3e6SDimitry Andric 
120039d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::Function *Fn,
120139d628a0SDimitry Andric                                            SourceLocation Loc) const {
120239d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
120339d628a0SDimitry Andric   // Blacklist by function name.
120439d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedFunction(Fn->getName()))
120539d628a0SDimitry Andric     return true;
120639d628a0SDimitry Andric   // Blacklist by location.
120739d628a0SDimitry Andric   if (!Loc.isInvalid())
120839d628a0SDimitry Andric     return SanitizerBL.isBlacklistedLocation(Loc);
120939d628a0SDimitry Andric   // If location is unknown, this may be a compiler-generated function. Assume
121039d628a0SDimitry Andric   // it's located in the main file.
121139d628a0SDimitry Andric   auto &SM = Context.getSourceManager();
121239d628a0SDimitry Andric   if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
121339d628a0SDimitry Andric     return SanitizerBL.isBlacklistedFile(MainFile->getName());
121439d628a0SDimitry Andric   }
121539d628a0SDimitry Andric   return false;
121639d628a0SDimitry Andric }
121739d628a0SDimitry Andric 
121839d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::GlobalVariable *GV,
121939d628a0SDimitry Andric                                            SourceLocation Loc, QualType Ty,
122039d628a0SDimitry Andric                                            StringRef Category) const {
12218f0fd8f6SDimitry Andric   // For now globals can be blacklisted only in ASan and KASan.
12228f0fd8f6SDimitry Andric   if (!LangOpts.Sanitize.hasOneOf(
12238f0fd8f6SDimitry Andric           SanitizerKind::Address | SanitizerKind::KernelAddress))
122439d628a0SDimitry Andric     return false;
122539d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
122639d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedGlobal(GV->getName(), Category))
122739d628a0SDimitry Andric     return true;
122839d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedLocation(Loc, Category))
122939d628a0SDimitry Andric     return true;
123039d628a0SDimitry Andric   // Check global type.
123139d628a0SDimitry Andric   if (!Ty.isNull()) {
123239d628a0SDimitry Andric     // Drill down the array types: if global variable of a fixed type is
123339d628a0SDimitry Andric     // blacklisted, we also don't instrument arrays of them.
123439d628a0SDimitry Andric     while (auto AT = dyn_cast<ArrayType>(Ty.getTypePtr()))
123539d628a0SDimitry Andric       Ty = AT->getElementType();
123639d628a0SDimitry Andric     Ty = Ty.getCanonicalType().getUnqualifiedType();
123739d628a0SDimitry Andric     // We allow to blacklist only record types (classes, structs etc.)
123839d628a0SDimitry Andric     if (Ty->isRecordType()) {
123939d628a0SDimitry Andric       std::string TypeStr = Ty.getAsString(getContext().getPrintingPolicy());
124039d628a0SDimitry Andric       if (SanitizerBL.isBlacklistedType(TypeStr, Category))
124139d628a0SDimitry Andric         return true;
124239d628a0SDimitry Andric     }
124339d628a0SDimitry Andric   }
124439d628a0SDimitry Andric   return false;
124539d628a0SDimitry Andric }
124639d628a0SDimitry Andric 
124739d628a0SDimitry Andric bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) {
1248e580952dSDimitry Andric   // Never defer when EmitAllDecls is specified.
1249dff0c46cSDimitry Andric   if (LangOpts.EmitAllDecls)
125039d628a0SDimitry Andric     return true;
125139d628a0SDimitry Andric 
125239d628a0SDimitry Andric   return getContext().DeclMustBeEmitted(Global);
125339d628a0SDimitry Andric }
125439d628a0SDimitry Andric 
125539d628a0SDimitry Andric bool CodeGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
125639d628a0SDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global))
125739d628a0SDimitry Andric     if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
125839d628a0SDimitry Andric       // Implicit template instantiations may change linkage if they are later
125939d628a0SDimitry Andric       // explicitly instantiated, so they should not be emitted eagerly.
1260f22ef01cSRoman Divacky       return false;
1261f22ef01cSRoman Divacky 
126239d628a0SDimitry Andric   return true;
1263f22ef01cSRoman Divacky }
1264f22ef01cSRoman Divacky 
12653861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
12663861d79fSDimitry Andric     const CXXUuidofExpr* E) {
12673861d79fSDimitry Andric   // Sema has verified that IIDSource has a __declspec(uuid()), and that its
12683861d79fSDimitry Andric   // well-formed.
1269f785676fSDimitry Andric   StringRef Uuid = E->getUuidAsStringRef(Context);
1270f785676fSDimitry Andric   std::string Name = "_GUID_" + Uuid.lower();
1271f785676fSDimitry Andric   std::replace(Name.begin(), Name.end(), '-', '_');
12723861d79fSDimitry Andric 
12733861d79fSDimitry Andric   // Look for an existing global.
12743861d79fSDimitry Andric   if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
12753861d79fSDimitry Andric     return GV;
12763861d79fSDimitry Andric 
127739d628a0SDimitry Andric   llvm::Constant *Init = EmitUuidofInitializer(Uuid);
12783861d79fSDimitry Andric   assert(Init && "failed to initialize as constant");
12793861d79fSDimitry Andric 
128059d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
1281f785676fSDimitry Andric       getModule(), Init->getType(),
1282f785676fSDimitry Andric       /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
128333956c43SDimitry Andric   if (supportsCOMDAT())
128433956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
12853861d79fSDimitry Andric   return GV;
12863861d79fSDimitry Andric }
12873861d79fSDimitry Andric 
1288f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
1289f22ef01cSRoman Divacky   const AliasAttr *AA = VD->getAttr<AliasAttr>();
1290f22ef01cSRoman Divacky   assert(AA && "No alias?");
1291f22ef01cSRoman Divacky 
12926122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType());
1293f22ef01cSRoman Divacky 
1294f22ef01cSRoman Divacky   // See if there is already something with the target's name in the module.
1295f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
12963861d79fSDimitry Andric   if (Entry) {
12973861d79fSDimitry Andric     unsigned AS = getContext().getTargetAddressSpace(VD->getType());
12983861d79fSDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
12993861d79fSDimitry Andric   }
1300f22ef01cSRoman Divacky 
1301f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
1302f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
13033861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
13043861d79fSDimitry Andric                                       GlobalDecl(cast<FunctionDecl>(VD)),
13052754fe60SDimitry Andric                                       /*ForVTable=*/false);
1306f22ef01cSRoman Divacky   else
1307f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
130859d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
130959d1ed5bSDimitry Andric                                     nullptr);
13103861d79fSDimitry Andric 
131159d1ed5bSDimitry Andric   auto *F = cast<llvm::GlobalValue>(Aliasee);
1312f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::ExternalWeakLinkage);
1313f22ef01cSRoman Divacky   WeakRefReferences.insert(F);
1314f22ef01cSRoman Divacky 
1315f22ef01cSRoman Divacky   return Aliasee;
1316f22ef01cSRoman Divacky }
1317f22ef01cSRoman Divacky 
1318f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) {
131959d1ed5bSDimitry Andric   const auto *Global = cast<ValueDecl>(GD.getDecl());
1320f22ef01cSRoman Divacky 
1321f22ef01cSRoman Divacky   // Weak references don't produce any output by themselves.
1322f22ef01cSRoman Divacky   if (Global->hasAttr<WeakRefAttr>())
1323f22ef01cSRoman Divacky     return;
1324f22ef01cSRoman Divacky 
1325f22ef01cSRoman Divacky   // If this is an alias definition (which otherwise looks like a declaration)
1326f22ef01cSRoman Divacky   // emit it now.
1327f22ef01cSRoman Divacky   if (Global->hasAttr<AliasAttr>())
1328f22ef01cSRoman Divacky     return EmitAliasDefinition(GD);
1329f22ef01cSRoman Divacky 
13306122f3e6SDimitry Andric   // If this is CUDA, be selective about which declarations we emit.
1331dff0c46cSDimitry Andric   if (LangOpts.CUDA) {
133233956c43SDimitry Andric     if (LangOpts.CUDAIsDevice) {
13336122f3e6SDimitry Andric       if (!Global->hasAttr<CUDADeviceAttr>() &&
13346122f3e6SDimitry Andric           !Global->hasAttr<CUDAGlobalAttr>() &&
13356122f3e6SDimitry Andric           !Global->hasAttr<CUDAConstantAttr>() &&
13366122f3e6SDimitry Andric           !Global->hasAttr<CUDASharedAttr>())
13376122f3e6SDimitry Andric         return;
13386122f3e6SDimitry Andric     } else {
13396122f3e6SDimitry Andric       if (!Global->hasAttr<CUDAHostAttr>() && (
13406122f3e6SDimitry Andric             Global->hasAttr<CUDADeviceAttr>() ||
13416122f3e6SDimitry Andric             Global->hasAttr<CUDAConstantAttr>() ||
13426122f3e6SDimitry Andric             Global->hasAttr<CUDASharedAttr>()))
13436122f3e6SDimitry Andric         return;
1344e580952dSDimitry Andric     }
1345e580952dSDimitry Andric   }
1346e580952dSDimitry Andric 
13476122f3e6SDimitry Andric   // Ignore declarations, they will be emitted on their first use.
134859d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
1349f22ef01cSRoman Divacky     // Forward declarations are emitted lazily on first use.
13506122f3e6SDimitry Andric     if (!FD->doesThisDeclarationHaveABody()) {
13516122f3e6SDimitry Andric       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
1352f22ef01cSRoman Divacky         return;
13536122f3e6SDimitry Andric 
13546122f3e6SDimitry Andric       StringRef MangledName = getMangledName(GD);
135559d1ed5bSDimitry Andric 
135659d1ed5bSDimitry Andric       // Compute the function info and LLVM type.
135759d1ed5bSDimitry Andric       const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
135859d1ed5bSDimitry Andric       llvm::Type *Ty = getTypes().GetFunctionType(FI);
135959d1ed5bSDimitry Andric 
136059d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false,
136159d1ed5bSDimitry Andric                               /*DontDefer=*/false);
13626122f3e6SDimitry Andric       return;
13636122f3e6SDimitry Andric     }
1364f22ef01cSRoman Divacky   } else {
136559d1ed5bSDimitry Andric     const auto *VD = cast<VarDecl>(Global);
1366f22ef01cSRoman Divacky     assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
1367f22ef01cSRoman Divacky 
136859d1ed5bSDimitry Andric     if (VD->isThisDeclarationADefinition() != VarDecl::Definition &&
136959d1ed5bSDimitry Andric         !Context.isMSStaticDataMemberInlineDefinition(VD))
1370f22ef01cSRoman Divacky       return;
1371f22ef01cSRoman Divacky   }
1372f22ef01cSRoman Divacky 
137339d628a0SDimitry Andric   // Defer code generation to first use when possible, e.g. if this is an inline
137439d628a0SDimitry Andric   // function. If the global must always be emitted, do it eagerly if possible
137539d628a0SDimitry Andric   // to benefit from cache locality.
137639d628a0SDimitry Andric   if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) {
1377f22ef01cSRoman Divacky     // Emit the definition if it can't be deferred.
1378f22ef01cSRoman Divacky     EmitGlobalDefinition(GD);
1379f22ef01cSRoman Divacky     return;
1380f22ef01cSRoman Divacky   }
1381f22ef01cSRoman Divacky 
1382e580952dSDimitry Andric   // If we're deferring emission of a C++ variable with an
1383e580952dSDimitry Andric   // initializer, remember the order in which it appeared in the file.
1384dff0c46cSDimitry Andric   if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) &&
1385e580952dSDimitry Andric       cast<VarDecl>(Global)->hasInit()) {
1386e580952dSDimitry Andric     DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
138759d1ed5bSDimitry Andric     CXXGlobalInits.push_back(nullptr);
1388e580952dSDimitry Andric   }
1389e580952dSDimitry Andric 
13906122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
139139d628a0SDimitry Andric   if (llvm::GlobalValue *GV = GetGlobalValue(MangledName)) {
139239d628a0SDimitry Andric     // The value has already been used and should therefore be emitted.
139359d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, GD);
139439d628a0SDimitry Andric   } else if (MustBeEmitted(Global)) {
139539d628a0SDimitry Andric     // The value must be emitted, but cannot be emitted eagerly.
139639d628a0SDimitry Andric     assert(!MayBeEmittedEagerly(Global));
139739d628a0SDimitry Andric     addDeferredDeclToEmit(/*GV=*/nullptr, GD);
139839d628a0SDimitry Andric   } else {
1399f22ef01cSRoman Divacky     // Otherwise, remember that we saw a deferred decl with this name.  The
1400f22ef01cSRoman Divacky     // first use of the mangled name will cause it to move into
1401f22ef01cSRoman Divacky     // DeferredDeclsToEmit.
1402f22ef01cSRoman Divacky     DeferredDecls[MangledName] = GD;
1403f22ef01cSRoman Divacky   }
1404f22ef01cSRoman Divacky }
1405f22ef01cSRoman Divacky 
1406f8254f43SDimitry Andric namespace {
1407f8254f43SDimitry Andric   struct FunctionIsDirectlyRecursive :
1408f8254f43SDimitry Andric     public RecursiveASTVisitor<FunctionIsDirectlyRecursive> {
1409f8254f43SDimitry Andric     const StringRef Name;
1410dff0c46cSDimitry Andric     const Builtin::Context &BI;
1411f8254f43SDimitry Andric     bool Result;
1412dff0c46cSDimitry Andric     FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) :
1413dff0c46cSDimitry Andric       Name(N), BI(C), Result(false) {
1414f8254f43SDimitry Andric     }
1415f8254f43SDimitry Andric     typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base;
1416f8254f43SDimitry Andric 
1417f8254f43SDimitry Andric     bool TraverseCallExpr(CallExpr *E) {
1418dff0c46cSDimitry Andric       const FunctionDecl *FD = E->getDirectCallee();
1419dff0c46cSDimitry Andric       if (!FD)
1420f8254f43SDimitry Andric         return true;
1421dff0c46cSDimitry Andric       AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1422dff0c46cSDimitry Andric       if (Attr && Name == Attr->getLabel()) {
1423dff0c46cSDimitry Andric         Result = true;
1424dff0c46cSDimitry Andric         return false;
1425dff0c46cSDimitry Andric       }
1426dff0c46cSDimitry Andric       unsigned BuiltinID = FD->getBuiltinID();
1427dff0c46cSDimitry Andric       if (!BuiltinID)
1428f8254f43SDimitry Andric         return true;
1429dff0c46cSDimitry Andric       StringRef BuiltinName = BI.GetName(BuiltinID);
1430dff0c46cSDimitry Andric       if (BuiltinName.startswith("__builtin_") &&
1431dff0c46cSDimitry Andric           Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) {
1432f8254f43SDimitry Andric         Result = true;
1433f8254f43SDimitry Andric         return false;
1434f8254f43SDimitry Andric       }
1435f8254f43SDimitry Andric       return true;
1436f8254f43SDimitry Andric     }
1437f8254f43SDimitry Andric   };
1438f8254f43SDimitry Andric }
1439f8254f43SDimitry Andric 
1440dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another
1441dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin,
1442dff0c46cSDimitry Andric // ends up pointing to itself.
1443f8254f43SDimitry Andric bool
1444dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) {
1445dff0c46cSDimitry Andric   StringRef Name;
1446dff0c46cSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
1447dff0c46cSDimitry Andric     // asm labels are a special kind of mangling we have to support.
1448dff0c46cSDimitry Andric     AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1449dff0c46cSDimitry Andric     if (!Attr)
1450f8254f43SDimitry Andric       return false;
1451dff0c46cSDimitry Andric     Name = Attr->getLabel();
1452dff0c46cSDimitry Andric   } else {
1453dff0c46cSDimitry Andric     Name = FD->getName();
1454dff0c46cSDimitry Andric   }
1455f8254f43SDimitry Andric 
1456dff0c46cSDimitry Andric   FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
1457dff0c46cSDimitry Andric   Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
1458f8254f43SDimitry Andric   return Walker.Result;
1459f8254f43SDimitry Andric }
1460f8254f43SDimitry Andric 
1461f8254f43SDimitry Andric bool
1462f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
1463f785676fSDimitry Andric   if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage)
1464f8254f43SDimitry Andric     return true;
146559d1ed5bSDimitry Andric   const auto *F = cast<FunctionDecl>(GD.getDecl());
146659d1ed5bSDimitry Andric   if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
1467f8254f43SDimitry Andric     return false;
1468f8254f43SDimitry Andric   // PR9614. Avoid cases where the source code is lying to us. An available
1469f8254f43SDimitry Andric   // externally function should have an equivalent function somewhere else,
1470f8254f43SDimitry Andric   // but a function that calls itself is clearly not equivalent to the real
1471f8254f43SDimitry Andric   // implementation.
1472f8254f43SDimitry Andric   // This happens in glibc's btowc and in some configure checks.
1473dff0c46cSDimitry Andric   return !isTriviallyRecursive(F);
1474f8254f43SDimitry Andric }
1475f8254f43SDimitry Andric 
1476f785676fSDimitry Andric /// If the type for the method's class was generated by
1477f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a
1478f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart()
1479f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need
1480f785676fSDimitry Andric /// to construct the complete type prior to emitting the method.
1481f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) {
1482f785676fSDimitry Andric   if (!D->isInstance())
1483f785676fSDimitry Andric     return;
1484f785676fSDimitry Andric 
1485f785676fSDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
1486f785676fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
148759d1ed5bSDimitry Andric       const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext()));
1488f785676fSDimitry Andric       DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation());
1489f785676fSDimitry Andric     }
1490f785676fSDimitry Andric }
1491f785676fSDimitry Andric 
149259d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
149359d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
1494f22ef01cSRoman Divacky 
1495f22ef01cSRoman Divacky   PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(),
1496f22ef01cSRoman Divacky                                  Context.getSourceManager(),
1497f22ef01cSRoman Divacky                                  "Generating code for declaration");
1498f22ef01cSRoman Divacky 
1499f785676fSDimitry Andric   if (isa<FunctionDecl>(D)) {
1500ffd1746dSEd Schouten     // At -O0, don't generate IR for functions with available_externally
1501ffd1746dSEd Schouten     // linkage.
1502f785676fSDimitry Andric     if (!shouldEmitFunction(GD))
1503ffd1746dSEd Schouten       return;
1504ffd1746dSEd Schouten 
150559d1ed5bSDimitry Andric     if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
1506f785676fSDimitry Andric       CompleteDIClassType(Method);
1507bd5abe19SDimitry Andric       // Make sure to emit the definition(s) before we emit the thunks.
1508bd5abe19SDimitry Andric       // This is necessary for the generation of certain thunks.
150959d1ed5bSDimitry Andric       if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method))
151039d628a0SDimitry Andric         ABI->emitCXXStructor(CD, getFromCtorType(GD.getCtorType()));
151159d1ed5bSDimitry Andric       else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method))
151239d628a0SDimitry Andric         ABI->emitCXXStructor(DD, getFromDtorType(GD.getDtorType()));
1513bd5abe19SDimitry Andric       else
151459d1ed5bSDimitry Andric         EmitGlobalFunctionDefinition(GD, GV);
1515bd5abe19SDimitry Andric 
1516f22ef01cSRoman Divacky       if (Method->isVirtual())
1517f22ef01cSRoman Divacky         getVTables().EmitThunks(GD);
1518f22ef01cSRoman Divacky 
1519bd5abe19SDimitry Andric       return;
1520ffd1746dSEd Schouten     }
1521f22ef01cSRoman Divacky 
152259d1ed5bSDimitry Andric     return EmitGlobalFunctionDefinition(GD, GV);
1523ffd1746dSEd Schouten   }
1524f22ef01cSRoman Divacky 
152559d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
1526f22ef01cSRoman Divacky     return EmitGlobalVarDefinition(VD);
1527f22ef01cSRoman Divacky 
15286122f3e6SDimitry Andric   llvm_unreachable("Invalid argument to EmitGlobalDefinition()");
1529f22ef01cSRoman Divacky }
1530f22ef01cSRoman Divacky 
1531f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the
1532f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there
1533f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1534f22ef01cSRoman Divacky /// bitcasted to the right type.
1535f22ef01cSRoman Divacky ///
1536f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1537f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created.
1538f22ef01cSRoman Divacky llvm::Constant *
15396122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
15406122f3e6SDimitry Andric                                        llvm::Type *Ty,
1541f785676fSDimitry Andric                                        GlobalDecl GD, bool ForVTable,
154239d628a0SDimitry Andric                                        bool DontDefer, bool IsThunk,
1543139f7f9bSDimitry Andric                                        llvm::AttributeSet ExtraAttrs) {
1544f785676fSDimitry Andric   const Decl *D = GD.getDecl();
1545f785676fSDimitry Andric 
1546f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1547f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1548f22ef01cSRoman Divacky   if (Entry) {
15493861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1550f785676fSDimitry Andric       const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
1551f22ef01cSRoman Divacky       if (FD && !FD->hasAttr<WeakAttr>())
1552f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1553f22ef01cSRoman Divacky     }
1554f22ef01cSRoman Divacky 
155539d628a0SDimitry Andric     // Handle dropped DLL attributes.
155639d628a0SDimitry Andric     if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
155739d628a0SDimitry Andric       Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
155839d628a0SDimitry Andric 
1559f22ef01cSRoman Divacky     if (Entry->getType()->getElementType() == Ty)
1560f22ef01cSRoman Divacky       return Entry;
1561f22ef01cSRoman Divacky 
1562f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
156317a519f9SDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
1564f22ef01cSRoman Divacky   }
1565f22ef01cSRoman Divacky 
1566f22ef01cSRoman Divacky   // This function doesn't have a complete type (for example, the return
1567f22ef01cSRoman Divacky   // type is an incomplete struct). Use a fake type instead, and make
1568f22ef01cSRoman Divacky   // sure not to try to set attributes.
1569f22ef01cSRoman Divacky   bool IsIncompleteFunction = false;
1570f22ef01cSRoman Divacky 
15716122f3e6SDimitry Andric   llvm::FunctionType *FTy;
1572f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(Ty)) {
1573f22ef01cSRoman Divacky     FTy = cast<llvm::FunctionType>(Ty);
1574f22ef01cSRoman Divacky   } else {
1575bd5abe19SDimitry Andric     FTy = llvm::FunctionType::get(VoidTy, false);
1576f22ef01cSRoman Divacky     IsIncompleteFunction = true;
1577f22ef01cSRoman Divacky   }
1578ffd1746dSEd Schouten 
1579f22ef01cSRoman Divacky   llvm::Function *F = llvm::Function::Create(FTy,
1580f22ef01cSRoman Divacky                                              llvm::Function::ExternalLinkage,
1581f22ef01cSRoman Divacky                                              MangledName, &getModule());
1582f22ef01cSRoman Divacky   assert(F->getName() == MangledName && "name was uniqued!");
1583f785676fSDimitry Andric   if (D)
158439d628a0SDimitry Andric     SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
1585139f7f9bSDimitry Andric   if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) {
1586139f7f9bSDimitry Andric     llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex);
1587139f7f9bSDimitry Andric     F->addAttributes(llvm::AttributeSet::FunctionIndex,
1588139f7f9bSDimitry Andric                      llvm::AttributeSet::get(VMContext,
1589139f7f9bSDimitry Andric                                              llvm::AttributeSet::FunctionIndex,
1590139f7f9bSDimitry Andric                                              B));
1591139f7f9bSDimitry Andric   }
1592f22ef01cSRoman Divacky 
159359d1ed5bSDimitry Andric   if (!DontDefer) {
159459d1ed5bSDimitry Andric     // All MSVC dtors other than the base dtor are linkonce_odr and delegate to
159559d1ed5bSDimitry Andric     // each other bottoming out with the base dtor.  Therefore we emit non-base
159659d1ed5bSDimitry Andric     // dtors on usage, even if there is no dtor definition in the TU.
159759d1ed5bSDimitry Andric     if (D && isa<CXXDestructorDecl>(D) &&
159859d1ed5bSDimitry Andric         getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
159959d1ed5bSDimitry Andric                                            GD.getDtorType()))
160059d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
160159d1ed5bSDimitry Andric 
1602f22ef01cSRoman Divacky     // This is the first use or definition of a mangled name.  If there is a
1603f22ef01cSRoman Divacky     // deferred decl with this name, remember that we need to emit it at the end
1604f22ef01cSRoman Divacky     // of the file.
160559d1ed5bSDimitry Andric     auto DDI = DeferredDecls.find(MangledName);
1606f22ef01cSRoman Divacky     if (DDI != DeferredDecls.end()) {
160759d1ed5bSDimitry Andric       // Move the potentially referenced deferred decl to the
160859d1ed5bSDimitry Andric       // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we
160959d1ed5bSDimitry Andric       // don't need it anymore).
161059d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, DDI->second);
1611f22ef01cSRoman Divacky       DeferredDecls.erase(DDI);
16122754fe60SDimitry 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 
176933956c43SDimitry Andric     GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
177033956c43SDimitry Andric 
177159d1ed5bSDimitry Andric     setLinkageAndVisibilityForGV(GV, D);
17722754fe60SDimitry Andric 
1773284c1978SDimitry Andric     if (D->getTLSKind()) {
1774284c1978SDimitry Andric       if (D->getTLSKind() == VarDecl::TLS_Dynamic)
1775284c1978SDimitry Andric         CXXThreadLocals.push_back(std::make_pair(D, GV));
17767ae0e2c9SDimitry Andric       setTLSMode(GV, *D);
1777f22ef01cSRoman Divacky     }
1778f785676fSDimitry Andric 
1779f785676fSDimitry Andric     // If required by the ABI, treat declarations of static data members with
1780f785676fSDimitry Andric     // inline initializers as definitions.
178159d1ed5bSDimitry Andric     if (getContext().isMSStaticDataMemberInlineDefinition(D)) {
1782f785676fSDimitry Andric       EmitGlobalVarDefinition(D);
1783284c1978SDimitry Andric     }
1784f22ef01cSRoman Divacky 
178559d1ed5bSDimitry Andric     // Handle XCore specific ABI requirements.
178659d1ed5bSDimitry Andric     if (getTarget().getTriple().getArch() == llvm::Triple::xcore &&
178759d1ed5bSDimitry Andric         D->getLanguageLinkage() == CLanguageLinkage &&
178859d1ed5bSDimitry Andric         D->getType().isConstant(Context) &&
178959d1ed5bSDimitry Andric         isExternallyVisible(D->getLinkageAndVisibility().getLinkage()))
179059d1ed5bSDimitry Andric       GV->setSection(".cp.rodata");
179159d1ed5bSDimitry Andric   }
179259d1ed5bSDimitry Andric 
17937ae0e2c9SDimitry Andric   if (AddrSpace != Ty->getAddressSpace())
1794f785676fSDimitry Andric     return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty);
1795f785676fSDimitry Andric 
1796f22ef01cSRoman Divacky   return GV;
1797f22ef01cSRoman Divacky }
1798f22ef01cSRoman Divacky 
1799f22ef01cSRoman Divacky 
18002754fe60SDimitry Andric llvm::GlobalVariable *
18016122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
18026122f3e6SDimitry Andric                                       llvm::Type *Ty,
18032754fe60SDimitry Andric                                       llvm::GlobalValue::LinkageTypes Linkage) {
18042754fe60SDimitry Andric   llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name);
180559d1ed5bSDimitry Andric   llvm::GlobalVariable *OldGV = nullptr;
18062754fe60SDimitry Andric 
18072754fe60SDimitry Andric   if (GV) {
18082754fe60SDimitry Andric     // Check if the variable has the right type.
18092754fe60SDimitry Andric     if (GV->getType()->getElementType() == Ty)
18102754fe60SDimitry Andric       return GV;
18112754fe60SDimitry Andric 
18122754fe60SDimitry Andric     // Because C++ name mangling, the only way we can end up with an already
18132754fe60SDimitry Andric     // existing global with the same name is if it has been declared extern "C".
18142754fe60SDimitry Andric     assert(GV->isDeclaration() && "Declaration has wrong type!");
18152754fe60SDimitry Andric     OldGV = GV;
18162754fe60SDimitry Andric   }
18172754fe60SDimitry Andric 
18182754fe60SDimitry Andric   // Create a new variable.
18192754fe60SDimitry Andric   GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true,
182059d1ed5bSDimitry Andric                                 Linkage, nullptr, Name);
18212754fe60SDimitry Andric 
18222754fe60SDimitry Andric   if (OldGV) {
18232754fe60SDimitry Andric     // Replace occurrences of the old variable if needed.
18242754fe60SDimitry Andric     GV->takeName(OldGV);
18252754fe60SDimitry Andric 
18262754fe60SDimitry Andric     if (!OldGV->use_empty()) {
18272754fe60SDimitry Andric       llvm::Constant *NewPtrForOldDecl =
18282754fe60SDimitry Andric       llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
18292754fe60SDimitry Andric       OldGV->replaceAllUsesWith(NewPtrForOldDecl);
18302754fe60SDimitry Andric     }
18312754fe60SDimitry Andric 
18322754fe60SDimitry Andric     OldGV->eraseFromParent();
18332754fe60SDimitry Andric   }
18342754fe60SDimitry Andric 
183533956c43SDimitry Andric   if (supportsCOMDAT() && GV->isWeakForLinker() &&
183633956c43SDimitry Andric       !GV->hasAvailableExternallyLinkage())
183733956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
183833956c43SDimitry Andric 
18392754fe60SDimitry Andric   return GV;
18402754fe60SDimitry Andric }
18412754fe60SDimitry Andric 
1842f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the
1843f22ef01cSRoman Divacky /// given global variable.  If Ty is non-null and if the global doesn't exist,
1844cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the
1845f22ef01cSRoman Divacky /// normal requested type would be.
1846f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
18476122f3e6SDimitry Andric                                                   llvm::Type *Ty) {
1848f22ef01cSRoman Divacky   assert(D->hasGlobalStorage() && "Not a global variable");
1849f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
185059d1ed5bSDimitry Andric   if (!Ty)
1851f22ef01cSRoman Divacky     Ty = getTypes().ConvertTypeForMem(ASTTy);
1852f22ef01cSRoman Divacky 
18536122f3e6SDimitry Andric   llvm::PointerType *PTy =
18543b0f4066SDimitry Andric     llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy));
1855f22ef01cSRoman Divacky 
18566122f3e6SDimitry Andric   StringRef MangledName = getMangledName(D);
1857f22ef01cSRoman Divacky   return GetOrCreateLLVMGlobal(MangledName, PTy, D);
1858f22ef01cSRoman Divacky }
1859f22ef01cSRoman Divacky 
1860f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the
1861f22ef01cSRoman Divacky /// specified type and name.
1862f22ef01cSRoman Divacky llvm::Constant *
18636122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty,
18646122f3e6SDimitry Andric                                      StringRef Name) {
186559d1ed5bSDimitry Andric   return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr);
1866f22ef01cSRoman Divacky }
1867f22ef01cSRoman Divacky 
1868f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) {
1869f22ef01cSRoman Divacky   assert(!D->getInit() && "Cannot emit definite definitions here!");
1870f22ef01cSRoman Divacky 
187139d628a0SDimitry Andric   if (!MustBeEmitted(D)) {
1872f22ef01cSRoman Divacky     // If we have not seen a reference to this variable yet, place it
1873f22ef01cSRoman Divacky     // into the deferred declarations table to be emitted if needed
1874f22ef01cSRoman Divacky     // later.
18756122f3e6SDimitry Andric     StringRef MangledName = getMangledName(D);
1876f22ef01cSRoman Divacky     if (!GetGlobalValue(MangledName)) {
1877f22ef01cSRoman Divacky       DeferredDecls[MangledName] = D;
1878f22ef01cSRoman Divacky       return;
1879f22ef01cSRoman Divacky     }
1880f22ef01cSRoman Divacky   }
1881f22ef01cSRoman Divacky 
1882f22ef01cSRoman Divacky   // The tentative definition is the only definition.
1883f22ef01cSRoman Divacky   EmitGlobalVarDefinition(D);
1884f22ef01cSRoman Divacky }
1885f22ef01cSRoman Divacky 
18866122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const {
18872754fe60SDimitry Andric     return Context.toCharUnitsFromBits(
18883861d79fSDimitry Andric       TheDataLayout.getTypeStoreSizeInBits(Ty));
1889f22ef01cSRoman Divacky }
1890f22ef01cSRoman Divacky 
18917ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D,
18927ae0e2c9SDimitry Andric                                                  unsigned AddrSpace) {
189333956c43SDimitry Andric   if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
18947ae0e2c9SDimitry Andric     if (D->hasAttr<CUDAConstantAttr>())
18957ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant);
18967ae0e2c9SDimitry Andric     else if (D->hasAttr<CUDASharedAttr>())
18977ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared);
18987ae0e2c9SDimitry Andric     else
18997ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device);
19007ae0e2c9SDimitry Andric   }
19017ae0e2c9SDimitry Andric 
19027ae0e2c9SDimitry Andric   return AddrSpace;
19037ae0e2c9SDimitry Andric }
19047ae0e2c9SDimitry Andric 
1905284c1978SDimitry Andric template<typename SomeDecl>
1906284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
1907284c1978SDimitry Andric                                                llvm::GlobalValue *GV) {
1908284c1978SDimitry Andric   if (!getLangOpts().CPlusPlus)
1909284c1978SDimitry Andric     return;
1910284c1978SDimitry Andric 
1911284c1978SDimitry Andric   // Must have 'used' attribute, or else inline assembly can't rely on
1912284c1978SDimitry Andric   // the name existing.
1913284c1978SDimitry Andric   if (!D->template hasAttr<UsedAttr>())
1914284c1978SDimitry Andric     return;
1915284c1978SDimitry Andric 
1916284c1978SDimitry Andric   // Must have internal linkage and an ordinary name.
1917f785676fSDimitry Andric   if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage)
1918284c1978SDimitry Andric     return;
1919284c1978SDimitry Andric 
1920284c1978SDimitry Andric   // Must be in an extern "C" context. Entities declared directly within
1921284c1978SDimitry Andric   // a record are not extern "C" even if the record is in such a context.
1922f785676fSDimitry Andric   const SomeDecl *First = D->getFirstDecl();
1923284c1978SDimitry Andric   if (First->getDeclContext()->isRecord() || !First->isInExternCContext())
1924284c1978SDimitry Andric     return;
1925284c1978SDimitry Andric 
1926284c1978SDimitry Andric   // OK, this is an internal linkage entity inside an extern "C" linkage
1927284c1978SDimitry Andric   // specification. Make a note of that so we can give it the "expected"
1928284c1978SDimitry Andric   // mangled name if nothing else is using that name.
1929284c1978SDimitry Andric   std::pair<StaticExternCMap::iterator, bool> R =
1930284c1978SDimitry Andric       StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
1931284c1978SDimitry Andric 
1932284c1978SDimitry Andric   // If we have multiple internal linkage entities with the same name
1933284c1978SDimitry Andric   // in extern "C" regions, none of them gets that name.
1934284c1978SDimitry Andric   if (!R.second)
193559d1ed5bSDimitry Andric     R.first->second = nullptr;
1936284c1978SDimitry Andric }
1937284c1978SDimitry Andric 
193833956c43SDimitry Andric static bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D) {
193933956c43SDimitry Andric   if (!CGM.supportsCOMDAT())
194033956c43SDimitry Andric     return false;
194133956c43SDimitry Andric 
194233956c43SDimitry Andric   if (D.hasAttr<SelectAnyAttr>())
194333956c43SDimitry Andric     return true;
194433956c43SDimitry Andric 
194533956c43SDimitry Andric   GVALinkage Linkage;
194633956c43SDimitry Andric   if (auto *VD = dyn_cast<VarDecl>(&D))
194733956c43SDimitry Andric     Linkage = CGM.getContext().GetGVALinkageForVariable(VD);
194833956c43SDimitry Andric   else
194933956c43SDimitry Andric     Linkage = CGM.getContext().GetGVALinkageForFunction(cast<FunctionDecl>(&D));
195033956c43SDimitry Andric 
195133956c43SDimitry Andric   switch (Linkage) {
195233956c43SDimitry Andric   case GVA_Internal:
195333956c43SDimitry Andric   case GVA_AvailableExternally:
195433956c43SDimitry Andric   case GVA_StrongExternal:
195533956c43SDimitry Andric     return false;
195633956c43SDimitry Andric   case GVA_DiscardableODR:
195733956c43SDimitry Andric   case GVA_StrongODR:
195833956c43SDimitry Andric     return true;
195933956c43SDimitry Andric   }
196033956c43SDimitry Andric   llvm_unreachable("No such linkage");
196133956c43SDimitry Andric }
196233956c43SDimitry Andric 
196333956c43SDimitry Andric void CodeGenModule::maybeSetTrivialComdat(const Decl &D,
196433956c43SDimitry Andric                                           llvm::GlobalObject &GO) {
196533956c43SDimitry Andric   if (!shouldBeInCOMDAT(*this, D))
196633956c43SDimitry Andric     return;
196733956c43SDimitry Andric   GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
196833956c43SDimitry Andric }
196933956c43SDimitry Andric 
1970f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
197159d1ed5bSDimitry Andric   llvm::Constant *Init = nullptr;
1972f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
1973dff0c46cSDimitry Andric   CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1974dff0c46cSDimitry Andric   bool NeedsGlobalCtor = false;
1975dff0c46cSDimitry Andric   bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor();
1976f22ef01cSRoman Divacky 
1977dff0c46cSDimitry Andric   const VarDecl *InitDecl;
1978dff0c46cSDimitry Andric   const Expr *InitExpr = D->getAnyInitializer(InitDecl);
1979f22ef01cSRoman Divacky 
1980f22ef01cSRoman Divacky   if (!InitExpr) {
1981f22ef01cSRoman Divacky     // This is a tentative definition; tentative definitions are
1982f22ef01cSRoman Divacky     // implicitly initialized with { 0 }.
1983f22ef01cSRoman Divacky     //
1984f22ef01cSRoman Divacky     // Note that tentative definitions are only emitted at the end of
1985f22ef01cSRoman Divacky     // a translation unit, so they should never have incomplete
1986f22ef01cSRoman Divacky     // type. In addition, EmitTentativeDefinition makes sure that we
1987f22ef01cSRoman Divacky     // never attempt to emit a tentative definition if a real one
1988f22ef01cSRoman Divacky     // exists. A use may still exists, however, so we still may need
1989f22ef01cSRoman Divacky     // to do a RAUW.
1990f22ef01cSRoman Divacky     assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
1991f22ef01cSRoman Divacky     Init = EmitNullConstant(D->getType());
1992f22ef01cSRoman Divacky   } else {
19937ae0e2c9SDimitry Andric     initializedGlobalDecl = GlobalDecl(D);
1994dff0c46cSDimitry Andric     Init = EmitConstantInit(*InitDecl);
1995f785676fSDimitry Andric 
1996f22ef01cSRoman Divacky     if (!Init) {
1997f22ef01cSRoman Divacky       QualType T = InitExpr->getType();
1998f22ef01cSRoman Divacky       if (D->getType()->isReferenceType())
1999f22ef01cSRoman Divacky         T = D->getType();
2000f22ef01cSRoman Divacky 
2001dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus) {
2002f22ef01cSRoman Divacky         Init = EmitNullConstant(T);
2003dff0c46cSDimitry Andric         NeedsGlobalCtor = true;
2004f22ef01cSRoman Divacky       } else {
2005f22ef01cSRoman Divacky         ErrorUnsupported(D, "static initializer");
2006f22ef01cSRoman Divacky         Init = llvm::UndefValue::get(getTypes().ConvertType(T));
2007f22ef01cSRoman Divacky       }
2008e580952dSDimitry Andric     } else {
2009e580952dSDimitry Andric       // We don't need an initializer, so remove the entry for the delayed
2010dff0c46cSDimitry Andric       // initializer position (just in case this entry was delayed) if we
2011dff0c46cSDimitry Andric       // also don't need to register a destructor.
2012dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus && !NeedsGlobalDtor)
2013e580952dSDimitry Andric         DelayedCXXInitPosition.erase(D);
2014f22ef01cSRoman Divacky     }
2015f22ef01cSRoman Divacky   }
2016f22ef01cSRoman Divacky 
20176122f3e6SDimitry Andric   llvm::Type* InitType = Init->getType();
2018f22ef01cSRoman Divacky   llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType);
2019f22ef01cSRoman Divacky 
2020f22ef01cSRoman Divacky   // Strip off a bitcast if we got one back.
202159d1ed5bSDimitry Andric   if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
2022f22ef01cSRoman Divacky     assert(CE->getOpcode() == llvm::Instruction::BitCast ||
2023f785676fSDimitry Andric            CE->getOpcode() == llvm::Instruction::AddrSpaceCast ||
2024f785676fSDimitry Andric            // All zero index gep.
2025f22ef01cSRoman Divacky            CE->getOpcode() == llvm::Instruction::GetElementPtr);
2026f22ef01cSRoman Divacky     Entry = CE->getOperand(0);
2027f22ef01cSRoman Divacky   }
2028f22ef01cSRoman Divacky 
2029f22ef01cSRoman Divacky   // Entry is now either a Function or GlobalVariable.
203059d1ed5bSDimitry Andric   auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
2031f22ef01cSRoman Divacky 
2032f22ef01cSRoman Divacky   // We have a definition after a declaration with the wrong type.
2033f22ef01cSRoman Divacky   // We must make a new GlobalVariable* and update everything that used OldGV
2034f22ef01cSRoman Divacky   // (a declaration or tentative definition) with the new GlobalVariable*
2035f22ef01cSRoman Divacky   // (which will be a definition).
2036f22ef01cSRoman Divacky   //
2037f22ef01cSRoman Divacky   // This happens if there is a prototype for a global (e.g.
2038f22ef01cSRoman Divacky   // "extern int x[];") and then a definition of a different type (e.g.
2039f22ef01cSRoman Divacky   // "int x[10];"). This also happens when an initializer has a different type
2040f22ef01cSRoman Divacky   // from the type of the global (this happens with unions).
204159d1ed5bSDimitry Andric   if (!GV ||
2042f22ef01cSRoman Divacky       GV->getType()->getElementType() != InitType ||
20433b0f4066SDimitry Andric       GV->getType()->getAddressSpace() !=
20447ae0e2c9SDimitry Andric        GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) {
2045f22ef01cSRoman Divacky 
2046f22ef01cSRoman Divacky     // Move the old entry aside so that we'll create a new one.
20476122f3e6SDimitry Andric     Entry->setName(StringRef());
2048f22ef01cSRoman Divacky 
2049f22ef01cSRoman Divacky     // Make a new global with the correct type, this is now guaranteed to work.
2050f22ef01cSRoman Divacky     GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType));
2051f22ef01cSRoman Divacky 
2052f22ef01cSRoman Divacky     // Replace all uses of the old global with the new global
2053f22ef01cSRoman Divacky     llvm::Constant *NewPtrForOldDecl =
2054f22ef01cSRoman Divacky         llvm::ConstantExpr::getBitCast(GV, Entry->getType());
2055f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(NewPtrForOldDecl);
2056f22ef01cSRoman Divacky 
2057f22ef01cSRoman Divacky     // Erase the old global, since it is no longer used.
2058f22ef01cSRoman Divacky     cast<llvm::GlobalValue>(Entry)->eraseFromParent();
2059f22ef01cSRoman Divacky   }
2060f22ef01cSRoman Divacky 
2061284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, GV);
2062284c1978SDimitry Andric 
20636122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
20646122f3e6SDimitry Andric     AddGlobalAnnotations(D, GV);
2065f22ef01cSRoman Divacky 
2066f22ef01cSRoman Divacky   GV->setInitializer(Init);
2067f22ef01cSRoman Divacky 
2068f22ef01cSRoman Divacky   // If it is safe to mark the global 'constant', do so now.
2069dff0c46cSDimitry Andric   GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
2070dff0c46cSDimitry Andric                   isTypeConstant(D->getType(), true));
2071f22ef01cSRoman Divacky 
207239d628a0SDimitry Andric   // If it is in a read-only section, mark it 'constant'.
207339d628a0SDimitry Andric   if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
207439d628a0SDimitry Andric     const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
207539d628a0SDimitry Andric     if ((SI.SectionFlags & ASTContext::PSF_Write) == 0)
207639d628a0SDimitry Andric       GV->setConstant(true);
207739d628a0SDimitry Andric   }
207839d628a0SDimitry Andric 
2079f22ef01cSRoman Divacky   GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
2080f22ef01cSRoman Divacky 
2081f22ef01cSRoman Divacky   // Set the llvm linkage type as appropriate.
20822754fe60SDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
208359d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(D, GV->isConstant());
2084f785676fSDimitry Andric 
208559d1ed5bSDimitry Andric   // On Darwin, the backing variable for a C++11 thread_local variable always
208659d1ed5bSDimitry Andric   // has internal linkage; all accesses should just be calls to the
208759d1ed5bSDimitry Andric   // Itanium-specified entry point, which has the normal linkage of the
208859d1ed5bSDimitry Andric   // variable.
208939d628a0SDimitry Andric   if (!D->isStaticLocal() && D->getTLSKind() == VarDecl::TLS_Dynamic &&
209059d1ed5bSDimitry Andric       Context.getTargetInfo().getTriple().isMacOSX())
209159d1ed5bSDimitry Andric     Linkage = llvm::GlobalValue::InternalLinkage;
209259d1ed5bSDimitry Andric 
209359d1ed5bSDimitry Andric   GV->setLinkage(Linkage);
209459d1ed5bSDimitry Andric   if (D->hasAttr<DLLImportAttr>())
209559d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
209659d1ed5bSDimitry Andric   else if (D->hasAttr<DLLExportAttr>())
209759d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
209839d628a0SDimitry Andric   else
209939d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
2100f785676fSDimitry Andric 
21012754fe60SDimitry Andric   if (Linkage == llvm::GlobalVariable::CommonLinkage)
2102f22ef01cSRoman Divacky     // common vars aren't constant even if declared const.
2103f22ef01cSRoman Divacky     GV->setConstant(false);
2104f22ef01cSRoman Divacky 
210559d1ed5bSDimitry Andric   setNonAliasAttributes(D, GV);
2106f22ef01cSRoman Divacky 
210739d628a0SDimitry Andric   if (D->getTLSKind() && !GV->isThreadLocal()) {
210839d628a0SDimitry Andric     if (D->getTLSKind() == VarDecl::TLS_Dynamic)
210939d628a0SDimitry Andric       CXXThreadLocals.push_back(std::make_pair(D, GV));
211039d628a0SDimitry Andric     setTLSMode(GV, *D);
211139d628a0SDimitry Andric   }
211239d628a0SDimitry Andric 
211333956c43SDimitry Andric   maybeSetTrivialComdat(*D, *GV);
211433956c43SDimitry Andric 
21152754fe60SDimitry Andric   // Emit the initializer function if necessary.
2116dff0c46cSDimitry Andric   if (NeedsGlobalCtor || NeedsGlobalDtor)
2117dff0c46cSDimitry Andric     EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
21182754fe60SDimitry Andric 
211939d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, *D, NeedsGlobalCtor);
21203861d79fSDimitry Andric 
2121f22ef01cSRoman Divacky   // Emit global variable debug information.
21226122f3e6SDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
21233861d79fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
2124f22ef01cSRoman Divacky       DI->EmitGlobalVariable(GV, D);
2125f22ef01cSRoman Divacky }
2126f22ef01cSRoman Divacky 
212739d628a0SDimitry Andric static bool isVarDeclStrongDefinition(const ASTContext &Context,
212833956c43SDimitry Andric                                       CodeGenModule &CGM, const VarDecl *D,
212933956c43SDimitry Andric                                       bool NoCommon) {
213059d1ed5bSDimitry Andric   // Don't give variables common linkage if -fno-common was specified unless it
213159d1ed5bSDimitry Andric   // was overridden by a NoCommon attribute.
213259d1ed5bSDimitry Andric   if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>())
213359d1ed5bSDimitry Andric     return true;
213459d1ed5bSDimitry Andric 
213559d1ed5bSDimitry Andric   // C11 6.9.2/2:
213659d1ed5bSDimitry Andric   //   A declaration of an identifier for an object that has file scope without
213759d1ed5bSDimitry Andric   //   an initializer, and without a storage-class specifier or with the
213859d1ed5bSDimitry Andric   //   storage-class specifier static, constitutes a tentative definition.
213959d1ed5bSDimitry Andric   if (D->getInit() || D->hasExternalStorage())
214059d1ed5bSDimitry Andric     return true;
214159d1ed5bSDimitry Andric 
214259d1ed5bSDimitry Andric   // A variable cannot be both common and exist in a section.
214359d1ed5bSDimitry Andric   if (D->hasAttr<SectionAttr>())
214459d1ed5bSDimitry Andric     return true;
214559d1ed5bSDimitry Andric 
214659d1ed5bSDimitry Andric   // Thread local vars aren't considered common linkage.
214759d1ed5bSDimitry Andric   if (D->getTLSKind())
214859d1ed5bSDimitry Andric     return true;
214959d1ed5bSDimitry Andric 
215059d1ed5bSDimitry Andric   // Tentative definitions marked with WeakImportAttr are true definitions.
215159d1ed5bSDimitry Andric   if (D->hasAttr<WeakImportAttr>())
215259d1ed5bSDimitry Andric     return true;
215359d1ed5bSDimitry Andric 
215433956c43SDimitry Andric   // A variable cannot be both common and exist in a comdat.
215533956c43SDimitry Andric   if (shouldBeInCOMDAT(CGM, *D))
215633956c43SDimitry Andric     return true;
215733956c43SDimitry Andric 
215839d628a0SDimitry Andric   // Declarations with a required alignment do not have common linakge in MSVC
215939d628a0SDimitry Andric   // mode.
216033956c43SDimitry Andric   if (Context.getLangOpts().MSVCCompat) {
216133956c43SDimitry Andric     if (D->hasAttr<AlignedAttr>())
216239d628a0SDimitry Andric       return true;
216333956c43SDimitry Andric     QualType VarType = D->getType();
216433956c43SDimitry Andric     if (Context.isAlignmentRequired(VarType))
216533956c43SDimitry Andric       return true;
216633956c43SDimitry Andric 
216733956c43SDimitry Andric     if (const auto *RT = VarType->getAs<RecordType>()) {
216833956c43SDimitry Andric       const RecordDecl *RD = RT->getDecl();
216933956c43SDimitry Andric       for (const FieldDecl *FD : RD->fields()) {
217033956c43SDimitry Andric         if (FD->isBitField())
217133956c43SDimitry Andric           continue;
217233956c43SDimitry Andric         if (FD->hasAttr<AlignedAttr>())
217333956c43SDimitry Andric           return true;
217433956c43SDimitry Andric         if (Context.isAlignmentRequired(FD->getType()))
217533956c43SDimitry Andric           return true;
217633956c43SDimitry Andric       }
217733956c43SDimitry Andric     }
217833956c43SDimitry Andric   }
217939d628a0SDimitry Andric 
218059d1ed5bSDimitry Andric   return false;
218159d1ed5bSDimitry Andric }
218259d1ed5bSDimitry Andric 
218359d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
218459d1ed5bSDimitry Andric     const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) {
21852754fe60SDimitry Andric   if (Linkage == GVA_Internal)
21862754fe60SDimitry Andric     return llvm::Function::InternalLinkage;
218759d1ed5bSDimitry Andric 
218859d1ed5bSDimitry Andric   if (D->hasAttr<WeakAttr>()) {
218959d1ed5bSDimitry Andric     if (IsConstantVariable)
219059d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakODRLinkage;
219159d1ed5bSDimitry Andric     else
219259d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakAnyLinkage;
219359d1ed5bSDimitry Andric   }
219459d1ed5bSDimitry Andric 
219559d1ed5bSDimitry Andric   // We are guaranteed to have a strong definition somewhere else,
219659d1ed5bSDimitry Andric   // so we can use available_externally linkage.
219759d1ed5bSDimitry Andric   if (Linkage == GVA_AvailableExternally)
219859d1ed5bSDimitry Andric     return llvm::Function::AvailableExternallyLinkage;
219959d1ed5bSDimitry Andric 
220059d1ed5bSDimitry Andric   // Note that Apple's kernel linker doesn't support symbol
220159d1ed5bSDimitry Andric   // coalescing, so we need to avoid linkonce and weak linkages there.
220259d1ed5bSDimitry Andric   // Normally, this means we just map to internal, but for explicit
220359d1ed5bSDimitry Andric   // instantiations we'll map to external.
220459d1ed5bSDimitry Andric 
220559d1ed5bSDimitry Andric   // In C++, the compiler has to emit a definition in every translation unit
220659d1ed5bSDimitry Andric   // that references the function.  We should use linkonce_odr because
220759d1ed5bSDimitry Andric   // a) if all references in this translation unit are optimized away, we
220859d1ed5bSDimitry Andric   // don't need to codegen it.  b) if the function persists, it needs to be
220959d1ed5bSDimitry Andric   // merged with other definitions. c) C++ has the ODR, so we know the
221059d1ed5bSDimitry Andric   // definition is dependable.
221159d1ed5bSDimitry Andric   if (Linkage == GVA_DiscardableODR)
221259d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
221359d1ed5bSDimitry Andric                                             : llvm::Function::InternalLinkage;
221459d1ed5bSDimitry Andric 
221559d1ed5bSDimitry Andric   // An explicit instantiation of a template has weak linkage, since
221659d1ed5bSDimitry Andric   // explicit instantiations can occur in multiple translation units
221759d1ed5bSDimitry Andric   // and must all be equivalent. However, we are not allowed to
221859d1ed5bSDimitry Andric   // throw away these explicit instantiations.
221959d1ed5bSDimitry Andric   if (Linkage == GVA_StrongODR)
222059d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage
222159d1ed5bSDimitry Andric                                             : llvm::Function::ExternalLinkage;
222259d1ed5bSDimitry Andric 
222359d1ed5bSDimitry Andric   // C++ doesn't have tentative definitions and thus cannot have common
222459d1ed5bSDimitry Andric   // linkage.
222559d1ed5bSDimitry Andric   if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) &&
222633956c43SDimitry Andric       !isVarDeclStrongDefinition(Context, *this, cast<VarDecl>(D),
222739d628a0SDimitry Andric                                  CodeGenOpts.NoCommon))
222859d1ed5bSDimitry Andric     return llvm::GlobalVariable::CommonLinkage;
222959d1ed5bSDimitry Andric 
2230f785676fSDimitry Andric   // selectany symbols are externally visible, so use weak instead of
2231f785676fSDimitry Andric   // linkonce.  MSVC optimizes away references to const selectany globals, so
2232f785676fSDimitry Andric   // all definitions should be the same and ODR linkage should be used.
2233f785676fSDimitry Andric   // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx
223459d1ed5bSDimitry Andric   if (D->hasAttr<SelectAnyAttr>())
2235f785676fSDimitry Andric     return llvm::GlobalVariable::WeakODRLinkage;
223659d1ed5bSDimitry Andric 
223759d1ed5bSDimitry Andric   // Otherwise, we have strong external linkage.
223859d1ed5bSDimitry Andric   assert(Linkage == GVA_StrongExternal);
22392754fe60SDimitry Andric   return llvm::GlobalVariable::ExternalLinkage;
22402754fe60SDimitry Andric }
22412754fe60SDimitry Andric 
224259d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition(
224359d1ed5bSDimitry Andric     const VarDecl *VD, bool IsConstant) {
224459d1ed5bSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD);
224559d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant);
224659d1ed5bSDimitry Andric }
224759d1ed5bSDimitry Andric 
2248139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type.
2249139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites
2250139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old,
2251139f7f9bSDimitry Andric                                           llvm::Function *newFn) {
2252139f7f9bSDimitry Andric   // Fast path.
2253139f7f9bSDimitry Andric   if (old->use_empty()) return;
2254139f7f9bSDimitry Andric 
2255139f7f9bSDimitry Andric   llvm::Type *newRetTy = newFn->getReturnType();
2256139f7f9bSDimitry Andric   SmallVector<llvm::Value*, 4> newArgs;
2257139f7f9bSDimitry Andric 
2258139f7f9bSDimitry Andric   for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
2259139f7f9bSDimitry Andric          ui != ue; ) {
2260139f7f9bSDimitry Andric     llvm::Value::use_iterator use = ui++; // Increment before the use is erased.
226159d1ed5bSDimitry Andric     llvm::User *user = use->getUser();
2262139f7f9bSDimitry Andric 
2263139f7f9bSDimitry Andric     // Recognize and replace uses of bitcasts.  Most calls to
2264139f7f9bSDimitry Andric     // unprototyped functions will use bitcasts.
226559d1ed5bSDimitry Andric     if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
2266139f7f9bSDimitry Andric       if (bitcast->getOpcode() == llvm::Instruction::BitCast)
2267139f7f9bSDimitry Andric         replaceUsesOfNonProtoConstant(bitcast, newFn);
2268139f7f9bSDimitry Andric       continue;
2269139f7f9bSDimitry Andric     }
2270139f7f9bSDimitry Andric 
2271139f7f9bSDimitry Andric     // Recognize calls to the function.
2272139f7f9bSDimitry Andric     llvm::CallSite callSite(user);
2273139f7f9bSDimitry Andric     if (!callSite) continue;
227459d1ed5bSDimitry Andric     if (!callSite.isCallee(&*use)) continue;
2275139f7f9bSDimitry Andric 
2276139f7f9bSDimitry Andric     // If the return types don't match exactly, then we can't
2277139f7f9bSDimitry Andric     // transform this call unless it's dead.
2278139f7f9bSDimitry Andric     if (callSite->getType() != newRetTy && !callSite->use_empty())
2279139f7f9bSDimitry Andric       continue;
2280139f7f9bSDimitry Andric 
2281139f7f9bSDimitry Andric     // Get the call site's attribute list.
2282139f7f9bSDimitry Andric     SmallVector<llvm::AttributeSet, 8> newAttrs;
2283139f7f9bSDimitry Andric     llvm::AttributeSet oldAttrs = callSite.getAttributes();
2284139f7f9bSDimitry Andric 
2285139f7f9bSDimitry Andric     // Collect any return attributes from the call.
2286139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex))
2287139f7f9bSDimitry Andric       newAttrs.push_back(
2288139f7f9bSDimitry Andric         llvm::AttributeSet::get(newFn->getContext(),
2289139f7f9bSDimitry Andric                                 oldAttrs.getRetAttributes()));
2290139f7f9bSDimitry Andric 
2291139f7f9bSDimitry Andric     // If the function was passed too few arguments, don't transform.
2292139f7f9bSDimitry Andric     unsigned newNumArgs = newFn->arg_size();
2293139f7f9bSDimitry Andric     if (callSite.arg_size() < newNumArgs) continue;
2294139f7f9bSDimitry Andric 
2295139f7f9bSDimitry Andric     // If extra arguments were passed, we silently drop them.
2296139f7f9bSDimitry Andric     // If any of the types mismatch, we don't transform.
2297139f7f9bSDimitry Andric     unsigned argNo = 0;
2298139f7f9bSDimitry Andric     bool dontTransform = false;
2299139f7f9bSDimitry Andric     for (llvm::Function::arg_iterator ai = newFn->arg_begin(),
2300139f7f9bSDimitry Andric            ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) {
2301139f7f9bSDimitry Andric       if (callSite.getArgument(argNo)->getType() != ai->getType()) {
2302139f7f9bSDimitry Andric         dontTransform = true;
2303139f7f9bSDimitry Andric         break;
2304139f7f9bSDimitry Andric       }
2305139f7f9bSDimitry Andric 
2306139f7f9bSDimitry Andric       // Add any parameter attributes.
2307139f7f9bSDimitry Andric       if (oldAttrs.hasAttributes(argNo + 1))
2308139f7f9bSDimitry Andric         newAttrs.
2309139f7f9bSDimitry Andric           push_back(llvm::
2310139f7f9bSDimitry Andric                     AttributeSet::get(newFn->getContext(),
2311139f7f9bSDimitry Andric                                       oldAttrs.getParamAttributes(argNo + 1)));
2312139f7f9bSDimitry Andric     }
2313139f7f9bSDimitry Andric     if (dontTransform)
2314139f7f9bSDimitry Andric       continue;
2315139f7f9bSDimitry Andric 
2316139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex))
2317139f7f9bSDimitry Andric       newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(),
2318139f7f9bSDimitry Andric                                                  oldAttrs.getFnAttributes()));
2319139f7f9bSDimitry Andric 
2320139f7f9bSDimitry Andric     // Okay, we can transform this.  Create the new call instruction and copy
2321139f7f9bSDimitry Andric     // over the required information.
2322139f7f9bSDimitry Andric     newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo);
2323139f7f9bSDimitry Andric 
2324139f7f9bSDimitry Andric     llvm::CallSite newCall;
2325139f7f9bSDimitry Andric     if (callSite.isCall()) {
2326139f7f9bSDimitry Andric       newCall = llvm::CallInst::Create(newFn, newArgs, "",
2327139f7f9bSDimitry Andric                                        callSite.getInstruction());
2328139f7f9bSDimitry Andric     } else {
232959d1ed5bSDimitry Andric       auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction());
2330139f7f9bSDimitry Andric       newCall = llvm::InvokeInst::Create(newFn,
2331139f7f9bSDimitry Andric                                          oldInvoke->getNormalDest(),
2332139f7f9bSDimitry Andric                                          oldInvoke->getUnwindDest(),
2333139f7f9bSDimitry Andric                                          newArgs, "",
2334139f7f9bSDimitry Andric                                          callSite.getInstruction());
2335139f7f9bSDimitry Andric     }
2336139f7f9bSDimitry Andric     newArgs.clear(); // for the next iteration
2337139f7f9bSDimitry Andric 
2338139f7f9bSDimitry Andric     if (!newCall->getType()->isVoidTy())
2339139f7f9bSDimitry Andric       newCall->takeName(callSite.getInstruction());
2340139f7f9bSDimitry Andric     newCall.setAttributes(
2341139f7f9bSDimitry Andric                      llvm::AttributeSet::get(newFn->getContext(), newAttrs));
2342139f7f9bSDimitry Andric     newCall.setCallingConv(callSite.getCallingConv());
2343139f7f9bSDimitry Andric 
2344139f7f9bSDimitry Andric     // Finally, remove the old call, replacing any uses with the new one.
2345139f7f9bSDimitry Andric     if (!callSite->use_empty())
2346139f7f9bSDimitry Andric       callSite->replaceAllUsesWith(newCall.getInstruction());
2347139f7f9bSDimitry Andric 
2348139f7f9bSDimitry Andric     // Copy debug location attached to CI.
234933956c43SDimitry Andric     if (callSite->getDebugLoc())
2350139f7f9bSDimitry Andric       newCall->setDebugLoc(callSite->getDebugLoc());
2351139f7f9bSDimitry Andric     callSite->eraseFromParent();
2352139f7f9bSDimitry Andric   }
2353139f7f9bSDimitry Andric }
2354139f7f9bSDimitry Andric 
2355f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we
2356f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}".  If there are
2357f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to
2358f22ef01cSRoman Divacky /// call the new function directly.
2359f22ef01cSRoman Divacky ///
2360f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to
2361f22ef01cSRoman Divacky /// functions to be able to inline them.  If there is a bitcast in the way, it
2362f22ef01cSRoman Divacky /// won't inline them.  Instcombine normally deletes these calls, but it isn't
2363f22ef01cSRoman Divacky /// run at -O0.
2364f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
2365f22ef01cSRoman Divacky                                                       llvm::Function *NewFn) {
2366f22ef01cSRoman Divacky   // If we're redefining a global as a function, don't transform it.
2367139f7f9bSDimitry Andric   if (!isa<llvm::Function>(Old)) return;
2368f22ef01cSRoman Divacky 
2369139f7f9bSDimitry Andric   replaceUsesOfNonProtoConstant(Old, NewFn);
2370f22ef01cSRoman Divacky }
2371f22ef01cSRoman Divacky 
2372dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2373dff0c46cSDimitry Andric   TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
2374dff0c46cSDimitry Andric   // If we have a definition, this might be a deferred decl. If the
2375dff0c46cSDimitry Andric   // instantiation is explicit, make sure we emit it at the end.
2376dff0c46cSDimitry Andric   if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
2377dff0c46cSDimitry Andric     GetAddrOfGlobalVar(VD);
2378139f7f9bSDimitry Andric 
2379139f7f9bSDimitry Andric   EmitTopLevelDecl(VD);
2380dff0c46cSDimitry Andric }
2381f22ef01cSRoman Divacky 
238259d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
238359d1ed5bSDimitry Andric                                                  llvm::GlobalValue *GV) {
238459d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
23853b0f4066SDimitry Andric 
23863b0f4066SDimitry Andric   // Compute the function info and LLVM type.
2387dff0c46cSDimitry Andric   const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
2388dff0c46cSDimitry Andric   llvm::FunctionType *Ty = getTypes().GetFunctionType(FI);
23893b0f4066SDimitry Andric 
2390f22ef01cSRoman Divacky   // Get or create the prototype for the function.
239159d1ed5bSDimitry Andric   if (!GV) {
239259d1ed5bSDimitry Andric     llvm::Constant *C =
239359d1ed5bSDimitry Andric         GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true);
2394f22ef01cSRoman Divacky 
2395f22ef01cSRoman Divacky     // Strip off a bitcast if we got one back.
239659d1ed5bSDimitry Andric     if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) {
2397f22ef01cSRoman Divacky       assert(CE->getOpcode() == llvm::Instruction::BitCast);
239859d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(CE->getOperand(0));
239959d1ed5bSDimitry Andric     } else {
240059d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(C);
240159d1ed5bSDimitry Andric     }
2402f22ef01cSRoman Divacky   }
2403f22ef01cSRoman Divacky 
240459d1ed5bSDimitry Andric   if (!GV->isDeclaration()) {
2405f785676fSDimitry Andric     getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name);
240639d628a0SDimitry Andric     GlobalDecl OldGD = Manglings.lookup(GV->getName());
240739d628a0SDimitry Andric     if (auto *Prev = OldGD.getDecl())
240839d628a0SDimitry Andric       getDiags().Report(Prev->getLocation(), diag::note_previous_definition);
2409f785676fSDimitry Andric     return;
2410f785676fSDimitry Andric   }
2411f22ef01cSRoman Divacky 
241259d1ed5bSDimitry Andric   if (GV->getType()->getElementType() != Ty) {
2413f22ef01cSRoman Divacky     // If the types mismatch then we have to rewrite the definition.
241459d1ed5bSDimitry Andric     assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
2415f22ef01cSRoman Divacky 
2416f22ef01cSRoman Divacky     // F is the Function* for the one with the wrong type, we must make a new
2417f22ef01cSRoman Divacky     // Function* and update everything that used F (a declaration) with the new
2418f22ef01cSRoman Divacky     // Function* (which will be a definition).
2419f22ef01cSRoman Divacky     //
2420f22ef01cSRoman Divacky     // This happens if there is a prototype for a function
2421f22ef01cSRoman Divacky     // (e.g. "int f()") and then a definition of a different type
2422f22ef01cSRoman Divacky     // (e.g. "int f(int x)").  Move the old function aside so that it
2423f22ef01cSRoman Divacky     // doesn't interfere with GetAddrOfFunction.
242459d1ed5bSDimitry Andric     GV->setName(StringRef());
242559d1ed5bSDimitry Andric     auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
2426f22ef01cSRoman Divacky 
2427139f7f9bSDimitry Andric     // This might be an implementation of a function without a
2428139f7f9bSDimitry Andric     // prototype, in which case, try to do special replacement of
2429139f7f9bSDimitry Andric     // calls which match the new prototype.  The really key thing here
2430139f7f9bSDimitry Andric     // is that we also potentially drop arguments from the call site
2431139f7f9bSDimitry Andric     // so as to make a direct call, which makes the inliner happier
2432139f7f9bSDimitry Andric     // and suppresses a number of optimizer warnings (!) about
2433139f7f9bSDimitry Andric     // dropping arguments.
243459d1ed5bSDimitry Andric     if (!GV->use_empty()) {
243559d1ed5bSDimitry Andric       ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn);
243659d1ed5bSDimitry Andric       GV->removeDeadConstantUsers();
2437f22ef01cSRoman Divacky     }
2438f22ef01cSRoman Divacky 
2439f22ef01cSRoman Divacky     // Replace uses of F with the Function we will endow with a body.
244059d1ed5bSDimitry Andric     if (!GV->use_empty()) {
2441f22ef01cSRoman Divacky       llvm::Constant *NewPtrForOldDecl =
244259d1ed5bSDimitry Andric           llvm::ConstantExpr::getBitCast(NewFn, GV->getType());
244359d1ed5bSDimitry Andric       GV->replaceAllUsesWith(NewPtrForOldDecl);
2444f22ef01cSRoman Divacky     }
2445f22ef01cSRoman Divacky 
2446f22ef01cSRoman Divacky     // Ok, delete the old function now, which is dead.
244759d1ed5bSDimitry Andric     GV->eraseFromParent();
2448f22ef01cSRoman Divacky 
244959d1ed5bSDimitry Andric     GV = NewFn;
2450f22ef01cSRoman Divacky   }
2451f22ef01cSRoman Divacky 
24522754fe60SDimitry Andric   // We need to set linkage and visibility on the function before
24532754fe60SDimitry Andric   // generating code for it because various parts of IR generation
24542754fe60SDimitry Andric   // want to propagate this information down (e.g. to local static
24552754fe60SDimitry Andric   // declarations).
245659d1ed5bSDimitry Andric   auto *Fn = cast<llvm::Function>(GV);
2457f785676fSDimitry Andric   setFunctionLinkage(GD, Fn);
245897bc6c73SDimitry Andric   setFunctionDLLStorageClass(GD, Fn);
2459f22ef01cSRoman Divacky 
246059d1ed5bSDimitry Andric   // FIXME: this is redundant with part of setFunctionDefinitionAttributes
24612754fe60SDimitry Andric   setGlobalVisibility(Fn, D);
24622754fe60SDimitry Andric 
2463284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, Fn);
2464284c1978SDimitry Andric 
246533956c43SDimitry Andric   maybeSetTrivialComdat(*D, *Fn);
246633956c43SDimitry Andric 
24673b0f4066SDimitry Andric   CodeGenFunction(*this).GenerateCode(D, Fn, FI);
2468f22ef01cSRoman Divacky 
246959d1ed5bSDimitry Andric   setFunctionDefinitionAttributes(D, Fn);
2470f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, Fn);
2471f22ef01cSRoman Divacky 
2472f22ef01cSRoman Divacky   if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>())
2473f22ef01cSRoman Divacky     AddGlobalCtor(Fn, CA->getPriority());
2474f22ef01cSRoman Divacky   if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
2475f22ef01cSRoman Divacky     AddGlobalDtor(Fn, DA->getPriority());
24766122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
24776122f3e6SDimitry Andric     AddGlobalAnnotations(D, Fn);
2478f22ef01cSRoman Divacky }
2479f22ef01cSRoman Divacky 
2480f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
248159d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
2482f22ef01cSRoman Divacky   const AliasAttr *AA = D->getAttr<AliasAttr>();
2483f22ef01cSRoman Divacky   assert(AA && "Not an alias?");
2484f22ef01cSRoman Divacky 
24856122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
2486f22ef01cSRoman Divacky 
2487f22ef01cSRoman Divacky   // If there is a definition in the module, then it wins over the alias.
2488f22ef01cSRoman Divacky   // This is dubious, but allow it to be safe.  Just ignore the alias.
2489f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2490f22ef01cSRoman Divacky   if (Entry && !Entry->isDeclaration())
2491f22ef01cSRoman Divacky     return;
2492f22ef01cSRoman Divacky 
2493f785676fSDimitry Andric   Aliases.push_back(GD);
2494f785676fSDimitry Andric 
24956122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType());
2496f22ef01cSRoman Divacky 
2497f22ef01cSRoman Divacky   // Create a reference to the named value.  This ensures that it is emitted
2498f22ef01cSRoman Divacky   // if a deferred decl.
2499f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
2500f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
25013861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
25022754fe60SDimitry Andric                                       /*ForVTable=*/false);
2503f22ef01cSRoman Divacky   else
2504f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
250559d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
250639d628a0SDimitry Andric                                     /*D=*/nullptr);
2507f22ef01cSRoman Divacky 
2508f22ef01cSRoman Divacky   // Create the new alias itself, but don't set a name yet.
250959d1ed5bSDimitry Andric   auto *GA = llvm::GlobalAlias::create(
251033956c43SDimitry Andric       cast<llvm::PointerType>(Aliasee->getType()),
251159d1ed5bSDimitry Andric       llvm::Function::ExternalLinkage, "", Aliasee, &getModule());
2512f22ef01cSRoman Divacky 
2513f22ef01cSRoman Divacky   if (Entry) {
251459d1ed5bSDimitry Andric     if (GA->getAliasee() == Entry) {
251559d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
251659d1ed5bSDimitry Andric       return;
251759d1ed5bSDimitry Andric     }
251859d1ed5bSDimitry Andric 
2519f22ef01cSRoman Divacky     assert(Entry->isDeclaration());
2520f22ef01cSRoman Divacky 
2521f22ef01cSRoman Divacky     // If there is a declaration in the module, then we had an extern followed
2522f22ef01cSRoman Divacky     // by the alias, as in:
2523f22ef01cSRoman Divacky     //   extern int test6();
2524f22ef01cSRoman Divacky     //   ...
2525f22ef01cSRoman Divacky     //   int test6() __attribute__((alias("test7")));
2526f22ef01cSRoman Divacky     //
2527f22ef01cSRoman Divacky     // Remove it and replace uses of it with the alias.
2528f22ef01cSRoman Divacky     GA->takeName(Entry);
2529f22ef01cSRoman Divacky 
2530f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA,
2531f22ef01cSRoman Divacky                                                           Entry->getType()));
2532f22ef01cSRoman Divacky     Entry->eraseFromParent();
2533f22ef01cSRoman Divacky   } else {
2534ffd1746dSEd Schouten     GA->setName(MangledName);
2535f22ef01cSRoman Divacky   }
2536f22ef01cSRoman Divacky 
2537f22ef01cSRoman Divacky   // Set attributes which are particular to an alias; this is a
2538f22ef01cSRoman Divacky   // specialization of the attributes which may be set on a global
2539f22ef01cSRoman Divacky   // variable/function.
254039d628a0SDimitry Andric   if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakRefAttr>() ||
25413b0f4066SDimitry Andric       D->isWeakImported()) {
2542f22ef01cSRoman Divacky     GA->setLinkage(llvm::Function::WeakAnyLinkage);
2543f22ef01cSRoman Divacky   }
2544f22ef01cSRoman Divacky 
254539d628a0SDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
254639d628a0SDimitry Andric     if (VD->getTLSKind())
254739d628a0SDimitry Andric       setTLSMode(GA, *VD);
254839d628a0SDimitry Andric 
254939d628a0SDimitry Andric   setAliasAttributes(D, GA);
2550f22ef01cSRoman Divacky }
2551f22ef01cSRoman Divacky 
255217a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
25536122f3e6SDimitry Andric                                             ArrayRef<llvm::Type*> Tys) {
255417a519f9SDimitry Andric   return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
255517a519f9SDimitry Andric                                          Tys);
2556f22ef01cSRoman Divacky }
2557f22ef01cSRoman Divacky 
255833956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> &
255933956c43SDimitry Andric GetConstantCFStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
256033956c43SDimitry Andric                          const StringLiteral *Literal, bool TargetIsLSB,
256133956c43SDimitry Andric                          bool &IsUTF16, unsigned &StringLength) {
25626122f3e6SDimitry Andric   StringRef String = Literal->getString();
2563e580952dSDimitry Andric   unsigned NumBytes = String.size();
2564f22ef01cSRoman Divacky 
2565f22ef01cSRoman Divacky   // Check for simple case.
2566f22ef01cSRoman Divacky   if (!Literal->containsNonAsciiOrNull()) {
2567f22ef01cSRoman Divacky     StringLength = NumBytes;
256839d628a0SDimitry Andric     return *Map.insert(std::make_pair(String, nullptr)).first;
2569f22ef01cSRoman Divacky   }
2570f22ef01cSRoman Divacky 
2571dff0c46cSDimitry Andric   // Otherwise, convert the UTF8 literals into a string of shorts.
2572dff0c46cSDimitry Andric   IsUTF16 = true;
2573dff0c46cSDimitry Andric 
2574dff0c46cSDimitry Andric   SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls.
25753861d79fSDimitry Andric   const UTF8 *FromPtr = (const UTF8 *)String.data();
2576f22ef01cSRoman Divacky   UTF16 *ToPtr = &ToBuf[0];
2577f22ef01cSRoman Divacky 
25782754fe60SDimitry Andric   (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes,
2579f22ef01cSRoman Divacky                            &ToPtr, ToPtr + NumBytes,
2580f22ef01cSRoman Divacky                            strictConversion);
2581f22ef01cSRoman Divacky 
2582f22ef01cSRoman Divacky   // ConvertUTF8toUTF16 returns the length in ToPtr.
2583f22ef01cSRoman Divacky   StringLength = ToPtr - &ToBuf[0];
2584f22ef01cSRoman Divacky 
2585dff0c46cSDimitry Andric   // Add an explicit null.
2586dff0c46cSDimitry Andric   *ToPtr = 0;
258739d628a0SDimitry Andric   return *Map.insert(std::make_pair(
258839d628a0SDimitry Andric                          StringRef(reinterpret_cast<const char *>(ToBuf.data()),
258939d628a0SDimitry Andric                                    (StringLength + 1) * 2),
259039d628a0SDimitry Andric                          nullptr)).first;
2591f22ef01cSRoman Divacky }
2592f22ef01cSRoman Divacky 
259333956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> &
259433956c43SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
259533956c43SDimitry Andric                        const StringLiteral *Literal, unsigned &StringLength) {
25966122f3e6SDimitry Andric   StringRef String = Literal->getString();
2597bd5abe19SDimitry Andric   StringLength = String.size();
259839d628a0SDimitry Andric   return *Map.insert(std::make_pair(String, nullptr)).first;
2599bd5abe19SDimitry Andric }
2600bd5abe19SDimitry Andric 
2601f22ef01cSRoman Divacky llvm::Constant *
2602f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
2603f22ef01cSRoman Divacky   unsigned StringLength = 0;
2604f22ef01cSRoman Divacky   bool isUTF16 = false;
260533956c43SDimitry Andric   llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
2606f22ef01cSRoman Divacky       GetConstantCFStringEntry(CFConstantStringMap, Literal,
260733956c43SDimitry Andric                                getDataLayout().isLittleEndian(), isUTF16,
260833956c43SDimitry Andric                                StringLength);
2609f22ef01cSRoman Divacky 
261039d628a0SDimitry Andric   if (auto *C = Entry.second)
2611f22ef01cSRoman Divacky     return C;
2612f22ef01cSRoman Divacky 
2613dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2614f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2615284c1978SDimitry Andric   llvm::Value *V;
2616f22ef01cSRoman Divacky 
2617f22ef01cSRoman Divacky   // If we don't already have it, get __CFConstantStringClassReference.
2618f22ef01cSRoman Divacky   if (!CFConstantStringClassRef) {
26196122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
2620f22ef01cSRoman Divacky     Ty = llvm::ArrayType::get(Ty, 0);
2621f22ef01cSRoman Divacky     llvm::Constant *GV = CreateRuntimeVariable(Ty,
2622f22ef01cSRoman Divacky                                            "__CFConstantStringClassReference");
2623f22ef01cSRoman Divacky     // Decay array -> ptr
262433956c43SDimitry Andric     V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros);
2625284c1978SDimitry Andric     CFConstantStringClassRef = V;
2626f22ef01cSRoman Divacky   }
2627284c1978SDimitry Andric   else
2628284c1978SDimitry Andric     V = CFConstantStringClassRef;
2629f22ef01cSRoman Divacky 
2630f22ef01cSRoman Divacky   QualType CFTy = getContext().getCFConstantStringType();
2631f22ef01cSRoman Divacky 
263259d1ed5bSDimitry Andric   auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy));
2633f22ef01cSRoman Divacky 
2634dff0c46cSDimitry Andric   llvm::Constant *Fields[4];
2635f22ef01cSRoman Divacky 
2636f22ef01cSRoman Divacky   // Class pointer.
2637284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2638f22ef01cSRoman Divacky 
2639f22ef01cSRoman Divacky   // Flags.
26406122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2641f22ef01cSRoman Divacky   Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) :
2642f22ef01cSRoman Divacky     llvm::ConstantInt::get(Ty, 0x07C8);
2643f22ef01cSRoman Divacky 
2644f22ef01cSRoman Divacky   // String pointer.
264559d1ed5bSDimitry Andric   llvm::Constant *C = nullptr;
2646dff0c46cSDimitry Andric   if (isUTF16) {
264739d628a0SDimitry Andric     ArrayRef<uint16_t> Arr = llvm::makeArrayRef<uint16_t>(
264839d628a0SDimitry Andric         reinterpret_cast<uint16_t *>(const_cast<char *>(Entry.first().data())),
264939d628a0SDimitry Andric         Entry.first().size() / 2);
2650dff0c46cSDimitry Andric     C = llvm::ConstantDataArray::get(VMContext, Arr);
2651dff0c46cSDimitry Andric   } else {
265239d628a0SDimitry Andric     C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
2653dff0c46cSDimitry Andric   }
2654f22ef01cSRoman Divacky 
2655dff0c46cSDimitry Andric   // Note: -fwritable-strings doesn't make the backing store strings of
2656dff0c46cSDimitry Andric   // CFStrings writable. (See <rdar://problem/10657500>)
265759d1ed5bSDimitry Andric   auto *GV =
2658dff0c46cSDimitry Andric       new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true,
265959d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, C, ".str");
26602754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2661284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2662284c1978SDimitry Andric   // of the string is via this class initializer.
266359d1ed5bSDimitry Andric   // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without
266459d1ed5bSDimitry Andric   // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing
266559d1ed5bSDimitry Andric   // that changes the section it ends in, which surprises ld64.
2666f22ef01cSRoman Divacky   if (isUTF16) {
2667f22ef01cSRoman Divacky     CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy);
2668f22ef01cSRoman Divacky     GV->setAlignment(Align.getQuantity());
266959d1ed5bSDimitry Andric     GV->setSection("__TEXT,__ustring");
26703b0f4066SDimitry Andric   } else {
26713b0f4066SDimitry Andric     CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
26723b0f4066SDimitry Andric     GV->setAlignment(Align.getQuantity());
267359d1ed5bSDimitry Andric     GV->setSection("__TEXT,__cstring,cstring_literals");
2674f22ef01cSRoman Divacky   }
2675dff0c46cSDimitry Andric 
2676dff0c46cSDimitry Andric   // String.
267733956c43SDimitry Andric   Fields[2] =
267833956c43SDimitry Andric       llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros);
2679f22ef01cSRoman Divacky 
2680dff0c46cSDimitry Andric   if (isUTF16)
2681dff0c46cSDimitry Andric     // Cast the UTF16 string to the correct type.
2682dff0c46cSDimitry Andric     Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy);
2683dff0c46cSDimitry Andric 
2684f22ef01cSRoman Divacky   // String length.
2685f22ef01cSRoman Divacky   Ty = getTypes().ConvertType(getContext().LongTy);
2686f22ef01cSRoman Divacky   Fields[3] = llvm::ConstantInt::get(Ty, StringLength);
2687f22ef01cSRoman Divacky 
2688f22ef01cSRoman Divacky   // The struct.
2689f22ef01cSRoman Divacky   C = llvm::ConstantStruct::get(STy, Fields);
2690f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2691f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2692f22ef01cSRoman Divacky                                 "_unnamed_cfstring_");
269359d1ed5bSDimitry Andric   GV->setSection("__DATA,__cfstring");
269439d628a0SDimitry Andric   Entry.second = GV;
2695f22ef01cSRoman Divacky 
2696f22ef01cSRoman Divacky   return GV;
2697f22ef01cSRoman Divacky }
2698f22ef01cSRoman Divacky 
269933956c43SDimitry Andric llvm::GlobalVariable *
27002754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
2701f22ef01cSRoman Divacky   unsigned StringLength = 0;
270233956c43SDimitry Andric   llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
2703bd5abe19SDimitry Andric       GetConstantStringEntry(CFConstantStringMap, Literal, StringLength);
2704f22ef01cSRoman Divacky 
270539d628a0SDimitry Andric   if (auto *C = Entry.second)
2706f22ef01cSRoman Divacky     return C;
2707f22ef01cSRoman Divacky 
2708dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2709f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2710284c1978SDimitry Andric   llvm::Value *V;
2711f22ef01cSRoman Divacky   // If we don't already have it, get _NSConstantStringClassReference.
27122754fe60SDimitry Andric   if (!ConstantStringClassRef) {
2713dff0c46cSDimitry Andric     std::string StringClass(getLangOpts().ObjCConstantStringClass);
27146122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
27152754fe60SDimitry Andric     llvm::Constant *GV;
27167ae0e2c9SDimitry Andric     if (LangOpts.ObjCRuntime.isNonFragile()) {
2717bd5abe19SDimitry Andric       std::string str =
2718bd5abe19SDimitry Andric         StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
2719bd5abe19SDimitry Andric                             : "OBJC_CLASS_$_" + StringClass;
2720bd5abe19SDimitry Andric       GV = getObjCRuntime().GetClassGlobal(str);
2721bd5abe19SDimitry Andric       // Make sure the result is of the correct type.
27226122f3e6SDimitry Andric       llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
2723284c1978SDimitry Andric       V = llvm::ConstantExpr::getBitCast(GV, PTy);
2724284c1978SDimitry Andric       ConstantStringClassRef = V;
2725bd5abe19SDimitry Andric     } else {
2726bd5abe19SDimitry Andric       std::string str =
2727bd5abe19SDimitry Andric         StringClass.empty() ? "_NSConstantStringClassReference"
2728bd5abe19SDimitry Andric                             : "_" + StringClass + "ClassReference";
27296122f3e6SDimitry Andric       llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
2730bd5abe19SDimitry Andric       GV = CreateRuntimeVariable(PTy, str);
2731f22ef01cSRoman Divacky       // Decay array -> ptr
273233956c43SDimitry Andric       V = llvm::ConstantExpr::getGetElementPtr(PTy, GV, Zeros);
2733284c1978SDimitry Andric       ConstantStringClassRef = V;
2734f22ef01cSRoman Divacky     }
273533956c43SDimitry Andric   } else
2736284c1978SDimitry Andric     V = ConstantStringClassRef;
2737f22ef01cSRoman Divacky 
27386122f3e6SDimitry Andric   if (!NSConstantStringType) {
27396122f3e6SDimitry Andric     // Construct the type for a constant NSString.
274059d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString");
27416122f3e6SDimitry Andric     D->startDefinition();
2742f22ef01cSRoman Divacky 
27436122f3e6SDimitry Andric     QualType FieldTypes[3];
27446122f3e6SDimitry Andric 
27456122f3e6SDimitry Andric     // const int *isa;
27466122f3e6SDimitry Andric     FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst());
27476122f3e6SDimitry Andric     // const char *str;
27486122f3e6SDimitry Andric     FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst());
27496122f3e6SDimitry Andric     // unsigned int length;
27506122f3e6SDimitry Andric     FieldTypes[2] = Context.UnsignedIntTy;
27516122f3e6SDimitry Andric 
27526122f3e6SDimitry Andric     // Create fields
27536122f3e6SDimitry Andric     for (unsigned i = 0; i < 3; ++i) {
27546122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context, D,
27556122f3e6SDimitry Andric                                            SourceLocation(),
275659d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
275759d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
275859d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
27596122f3e6SDimitry Andric                                            /*Mutable=*/false,
27607ae0e2c9SDimitry Andric                                            ICIS_NoInit);
27616122f3e6SDimitry Andric       Field->setAccess(AS_public);
27626122f3e6SDimitry Andric       D->addDecl(Field);
27636122f3e6SDimitry Andric     }
27646122f3e6SDimitry Andric 
27656122f3e6SDimitry Andric     D->completeDefinition();
27666122f3e6SDimitry Andric     QualType NSTy = Context.getTagDeclType(D);
27676122f3e6SDimitry Andric     NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy));
27686122f3e6SDimitry Andric   }
2769f22ef01cSRoman Divacky 
2770dff0c46cSDimitry Andric   llvm::Constant *Fields[3];
2771f22ef01cSRoman Divacky 
2772f22ef01cSRoman Divacky   // Class pointer.
2773284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2774f22ef01cSRoman Divacky 
2775f22ef01cSRoman Divacky   // String pointer.
2776dff0c46cSDimitry Andric   llvm::Constant *C =
277739d628a0SDimitry Andric       llvm::ConstantDataArray::getString(VMContext, Entry.first());
2778f22ef01cSRoman Divacky 
2779f22ef01cSRoman Divacky   llvm::GlobalValue::LinkageTypes Linkage;
2780f22ef01cSRoman Divacky   bool isConstant;
2781f22ef01cSRoman Divacky   Linkage = llvm::GlobalValue::PrivateLinkage;
2782dff0c46cSDimitry Andric   isConstant = !LangOpts.WritableStrings;
2783f22ef01cSRoman Divacky 
278459d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant,
278559d1ed5bSDimitry Andric                                       Linkage, C, ".str");
27862754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2787284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2788284c1978SDimitry Andric   // of the string is via this class initializer.
27893b0f4066SDimitry Andric   CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
27903b0f4066SDimitry Andric   GV->setAlignment(Align.getQuantity());
279133956c43SDimitry Andric   Fields[1] =
279233956c43SDimitry Andric       llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros);
2793f22ef01cSRoman Divacky 
2794f22ef01cSRoman Divacky   // String length.
27956122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2796f22ef01cSRoman Divacky   Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
2797f22ef01cSRoman Divacky 
2798f22ef01cSRoman Divacky   // The struct.
27996122f3e6SDimitry Andric   C = llvm::ConstantStruct::get(NSConstantStringType, Fields);
2800f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2801f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2802f22ef01cSRoman Divacky                                 "_unnamed_nsstring_");
280359d1ed5bSDimitry Andric   const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
280459d1ed5bSDimitry Andric   const char *NSStringNonFragileABISection =
280559d1ed5bSDimitry Andric       "__DATA,__objc_stringobj,regular,no_dead_strip";
2806f22ef01cSRoman Divacky   // FIXME. Fix section.
280759d1ed5bSDimitry Andric   GV->setSection(LangOpts.ObjCRuntime.isNonFragile()
280859d1ed5bSDimitry Andric                      ? NSStringNonFragileABISection
280959d1ed5bSDimitry Andric                      : NSStringSection);
281039d628a0SDimitry Andric   Entry.second = GV;
2811f22ef01cSRoman Divacky 
2812f22ef01cSRoman Divacky   return GV;
2813f22ef01cSRoman Divacky }
2814f22ef01cSRoman Divacky 
28156122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() {
28166122f3e6SDimitry Andric   if (ObjCFastEnumerationStateType.isNull()) {
281759d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState");
28186122f3e6SDimitry Andric     D->startDefinition();
28196122f3e6SDimitry Andric 
28206122f3e6SDimitry Andric     QualType FieldTypes[] = {
28216122f3e6SDimitry Andric       Context.UnsignedLongTy,
28226122f3e6SDimitry Andric       Context.getPointerType(Context.getObjCIdType()),
28236122f3e6SDimitry Andric       Context.getPointerType(Context.UnsignedLongTy),
28246122f3e6SDimitry Andric       Context.getConstantArrayType(Context.UnsignedLongTy,
28256122f3e6SDimitry Andric                            llvm::APInt(32, 5), ArrayType::Normal, 0)
28266122f3e6SDimitry Andric     };
28276122f3e6SDimitry Andric 
28286122f3e6SDimitry Andric     for (size_t i = 0; i < 4; ++i) {
28296122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context,
28306122f3e6SDimitry Andric                                            D,
28316122f3e6SDimitry Andric                                            SourceLocation(),
283259d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
283359d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
283459d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
28356122f3e6SDimitry Andric                                            /*Mutable=*/false,
28367ae0e2c9SDimitry Andric                                            ICIS_NoInit);
28376122f3e6SDimitry Andric       Field->setAccess(AS_public);
28386122f3e6SDimitry Andric       D->addDecl(Field);
28396122f3e6SDimitry Andric     }
28406122f3e6SDimitry Andric 
28416122f3e6SDimitry Andric     D->completeDefinition();
28426122f3e6SDimitry Andric     ObjCFastEnumerationStateType = Context.getTagDeclType(D);
28436122f3e6SDimitry Andric   }
28446122f3e6SDimitry Andric 
28456122f3e6SDimitry Andric   return ObjCFastEnumerationStateType;
28466122f3e6SDimitry Andric }
28476122f3e6SDimitry Andric 
2848dff0c46cSDimitry Andric llvm::Constant *
2849dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
2850dff0c46cSDimitry Andric   assert(!E->getType()->isPointerType() && "Strings are always arrays");
2851f22ef01cSRoman Divacky 
2852dff0c46cSDimitry Andric   // Don't emit it as the address of the string, emit the string data itself
2853dff0c46cSDimitry Andric   // as an inline array.
2854dff0c46cSDimitry Andric   if (E->getCharByteWidth() == 1) {
2855dff0c46cSDimitry Andric     SmallString<64> Str(E->getString());
2856f22ef01cSRoman Divacky 
2857dff0c46cSDimitry Andric     // Resize the string to the right size, which is indicated by its type.
2858dff0c46cSDimitry Andric     const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType());
2859dff0c46cSDimitry Andric     Str.resize(CAT->getSize().getZExtValue());
2860dff0c46cSDimitry Andric     return llvm::ConstantDataArray::getString(VMContext, Str, false);
28616122f3e6SDimitry Andric   }
2862f22ef01cSRoman Divacky 
286359d1ed5bSDimitry Andric   auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
2864dff0c46cSDimitry Andric   llvm::Type *ElemTy = AType->getElementType();
2865dff0c46cSDimitry Andric   unsigned NumElements = AType->getNumElements();
2866f22ef01cSRoman Divacky 
2867dff0c46cSDimitry Andric   // Wide strings have either 2-byte or 4-byte elements.
2868dff0c46cSDimitry Andric   if (ElemTy->getPrimitiveSizeInBits() == 16) {
2869dff0c46cSDimitry Andric     SmallVector<uint16_t, 32> Elements;
2870dff0c46cSDimitry Andric     Elements.reserve(NumElements);
2871dff0c46cSDimitry Andric 
2872dff0c46cSDimitry Andric     for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2873dff0c46cSDimitry Andric       Elements.push_back(E->getCodeUnit(i));
2874dff0c46cSDimitry Andric     Elements.resize(NumElements);
2875dff0c46cSDimitry Andric     return llvm::ConstantDataArray::get(VMContext, Elements);
2876dff0c46cSDimitry Andric   }
2877dff0c46cSDimitry Andric 
2878dff0c46cSDimitry Andric   assert(ElemTy->getPrimitiveSizeInBits() == 32);
2879dff0c46cSDimitry Andric   SmallVector<uint32_t, 32> Elements;
2880dff0c46cSDimitry Andric   Elements.reserve(NumElements);
2881dff0c46cSDimitry Andric 
2882dff0c46cSDimitry Andric   for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2883dff0c46cSDimitry Andric     Elements.push_back(E->getCodeUnit(i));
2884dff0c46cSDimitry Andric   Elements.resize(NumElements);
2885dff0c46cSDimitry Andric   return llvm::ConstantDataArray::get(VMContext, Elements);
2886f22ef01cSRoman Divacky }
2887f22ef01cSRoman Divacky 
288859d1ed5bSDimitry Andric static llvm::GlobalVariable *
288959d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT,
289059d1ed5bSDimitry Andric                       CodeGenModule &CGM, StringRef GlobalName,
289159d1ed5bSDimitry Andric                       unsigned Alignment) {
289259d1ed5bSDimitry Andric   // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
289359d1ed5bSDimitry Andric   unsigned AddrSpace = 0;
289459d1ed5bSDimitry Andric   if (CGM.getLangOpts().OpenCL)
289559d1ed5bSDimitry Andric     AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
2896dff0c46cSDimitry Andric 
289733956c43SDimitry Andric   llvm::Module &M = CGM.getModule();
289859d1ed5bSDimitry Andric   // Create a global variable for this string
289959d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
290033956c43SDimitry Andric       M, C->getType(), !CGM.getLangOpts().WritableStrings, LT, C, GlobalName,
290133956c43SDimitry Andric       nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
290259d1ed5bSDimitry Andric   GV->setAlignment(Alignment);
290359d1ed5bSDimitry Andric   GV->setUnnamedAddr(true);
290433956c43SDimitry Andric   if (GV->isWeakForLinker()) {
290533956c43SDimitry Andric     assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals");
290633956c43SDimitry Andric     GV->setComdat(M.getOrInsertComdat(GV->getName()));
290733956c43SDimitry Andric   }
290833956c43SDimitry Andric 
290959d1ed5bSDimitry Andric   return GV;
2910f22ef01cSRoman Divacky }
2911dff0c46cSDimitry Andric 
291259d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a
291359d1ed5bSDimitry Andric /// constant array for the given string literal.
291459d1ed5bSDimitry Andric llvm::GlobalVariable *
291539d628a0SDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S,
291639d628a0SDimitry Andric                                                   StringRef Name) {
291759d1ed5bSDimitry Andric   auto Alignment =
291859d1ed5bSDimitry Andric       getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
2919dff0c46cSDimitry Andric 
292059d1ed5bSDimitry Andric   llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
292159d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
292259d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
292359d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
292459d1ed5bSDimitry Andric     if (auto GV = *Entry) {
292559d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
292659d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
292759d1ed5bSDimitry Andric       return GV;
292859d1ed5bSDimitry Andric     }
292959d1ed5bSDimitry Andric   }
293059d1ed5bSDimitry Andric 
293159d1ed5bSDimitry Andric   SmallString<256> MangledNameBuffer;
293259d1ed5bSDimitry Andric   StringRef GlobalVariableName;
293359d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes LT;
293459d1ed5bSDimitry Andric 
293559d1ed5bSDimitry Andric   // Mangle the string literal if the ABI allows for it.  However, we cannot
293659d1ed5bSDimitry Andric   // do this if  we are compiling with ASan or -fwritable-strings because they
293759d1ed5bSDimitry Andric   // rely on strings having normal linkage.
293839d628a0SDimitry Andric   if (!LangOpts.WritableStrings &&
293939d628a0SDimitry Andric       !LangOpts.Sanitize.has(SanitizerKind::Address) &&
294059d1ed5bSDimitry Andric       getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) {
294159d1ed5bSDimitry Andric     llvm::raw_svector_ostream Out(MangledNameBuffer);
294259d1ed5bSDimitry Andric     getCXXABI().getMangleContext().mangleStringLiteral(S, Out);
294359d1ed5bSDimitry Andric     Out.flush();
294459d1ed5bSDimitry Andric 
294559d1ed5bSDimitry Andric     LT = llvm::GlobalValue::LinkOnceODRLinkage;
294659d1ed5bSDimitry Andric     GlobalVariableName = MangledNameBuffer;
294759d1ed5bSDimitry Andric   } else {
294859d1ed5bSDimitry Andric     LT = llvm::GlobalValue::PrivateLinkage;
294939d628a0SDimitry Andric     GlobalVariableName = Name;
295059d1ed5bSDimitry Andric   }
295159d1ed5bSDimitry Andric 
295259d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
295359d1ed5bSDimitry Andric   if (Entry)
295459d1ed5bSDimitry Andric     *Entry = GV;
295559d1ed5bSDimitry Andric 
295639d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>",
295739d628a0SDimitry Andric                                   QualType());
2958dff0c46cSDimitry Andric   return GV;
2959f22ef01cSRoman Divacky }
2960f22ef01cSRoman Divacky 
2961f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant
2962f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node.
296359d1ed5bSDimitry Andric llvm::GlobalVariable *
2964f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
2965f22ef01cSRoman Divacky   std::string Str;
2966f22ef01cSRoman Divacky   getContext().getObjCEncodingForType(E->getEncodedType(), Str);
2967f22ef01cSRoman Divacky 
2968f22ef01cSRoman Divacky   return GetAddrOfConstantCString(Str);
2969f22ef01cSRoman Divacky }
2970f22ef01cSRoman Divacky 
297159d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing
297259d1ed5bSDimitry Andric /// the literal and a terminating '\0' character.
297359d1ed5bSDimitry Andric /// The result has pointer to array type.
297459d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
297559d1ed5bSDimitry Andric     const std::string &Str, const char *GlobalName, unsigned Alignment) {
297659d1ed5bSDimitry Andric   StringRef StrWithNull(Str.c_str(), Str.size() + 1);
297759d1ed5bSDimitry Andric   if (Alignment == 0) {
297859d1ed5bSDimitry Andric     Alignment = getContext()
297959d1ed5bSDimitry Andric                     .getAlignOfGlobalVarInChars(getContext().CharTy)
298059d1ed5bSDimitry Andric                     .getQuantity();
2981f22ef01cSRoman Divacky   }
2982f22ef01cSRoman Divacky 
298359d1ed5bSDimitry Andric   llvm::Constant *C =
298459d1ed5bSDimitry Andric       llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
298559d1ed5bSDimitry Andric 
298659d1ed5bSDimitry Andric   // Don't share any string literals if strings aren't constant.
298759d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
298859d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
298959d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
299059d1ed5bSDimitry Andric     if (auto GV = *Entry) {
299159d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
299259d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
299359d1ed5bSDimitry Andric       return GV;
299459d1ed5bSDimitry Andric     }
299559d1ed5bSDimitry Andric   }
299659d1ed5bSDimitry Andric 
2997f22ef01cSRoman Divacky   // Get the default prefix if a name wasn't specified.
2998f22ef01cSRoman Divacky   if (!GlobalName)
2999f22ef01cSRoman Divacky     GlobalName = ".str";
3000f22ef01cSRoman Divacky   // Create a global variable for this.
300159d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
300259d1ed5bSDimitry Andric                                   GlobalName, Alignment);
300359d1ed5bSDimitry Andric   if (Entry)
300459d1ed5bSDimitry Andric     *Entry = GV;
30056122f3e6SDimitry Andric   return GV;
3006f22ef01cSRoman Divacky }
3007f22ef01cSRoman Divacky 
3008f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
3009f785676fSDimitry Andric     const MaterializeTemporaryExpr *E, const Expr *Init) {
3010f785676fSDimitry Andric   assert((E->getStorageDuration() == SD_Static ||
3011f785676fSDimitry Andric           E->getStorageDuration() == SD_Thread) && "not a global temporary");
301259d1ed5bSDimitry Andric   const auto *VD = cast<VarDecl>(E->getExtendingDecl());
3013f785676fSDimitry Andric 
3014f785676fSDimitry Andric   // If we're not materializing a subobject of the temporary, keep the
3015f785676fSDimitry Andric   // cv-qualifiers from the type of the MaterializeTemporaryExpr.
3016f785676fSDimitry Andric   QualType MaterializedType = Init->getType();
3017f785676fSDimitry Andric   if (Init == E->GetTemporaryExpr())
3018f785676fSDimitry Andric     MaterializedType = E->getType();
3019f785676fSDimitry Andric 
3020f785676fSDimitry Andric   llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E];
3021f785676fSDimitry Andric   if (Slot)
3022f785676fSDimitry Andric     return Slot;
3023f785676fSDimitry Andric 
3024f785676fSDimitry Andric   // FIXME: If an externally-visible declaration extends multiple temporaries,
3025f785676fSDimitry Andric   // we need to give each temporary the same name in every translation unit (and
3026f785676fSDimitry Andric   // we also need to make the temporaries externally-visible).
3027f785676fSDimitry Andric   SmallString<256> Name;
3028f785676fSDimitry Andric   llvm::raw_svector_ostream Out(Name);
302959d1ed5bSDimitry Andric   getCXXABI().getMangleContext().mangleReferenceTemporary(
303059d1ed5bSDimitry Andric       VD, E->getManglingNumber(), Out);
3031f785676fSDimitry Andric   Out.flush();
3032f785676fSDimitry Andric 
303359d1ed5bSDimitry Andric   APValue *Value = nullptr;
3034f785676fSDimitry Andric   if (E->getStorageDuration() == SD_Static) {
3035f785676fSDimitry Andric     // We might have a cached constant initializer for this temporary. Note
3036f785676fSDimitry Andric     // that this might have a different value from the value computed by
3037f785676fSDimitry Andric     // evaluating the initializer if the surrounding constant expression
3038f785676fSDimitry Andric     // modifies the temporary.
3039f785676fSDimitry Andric     Value = getContext().getMaterializedTemporaryValue(E, false);
3040f785676fSDimitry Andric     if (Value && Value->isUninit())
304159d1ed5bSDimitry Andric       Value = nullptr;
3042f785676fSDimitry Andric   }
3043f785676fSDimitry Andric 
3044f785676fSDimitry Andric   // Try evaluating it now, it might have a constant initializer.
3045f785676fSDimitry Andric   Expr::EvalResult EvalResult;
3046f785676fSDimitry Andric   if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) &&
3047f785676fSDimitry Andric       !EvalResult.hasSideEffects())
3048f785676fSDimitry Andric     Value = &EvalResult.Val;
3049f785676fSDimitry Andric 
305059d1ed5bSDimitry Andric   llvm::Constant *InitialValue = nullptr;
3051f785676fSDimitry Andric   bool Constant = false;
3052f785676fSDimitry Andric   llvm::Type *Type;
3053f785676fSDimitry Andric   if (Value) {
3054f785676fSDimitry Andric     // The temporary has a constant initializer, use it.
305559d1ed5bSDimitry Andric     InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr);
3056f785676fSDimitry Andric     Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value);
3057f785676fSDimitry Andric     Type = InitialValue->getType();
3058f785676fSDimitry Andric   } else {
3059f785676fSDimitry Andric     // No initializer, the initialization will be provided when we
3060f785676fSDimitry Andric     // initialize the declaration which performed lifetime extension.
3061f785676fSDimitry Andric     Type = getTypes().ConvertTypeForMem(MaterializedType);
3062f785676fSDimitry Andric   }
3063f785676fSDimitry Andric 
3064f785676fSDimitry Andric   // Create a global variable for this lifetime-extended temporary.
306559d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
306659d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(VD, Constant);
306733956c43SDimitry Andric   if (Linkage == llvm::GlobalVariable::ExternalLinkage) {
306833956c43SDimitry Andric     const VarDecl *InitVD;
306933956c43SDimitry Andric     if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
307033956c43SDimitry Andric         isa<CXXRecordDecl>(InitVD->getLexicalDeclContext())) {
307133956c43SDimitry Andric       // Temporaries defined inside a class get linkonce_odr linkage because the
307233956c43SDimitry Andric       // class can be defined in multipe translation units.
307333956c43SDimitry Andric       Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
307433956c43SDimitry Andric     } else {
307533956c43SDimitry Andric       // There is no need for this temporary to have external linkage if the
307633956c43SDimitry Andric       // VarDecl has external linkage.
307733956c43SDimitry Andric       Linkage = llvm::GlobalVariable::InternalLinkage;
307833956c43SDimitry Andric     }
307933956c43SDimitry Andric   }
308059d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(
308159d1ed5bSDimitry Andric       VD, getContext().getTargetAddressSpace(MaterializedType));
308259d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
308359d1ed5bSDimitry Andric       getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
308459d1ed5bSDimitry Andric       /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal,
308559d1ed5bSDimitry Andric       AddrSpace);
308659d1ed5bSDimitry Andric   setGlobalVisibility(GV, VD);
3087f785676fSDimitry Andric   GV->setAlignment(
3088f785676fSDimitry Andric       getContext().getTypeAlignInChars(MaterializedType).getQuantity());
308933956c43SDimitry Andric   if (supportsCOMDAT() && GV->isWeakForLinker())
309033956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3091f785676fSDimitry Andric   if (VD->getTLSKind())
3092f785676fSDimitry Andric     setTLSMode(GV, *VD);
3093f785676fSDimitry Andric   Slot = GV;
3094f785676fSDimitry Andric   return GV;
3095f785676fSDimitry Andric }
3096f785676fSDimitry Andric 
3097f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized
3098f22ef01cSRoman Divacky /// properties for an implementation.
3099f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const
3100f22ef01cSRoman Divacky                                                     ObjCImplementationDecl *D) {
310159d1ed5bSDimitry Andric   for (const auto *PID : D->property_impls()) {
3102f22ef01cSRoman Divacky     // Dynamic is just for type-checking.
3103f22ef01cSRoman Divacky     if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3104f22ef01cSRoman Divacky       ObjCPropertyDecl *PD = PID->getPropertyDecl();
3105f22ef01cSRoman Divacky 
3106f22ef01cSRoman Divacky       // Determine which methods need to be implemented, some may have
31073861d79fSDimitry Andric       // been overridden. Note that ::isPropertyAccessor is not the method
3108f22ef01cSRoman Divacky       // we want, that just indicates if the decl came from a
3109f22ef01cSRoman Divacky       // property. What we want to know is if the method is defined in
3110f22ef01cSRoman Divacky       // this implementation.
3111f22ef01cSRoman Divacky       if (!D->getInstanceMethod(PD->getGetterName()))
3112f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCGetter(
3113f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3114f22ef01cSRoman Divacky       if (!PD->isReadOnly() &&
3115f22ef01cSRoman Divacky           !D->getInstanceMethod(PD->getSetterName()))
3116f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCSetter(
3117f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3118f22ef01cSRoman Divacky     }
3119f22ef01cSRoman Divacky   }
3120f22ef01cSRoman Divacky }
3121f22ef01cSRoman Divacky 
31223b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) {
31236122f3e6SDimitry Andric   const ObjCInterfaceDecl *iface = impl->getClassInterface();
31246122f3e6SDimitry Andric   for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
31253b0f4066SDimitry Andric        ivar; ivar = ivar->getNextIvar())
31263b0f4066SDimitry Andric     if (ivar->getType().isDestructedType())
31273b0f4066SDimitry Andric       return true;
31283b0f4066SDimitry Andric 
31293b0f4066SDimitry Andric   return false;
31303b0f4066SDimitry Andric }
31313b0f4066SDimitry Andric 
313239d628a0SDimitry Andric static bool AllTrivialInitializers(CodeGenModule &CGM,
313339d628a0SDimitry Andric                                    ObjCImplementationDecl *D) {
313439d628a0SDimitry Andric   CodeGenFunction CGF(CGM);
313539d628a0SDimitry Andric   for (ObjCImplementationDecl::init_iterator B = D->init_begin(),
313639d628a0SDimitry Andric        E = D->init_end(); B != E; ++B) {
313739d628a0SDimitry Andric     CXXCtorInitializer *CtorInitExp = *B;
313839d628a0SDimitry Andric     Expr *Init = CtorInitExp->getInit();
313939d628a0SDimitry Andric     if (!CGF.isTrivialInitializer(Init))
314039d628a0SDimitry Andric       return false;
314139d628a0SDimitry Andric   }
314239d628a0SDimitry Andric   return true;
314339d628a0SDimitry Andric }
314439d628a0SDimitry Andric 
3145f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization
3146f22ef01cSRoman Divacky /// for an implementation.
3147f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
31483b0f4066SDimitry Andric   // We might need a .cxx_destruct even if we don't have any ivar initializers.
31493b0f4066SDimitry Andric   if (needsDestructMethod(D)) {
3150f22ef01cSRoman Divacky     IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
3151f22ef01cSRoman Divacky     Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
31523b0f4066SDimitry Andric     ObjCMethodDecl *DTORMethod =
31533b0f4066SDimitry Andric       ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
315459d1ed5bSDimitry Andric                              cxxSelector, getContext().VoidTy, nullptr, D,
31556122f3e6SDimitry Andric                              /*isInstance=*/true, /*isVariadic=*/false,
31563861d79fSDimitry Andric                           /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true,
31576122f3e6SDimitry Andric                              /*isDefined=*/false, ObjCMethodDecl::Required);
3158f22ef01cSRoman Divacky     D->addInstanceMethod(DTORMethod);
3159f22ef01cSRoman Divacky     CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
31603861d79fSDimitry Andric     D->setHasDestructors(true);
31613b0f4066SDimitry Andric   }
3162f22ef01cSRoman Divacky 
31633b0f4066SDimitry Andric   // If the implementation doesn't have any ivar initializers, we don't need
31643b0f4066SDimitry Andric   // a .cxx_construct.
316539d628a0SDimitry Andric   if (D->getNumIvarInitializers() == 0 ||
316639d628a0SDimitry Andric       AllTrivialInitializers(*this, D))
31673b0f4066SDimitry Andric     return;
31683b0f4066SDimitry Andric 
31693b0f4066SDimitry Andric   IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
31703b0f4066SDimitry Andric   Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
3171f22ef01cSRoman Divacky   // The constructor returns 'self'.
3172f22ef01cSRoman Divacky   ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
3173f22ef01cSRoman Divacky                                                 D->getLocation(),
31746122f3e6SDimitry Andric                                                 D->getLocation(),
31756122f3e6SDimitry Andric                                                 cxxSelector,
317659d1ed5bSDimitry Andric                                                 getContext().getObjCIdType(),
317759d1ed5bSDimitry Andric                                                 nullptr, D, /*isInstance=*/true,
31786122f3e6SDimitry Andric                                                 /*isVariadic=*/false,
31793861d79fSDimitry Andric                                                 /*isPropertyAccessor=*/true,
31806122f3e6SDimitry Andric                                                 /*isImplicitlyDeclared=*/true,
31816122f3e6SDimitry Andric                                                 /*isDefined=*/false,
3182f22ef01cSRoman Divacky                                                 ObjCMethodDecl::Required);
3183f22ef01cSRoman Divacky   D->addInstanceMethod(CTORMethod);
3184f22ef01cSRoman Divacky   CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
31853861d79fSDimitry Andric   D->setHasNonZeroConstructors(true);
3186f22ef01cSRoman Divacky }
3187f22ef01cSRoman Divacky 
3188f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace.
3189f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) {
319059d1ed5bSDimitry Andric   for (auto *I : ND->decls()) {
319159d1ed5bSDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(I))
3192f785676fSDimitry Andric       if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
3193f785676fSDimitry Andric           VD->getTemplateSpecializationKind() != TSK_Undeclared)
3194f785676fSDimitry Andric         continue;
319559d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3196f22ef01cSRoman Divacky   }
3197f785676fSDimitry Andric }
3198f22ef01cSRoman Divacky 
3199f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec.
3200f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
3201f22ef01cSRoman Divacky   if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
3202f22ef01cSRoman Divacky       LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
3203f22ef01cSRoman Divacky     ErrorUnsupported(LSD, "linkage spec");
3204f22ef01cSRoman Divacky     return;
3205f22ef01cSRoman Divacky   }
3206f22ef01cSRoman Divacky 
320759d1ed5bSDimitry Andric   for (auto *I : LSD->decls()) {
32083861d79fSDimitry Andric     // Meta-data for ObjC class includes references to implemented methods.
32093861d79fSDimitry Andric     // Generate class's method definitions first.
321059d1ed5bSDimitry Andric     if (auto *OID = dyn_cast<ObjCImplDecl>(I)) {
321159d1ed5bSDimitry Andric       for (auto *M : OID->methods())
321259d1ed5bSDimitry Andric         EmitTopLevelDecl(M);
32133861d79fSDimitry Andric     }
321459d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3215f22ef01cSRoman Divacky   }
32163861d79fSDimitry Andric }
3217f22ef01cSRoman Divacky 
3218f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration.
3219f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) {
3220f22ef01cSRoman Divacky   // Ignore dependent declarations.
3221f22ef01cSRoman Divacky   if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
3222f22ef01cSRoman Divacky     return;
3223f22ef01cSRoman Divacky 
3224f22ef01cSRoman Divacky   switch (D->getKind()) {
3225f22ef01cSRoman Divacky   case Decl::CXXConversion:
3226f22ef01cSRoman Divacky   case Decl::CXXMethod:
3227f22ef01cSRoman Divacky   case Decl::Function:
3228f22ef01cSRoman Divacky     // Skip function templates
32293b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
32303b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3231f22ef01cSRoman Divacky       return;
3232f22ef01cSRoman Divacky 
3233f22ef01cSRoman Divacky     EmitGlobal(cast<FunctionDecl>(D));
323439d628a0SDimitry Andric     // Always provide some coverage mapping
323539d628a0SDimitry Andric     // even for the functions that aren't emitted.
323639d628a0SDimitry Andric     AddDeferredUnusedCoverageMapping(D);
3237f22ef01cSRoman Divacky     break;
3238f22ef01cSRoman Divacky 
3239f22ef01cSRoman Divacky   case Decl::Var:
3240f785676fSDimitry Andric     // Skip variable templates
3241f785676fSDimitry Andric     if (cast<VarDecl>(D)->getDescribedVarTemplate())
3242f785676fSDimitry Andric       return;
3243f785676fSDimitry Andric   case Decl::VarTemplateSpecialization:
3244f22ef01cSRoman Divacky     EmitGlobal(cast<VarDecl>(D));
3245f22ef01cSRoman Divacky     break;
3246f22ef01cSRoman Divacky 
32473b0f4066SDimitry Andric   // Indirect fields from global anonymous structs and unions can be
32483b0f4066SDimitry Andric   // ignored; only the actual variable requires IR gen support.
32493b0f4066SDimitry Andric   case Decl::IndirectField:
32503b0f4066SDimitry Andric     break;
32513b0f4066SDimitry Andric 
3252f22ef01cSRoman Divacky   // C++ Decls
3253f22ef01cSRoman Divacky   case Decl::Namespace:
3254f22ef01cSRoman Divacky     EmitNamespace(cast<NamespaceDecl>(D));
3255f22ef01cSRoman Divacky     break;
3256f22ef01cSRoman Divacky     // No code generation needed.
3257f22ef01cSRoman Divacky   case Decl::UsingShadow:
3258f22ef01cSRoman Divacky   case Decl::ClassTemplate:
3259f785676fSDimitry Andric   case Decl::VarTemplate:
3260f785676fSDimitry Andric   case Decl::VarTemplatePartialSpecialization:
3261f22ef01cSRoman Divacky   case Decl::FunctionTemplate:
3262bd5abe19SDimitry Andric   case Decl::TypeAliasTemplate:
3263bd5abe19SDimitry Andric   case Decl::Block:
3264139f7f9bSDimitry Andric   case Decl::Empty:
3265f22ef01cSRoman Divacky     break;
326659d1ed5bSDimitry Andric   case Decl::Using:          // using X; [C++]
326759d1ed5bSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
326859d1ed5bSDimitry Andric         DI->EmitUsingDecl(cast<UsingDecl>(*D));
326959d1ed5bSDimitry Andric     return;
3270f785676fSDimitry Andric   case Decl::NamespaceAlias:
3271f785676fSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3272f785676fSDimitry Andric         DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D));
3273f785676fSDimitry Andric     return;
3274284c1978SDimitry Andric   case Decl::UsingDirective: // using namespace X; [C++]
3275284c1978SDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3276284c1978SDimitry Andric       DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D));
3277284c1978SDimitry Andric     return;
3278f22ef01cSRoman Divacky   case Decl::CXXConstructor:
3279f22ef01cSRoman Divacky     // Skip function templates
32803b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
32813b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3282f22ef01cSRoman Divacky       return;
3283f22ef01cSRoman Divacky 
3284f785676fSDimitry Andric     getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D));
3285f22ef01cSRoman Divacky     break;
3286f22ef01cSRoman Divacky   case Decl::CXXDestructor:
32873b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->isLateTemplateParsed())
32883b0f4066SDimitry Andric       return;
3289f785676fSDimitry Andric     getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D));
3290f22ef01cSRoman Divacky     break;
3291f22ef01cSRoman Divacky 
3292f22ef01cSRoman Divacky   case Decl::StaticAssert:
3293f22ef01cSRoman Divacky     // Nothing to do.
3294f22ef01cSRoman Divacky     break;
3295f22ef01cSRoman Divacky 
3296f22ef01cSRoman Divacky   // Objective-C Decls
3297f22ef01cSRoman Divacky 
3298f22ef01cSRoman Divacky   // Forward declarations, no (immediate) code generation.
3299f22ef01cSRoman Divacky   case Decl::ObjCInterface:
33007ae0e2c9SDimitry Andric   case Decl::ObjCCategory:
3301f22ef01cSRoman Divacky     break;
3302f22ef01cSRoman Divacky 
3303dff0c46cSDimitry Andric   case Decl::ObjCProtocol: {
330459d1ed5bSDimitry Andric     auto *Proto = cast<ObjCProtocolDecl>(D);
3305dff0c46cSDimitry Andric     if (Proto->isThisDeclarationADefinition())
3306dff0c46cSDimitry Andric       ObjCRuntime->GenerateProtocol(Proto);
3307f22ef01cSRoman Divacky     break;
3308dff0c46cSDimitry Andric   }
3309f22ef01cSRoman Divacky 
3310f22ef01cSRoman Divacky   case Decl::ObjCCategoryImpl:
3311f22ef01cSRoman Divacky     // Categories have properties but don't support synthesize so we
3312f22ef01cSRoman Divacky     // can ignore them here.
33136122f3e6SDimitry Andric     ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
3314f22ef01cSRoman Divacky     break;
3315f22ef01cSRoman Divacky 
3316f22ef01cSRoman Divacky   case Decl::ObjCImplementation: {
331759d1ed5bSDimitry Andric     auto *OMD = cast<ObjCImplementationDecl>(D);
3318f22ef01cSRoman Divacky     EmitObjCPropertyImplementations(OMD);
3319f22ef01cSRoman Divacky     EmitObjCIvarInitializations(OMD);
33206122f3e6SDimitry Andric     ObjCRuntime->GenerateClass(OMD);
3321dff0c46cSDimitry Andric     // Emit global variable debug information.
3322dff0c46cSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3323139f7f9bSDimitry Andric       if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
3324139f7f9bSDimitry Andric         DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
3325139f7f9bSDimitry Andric             OMD->getClassInterface()), OMD->getLocation());
3326f22ef01cSRoman Divacky     break;
3327f22ef01cSRoman Divacky   }
3328f22ef01cSRoman Divacky   case Decl::ObjCMethod: {
332959d1ed5bSDimitry Andric     auto *OMD = cast<ObjCMethodDecl>(D);
3330f22ef01cSRoman Divacky     // If this is not a prototype, emit the body.
3331f22ef01cSRoman Divacky     if (OMD->getBody())
3332f22ef01cSRoman Divacky       CodeGenFunction(*this).GenerateObjCMethod(OMD);
3333f22ef01cSRoman Divacky     break;
3334f22ef01cSRoman Divacky   }
3335f22ef01cSRoman Divacky   case Decl::ObjCCompatibleAlias:
3336dff0c46cSDimitry Andric     ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D));
3337f22ef01cSRoman Divacky     break;
3338f22ef01cSRoman Divacky 
3339f22ef01cSRoman Divacky   case Decl::LinkageSpec:
3340f22ef01cSRoman Divacky     EmitLinkageSpec(cast<LinkageSpecDecl>(D));
3341f22ef01cSRoman Divacky     break;
3342f22ef01cSRoman Divacky 
3343f22ef01cSRoman Divacky   case Decl::FileScopeAsm: {
334433956c43SDimitry Andric     // File-scope asm is ignored during device-side CUDA compilation.
334533956c43SDimitry Andric     if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
334633956c43SDimitry Andric       break;
334759d1ed5bSDimitry Andric     auto *AD = cast<FileScopeAsmDecl>(D);
334833956c43SDimitry Andric     getModule().appendModuleInlineAsm(AD->getAsmString()->getString());
3349f22ef01cSRoman Divacky     break;
3350f22ef01cSRoman Divacky   }
3351f22ef01cSRoman Divacky 
3352139f7f9bSDimitry Andric   case Decl::Import: {
335359d1ed5bSDimitry Andric     auto *Import = cast<ImportDecl>(D);
3354139f7f9bSDimitry Andric 
3355139f7f9bSDimitry Andric     // Ignore import declarations that come from imported modules.
335633956c43SDimitry Andric     if (clang::Module *Owner = Import->getImportedOwningModule()) {
3357139f7f9bSDimitry Andric       if (getLangOpts().CurrentModule.empty() ||
3358139f7f9bSDimitry Andric           Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)
3359139f7f9bSDimitry Andric         break;
3360139f7f9bSDimitry Andric     }
3361139f7f9bSDimitry Andric 
3362139f7f9bSDimitry Andric     ImportedModules.insert(Import->getImportedModule());
3363139f7f9bSDimitry Andric     break;
3364139f7f9bSDimitry Andric   }
3365139f7f9bSDimitry Andric 
336639d628a0SDimitry Andric   case Decl::OMPThreadPrivate:
336739d628a0SDimitry Andric     EmitOMPThreadPrivateDecl(cast<OMPThreadPrivateDecl>(D));
336839d628a0SDimitry Andric     break;
336939d628a0SDimitry Andric 
337059d1ed5bSDimitry Andric   case Decl::ClassTemplateSpecialization: {
337159d1ed5bSDimitry Andric     const auto *Spec = cast<ClassTemplateSpecializationDecl>(D);
337259d1ed5bSDimitry Andric     if (DebugInfo &&
337339d628a0SDimitry Andric         Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition &&
337439d628a0SDimitry Andric         Spec->hasDefinition())
337559d1ed5bSDimitry Andric       DebugInfo->completeTemplateDefinition(*Spec);
337639d628a0SDimitry Andric     break;
337759d1ed5bSDimitry Andric   }
337859d1ed5bSDimitry Andric 
3379f22ef01cSRoman Divacky   default:
3380f22ef01cSRoman Divacky     // Make sure we handled everything we should, every other kind is a
3381f22ef01cSRoman Divacky     // non-top-level decl.  FIXME: Would be nice to have an isTopLevelDeclKind
3382f22ef01cSRoman Divacky     // function. Need to recode Decl::Kind to do that easily.
3383f22ef01cSRoman Divacky     assert(isa<TypeDecl>(D) && "Unsupported decl kind");
338439d628a0SDimitry Andric     break;
338539d628a0SDimitry Andric   }
338639d628a0SDimitry Andric }
338739d628a0SDimitry Andric 
338839d628a0SDimitry Andric void CodeGenModule::AddDeferredUnusedCoverageMapping(Decl *D) {
338939d628a0SDimitry Andric   // Do we need to generate coverage mapping?
339039d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
339139d628a0SDimitry Andric     return;
339239d628a0SDimitry Andric   switch (D->getKind()) {
339339d628a0SDimitry Andric   case Decl::CXXConversion:
339439d628a0SDimitry Andric   case Decl::CXXMethod:
339539d628a0SDimitry Andric   case Decl::Function:
339639d628a0SDimitry Andric   case Decl::ObjCMethod:
339739d628a0SDimitry Andric   case Decl::CXXConstructor:
339839d628a0SDimitry Andric   case Decl::CXXDestructor: {
339939d628a0SDimitry Andric     if (!cast<FunctionDecl>(D)->hasBody())
340039d628a0SDimitry Andric       return;
340139d628a0SDimitry Andric     auto I = DeferredEmptyCoverageMappingDecls.find(D);
340239d628a0SDimitry Andric     if (I == DeferredEmptyCoverageMappingDecls.end())
340339d628a0SDimitry Andric       DeferredEmptyCoverageMappingDecls[D] = true;
340439d628a0SDimitry Andric     break;
340539d628a0SDimitry Andric   }
340639d628a0SDimitry Andric   default:
340739d628a0SDimitry Andric     break;
340839d628a0SDimitry Andric   };
340939d628a0SDimitry Andric }
341039d628a0SDimitry Andric 
341139d628a0SDimitry Andric void CodeGenModule::ClearUnusedCoverageMapping(const Decl *D) {
341239d628a0SDimitry Andric   // Do we need to generate coverage mapping?
341339d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
341439d628a0SDimitry Andric     return;
341539d628a0SDimitry Andric   if (const auto *Fn = dyn_cast<FunctionDecl>(D)) {
341639d628a0SDimitry Andric     if (Fn->isTemplateInstantiation())
341739d628a0SDimitry Andric       ClearUnusedCoverageMapping(Fn->getTemplateInstantiationPattern());
341839d628a0SDimitry Andric   }
341939d628a0SDimitry Andric   auto I = DeferredEmptyCoverageMappingDecls.find(D);
342039d628a0SDimitry Andric   if (I == DeferredEmptyCoverageMappingDecls.end())
342139d628a0SDimitry Andric     DeferredEmptyCoverageMappingDecls[D] = false;
342239d628a0SDimitry Andric   else
342339d628a0SDimitry Andric     I->second = false;
342439d628a0SDimitry Andric }
342539d628a0SDimitry Andric 
342639d628a0SDimitry Andric void CodeGenModule::EmitDeferredUnusedCoverageMappings() {
342739d628a0SDimitry Andric   std::vector<const Decl *> DeferredDecls;
342833956c43SDimitry Andric   for (const auto &I : DeferredEmptyCoverageMappingDecls) {
342939d628a0SDimitry Andric     if (!I.second)
343039d628a0SDimitry Andric       continue;
343139d628a0SDimitry Andric     DeferredDecls.push_back(I.first);
343239d628a0SDimitry Andric   }
343339d628a0SDimitry Andric   // Sort the declarations by their location to make sure that the tests get a
343439d628a0SDimitry Andric   // predictable order for the coverage mapping for the unused declarations.
343539d628a0SDimitry Andric   if (CodeGenOpts.DumpCoverageMapping)
343639d628a0SDimitry Andric     std::sort(DeferredDecls.begin(), DeferredDecls.end(),
343739d628a0SDimitry Andric               [] (const Decl *LHS, const Decl *RHS) {
343839d628a0SDimitry Andric       return LHS->getLocStart() < RHS->getLocStart();
343939d628a0SDimitry Andric     });
344039d628a0SDimitry Andric   for (const auto *D : DeferredDecls) {
344139d628a0SDimitry Andric     switch (D->getKind()) {
344239d628a0SDimitry Andric     case Decl::CXXConversion:
344339d628a0SDimitry Andric     case Decl::CXXMethod:
344439d628a0SDimitry Andric     case Decl::Function:
344539d628a0SDimitry Andric     case Decl::ObjCMethod: {
344639d628a0SDimitry Andric       CodeGenPGO PGO(*this);
344739d628a0SDimitry Andric       GlobalDecl GD(cast<FunctionDecl>(D));
344839d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
344939d628a0SDimitry Andric                                   getFunctionLinkage(GD));
345039d628a0SDimitry Andric       break;
345139d628a0SDimitry Andric     }
345239d628a0SDimitry Andric     case Decl::CXXConstructor: {
345339d628a0SDimitry Andric       CodeGenPGO PGO(*this);
345439d628a0SDimitry Andric       GlobalDecl GD(cast<CXXConstructorDecl>(D), Ctor_Base);
345539d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
345639d628a0SDimitry Andric                                   getFunctionLinkage(GD));
345739d628a0SDimitry Andric       break;
345839d628a0SDimitry Andric     }
345939d628a0SDimitry Andric     case Decl::CXXDestructor: {
346039d628a0SDimitry Andric       CodeGenPGO PGO(*this);
346139d628a0SDimitry Andric       GlobalDecl GD(cast<CXXDestructorDecl>(D), Dtor_Base);
346239d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
346339d628a0SDimitry Andric                                   getFunctionLinkage(GD));
346439d628a0SDimitry Andric       break;
346539d628a0SDimitry Andric     }
346639d628a0SDimitry Andric     default:
346739d628a0SDimitry Andric       break;
346839d628a0SDimitry Andric     };
3469f22ef01cSRoman Divacky   }
3470f22ef01cSRoman Divacky }
3471ffd1746dSEd Schouten 
3472ffd1746dSEd Schouten /// Turns the given pointer into a constant.
3473ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context,
3474ffd1746dSEd Schouten                                           const void *Ptr) {
3475ffd1746dSEd Schouten   uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr);
34766122f3e6SDimitry Andric   llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
3477ffd1746dSEd Schouten   return llvm::ConstantInt::get(i64, PtrInt);
3478ffd1746dSEd Schouten }
3479ffd1746dSEd Schouten 
3480ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
3481ffd1746dSEd Schouten                                    llvm::NamedMDNode *&GlobalMetadata,
3482ffd1746dSEd Schouten                                    GlobalDecl D,
3483ffd1746dSEd Schouten                                    llvm::GlobalValue *Addr) {
3484ffd1746dSEd Schouten   if (!GlobalMetadata)
3485ffd1746dSEd Schouten     GlobalMetadata =
3486ffd1746dSEd Schouten       CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
3487ffd1746dSEd Schouten 
3488ffd1746dSEd Schouten   // TODO: should we report variant information for ctors/dtors?
348939d628a0SDimitry Andric   llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
349039d628a0SDimitry Andric                            llvm::ConstantAsMetadata::get(GetPointerConstant(
349139d628a0SDimitry Andric                                CGM.getLLVMContext(), D.getDecl()))};
34923b0f4066SDimitry Andric   GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
3493ffd1746dSEd Schouten }
3494ffd1746dSEd Schouten 
3495284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked
3496284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled
3497284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer
3498284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the
3499284c1978SDimitry Andric /// same translation unit.
3500284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() {
35018f0fd8f6SDimitry Andric   for (auto &I : StaticExternCValues) {
35028f0fd8f6SDimitry Andric     IdentifierInfo *Name = I.first;
35038f0fd8f6SDimitry Andric     llvm::GlobalValue *Val = I.second;
3504284c1978SDimitry Andric     if (Val && !getModule().getNamedValue(Name->getName()))
350559d1ed5bSDimitry Andric       addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val));
3506284c1978SDimitry Andric   }
3507284c1978SDimitry Andric }
3508284c1978SDimitry Andric 
350959d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName,
351059d1ed5bSDimitry Andric                                              GlobalDecl &Result) const {
351159d1ed5bSDimitry Andric   auto Res = Manglings.find(MangledName);
351259d1ed5bSDimitry Andric   if (Res == Manglings.end())
351359d1ed5bSDimitry Andric     return false;
351459d1ed5bSDimitry Andric   Result = Res->getValue();
351559d1ed5bSDimitry Andric   return true;
351659d1ed5bSDimitry Andric }
351759d1ed5bSDimitry Andric 
3518ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the
3519ffd1746dSEd Schouten /// current module with the Decls they came from.  This is useful for
3520ffd1746dSEd Schouten /// projects using IR gen as a subroutine.
3521ffd1746dSEd Schouten ///
3522ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly
3523ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata
3524ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'.
3525ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() {
352659d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3527ffd1746dSEd Schouten 
3528ffd1746dSEd Schouten   // StaticLocalDeclMap
352959d1ed5bSDimitry Andric   for (auto &I : MangledDeclNames) {
353059d1ed5bSDimitry Andric     llvm::GlobalValue *Addr = getModule().getNamedValue(I.second);
353159d1ed5bSDimitry Andric     EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr);
3532ffd1746dSEd Schouten   }
3533ffd1746dSEd Schouten }
3534ffd1746dSEd Schouten 
3535ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current
3536ffd1746dSEd Schouten /// function.
3537ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() {
3538ffd1746dSEd Schouten   if (LocalDeclMap.empty()) return;
3539ffd1746dSEd Schouten 
3540ffd1746dSEd Schouten   llvm::LLVMContext &Context = getLLVMContext();
3541ffd1746dSEd Schouten 
3542ffd1746dSEd Schouten   // Find the unique metadata ID for this name.
3543ffd1746dSEd Schouten   unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr");
3544ffd1746dSEd Schouten 
354559d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3546ffd1746dSEd Schouten 
354759d1ed5bSDimitry Andric   for (auto &I : LocalDeclMap) {
354859d1ed5bSDimitry Andric     const Decl *D = I.first;
354959d1ed5bSDimitry Andric     llvm::Value *Addr = I.second;
355059d1ed5bSDimitry Andric     if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
3551ffd1746dSEd Schouten       llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D);
355239d628a0SDimitry Andric       Alloca->setMetadata(
355339d628a0SDimitry Andric           DeclPtrKind, llvm::MDNode::get(
355439d628a0SDimitry Andric                            Context, llvm::ValueAsMetadata::getConstant(DAddr)));
355559d1ed5bSDimitry Andric     } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
3556ffd1746dSEd Schouten       GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
3557ffd1746dSEd Schouten       EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
3558ffd1746dSEd Schouten     }
3559ffd1746dSEd Schouten   }
3560ffd1746dSEd Schouten }
3561e580952dSDimitry Andric 
3562f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() {
3563f785676fSDimitry Andric   llvm::NamedMDNode *IdentMetadata =
3564f785676fSDimitry Andric     TheModule.getOrInsertNamedMetadata("llvm.ident");
3565f785676fSDimitry Andric   std::string Version = getClangFullVersion();
3566f785676fSDimitry Andric   llvm::LLVMContext &Ctx = TheModule.getContext();
3567f785676fSDimitry Andric 
356839d628a0SDimitry Andric   llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
3569f785676fSDimitry Andric   IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
3570f785676fSDimitry Andric }
3571f785676fSDimitry Andric 
357259d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() {
357339d628a0SDimitry Andric   // Warning, new MangledDeclNames may be appended within this loop.
357439d628a0SDimitry Andric   // We rely on MapVector insertions adding new elements to the end
357539d628a0SDimitry Andric   // of the container.
357639d628a0SDimitry Andric   // FIXME: Move this loop into the one target that needs it, and only
357739d628a0SDimitry Andric   // loop over those declarations for which we couldn't emit the target
357839d628a0SDimitry Andric   // metadata when we emitted the declaration.
357939d628a0SDimitry Andric   for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
358039d628a0SDimitry Andric     auto Val = *(MangledDeclNames.begin() + I);
358139d628a0SDimitry Andric     const Decl *D = Val.first.getDecl()->getMostRecentDecl();
358239d628a0SDimitry Andric     llvm::GlobalValue *GV = GetGlobalValue(Val.second);
358359d1ed5bSDimitry Andric     getTargetCodeGenInfo().emitTargetMD(D, GV, *this);
358459d1ed5bSDimitry Andric   }
358559d1ed5bSDimitry Andric }
358659d1ed5bSDimitry Andric 
3587bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() {
3588bd5abe19SDimitry Andric   if (!getCodeGenOpts().CoverageFile.empty()) {
3589bd5abe19SDimitry Andric     if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
3590bd5abe19SDimitry Andric       llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov");
3591bd5abe19SDimitry Andric       llvm::LLVMContext &Ctx = TheModule.getContext();
3592bd5abe19SDimitry Andric       llvm::MDString *CoverageFile =
3593bd5abe19SDimitry Andric           llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile);
3594bd5abe19SDimitry Andric       for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
3595bd5abe19SDimitry Andric         llvm::MDNode *CU = CUNode->getOperand(i);
359639d628a0SDimitry Andric         llvm::Metadata *Elts[] = {CoverageFile, CU};
359739d628a0SDimitry Andric         GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
3598bd5abe19SDimitry Andric       }
3599bd5abe19SDimitry Andric     }
3600bd5abe19SDimitry Andric   }
3601bd5abe19SDimitry Andric }
36023861d79fSDimitry Andric 
360339d628a0SDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) {
36043861d79fSDimitry Andric   // Sema has checked that all uuid strings are of the form
36053861d79fSDimitry Andric   // "12345678-1234-1234-1234-1234567890ab".
36063861d79fSDimitry Andric   assert(Uuid.size() == 36);
3607f785676fSDimitry Andric   for (unsigned i = 0; i < 36; ++i) {
3608f785676fSDimitry Andric     if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-');
3609f785676fSDimitry Andric     else                                         assert(isHexDigit(Uuid[i]));
36103861d79fSDimitry Andric   }
36113861d79fSDimitry Andric 
361239d628a0SDimitry Andric   // The starts of all bytes of Field3 in Uuid. Field 3 is "1234-1234567890ab".
3613f785676fSDimitry Andric   const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 };
36143861d79fSDimitry Andric 
3615f785676fSDimitry Andric   llvm::Constant *Field3[8];
3616f785676fSDimitry Andric   for (unsigned Idx = 0; Idx < 8; ++Idx)
3617f785676fSDimitry Andric     Field3[Idx] = llvm::ConstantInt::get(
3618f785676fSDimitry Andric         Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16);
36193861d79fSDimitry Andric 
3620f785676fSDimitry Andric   llvm::Constant *Fields[4] = {
3621f785676fSDimitry Andric     llvm::ConstantInt::get(Int32Ty, Uuid.substr(0,  8), 16),
3622f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(9,  4), 16),
3623f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16),
3624f785676fSDimitry Andric     llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3)
3625f785676fSDimitry Andric   };
3626f785676fSDimitry Andric 
3627f785676fSDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
36283861d79fSDimitry Andric }
362959d1ed5bSDimitry Andric 
363033956c43SDimitry Andric llvm::Constant *
363133956c43SDimitry Andric CodeGenModule::getAddrOfCXXCatchHandlerType(QualType Ty,
363233956c43SDimitry Andric                                             QualType CatchHandlerType) {
363333956c43SDimitry Andric   return getCXXABI().getAddrOfCXXCatchHandlerType(Ty, CatchHandlerType);
363433956c43SDimitry Andric }
363533956c43SDimitry Andric 
363659d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty,
363759d1ed5bSDimitry Andric                                                        bool ForEH) {
363859d1ed5bSDimitry Andric   // Return a bogus pointer if RTTI is disabled, unless it's for EH.
363959d1ed5bSDimitry Andric   // FIXME: should we even be calling this method if RTTI is disabled
364059d1ed5bSDimitry Andric   // and it's not for EH?
364159d1ed5bSDimitry Andric   if (!ForEH && !getLangOpts().RTTI)
364259d1ed5bSDimitry Andric     return llvm::Constant::getNullValue(Int8PtrTy);
364359d1ed5bSDimitry Andric 
364459d1ed5bSDimitry Andric   if (ForEH && Ty->isObjCObjectPointerType() &&
364559d1ed5bSDimitry Andric       LangOpts.ObjCRuntime.isGNUFamily())
364659d1ed5bSDimitry Andric     return ObjCRuntime->GetEHType(Ty);
364759d1ed5bSDimitry Andric 
364859d1ed5bSDimitry Andric   return getCXXABI().getAddrOfRTTIDescriptor(Ty);
364959d1ed5bSDimitry Andric }
365059d1ed5bSDimitry Andric 
365139d628a0SDimitry Andric void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
365239d628a0SDimitry Andric   for (auto RefExpr : D->varlists()) {
365339d628a0SDimitry Andric     auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());
365439d628a0SDimitry Andric     bool PerformInit =
365539d628a0SDimitry Andric         VD->getAnyInitializer() &&
365639d628a0SDimitry Andric         !VD->getAnyInitializer()->isConstantInitializer(getContext(),
365739d628a0SDimitry Andric                                                         /*ForRef=*/false);
365833956c43SDimitry Andric     if (auto InitFunction = getOpenMPRuntime().emitThreadPrivateVarDefinition(
365933956c43SDimitry Andric             VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(), PerformInit))
366039d628a0SDimitry Andric       CXXGlobalInits.push_back(InitFunction);
366139d628a0SDimitry Andric   }
366239d628a0SDimitry Andric }
36638f0fd8f6SDimitry Andric 
36648f0fd8f6SDimitry Andric llvm::MDTuple *CodeGenModule::CreateVTableBitSetEntry(
36658f0fd8f6SDimitry Andric     llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD) {
36668f0fd8f6SDimitry Andric   std::string OutName;
36678f0fd8f6SDimitry Andric   llvm::raw_string_ostream Out(OutName);
36688f0fd8f6SDimitry Andric   getCXXABI().getMangleContext().mangleCXXVTableBitSet(RD, Out);
36698f0fd8f6SDimitry Andric 
36708f0fd8f6SDimitry Andric   llvm::Metadata *BitsetOps[] = {
36718f0fd8f6SDimitry Andric       llvm::MDString::get(getLLVMContext(), Out.str()),
36728f0fd8f6SDimitry Andric       llvm::ConstantAsMetadata::get(VTable),
36738f0fd8f6SDimitry Andric       llvm::ConstantAsMetadata::get(
36748f0fd8f6SDimitry Andric           llvm::ConstantInt::get(Int64Ty, Offset.getQuantity()))};
36758f0fd8f6SDimitry Andric   return llvm::MDTuple::get(getLLVMContext(), BitsetOps);
36768f0fd8f6SDimitry Andric }
3677