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() {
208f785676fSDimitry Andric   for (ReplacementsTy::iterator I = Replacements.begin(),
209f785676fSDimitry Andric                                 E = Replacements.end();
210f785676fSDimitry Andric        I != E; ++I) {
211f785676fSDimitry Andric     StringRef MangledName = I->first();
212f785676fSDimitry Andric     llvm::Constant *Replacement = I->second;
213f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
214f785676fSDimitry Andric     if (!Entry)
215f785676fSDimitry Andric       continue;
21659d1ed5bSDimitry Andric     auto *OldF = cast<llvm::Function>(Entry);
21759d1ed5bSDimitry Andric     auto *NewF = dyn_cast<llvm::Function>(Replacement);
218f785676fSDimitry Andric     if (!NewF) {
21959d1ed5bSDimitry Andric       if (auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
22059d1ed5bSDimitry Andric         NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
22159d1ed5bSDimitry Andric       } else {
22259d1ed5bSDimitry Andric         auto *CE = cast<llvm::ConstantExpr>(Replacement);
223f785676fSDimitry Andric         assert(CE->getOpcode() == llvm::Instruction::BitCast ||
224f785676fSDimitry Andric                CE->getOpcode() == llvm::Instruction::GetElementPtr);
225f785676fSDimitry Andric         NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
226f785676fSDimitry Andric       }
22759d1ed5bSDimitry Andric     }
228f785676fSDimitry Andric 
229f785676fSDimitry Andric     // Replace old with new, but keep the old order.
230f785676fSDimitry Andric     OldF->replaceAllUsesWith(Replacement);
231f785676fSDimitry Andric     if (NewF) {
232f785676fSDimitry Andric       NewF->removeFromParent();
233f785676fSDimitry Andric       OldF->getParent()->getFunctionList().insertAfter(OldF, NewF);
234f785676fSDimitry Andric     }
235f785676fSDimitry Andric     OldF->eraseFromParent();
236f785676fSDimitry Andric   }
237f785676fSDimitry Andric }
238f785676fSDimitry Andric 
23959d1ed5bSDimitry Andric // This is only used in aliases that we created and we know they have a
24059d1ed5bSDimitry Andric // linear structure.
24159d1ed5bSDimitry Andric static const llvm::GlobalObject *getAliasedGlobal(const llvm::GlobalAlias &GA) {
24259d1ed5bSDimitry Andric   llvm::SmallPtrSet<const llvm::GlobalAlias*, 4> Visited;
24359d1ed5bSDimitry Andric   const llvm::Constant *C = &GA;
24459d1ed5bSDimitry Andric   for (;;) {
24559d1ed5bSDimitry Andric     C = C->stripPointerCasts();
24659d1ed5bSDimitry Andric     if (auto *GO = dyn_cast<llvm::GlobalObject>(C))
24759d1ed5bSDimitry Andric       return GO;
24859d1ed5bSDimitry Andric     // stripPointerCasts will not walk over weak aliases.
24959d1ed5bSDimitry Andric     auto *GA2 = dyn_cast<llvm::GlobalAlias>(C);
25059d1ed5bSDimitry Andric     if (!GA2)
25159d1ed5bSDimitry Andric       return nullptr;
25239d628a0SDimitry Andric     if (!Visited.insert(GA2).second)
25359d1ed5bSDimitry Andric       return nullptr;
25459d1ed5bSDimitry Andric     C = GA2->getAliasee();
25559d1ed5bSDimitry Andric   }
25659d1ed5bSDimitry Andric }
25759d1ed5bSDimitry Andric 
258f785676fSDimitry Andric void CodeGenModule::checkAliases() {
25959d1ed5bSDimitry Andric   // Check if the constructed aliases are well formed. It is really unfortunate
26059d1ed5bSDimitry Andric   // that we have to do this in CodeGen, but we only construct mangled names
26159d1ed5bSDimitry Andric   // and aliases during codegen.
262f785676fSDimitry Andric   bool Error = false;
26359d1ed5bSDimitry Andric   DiagnosticsEngine &Diags = getDiags();
264f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
265f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
266f785676fSDimitry Andric     const GlobalDecl &GD = *I;
26759d1ed5bSDimitry Andric     const auto *D = cast<ValueDecl>(GD.getDecl());
268f785676fSDimitry Andric     const AliasAttr *AA = D->getAttr<AliasAttr>();
269f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
270f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
27159d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
27259d1ed5bSDimitry Andric     const llvm::GlobalValue *GV = getAliasedGlobal(*Alias);
27359d1ed5bSDimitry Andric     if (!GV) {
274f785676fSDimitry Andric       Error = true;
27559d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
27659d1ed5bSDimitry Andric     } else if (GV->isDeclaration()) {
277f785676fSDimitry Andric       Error = true;
27859d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_alias_to_undefined);
27959d1ed5bSDimitry Andric     }
28059d1ed5bSDimitry Andric 
28159d1ed5bSDimitry Andric     llvm::Constant *Aliasee = Alias->getAliasee();
28259d1ed5bSDimitry Andric     llvm::GlobalValue *AliaseeGV;
28359d1ed5bSDimitry Andric     if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
28459d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
28559d1ed5bSDimitry Andric     else
28659d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
28759d1ed5bSDimitry Andric 
28859d1ed5bSDimitry Andric     if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
28959d1ed5bSDimitry Andric       StringRef AliasSection = SA->getName();
29059d1ed5bSDimitry Andric       if (AliasSection != AliaseeGV->getSection())
29159d1ed5bSDimitry Andric         Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
29259d1ed5bSDimitry Andric             << AliasSection;
29359d1ed5bSDimitry Andric     }
29459d1ed5bSDimitry Andric 
29559d1ed5bSDimitry Andric     // We have to handle alias to weak aliases in here. LLVM itself disallows
29659d1ed5bSDimitry Andric     // this since the object semantics would not match the IL one. For
29759d1ed5bSDimitry Andric     // compatibility with gcc we implement it by just pointing the alias
29859d1ed5bSDimitry Andric     // to its aliasee's aliasee. We also warn, since the user is probably
29959d1ed5bSDimitry Andric     // expecting the link to be weak.
30059d1ed5bSDimitry Andric     if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
30159d1ed5bSDimitry Andric       if (GA->mayBeOverridden()) {
30259d1ed5bSDimitry Andric         Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias)
30359d1ed5bSDimitry Andric             << GV->getName() << GA->getName();
30459d1ed5bSDimitry Andric         Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
30559d1ed5bSDimitry Andric             GA->getAliasee(), Alias->getType());
30659d1ed5bSDimitry Andric         Alias->setAliasee(Aliasee);
30759d1ed5bSDimitry Andric       }
308f785676fSDimitry Andric     }
309f785676fSDimitry Andric   }
310f785676fSDimitry Andric   if (!Error)
311f785676fSDimitry Andric     return;
312f785676fSDimitry Andric 
313f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
314f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
315f785676fSDimitry Andric     const GlobalDecl &GD = *I;
316f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
317f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
31859d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
319f785676fSDimitry Andric     Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
320f785676fSDimitry Andric     Alias->eraseFromParent();
321f785676fSDimitry Andric   }
322f785676fSDimitry Andric }
323f785676fSDimitry Andric 
32459d1ed5bSDimitry Andric void CodeGenModule::clear() {
32559d1ed5bSDimitry Andric   DeferredDeclsToEmit.clear();
32633956c43SDimitry Andric   if (OpenMPRuntime)
32733956c43SDimitry Andric     OpenMPRuntime->clear();
32859d1ed5bSDimitry Andric }
32959d1ed5bSDimitry Andric 
33059d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags,
33159d1ed5bSDimitry Andric                                        StringRef MainFile) {
33259d1ed5bSDimitry Andric   if (!hasDiagnostics())
33359d1ed5bSDimitry Andric     return;
33459d1ed5bSDimitry Andric   if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
33559d1ed5bSDimitry Andric     if (MainFile.empty())
33659d1ed5bSDimitry Andric       MainFile = "<stdin>";
33759d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_unprofiled) << MainFile;
33859d1ed5bSDimitry Andric   } else
33959d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing
34059d1ed5bSDimitry Andric                                                       << Mismatched;
34159d1ed5bSDimitry Andric }
34259d1ed5bSDimitry Andric 
343f22ef01cSRoman Divacky void CodeGenModule::Release() {
344f22ef01cSRoman Divacky   EmitDeferred();
345f785676fSDimitry Andric   applyReplacements();
346f785676fSDimitry Andric   checkAliases();
347f22ef01cSRoman Divacky   EmitCXXGlobalInitFunc();
348f22ef01cSRoman Divacky   EmitCXXGlobalDtorFunc();
349284c1978SDimitry Andric   EmitCXXThreadLocalInitFunc();
3506122f3e6SDimitry Andric   if (ObjCRuntime)
3516122f3e6SDimitry Andric     if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
352f22ef01cSRoman Divacky       AddGlobalCtor(ObjCInitFunction);
35333956c43SDimitry Andric   if (Context.getLangOpts().CUDA && !Context.getLangOpts().CUDAIsDevice &&
35433956c43SDimitry Andric       CUDARuntime) {
35533956c43SDimitry Andric     if (llvm::Function *CudaCtorFunction = CUDARuntime->makeModuleCtorFunction())
35633956c43SDimitry Andric       AddGlobalCtor(CudaCtorFunction);
35733956c43SDimitry Andric     if (llvm::Function *CudaDtorFunction = CUDARuntime->makeModuleDtorFunction())
35833956c43SDimitry Andric       AddGlobalDtor(CudaDtorFunction);
35933956c43SDimitry Andric   }
36059d1ed5bSDimitry Andric   if (PGOReader && PGOStats.hasDiagnostics())
36159d1ed5bSDimitry Andric     PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName);
362f22ef01cSRoman Divacky   EmitCtorList(GlobalCtors, "llvm.global_ctors");
363f22ef01cSRoman Divacky   EmitCtorList(GlobalDtors, "llvm.global_dtors");
3646122f3e6SDimitry Andric   EmitGlobalAnnotations();
365284c1978SDimitry Andric   EmitStaticExternCAliases();
36639d628a0SDimitry Andric   EmitDeferredUnusedCoverageMappings();
36739d628a0SDimitry Andric   if (CoverageMapping)
36839d628a0SDimitry Andric     CoverageMapping->emit();
36959d1ed5bSDimitry Andric   emitLLVMUsed();
370ffd1746dSEd Schouten 
371f785676fSDimitry Andric   if (CodeGenOpts.Autolink &&
372f785676fSDimitry Andric       (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
373139f7f9bSDimitry Andric     EmitModuleLinkOptions();
374139f7f9bSDimitry Andric   }
375f785676fSDimitry Andric   if (CodeGenOpts.DwarfVersion)
376f785676fSDimitry Andric     // We actually want the latest version when there are conflicts.
377f785676fSDimitry Andric     // We can change from Warning to Latest if such mode is supported.
378f785676fSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
379f785676fSDimitry Andric                               CodeGenOpts.DwarfVersion);
380f785676fSDimitry Andric   if (DebugInfo)
38159d1ed5bSDimitry Andric     // We support a single version in the linked module. The LLVM
38259d1ed5bSDimitry Andric     // parser will drop debug info with a different version number
38359d1ed5bSDimitry Andric     // (and warn about it, too).
38459d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version",
385f785676fSDimitry Andric                               llvm::DEBUG_METADATA_VERSION);
386139f7f9bSDimitry Andric 
38759d1ed5bSDimitry Andric   // We need to record the widths of enums and wchar_t, so that we can generate
38859d1ed5bSDimitry Andric   // the correct build attributes in the ARM backend.
38959d1ed5bSDimitry Andric   llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch();
39059d1ed5bSDimitry Andric   if (   Arch == llvm::Triple::arm
39159d1ed5bSDimitry Andric       || Arch == llvm::Triple::armeb
39259d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumb
39359d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumbeb) {
39459d1ed5bSDimitry Andric     // Width of wchar_t in bytes
39559d1ed5bSDimitry Andric     uint64_t WCharWidth =
39659d1ed5bSDimitry Andric         Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
39759d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth);
39859d1ed5bSDimitry Andric 
39959d1ed5bSDimitry Andric     // The minimum width of an enum in bytes
40059d1ed5bSDimitry Andric     uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
40159d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth);
40259d1ed5bSDimitry Andric   }
40359d1ed5bSDimitry Andric 
40439d628a0SDimitry Andric   if (uint32_t PLevel = Context.getLangOpts().PICLevel) {
40539d628a0SDimitry Andric     llvm::PICLevel::Level PL = llvm::PICLevel::Default;
40639d628a0SDimitry Andric     switch (PLevel) {
40739d628a0SDimitry Andric     case 0: break;
40839d628a0SDimitry Andric     case 1: PL = llvm::PICLevel::Small; break;
40939d628a0SDimitry Andric     case 2: PL = llvm::PICLevel::Large; break;
41039d628a0SDimitry Andric     default: llvm_unreachable("Invalid PIC Level");
41139d628a0SDimitry Andric     }
41239d628a0SDimitry Andric 
41339d628a0SDimitry Andric     getModule().setPICLevel(PL);
41439d628a0SDimitry Andric   }
41539d628a0SDimitry Andric 
4162754fe60SDimitry Andric   SimplifyPersonality();
4172754fe60SDimitry Andric 
418ffd1746dSEd Schouten   if (getCodeGenOpts().EmitDeclMetadata)
419ffd1746dSEd Schouten     EmitDeclMetadata();
420bd5abe19SDimitry Andric 
421bd5abe19SDimitry Andric   if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
422bd5abe19SDimitry Andric     EmitCoverageFile();
4236122f3e6SDimitry Andric 
4246122f3e6SDimitry Andric   if (DebugInfo)
4256122f3e6SDimitry Andric     DebugInfo->finalize();
426f785676fSDimitry Andric 
427f785676fSDimitry Andric   EmitVersionIdentMetadata();
42859d1ed5bSDimitry Andric 
42959d1ed5bSDimitry Andric   EmitTargetMetadata();
430f22ef01cSRoman Divacky }
431f22ef01cSRoman Divacky 
4323b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
4333b0f4066SDimitry Andric   // Make sure that this type is translated.
4343b0f4066SDimitry Andric   Types.UpdateCompletedType(TD);
4353b0f4066SDimitry Andric }
4363b0f4066SDimitry Andric 
4372754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
4382754fe60SDimitry Andric   if (!TBAA)
43959d1ed5bSDimitry Andric     return nullptr;
4402754fe60SDimitry Andric   return TBAA->getTBAAInfo(QTy);
4412754fe60SDimitry Andric }
4422754fe60SDimitry Andric 
443dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
444dff0c46cSDimitry Andric   if (!TBAA)
44559d1ed5bSDimitry Andric     return nullptr;
446dff0c46cSDimitry Andric   return TBAA->getTBAAInfoForVTablePtr();
447dff0c46cSDimitry Andric }
448dff0c46cSDimitry Andric 
4493861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) {
4503861d79fSDimitry Andric   if (!TBAA)
45159d1ed5bSDimitry Andric     return nullptr;
4523861d79fSDimitry Andric   return TBAA->getTBAAStructInfo(QTy);
4533861d79fSDimitry Andric }
4543861d79fSDimitry Andric 
455139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
456139f7f9bSDimitry Andric   if (!TBAA)
45759d1ed5bSDimitry Andric     return nullptr;
458139f7f9bSDimitry Andric   return TBAA->getTBAAStructTypeInfo(QTy);
459139f7f9bSDimitry Andric }
460139f7f9bSDimitry Andric 
461139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
462139f7f9bSDimitry Andric                                                   llvm::MDNode *AccessN,
463139f7f9bSDimitry Andric                                                   uint64_t O) {
464139f7f9bSDimitry Andric   if (!TBAA)
46559d1ed5bSDimitry Andric     return nullptr;
466139f7f9bSDimitry Andric   return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
467139f7f9bSDimitry Andric }
468139f7f9bSDimitry Andric 
469f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA
470f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format:
471f785676fSDimitry Andric /// base type, access type and offset.
472284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type.
4732754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
474284c1978SDimitry Andric                                         llvm::MDNode *TBAAInfo,
475284c1978SDimitry Andric                                         bool ConvertTypeToTag) {
476f785676fSDimitry Andric   if (ConvertTypeToTag && TBAA)
477284c1978SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa,
478284c1978SDimitry Andric                       TBAA->getTBAAScalarTagInfo(TBAAInfo));
479284c1978SDimitry Andric   else
4802754fe60SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
4812754fe60SDimitry Andric }
4822754fe60SDimitry Andric 
48359d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) {
48459d1ed5bSDimitry Andric   unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0");
48559d1ed5bSDimitry Andric   getDiags().Report(Context.getFullLoc(loc), diagID) << message;
486f22ef01cSRoman Divacky }
487f22ef01cSRoman Divacky 
488f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
489f22ef01cSRoman Divacky /// specified stmt yet.
490f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
4916122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
492f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
493f22ef01cSRoman Divacky   std::string Msg = Type;
494f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
495f22ef01cSRoman Divacky     << Msg << S->getSourceRange();
496f22ef01cSRoman Divacky }
497f22ef01cSRoman Divacky 
498f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
499f22ef01cSRoman Divacky /// specified decl yet.
500f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
5016122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
502f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
503f22ef01cSRoman Divacky   std::string Msg = Type;
504f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
505f22ef01cSRoman Divacky }
506f22ef01cSRoman Divacky 
50717a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
50817a519f9SDimitry Andric   return llvm::ConstantInt::get(SizeTy, size.getQuantity());
50917a519f9SDimitry Andric }
51017a519f9SDimitry Andric 
511f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
5122754fe60SDimitry Andric                                         const NamedDecl *D) const {
513f22ef01cSRoman Divacky   // Internal definitions always have default visibility.
514f22ef01cSRoman Divacky   if (GV->hasLocalLinkage()) {
515f22ef01cSRoman Divacky     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
516f22ef01cSRoman Divacky     return;
517f22ef01cSRoman Divacky   }
518f22ef01cSRoman Divacky 
5192754fe60SDimitry Andric   // Set visibility for definitions.
520139f7f9bSDimitry Andric   LinkageInfo LV = D->getLinkageAndVisibility();
521139f7f9bSDimitry Andric   if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
522139f7f9bSDimitry Andric     GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
523f22ef01cSRoman Divacky }
524f22ef01cSRoman Divacky 
5257ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) {
5267ae0e2c9SDimitry Andric   return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
5277ae0e2c9SDimitry Andric       .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
5287ae0e2c9SDimitry Andric       .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
5297ae0e2c9SDimitry Andric       .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
5307ae0e2c9SDimitry Andric       .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel);
5317ae0e2c9SDimitry Andric }
5327ae0e2c9SDimitry Andric 
5337ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(
5347ae0e2c9SDimitry Andric     CodeGenOptions::TLSModel M) {
5357ae0e2c9SDimitry Andric   switch (M) {
5367ae0e2c9SDimitry Andric   case CodeGenOptions::GeneralDynamicTLSModel:
5377ae0e2c9SDimitry Andric     return llvm::GlobalVariable::GeneralDynamicTLSModel;
5387ae0e2c9SDimitry Andric   case CodeGenOptions::LocalDynamicTLSModel:
5397ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalDynamicTLSModel;
5407ae0e2c9SDimitry Andric   case CodeGenOptions::InitialExecTLSModel:
5417ae0e2c9SDimitry Andric     return llvm::GlobalVariable::InitialExecTLSModel;
5427ae0e2c9SDimitry Andric   case CodeGenOptions::LocalExecTLSModel:
5437ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalExecTLSModel;
5447ae0e2c9SDimitry Andric   }
5457ae0e2c9SDimitry Andric   llvm_unreachable("Invalid TLS model!");
5467ae0e2c9SDimitry Andric }
5477ae0e2c9SDimitry Andric 
54839d628a0SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const {
549284c1978SDimitry Andric   assert(D.getTLSKind() && "setting TLS mode on non-TLS var!");
5507ae0e2c9SDimitry Andric 
55139d628a0SDimitry Andric   llvm::GlobalValue::ThreadLocalMode TLM;
5523861d79fSDimitry Andric   TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
5537ae0e2c9SDimitry Andric 
5547ae0e2c9SDimitry Andric   // Override the TLS model if it is explicitly specified.
55559d1ed5bSDimitry Andric   if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) {
5567ae0e2c9SDimitry Andric     TLM = GetLLVMTLSModel(Attr->getModel());
5577ae0e2c9SDimitry Andric   }
5587ae0e2c9SDimitry Andric 
5597ae0e2c9SDimitry Andric   GV->setThreadLocalMode(TLM);
5607ae0e2c9SDimitry Andric }
5617ae0e2c9SDimitry Andric 
5626122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
56359d1ed5bSDimitry Andric   StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()];
56459d1ed5bSDimitry Andric   if (!FoundStr.empty())
56559d1ed5bSDimitry Andric     return FoundStr;
566f22ef01cSRoman Divacky 
56759d1ed5bSDimitry Andric   const auto *ND = cast<NamedDecl>(GD.getDecl());
568dff0c46cSDimitry Andric   SmallString<256> Buffer;
56959d1ed5bSDimitry Andric   StringRef Str;
57059d1ed5bSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) {
5712754fe60SDimitry Andric     llvm::raw_svector_ostream Out(Buffer);
57259d1ed5bSDimitry Andric     if (const auto *D = dyn_cast<CXXConstructorDecl>(ND))
5732754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out);
57459d1ed5bSDimitry Andric     else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND))
5752754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out);
576ffd1746dSEd Schouten     else
5772754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleName(ND, Out);
57859d1ed5bSDimitry Andric     Str = Out.str();
57959d1ed5bSDimitry Andric   } else {
58059d1ed5bSDimitry Andric     IdentifierInfo *II = ND->getIdentifier();
58159d1ed5bSDimitry Andric     assert(II && "Attempt to mangle unnamed decl.");
58259d1ed5bSDimitry Andric     Str = II->getName();
583ffd1746dSEd Schouten   }
584ffd1746dSEd Schouten 
58539d628a0SDimitry Andric   // Keep the first result in the case of a mangling collision.
58639d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Str, GD));
58739d628a0SDimitry Andric   return FoundStr = Result.first->first();
58859d1ed5bSDimitry Andric }
58959d1ed5bSDimitry Andric 
59059d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD,
591ffd1746dSEd Schouten                                              const BlockDecl *BD) {
5922754fe60SDimitry Andric   MangleContext &MangleCtx = getCXXABI().getMangleContext();
5932754fe60SDimitry Andric   const Decl *D = GD.getDecl();
59459d1ed5bSDimitry Andric 
59559d1ed5bSDimitry Andric   SmallString<256> Buffer;
59659d1ed5bSDimitry Andric   llvm::raw_svector_ostream Out(Buffer);
59759d1ed5bSDimitry Andric   if (!D)
5987ae0e2c9SDimitry Andric     MangleCtx.mangleGlobalBlock(BD,
5997ae0e2c9SDimitry Andric       dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
60059d1ed5bSDimitry Andric   else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D))
6012754fe60SDimitry Andric     MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out);
60259d1ed5bSDimitry Andric   else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D))
6032754fe60SDimitry Andric     MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out);
6042754fe60SDimitry Andric   else
6052754fe60SDimitry Andric     MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out);
60659d1ed5bSDimitry Andric 
60739d628a0SDimitry Andric   auto Result = Manglings.insert(std::make_pair(Out.str(), BD));
60839d628a0SDimitry Andric   return Result.first->first();
609f22ef01cSRoman Divacky }
610f22ef01cSRoman Divacky 
6116122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) {
612f22ef01cSRoman Divacky   return getModule().getNamedValue(Name);
613f22ef01cSRoman Divacky }
614f22ef01cSRoman Divacky 
615f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before
616f22ef01cSRoman Divacky /// main() runs.
61759d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority,
61859d1ed5bSDimitry Andric                                   llvm::Constant *AssociatedData) {
619f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
62059d1ed5bSDimitry Andric   GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData));
621f22ef01cSRoman Divacky }
622f22ef01cSRoman Divacky 
623f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called
624f22ef01cSRoman Divacky /// when the module is unloaded.
625f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) {
626f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
62759d1ed5bSDimitry Andric   GlobalDtors.push_back(Structor(Priority, Dtor, nullptr));
628f22ef01cSRoman Divacky }
629f22ef01cSRoman Divacky 
630f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
631f22ef01cSRoman Divacky   // Ctor function type is void()*.
632bd5abe19SDimitry Andric   llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
633f22ef01cSRoman Divacky   llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
634f22ef01cSRoman Divacky 
63559d1ed5bSDimitry Andric   // Get the type of a ctor entry, { i32, void ()*, i8* }.
63659d1ed5bSDimitry Andric   llvm::StructType *CtorStructTy = llvm::StructType::get(
63739d628a0SDimitry Andric       Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, nullptr);
638f22ef01cSRoman Divacky 
639f22ef01cSRoman Divacky   // Construct the constructor and destructor arrays.
640dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> Ctors;
641f22ef01cSRoman Divacky   for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
642dff0c46cSDimitry Andric     llvm::Constant *S[] = {
64359d1ed5bSDimitry Andric       llvm::ConstantInt::get(Int32Ty, I->Priority, false),
64459d1ed5bSDimitry Andric       llvm::ConstantExpr::getBitCast(I->Initializer, CtorPFTy),
64559d1ed5bSDimitry Andric       (I->AssociatedData
64659d1ed5bSDimitry Andric            ? llvm::ConstantExpr::getBitCast(I->AssociatedData, VoidPtrTy)
64759d1ed5bSDimitry Andric            : llvm::Constant::getNullValue(VoidPtrTy))
648dff0c46cSDimitry Andric     };
649f22ef01cSRoman Divacky     Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
650f22ef01cSRoman Divacky   }
651f22ef01cSRoman Divacky 
652f22ef01cSRoman Divacky   if (!Ctors.empty()) {
653f22ef01cSRoman Divacky     llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
654f22ef01cSRoman Divacky     new llvm::GlobalVariable(TheModule, AT, false,
655f22ef01cSRoman Divacky                              llvm::GlobalValue::AppendingLinkage,
656f22ef01cSRoman Divacky                              llvm::ConstantArray::get(AT, Ctors),
657f22ef01cSRoman Divacky                              GlobalName);
658f22ef01cSRoman Divacky   }
659f22ef01cSRoman Divacky }
660f22ef01cSRoman Divacky 
661f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes
662f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
66359d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
664f785676fSDimitry Andric 
665e580952dSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
666f22ef01cSRoman Divacky 
66759d1ed5bSDimitry Andric   if (isa<CXXDestructorDecl>(D) &&
66859d1ed5bSDimitry Andric       getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
66959d1ed5bSDimitry Andric                                          GD.getDtorType())) {
67059d1ed5bSDimitry Andric     // Destructor variants in the Microsoft C++ ABI are always internal or
67159d1ed5bSDimitry Andric     // linkonce_odr thunks emitted on an as-needed basis.
67259d1ed5bSDimitry Andric     return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
67359d1ed5bSDimitry Andric                                    : llvm::GlobalValue::LinkOnceODRLinkage;
674f22ef01cSRoman Divacky   }
675f22ef01cSRoman Divacky 
67659d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false);
67759d1ed5bSDimitry Andric }
678f22ef01cSRoman Divacky 
67997bc6c73SDimitry Andric void CodeGenModule::setFunctionDLLStorageClass(GlobalDecl GD, llvm::Function *F) {
68097bc6c73SDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
68197bc6c73SDimitry Andric 
68297bc6c73SDimitry Andric   if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
68397bc6c73SDimitry Andric     if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
68497bc6c73SDimitry Andric       // Don't dllexport/import destructor thunks.
68597bc6c73SDimitry Andric       F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
68697bc6c73SDimitry Andric       return;
68797bc6c73SDimitry Andric     }
68897bc6c73SDimitry Andric   }
68997bc6c73SDimitry Andric 
69097bc6c73SDimitry Andric   if (FD->hasAttr<DLLImportAttr>())
69197bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
69297bc6c73SDimitry Andric   else if (FD->hasAttr<DLLExportAttr>())
69397bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
69497bc6c73SDimitry Andric   else
69597bc6c73SDimitry Andric     F->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
69697bc6c73SDimitry Andric }
69797bc6c73SDimitry Andric 
69859d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D,
69959d1ed5bSDimitry Andric                                                     llvm::Function *F) {
70059d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
701f22ef01cSRoman Divacky }
702f22ef01cSRoman Divacky 
703f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D,
704f22ef01cSRoman Divacky                                               const CGFunctionInfo &Info,
705f22ef01cSRoman Divacky                                               llvm::Function *F) {
706f22ef01cSRoman Divacky   unsigned CallingConv;
707f22ef01cSRoman Divacky   AttributeListType AttributeList;
708139f7f9bSDimitry Andric   ConstructAttributeList(Info, D, AttributeList, CallingConv, false);
709139f7f9bSDimitry Andric   F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList));
710f22ef01cSRoman Divacky   F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
711f22ef01cSRoman Divacky }
712f22ef01cSRoman Divacky 
7136122f3e6SDimitry Andric /// Determines whether the language options require us to model
7146122f3e6SDimitry Andric /// unwind exceptions.  We treat -fexceptions as mandating this
7156122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions
7166122f3e6SDimitry Andric /// enabled.  This means, for example, that C with -fexceptions
7176122f3e6SDimitry Andric /// enables this.
718dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) {
7196122f3e6SDimitry Andric   // If exceptions are completely disabled, obviously this is false.
720dff0c46cSDimitry Andric   if (!LangOpts.Exceptions) return false;
7216122f3e6SDimitry Andric 
7226122f3e6SDimitry Andric   // If C++ exceptions are enabled, this is true.
723dff0c46cSDimitry Andric   if (LangOpts.CXXExceptions) return true;
7246122f3e6SDimitry Andric 
7256122f3e6SDimitry Andric   // If ObjC exceptions are enabled, this depends on the ABI.
726dff0c46cSDimitry Andric   if (LangOpts.ObjCExceptions) {
7277ae0e2c9SDimitry Andric     return LangOpts.ObjCRuntime.hasUnwindExceptions();
7286122f3e6SDimitry Andric   }
7296122f3e6SDimitry Andric 
7306122f3e6SDimitry Andric   return true;
7316122f3e6SDimitry Andric }
7326122f3e6SDimitry Andric 
733f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
734f22ef01cSRoman Divacky                                                            llvm::Function *F) {
735f785676fSDimitry Andric   llvm::AttrBuilder B;
736f785676fSDimitry Andric 
737bd5abe19SDimitry Andric   if (CodeGenOpts.UnwindTables)
738f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::UWTable);
739bd5abe19SDimitry Andric 
740dff0c46cSDimitry Andric   if (!hasUnwindExceptions(LangOpts))
741f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoUnwind);
742f22ef01cSRoman Divacky 
7436122f3e6SDimitry Andric   if (D->hasAttr<NakedAttr>()) {
7446122f3e6SDimitry Andric     // Naked implies noinline: we should not be inlining such functions.
745f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Naked);
746f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
74759d1ed5bSDimitry Andric   } else if (D->hasAttr<NoDuplicateAttr>()) {
74859d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::NoDuplicate);
749f785676fSDimitry Andric   } else if (D->hasAttr<NoInlineAttr>()) {
750f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
75159d1ed5bSDimitry Andric   } else if (D->hasAttr<AlwaysInlineAttr>() &&
752f785676fSDimitry Andric              !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
753f785676fSDimitry Andric                                               llvm::Attribute::NoInline)) {
754f785676fSDimitry Andric     // (noinline wins over always_inline, and we can't specify both in IR)
755f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::AlwaysInline);
7566122f3e6SDimitry Andric   }
7572754fe60SDimitry Andric 
758f785676fSDimitry Andric   if (D->hasAttr<ColdAttr>()) {
75939d628a0SDimitry Andric     if (!D->hasAttr<OptimizeNoneAttr>())
760f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::OptimizeForSize);
761f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Cold);
762f785676fSDimitry Andric   }
7633861d79fSDimitry Andric 
7643861d79fSDimitry Andric   if (D->hasAttr<MinSizeAttr>())
765f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::MinSize);
766f22ef01cSRoman Divacky 
7673861d79fSDimitry Andric   if (LangOpts.getStackProtector() == LangOptions::SSPOn)
768f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtect);
76959d1ed5bSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
77059d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectStrong);
7713861d79fSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
772f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectReq);
7733861d79fSDimitry Andric 
774f785676fSDimitry Andric   F->addAttributes(llvm::AttributeSet::FunctionIndex,
775f785676fSDimitry Andric                    llvm::AttributeSet::get(
776f785676fSDimitry Andric                        F->getContext(), llvm::AttributeSet::FunctionIndex, B));
777f785676fSDimitry Andric 
77839d628a0SDimitry Andric   if (D->hasAttr<OptimizeNoneAttr>()) {
77939d628a0SDimitry Andric     // OptimizeNone implies noinline; we should not be inlining such functions.
78039d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::OptimizeNone);
78139d628a0SDimitry Andric     F->addFnAttr(llvm::Attribute::NoInline);
78239d628a0SDimitry Andric 
78339d628a0SDimitry Andric     // OptimizeNone wins over OptimizeForSize, MinSize, AlwaysInline.
78439d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) &&
78539d628a0SDimitry Andric            "OptimizeNone and OptimizeForSize on same function!");
78639d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::MinSize) &&
78739d628a0SDimitry Andric            "OptimizeNone and MinSize on same function!");
78839d628a0SDimitry Andric     assert(!F->hasFnAttribute(llvm::Attribute::AlwaysInline) &&
78939d628a0SDimitry Andric            "OptimizeNone and AlwaysInline on same function!");
79039d628a0SDimitry Andric 
79139d628a0SDimitry Andric     // Attribute 'inlinehint' has no effect on 'optnone' functions.
79239d628a0SDimitry Andric     // Explicitly remove it from the set of function attributes.
79339d628a0SDimitry Andric     F->removeFnAttr(llvm::Attribute::InlineHint);
79439d628a0SDimitry Andric   }
79539d628a0SDimitry Andric 
796f785676fSDimitry Andric   if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
797f785676fSDimitry Andric     F->setUnnamedAddr(true);
79859d1ed5bSDimitry Andric   else if (const auto *MD = dyn_cast<CXXMethodDecl>(D))
799f785676fSDimitry Andric     if (MD->isVirtual())
800f785676fSDimitry Andric       F->setUnnamedAddr(true);
801f785676fSDimitry Andric 
802e580952dSDimitry Andric   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
803e580952dSDimitry Andric   if (alignment)
804e580952dSDimitry Andric     F->setAlignment(alignment);
805e580952dSDimitry Andric 
806f22ef01cSRoman Divacky   // C++ ABI requires 2-byte alignment for member functions.
807f22ef01cSRoman Divacky   if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D))
808f22ef01cSRoman Divacky     F->setAlignment(2);
809f22ef01cSRoman Divacky }
810f22ef01cSRoman Divacky 
811f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D,
812f22ef01cSRoman Divacky                                         llvm::GlobalValue *GV) {
81359d1ed5bSDimitry Andric   if (const auto *ND = dyn_cast<NamedDecl>(D))
8142754fe60SDimitry Andric     setGlobalVisibility(GV, ND);
8152754fe60SDimitry Andric   else
8162754fe60SDimitry Andric     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
817f22ef01cSRoman Divacky 
818f22ef01cSRoman Divacky   if (D->hasAttr<UsedAttr>())
81959d1ed5bSDimitry Andric     addUsedGlobal(GV);
82059d1ed5bSDimitry Andric }
82159d1ed5bSDimitry Andric 
82239d628a0SDimitry Andric void CodeGenModule::setAliasAttributes(const Decl *D,
82339d628a0SDimitry Andric                                        llvm::GlobalValue *GV) {
82439d628a0SDimitry Andric   SetCommonAttributes(D, GV);
82539d628a0SDimitry Andric 
82639d628a0SDimitry Andric   // Process the dllexport attribute based on whether the original definition
82739d628a0SDimitry Andric   // (not necessarily the aliasee) was exported.
82839d628a0SDimitry Andric   if (D->hasAttr<DLLExportAttr>())
82939d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
83039d628a0SDimitry Andric }
83139d628a0SDimitry Andric 
83259d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D,
83359d1ed5bSDimitry Andric                                           llvm::GlobalObject *GO) {
83459d1ed5bSDimitry Andric   SetCommonAttributes(D, GO);
835f22ef01cSRoman Divacky 
836f22ef01cSRoman Divacky   if (const SectionAttr *SA = D->getAttr<SectionAttr>())
83759d1ed5bSDimitry Andric     GO->setSection(SA->getName());
838f22ef01cSRoman Divacky 
83997bc6c73SDimitry Andric   getTargetCodeGenInfo().setTargetAttributes(D, GO, *this);
840f22ef01cSRoman Divacky }
841f22ef01cSRoman Divacky 
842f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
843f22ef01cSRoman Divacky                                                   llvm::Function *F,
844f22ef01cSRoman Divacky                                                   const CGFunctionInfo &FI) {
845f22ef01cSRoman Divacky   SetLLVMFunctionAttributes(D, FI, F);
846f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, F);
847f22ef01cSRoman Divacky 
848f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::InternalLinkage);
849f22ef01cSRoman Divacky 
85059d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
85159d1ed5bSDimitry Andric }
85259d1ed5bSDimitry Andric 
85359d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
85459d1ed5bSDimitry Andric                                          const NamedDecl *ND) {
85559d1ed5bSDimitry Andric   // Set linkage and visibility in case we never see a definition.
85659d1ed5bSDimitry Andric   LinkageInfo LV = ND->getLinkageAndVisibility();
85759d1ed5bSDimitry Andric   if (LV.getLinkage() != ExternalLinkage) {
85859d1ed5bSDimitry Andric     // Don't set internal linkage on declarations.
85959d1ed5bSDimitry Andric   } else {
86059d1ed5bSDimitry Andric     if (ND->hasAttr<DLLImportAttr>()) {
86159d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
86259d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
86359d1ed5bSDimitry Andric     } else if (ND->hasAttr<DLLExportAttr>()) {
86459d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
86559d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
86659d1ed5bSDimitry Andric     } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) {
86759d1ed5bSDimitry Andric       // "extern_weak" is overloaded in LLVM; we probably should have
86859d1ed5bSDimitry Andric       // separate linkage types for this.
86959d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
87059d1ed5bSDimitry Andric     }
87159d1ed5bSDimitry Andric 
87259d1ed5bSDimitry Andric     // Set visibility on a declaration only if it's explicit.
87359d1ed5bSDimitry Andric     if (LV.isVisibilityExplicit())
87459d1ed5bSDimitry Andric       GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
87559d1ed5bSDimitry Andric   }
876f22ef01cSRoman Divacky }
877f22ef01cSRoman Divacky 
87839d628a0SDimitry Andric void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
87939d628a0SDimitry Andric                                           bool IsIncompleteFunction,
88039d628a0SDimitry Andric                                           bool IsThunk) {
88133956c43SDimitry Andric   if (llvm::Intrinsic::ID IID = F->getIntrinsicID()) {
8823b0f4066SDimitry Andric     // If this is an intrinsic function, set the function's attributes
8833b0f4066SDimitry Andric     // to the intrinsic's attributes.
88433956c43SDimitry Andric     F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(), IID));
8853b0f4066SDimitry Andric     return;
8863b0f4066SDimitry Andric   }
8873b0f4066SDimitry Andric 
88859d1ed5bSDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
889f22ef01cSRoman Divacky 
890f22ef01cSRoman Divacky   if (!IsIncompleteFunction)
891dff0c46cSDimitry Andric     SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F);
892f22ef01cSRoman Divacky 
89359d1ed5bSDimitry Andric   // Add the Returned attribute for "this", except for iOS 5 and earlier
89459d1ed5bSDimitry Andric   // where substantial code, including the libstdc++ dylib, was compiled with
89559d1ed5bSDimitry Andric   // GCC and does not actually return "this".
89639d628a0SDimitry Andric   if (!IsThunk && getCXXABI().HasThisReturn(GD) &&
89759d1ed5bSDimitry Andric       !(getTarget().getTriple().isiOS() &&
89859d1ed5bSDimitry Andric         getTarget().getTriple().isOSVersionLT(6))) {
899f785676fSDimitry Andric     assert(!F->arg_empty() &&
900f785676fSDimitry Andric            F->arg_begin()->getType()
901f785676fSDimitry Andric              ->canLosslesslyBitCastTo(F->getReturnType()) &&
902f785676fSDimitry Andric            "unexpected this return");
903f785676fSDimitry Andric     F->addAttribute(1, llvm::Attribute::Returned);
904f785676fSDimitry Andric   }
905f785676fSDimitry Andric 
906f22ef01cSRoman Divacky   // Only a few attributes are set on declarations; these may later be
907f22ef01cSRoman Divacky   // overridden by a definition.
908f22ef01cSRoman Divacky 
90959d1ed5bSDimitry Andric   setLinkageAndVisibilityForGV(F, FD);
9102754fe60SDimitry Andric 
911f22ef01cSRoman Divacky   if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
912f22ef01cSRoman Divacky     F->setSection(SA->getName());
913f785676fSDimitry Andric 
914f785676fSDimitry Andric   // A replaceable global allocation function does not act like a builtin by
915f785676fSDimitry Andric   // default, only if it is invoked by a new-expression or delete-expression.
916f785676fSDimitry Andric   if (FD->isReplaceableGlobalAllocationFunction())
917f785676fSDimitry Andric     F->addAttribute(llvm::AttributeSet::FunctionIndex,
918f785676fSDimitry Andric                     llvm::Attribute::NoBuiltin);
919f22ef01cSRoman Divacky }
920f22ef01cSRoman Divacky 
92159d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
922f22ef01cSRoman Divacky   assert(!GV->isDeclaration() &&
923f22ef01cSRoman Divacky          "Only globals with definition can force usage.");
92497bc6c73SDimitry Andric   LLVMUsed.emplace_back(GV);
925f22ef01cSRoman Divacky }
926f22ef01cSRoman Divacky 
92759d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) {
92859d1ed5bSDimitry Andric   assert(!GV->isDeclaration() &&
92959d1ed5bSDimitry Andric          "Only globals with definition can force usage.");
93097bc6c73SDimitry Andric   LLVMCompilerUsed.emplace_back(GV);
93159d1ed5bSDimitry Andric }
93259d1ed5bSDimitry Andric 
93359d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name,
93459d1ed5bSDimitry Andric                      std::vector<llvm::WeakVH> &List) {
935f22ef01cSRoman Divacky   // Don't create llvm.used if there is no need.
93659d1ed5bSDimitry Andric   if (List.empty())
937f22ef01cSRoman Divacky     return;
938f22ef01cSRoman Divacky 
93959d1ed5bSDimitry Andric   // Convert List to what ConstantArray needs.
940dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> UsedArray;
94159d1ed5bSDimitry Andric   UsedArray.resize(List.size());
94259d1ed5bSDimitry Andric   for (unsigned i = 0, e = List.size(); i != e; ++i) {
943f22ef01cSRoman Divacky     UsedArray[i] =
94444f7b0dcSDimitry Andric         llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
94544f7b0dcSDimitry Andric             cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy);
946f22ef01cSRoman Divacky   }
947f22ef01cSRoman Divacky 
948f22ef01cSRoman Divacky   if (UsedArray.empty())
949f22ef01cSRoman Divacky     return;
95059d1ed5bSDimitry Andric   llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
951f22ef01cSRoman Divacky 
95259d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
95359d1ed5bSDimitry Andric       CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,
95459d1ed5bSDimitry Andric       llvm::ConstantArray::get(ATy, UsedArray), Name);
955f22ef01cSRoman Divacky 
956f22ef01cSRoman Divacky   GV->setSection("llvm.metadata");
957f22ef01cSRoman Divacky }
958f22ef01cSRoman Divacky 
95959d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() {
96059d1ed5bSDimitry Andric   emitUsed(*this, "llvm.used", LLVMUsed);
96159d1ed5bSDimitry Andric   emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed);
96259d1ed5bSDimitry Andric }
96359d1ed5bSDimitry Andric 
964f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
96539d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
966f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
967f785676fSDimitry Andric }
968f785676fSDimitry Andric 
969f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) {
970f785676fSDimitry Andric   llvm::SmallString<32> Opt;
971f785676fSDimitry Andric   getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt);
97239d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
973f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
974f785676fSDimitry Andric }
975f785676fSDimitry Andric 
976f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) {
977f785676fSDimitry Andric   llvm::SmallString<24> Opt;
978f785676fSDimitry Andric   getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
97939d628a0SDimitry Andric   auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
980f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
981f785676fSDimitry Andric }
982f785676fSDimitry Andric 
983139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules
984139f7f9bSDimitry Andric /// it depends on, using a postorder walk.
98539d628a0SDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod,
98639d628a0SDimitry Andric                                     SmallVectorImpl<llvm::Metadata *> &Metadata,
987139f7f9bSDimitry Andric                                     llvm::SmallPtrSet<Module *, 16> &Visited) {
988139f7f9bSDimitry Andric   // Import this module's parent.
98939d628a0SDimitry Andric   if (Mod->Parent && Visited.insert(Mod->Parent).second) {
990f785676fSDimitry Andric     addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited);
991139f7f9bSDimitry Andric   }
992139f7f9bSDimitry Andric 
993139f7f9bSDimitry Andric   // Import this module's dependencies.
994139f7f9bSDimitry Andric   for (unsigned I = Mod->Imports.size(); I > 0; --I) {
99539d628a0SDimitry Andric     if (Visited.insert(Mod->Imports[I - 1]).second)
996f785676fSDimitry Andric       addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited);
997139f7f9bSDimitry Andric   }
998139f7f9bSDimitry Andric 
999139f7f9bSDimitry Andric   // Add linker options to link against the libraries/frameworks
1000139f7f9bSDimitry Andric   // described by this module.
1001f785676fSDimitry Andric   llvm::LLVMContext &Context = CGM.getLLVMContext();
1002139f7f9bSDimitry Andric   for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) {
1003f785676fSDimitry Andric     // Link against a framework.  Frameworks are currently Darwin only, so we
1004f785676fSDimitry Andric     // don't to ask TargetCodeGenInfo for the spelling of the linker option.
1005139f7f9bSDimitry Andric     if (Mod->LinkLibraries[I-1].IsFramework) {
100639d628a0SDimitry Andric       llvm::Metadata *Args[2] = {
1007139f7f9bSDimitry Andric           llvm::MDString::get(Context, "-framework"),
100839d628a0SDimitry Andric           llvm::MDString::get(Context, Mod->LinkLibraries[I - 1].Library)};
1009139f7f9bSDimitry Andric 
1010139f7f9bSDimitry Andric       Metadata.push_back(llvm::MDNode::get(Context, Args));
1011139f7f9bSDimitry Andric       continue;
1012139f7f9bSDimitry Andric     }
1013139f7f9bSDimitry Andric 
1014139f7f9bSDimitry Andric     // Link against a library.
1015f785676fSDimitry Andric     llvm::SmallString<24> Opt;
1016f785676fSDimitry Andric     CGM.getTargetCodeGenInfo().getDependentLibraryOption(
1017f785676fSDimitry Andric       Mod->LinkLibraries[I-1].Library, Opt);
101839d628a0SDimitry Andric     auto *OptString = llvm::MDString::get(Context, Opt);
1019139f7f9bSDimitry Andric     Metadata.push_back(llvm::MDNode::get(Context, OptString));
1020139f7f9bSDimitry Andric   }
1021139f7f9bSDimitry Andric }
1022139f7f9bSDimitry Andric 
1023139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() {
1024139f7f9bSDimitry Andric   // Collect the set of all of the modules we want to visit to emit link
1025139f7f9bSDimitry Andric   // options, which is essentially the imported modules and all of their
1026139f7f9bSDimitry Andric   // non-explicit child modules.
1027139f7f9bSDimitry Andric   llvm::SetVector<clang::Module *> LinkModules;
1028139f7f9bSDimitry Andric   llvm::SmallPtrSet<clang::Module *, 16> Visited;
1029139f7f9bSDimitry Andric   SmallVector<clang::Module *, 16> Stack;
1030139f7f9bSDimitry Andric 
1031139f7f9bSDimitry Andric   // Seed the stack with imported modules.
1032139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(),
1033139f7f9bSDimitry Andric                                                MEnd = ImportedModules.end();
1034139f7f9bSDimitry Andric        M != MEnd; ++M) {
103539d628a0SDimitry Andric     if (Visited.insert(*M).second)
1036139f7f9bSDimitry Andric       Stack.push_back(*M);
1037139f7f9bSDimitry Andric   }
1038139f7f9bSDimitry Andric 
1039139f7f9bSDimitry Andric   // Find all of the modules to import, making a little effort to prune
1040139f7f9bSDimitry Andric   // non-leaf modules.
1041139f7f9bSDimitry Andric   while (!Stack.empty()) {
1042f785676fSDimitry Andric     clang::Module *Mod = Stack.pop_back_val();
1043139f7f9bSDimitry Andric 
1044139f7f9bSDimitry Andric     bool AnyChildren = false;
1045139f7f9bSDimitry Andric 
1046139f7f9bSDimitry Andric     // Visit the submodules of this module.
1047139f7f9bSDimitry Andric     for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(),
1048139f7f9bSDimitry Andric                                         SubEnd = Mod->submodule_end();
1049139f7f9bSDimitry Andric          Sub != SubEnd; ++Sub) {
1050139f7f9bSDimitry Andric       // Skip explicit children; they need to be explicitly imported to be
1051139f7f9bSDimitry Andric       // linked against.
1052139f7f9bSDimitry Andric       if ((*Sub)->IsExplicit)
1053139f7f9bSDimitry Andric         continue;
1054139f7f9bSDimitry Andric 
105539d628a0SDimitry Andric       if (Visited.insert(*Sub).second) {
1056139f7f9bSDimitry Andric         Stack.push_back(*Sub);
1057139f7f9bSDimitry Andric         AnyChildren = true;
1058139f7f9bSDimitry Andric       }
1059139f7f9bSDimitry Andric     }
1060139f7f9bSDimitry Andric 
1061139f7f9bSDimitry Andric     // We didn't find any children, so add this module to the list of
1062139f7f9bSDimitry Andric     // modules to link against.
1063139f7f9bSDimitry Andric     if (!AnyChildren) {
1064139f7f9bSDimitry Andric       LinkModules.insert(Mod);
1065139f7f9bSDimitry Andric     }
1066139f7f9bSDimitry Andric   }
1067139f7f9bSDimitry Andric 
1068139f7f9bSDimitry Andric   // Add link options for all of the imported modules in reverse topological
1069f785676fSDimitry Andric   // order.  We don't do anything to try to order import link flags with respect
1070f785676fSDimitry Andric   // to linker options inserted by things like #pragma comment().
107139d628a0SDimitry Andric   SmallVector<llvm::Metadata *, 16> MetadataArgs;
1072139f7f9bSDimitry Andric   Visited.clear();
1073139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(),
1074139f7f9bSDimitry Andric                                                MEnd = LinkModules.end();
1075139f7f9bSDimitry Andric        M != MEnd; ++M) {
107639d628a0SDimitry Andric     if (Visited.insert(*M).second)
1077f785676fSDimitry Andric       addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited);
1078139f7f9bSDimitry Andric   }
1079139f7f9bSDimitry Andric   std::reverse(MetadataArgs.begin(), MetadataArgs.end());
1080f785676fSDimitry Andric   LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
1081139f7f9bSDimitry Andric 
1082139f7f9bSDimitry Andric   // Add the linker options metadata flag.
1083139f7f9bSDimitry Andric   getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options",
1084f785676fSDimitry Andric                             llvm::MDNode::get(getLLVMContext(),
1085f785676fSDimitry Andric                                               LinkerOptionsMetadata));
1086139f7f9bSDimitry Andric }
1087139f7f9bSDimitry Andric 
1088f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() {
1089f22ef01cSRoman Divacky   // Emit code for any potentially referenced deferred decls.  Since a
1090f22ef01cSRoman Divacky   // previously unused static decl may become used during the generation of code
1091f22ef01cSRoman Divacky   // for a static function, iterate until no changes are made.
1092f22ef01cSRoman Divacky 
1093f22ef01cSRoman Divacky   if (!DeferredVTables.empty()) {
1094139f7f9bSDimitry Andric     EmitDeferredVTables();
1095139f7f9bSDimitry Andric 
1096139f7f9bSDimitry Andric     // Emitting a v-table doesn't directly cause more v-tables to
1097139f7f9bSDimitry Andric     // become deferred, although it can cause functions to be
1098139f7f9bSDimitry Andric     // emitted that then need those v-tables.
1099139f7f9bSDimitry Andric     assert(DeferredVTables.empty());
1100f22ef01cSRoman Divacky   }
1101f22ef01cSRoman Divacky 
1102139f7f9bSDimitry Andric   // Stop if we're out of both deferred v-tables and deferred declarations.
110333956c43SDimitry Andric   if (DeferredDeclsToEmit.empty())
110433956c43SDimitry Andric     return;
1105139f7f9bSDimitry Andric 
110633956c43SDimitry Andric   // Grab the list of decls to emit. If EmitGlobalDefinition schedules more
110733956c43SDimitry Andric   // work, it will not interfere with this.
110833956c43SDimitry Andric   std::vector<DeferredGlobal> CurDeclsToEmit;
110933956c43SDimitry Andric   CurDeclsToEmit.swap(DeferredDeclsToEmit);
111033956c43SDimitry Andric 
111133956c43SDimitry Andric   for (DeferredGlobal &G : CurDeclsToEmit) {
111259d1ed5bSDimitry Andric     GlobalDecl D = G.GD;
111359d1ed5bSDimitry Andric     llvm::GlobalValue *GV = G.GV;
111433956c43SDimitry Andric     G.GV = nullptr;
1115f22ef01cSRoman Divacky 
111639d628a0SDimitry Andric     assert(!GV || GV == GetGlobalValue(getMangledName(D)));
111739d628a0SDimitry Andric     if (!GV)
111839d628a0SDimitry Andric       GV = GetGlobalValue(getMangledName(D));
111939d628a0SDimitry Andric 
1120f22ef01cSRoman Divacky     // Check to see if we've already emitted this.  This is necessary
1121f22ef01cSRoman Divacky     // for a couple of reasons: first, decls can end up in the
1122f22ef01cSRoman Divacky     // deferred-decls queue multiple times, and second, decls can end
1123f22ef01cSRoman Divacky     // up with definitions in unusual ways (e.g. by an extern inline
1124f22ef01cSRoman Divacky     // function acquiring a strong function redefinition).  Just
1125f22ef01cSRoman Divacky     // ignore these cases.
112639d628a0SDimitry Andric     if (GV && !GV->isDeclaration())
1127f22ef01cSRoman Divacky       continue;
1128f22ef01cSRoman Divacky 
1129f22ef01cSRoman Divacky     // Otherwise, emit the definition and move on to the next one.
113059d1ed5bSDimitry Andric     EmitGlobalDefinition(D, GV);
113133956c43SDimitry Andric 
113233956c43SDimitry Andric     // If we found out that we need to emit more decls, do that recursively.
113333956c43SDimitry Andric     // This has the advantage that the decls are emitted in a DFS and related
113433956c43SDimitry Andric     // ones are close together, which is convenient for testing.
113533956c43SDimitry Andric     if (!DeferredVTables.empty() || !DeferredDeclsToEmit.empty()) {
113633956c43SDimitry Andric       EmitDeferred();
113733956c43SDimitry Andric       assert(DeferredVTables.empty() && DeferredDeclsToEmit.empty());
113833956c43SDimitry Andric     }
1139f22ef01cSRoman Divacky   }
1140f22ef01cSRoman Divacky }
1141f22ef01cSRoman Divacky 
11426122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() {
11436122f3e6SDimitry Andric   if (Annotations.empty())
11446122f3e6SDimitry Andric     return;
11456122f3e6SDimitry Andric 
11466122f3e6SDimitry Andric   // Create a new global variable for the ConstantStruct in the Module.
11476122f3e6SDimitry Andric   llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
11486122f3e6SDimitry Andric     Annotations[0]->getType(), Annotations.size()), Annotations);
114959d1ed5bSDimitry Andric   auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false,
115059d1ed5bSDimitry Andric                                       llvm::GlobalValue::AppendingLinkage,
115159d1ed5bSDimitry Andric                                       Array, "llvm.global.annotations");
11526122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11536122f3e6SDimitry Andric }
11546122f3e6SDimitry Andric 
1155139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) {
1156f785676fSDimitry Andric   llvm::Constant *&AStr = AnnotationStrings[Str];
1157f785676fSDimitry Andric   if (AStr)
1158f785676fSDimitry Andric     return AStr;
11596122f3e6SDimitry Andric 
11606122f3e6SDimitry Andric   // Not found yet, create a new global.
1161dff0c46cSDimitry Andric   llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
116259d1ed5bSDimitry Andric   auto *gv =
116359d1ed5bSDimitry Andric       new llvm::GlobalVariable(getModule(), s->getType(), true,
116459d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, s, ".str");
11656122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11666122f3e6SDimitry Andric   gv->setUnnamedAddr(true);
1167f785676fSDimitry Andric   AStr = gv;
11686122f3e6SDimitry Andric   return gv;
11696122f3e6SDimitry Andric }
11706122f3e6SDimitry Andric 
11716122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) {
11726122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11736122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(Loc);
11746122f3e6SDimitry Andric   if (PLoc.isValid())
11756122f3e6SDimitry Andric     return EmitAnnotationString(PLoc.getFilename());
11766122f3e6SDimitry Andric   return EmitAnnotationString(SM.getBufferName(Loc));
11776122f3e6SDimitry Andric }
11786122f3e6SDimitry Andric 
11796122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) {
11806122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11816122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(L);
11826122f3e6SDimitry Andric   unsigned LineNo = PLoc.isValid() ? PLoc.getLine() :
11836122f3e6SDimitry Andric     SM.getExpansionLineNumber(L);
11846122f3e6SDimitry Andric   return llvm::ConstantInt::get(Int32Ty, LineNo);
11856122f3e6SDimitry Andric }
11866122f3e6SDimitry Andric 
1187f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
1188f22ef01cSRoman Divacky                                                 const AnnotateAttr *AA,
11896122f3e6SDimitry Andric                                                 SourceLocation L) {
11906122f3e6SDimitry Andric   // Get the globals for file name, annotation, and the line number.
11916122f3e6SDimitry Andric   llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()),
11926122f3e6SDimitry Andric                  *UnitGV = EmitAnnotationUnit(L),
11936122f3e6SDimitry Andric                  *LineNoCst = EmitAnnotationLineNo(L);
1194f22ef01cSRoman Divacky 
1195f22ef01cSRoman Divacky   // Create the ConstantStruct for the global annotation.
1196f22ef01cSRoman Divacky   llvm::Constant *Fields[4] = {
11976122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
11986122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
11996122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
12006122f3e6SDimitry Andric     LineNoCst
1201f22ef01cSRoman Divacky   };
120217a519f9SDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
1203f22ef01cSRoman Divacky }
1204f22ef01cSRoman Divacky 
12056122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
12066122f3e6SDimitry Andric                                          llvm::GlobalValue *GV) {
12076122f3e6SDimitry Andric   assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
12086122f3e6SDimitry Andric   // Get the struct elements for these annotations.
120959d1ed5bSDimitry Andric   for (const auto *I : D->specific_attrs<AnnotateAttr>())
121059d1ed5bSDimitry Andric     Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation()));
12116122f3e6SDimitry Andric }
12126122f3e6SDimitry Andric 
121339d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::Function *Fn,
121439d628a0SDimitry Andric                                            SourceLocation Loc) const {
121539d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
121639d628a0SDimitry Andric   // Blacklist by function name.
121739d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedFunction(Fn->getName()))
121839d628a0SDimitry Andric     return true;
121939d628a0SDimitry Andric   // Blacklist by location.
122039d628a0SDimitry Andric   if (!Loc.isInvalid())
122139d628a0SDimitry Andric     return SanitizerBL.isBlacklistedLocation(Loc);
122239d628a0SDimitry Andric   // If location is unknown, this may be a compiler-generated function. Assume
122339d628a0SDimitry Andric   // it's located in the main file.
122439d628a0SDimitry Andric   auto &SM = Context.getSourceManager();
122539d628a0SDimitry Andric   if (const auto *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
122639d628a0SDimitry Andric     return SanitizerBL.isBlacklistedFile(MainFile->getName());
122739d628a0SDimitry Andric   }
122839d628a0SDimitry Andric   return false;
122939d628a0SDimitry Andric }
123039d628a0SDimitry Andric 
123139d628a0SDimitry Andric bool CodeGenModule::isInSanitizerBlacklist(llvm::GlobalVariable *GV,
123239d628a0SDimitry Andric                                            SourceLocation Loc, QualType Ty,
123339d628a0SDimitry Andric                                            StringRef Category) const {
123439d628a0SDimitry Andric   // For now globals can be blacklisted only in ASan.
123539d628a0SDimitry Andric   if (!LangOpts.Sanitize.has(SanitizerKind::Address))
123639d628a0SDimitry Andric     return false;
123739d628a0SDimitry Andric   const auto &SanitizerBL = getContext().getSanitizerBlacklist();
123839d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedGlobal(GV->getName(), Category))
123939d628a0SDimitry Andric     return true;
124039d628a0SDimitry Andric   if (SanitizerBL.isBlacklistedLocation(Loc, Category))
124139d628a0SDimitry Andric     return true;
124239d628a0SDimitry Andric   // Check global type.
124339d628a0SDimitry Andric   if (!Ty.isNull()) {
124439d628a0SDimitry Andric     // Drill down the array types: if global variable of a fixed type is
124539d628a0SDimitry Andric     // blacklisted, we also don't instrument arrays of them.
124639d628a0SDimitry Andric     while (auto AT = dyn_cast<ArrayType>(Ty.getTypePtr()))
124739d628a0SDimitry Andric       Ty = AT->getElementType();
124839d628a0SDimitry Andric     Ty = Ty.getCanonicalType().getUnqualifiedType();
124939d628a0SDimitry Andric     // We allow to blacklist only record types (classes, structs etc.)
125039d628a0SDimitry Andric     if (Ty->isRecordType()) {
125139d628a0SDimitry Andric       std::string TypeStr = Ty.getAsString(getContext().getPrintingPolicy());
125239d628a0SDimitry Andric       if (SanitizerBL.isBlacklistedType(TypeStr, Category))
125339d628a0SDimitry Andric         return true;
125439d628a0SDimitry Andric     }
125539d628a0SDimitry Andric   }
125639d628a0SDimitry Andric   return false;
125739d628a0SDimitry Andric }
125839d628a0SDimitry Andric 
125939d628a0SDimitry Andric bool CodeGenModule::MustBeEmitted(const ValueDecl *Global) {
1260e580952dSDimitry Andric   // Never defer when EmitAllDecls is specified.
1261dff0c46cSDimitry Andric   if (LangOpts.EmitAllDecls)
126239d628a0SDimitry Andric     return true;
126339d628a0SDimitry Andric 
126439d628a0SDimitry Andric   return getContext().DeclMustBeEmitted(Global);
126539d628a0SDimitry Andric }
126639d628a0SDimitry Andric 
126739d628a0SDimitry Andric bool CodeGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
126839d628a0SDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global))
126939d628a0SDimitry Andric     if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
127039d628a0SDimitry Andric       // Implicit template instantiations may change linkage if they are later
127139d628a0SDimitry Andric       // explicitly instantiated, so they should not be emitted eagerly.
1272f22ef01cSRoman Divacky       return false;
1273f22ef01cSRoman Divacky 
127439d628a0SDimitry Andric   return true;
1275f22ef01cSRoman Divacky }
1276f22ef01cSRoman Divacky 
12773861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
12783861d79fSDimitry Andric     const CXXUuidofExpr* E) {
12793861d79fSDimitry Andric   // Sema has verified that IIDSource has a __declspec(uuid()), and that its
12803861d79fSDimitry Andric   // well-formed.
1281f785676fSDimitry Andric   StringRef Uuid = E->getUuidAsStringRef(Context);
1282f785676fSDimitry Andric   std::string Name = "_GUID_" + Uuid.lower();
1283f785676fSDimitry Andric   std::replace(Name.begin(), Name.end(), '-', '_');
12843861d79fSDimitry Andric 
12853861d79fSDimitry Andric   // Look for an existing global.
12863861d79fSDimitry Andric   if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
12873861d79fSDimitry Andric     return GV;
12883861d79fSDimitry Andric 
128939d628a0SDimitry Andric   llvm::Constant *Init = EmitUuidofInitializer(Uuid);
12903861d79fSDimitry Andric   assert(Init && "failed to initialize as constant");
12913861d79fSDimitry Andric 
129259d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
1293f785676fSDimitry Andric       getModule(), Init->getType(),
1294f785676fSDimitry Andric       /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
129533956c43SDimitry Andric   if (supportsCOMDAT())
129633956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
12973861d79fSDimitry Andric   return GV;
12983861d79fSDimitry Andric }
12993861d79fSDimitry Andric 
1300f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
1301f22ef01cSRoman Divacky   const AliasAttr *AA = VD->getAttr<AliasAttr>();
1302f22ef01cSRoman Divacky   assert(AA && "No alias?");
1303f22ef01cSRoman Divacky 
13046122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType());
1305f22ef01cSRoman Divacky 
1306f22ef01cSRoman Divacky   // See if there is already something with the target's name in the module.
1307f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
13083861d79fSDimitry Andric   if (Entry) {
13093861d79fSDimitry Andric     unsigned AS = getContext().getTargetAddressSpace(VD->getType());
13103861d79fSDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
13113861d79fSDimitry Andric   }
1312f22ef01cSRoman Divacky 
1313f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
1314f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
13153861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
13163861d79fSDimitry Andric                                       GlobalDecl(cast<FunctionDecl>(VD)),
13172754fe60SDimitry Andric                                       /*ForVTable=*/false);
1318f22ef01cSRoman Divacky   else
1319f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
132059d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
132159d1ed5bSDimitry Andric                                     nullptr);
13223861d79fSDimitry Andric 
132359d1ed5bSDimitry Andric   auto *F = cast<llvm::GlobalValue>(Aliasee);
1324f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::ExternalWeakLinkage);
1325f22ef01cSRoman Divacky   WeakRefReferences.insert(F);
1326f22ef01cSRoman Divacky 
1327f22ef01cSRoman Divacky   return Aliasee;
1328f22ef01cSRoman Divacky }
1329f22ef01cSRoman Divacky 
1330f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) {
133159d1ed5bSDimitry Andric   const auto *Global = cast<ValueDecl>(GD.getDecl());
1332f22ef01cSRoman Divacky 
1333f22ef01cSRoman Divacky   // Weak references don't produce any output by themselves.
1334f22ef01cSRoman Divacky   if (Global->hasAttr<WeakRefAttr>())
1335f22ef01cSRoman Divacky     return;
1336f22ef01cSRoman Divacky 
1337f22ef01cSRoman Divacky   // If this is an alias definition (which otherwise looks like a declaration)
1338f22ef01cSRoman Divacky   // emit it now.
1339f22ef01cSRoman Divacky   if (Global->hasAttr<AliasAttr>())
1340f22ef01cSRoman Divacky     return EmitAliasDefinition(GD);
1341f22ef01cSRoman Divacky 
13426122f3e6SDimitry Andric   // If this is CUDA, be selective about which declarations we emit.
1343dff0c46cSDimitry Andric   if (LangOpts.CUDA) {
134433956c43SDimitry Andric     if (LangOpts.CUDAIsDevice) {
13456122f3e6SDimitry Andric       if (!Global->hasAttr<CUDADeviceAttr>() &&
13466122f3e6SDimitry Andric           !Global->hasAttr<CUDAGlobalAttr>() &&
13476122f3e6SDimitry Andric           !Global->hasAttr<CUDAConstantAttr>() &&
13486122f3e6SDimitry Andric           !Global->hasAttr<CUDASharedAttr>())
13496122f3e6SDimitry Andric         return;
13506122f3e6SDimitry Andric     } else {
13516122f3e6SDimitry Andric       if (!Global->hasAttr<CUDAHostAttr>() && (
13526122f3e6SDimitry Andric             Global->hasAttr<CUDADeviceAttr>() ||
13536122f3e6SDimitry Andric             Global->hasAttr<CUDAConstantAttr>() ||
13546122f3e6SDimitry Andric             Global->hasAttr<CUDASharedAttr>()))
13556122f3e6SDimitry Andric         return;
1356e580952dSDimitry Andric     }
1357e580952dSDimitry Andric   }
1358e580952dSDimitry Andric 
13596122f3e6SDimitry Andric   // Ignore declarations, they will be emitted on their first use.
136059d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
1361f22ef01cSRoman Divacky     // Forward declarations are emitted lazily on first use.
13626122f3e6SDimitry Andric     if (!FD->doesThisDeclarationHaveABody()) {
13636122f3e6SDimitry Andric       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
1364f22ef01cSRoman Divacky         return;
13656122f3e6SDimitry Andric 
13666122f3e6SDimitry Andric       StringRef MangledName = getMangledName(GD);
136759d1ed5bSDimitry Andric 
136859d1ed5bSDimitry Andric       // Compute the function info and LLVM type.
136959d1ed5bSDimitry Andric       const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
137059d1ed5bSDimitry Andric       llvm::Type *Ty = getTypes().GetFunctionType(FI);
137159d1ed5bSDimitry Andric 
137259d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false,
137359d1ed5bSDimitry Andric                               /*DontDefer=*/false);
13746122f3e6SDimitry Andric       return;
13756122f3e6SDimitry Andric     }
1376f22ef01cSRoman Divacky   } else {
137759d1ed5bSDimitry Andric     const auto *VD = cast<VarDecl>(Global);
1378f22ef01cSRoman Divacky     assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
1379f22ef01cSRoman Divacky 
138059d1ed5bSDimitry Andric     if (VD->isThisDeclarationADefinition() != VarDecl::Definition &&
138159d1ed5bSDimitry Andric         !Context.isMSStaticDataMemberInlineDefinition(VD))
1382f22ef01cSRoman Divacky       return;
1383f22ef01cSRoman Divacky   }
1384f22ef01cSRoman Divacky 
138539d628a0SDimitry Andric   // Defer code generation to first use when possible, e.g. if this is an inline
138639d628a0SDimitry Andric   // function. If the global must always be emitted, do it eagerly if possible
138739d628a0SDimitry Andric   // to benefit from cache locality.
138839d628a0SDimitry Andric   if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) {
1389f22ef01cSRoman Divacky     // Emit the definition if it can't be deferred.
1390f22ef01cSRoman Divacky     EmitGlobalDefinition(GD);
1391f22ef01cSRoman Divacky     return;
1392f22ef01cSRoman Divacky   }
1393f22ef01cSRoman Divacky 
1394e580952dSDimitry Andric   // If we're deferring emission of a C++ variable with an
1395e580952dSDimitry Andric   // initializer, remember the order in which it appeared in the file.
1396dff0c46cSDimitry Andric   if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) &&
1397e580952dSDimitry Andric       cast<VarDecl>(Global)->hasInit()) {
1398e580952dSDimitry Andric     DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
139959d1ed5bSDimitry Andric     CXXGlobalInits.push_back(nullptr);
1400e580952dSDimitry Andric   }
1401e580952dSDimitry Andric 
14026122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
140339d628a0SDimitry Andric   if (llvm::GlobalValue *GV = GetGlobalValue(MangledName)) {
140439d628a0SDimitry Andric     // The value has already been used and should therefore be emitted.
140559d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, GD);
140639d628a0SDimitry Andric   } else if (MustBeEmitted(Global)) {
140739d628a0SDimitry Andric     // The value must be emitted, but cannot be emitted eagerly.
140839d628a0SDimitry Andric     assert(!MayBeEmittedEagerly(Global));
140939d628a0SDimitry Andric     addDeferredDeclToEmit(/*GV=*/nullptr, GD);
141039d628a0SDimitry Andric   } else {
1411f22ef01cSRoman Divacky     // Otherwise, remember that we saw a deferred decl with this name.  The
1412f22ef01cSRoman Divacky     // first use of the mangled name will cause it to move into
1413f22ef01cSRoman Divacky     // DeferredDeclsToEmit.
1414f22ef01cSRoman Divacky     DeferredDecls[MangledName] = GD;
1415f22ef01cSRoman Divacky   }
1416f22ef01cSRoman Divacky }
1417f22ef01cSRoman Divacky 
1418f8254f43SDimitry Andric namespace {
1419f8254f43SDimitry Andric   struct FunctionIsDirectlyRecursive :
1420f8254f43SDimitry Andric     public RecursiveASTVisitor<FunctionIsDirectlyRecursive> {
1421f8254f43SDimitry Andric     const StringRef Name;
1422dff0c46cSDimitry Andric     const Builtin::Context &BI;
1423f8254f43SDimitry Andric     bool Result;
1424dff0c46cSDimitry Andric     FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) :
1425dff0c46cSDimitry Andric       Name(N), BI(C), Result(false) {
1426f8254f43SDimitry Andric     }
1427f8254f43SDimitry Andric     typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base;
1428f8254f43SDimitry Andric 
1429f8254f43SDimitry Andric     bool TraverseCallExpr(CallExpr *E) {
1430dff0c46cSDimitry Andric       const FunctionDecl *FD = E->getDirectCallee();
1431dff0c46cSDimitry Andric       if (!FD)
1432f8254f43SDimitry Andric         return true;
1433dff0c46cSDimitry Andric       AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1434dff0c46cSDimitry Andric       if (Attr && Name == Attr->getLabel()) {
1435dff0c46cSDimitry Andric         Result = true;
1436dff0c46cSDimitry Andric         return false;
1437dff0c46cSDimitry Andric       }
1438dff0c46cSDimitry Andric       unsigned BuiltinID = FD->getBuiltinID();
1439dff0c46cSDimitry Andric       if (!BuiltinID)
1440f8254f43SDimitry Andric         return true;
1441dff0c46cSDimitry Andric       StringRef BuiltinName = BI.GetName(BuiltinID);
1442dff0c46cSDimitry Andric       if (BuiltinName.startswith("__builtin_") &&
1443dff0c46cSDimitry Andric           Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) {
1444f8254f43SDimitry Andric         Result = true;
1445f8254f43SDimitry Andric         return false;
1446f8254f43SDimitry Andric       }
1447f8254f43SDimitry Andric       return true;
1448f8254f43SDimitry Andric     }
1449f8254f43SDimitry Andric   };
1450f8254f43SDimitry Andric }
1451f8254f43SDimitry Andric 
1452dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another
1453dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin,
1454dff0c46cSDimitry Andric // ends up pointing to itself.
1455f8254f43SDimitry Andric bool
1456dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) {
1457dff0c46cSDimitry Andric   StringRef Name;
1458dff0c46cSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
1459dff0c46cSDimitry Andric     // asm labels are a special kind of mangling we have to support.
1460dff0c46cSDimitry Andric     AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1461dff0c46cSDimitry Andric     if (!Attr)
1462f8254f43SDimitry Andric       return false;
1463dff0c46cSDimitry Andric     Name = Attr->getLabel();
1464dff0c46cSDimitry Andric   } else {
1465dff0c46cSDimitry Andric     Name = FD->getName();
1466dff0c46cSDimitry Andric   }
1467f8254f43SDimitry Andric 
1468dff0c46cSDimitry Andric   FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
1469dff0c46cSDimitry Andric   Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
1470f8254f43SDimitry Andric   return Walker.Result;
1471f8254f43SDimitry Andric }
1472f8254f43SDimitry Andric 
1473f8254f43SDimitry Andric bool
1474f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
1475f785676fSDimitry Andric   if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage)
1476f8254f43SDimitry Andric     return true;
147759d1ed5bSDimitry Andric   const auto *F = cast<FunctionDecl>(GD.getDecl());
147859d1ed5bSDimitry Andric   if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
1479f8254f43SDimitry Andric     return false;
1480f8254f43SDimitry Andric   // PR9614. Avoid cases where the source code is lying to us. An available
1481f8254f43SDimitry Andric   // externally function should have an equivalent function somewhere else,
1482f8254f43SDimitry Andric   // but a function that calls itself is clearly not equivalent to the real
1483f8254f43SDimitry Andric   // implementation.
1484f8254f43SDimitry Andric   // This happens in glibc's btowc and in some configure checks.
1485dff0c46cSDimitry Andric   return !isTriviallyRecursive(F);
1486f8254f43SDimitry Andric }
1487f8254f43SDimitry Andric 
1488f785676fSDimitry Andric /// If the type for the method's class was generated by
1489f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a
1490f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart()
1491f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need
1492f785676fSDimitry Andric /// to construct the complete type prior to emitting the method.
1493f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) {
1494f785676fSDimitry Andric   if (!D->isInstance())
1495f785676fSDimitry Andric     return;
1496f785676fSDimitry Andric 
1497f785676fSDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
1498f785676fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
149959d1ed5bSDimitry Andric       const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext()));
1500f785676fSDimitry Andric       DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation());
1501f785676fSDimitry Andric     }
1502f785676fSDimitry Andric }
1503f785676fSDimitry Andric 
150459d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
150559d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
1506f22ef01cSRoman Divacky 
1507f22ef01cSRoman Divacky   PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(),
1508f22ef01cSRoman Divacky                                  Context.getSourceManager(),
1509f22ef01cSRoman Divacky                                  "Generating code for declaration");
1510f22ef01cSRoman Divacky 
1511f785676fSDimitry Andric   if (isa<FunctionDecl>(D)) {
1512ffd1746dSEd Schouten     // At -O0, don't generate IR for functions with available_externally
1513ffd1746dSEd Schouten     // linkage.
1514f785676fSDimitry Andric     if (!shouldEmitFunction(GD))
1515ffd1746dSEd Schouten       return;
1516ffd1746dSEd Schouten 
151759d1ed5bSDimitry Andric     if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
1518f785676fSDimitry Andric       CompleteDIClassType(Method);
1519bd5abe19SDimitry Andric       // Make sure to emit the definition(s) before we emit the thunks.
1520bd5abe19SDimitry Andric       // This is necessary for the generation of certain thunks.
152159d1ed5bSDimitry Andric       if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method))
152239d628a0SDimitry Andric         ABI->emitCXXStructor(CD, getFromCtorType(GD.getCtorType()));
152359d1ed5bSDimitry Andric       else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method))
152439d628a0SDimitry Andric         ABI->emitCXXStructor(DD, getFromDtorType(GD.getDtorType()));
1525bd5abe19SDimitry Andric       else
152659d1ed5bSDimitry Andric         EmitGlobalFunctionDefinition(GD, GV);
1527bd5abe19SDimitry Andric 
1528f22ef01cSRoman Divacky       if (Method->isVirtual())
1529f22ef01cSRoman Divacky         getVTables().EmitThunks(GD);
1530f22ef01cSRoman Divacky 
1531bd5abe19SDimitry Andric       return;
1532ffd1746dSEd Schouten     }
1533f22ef01cSRoman Divacky 
153459d1ed5bSDimitry Andric     return EmitGlobalFunctionDefinition(GD, GV);
1535ffd1746dSEd Schouten   }
1536f22ef01cSRoman Divacky 
153759d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
1538f22ef01cSRoman Divacky     return EmitGlobalVarDefinition(VD);
1539f22ef01cSRoman Divacky 
15406122f3e6SDimitry Andric   llvm_unreachable("Invalid argument to EmitGlobalDefinition()");
1541f22ef01cSRoman Divacky }
1542f22ef01cSRoman Divacky 
1543f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the
1544f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there
1545f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1546f22ef01cSRoman Divacky /// bitcasted to the right type.
1547f22ef01cSRoman Divacky ///
1548f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1549f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created.
1550f22ef01cSRoman Divacky llvm::Constant *
15516122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
15526122f3e6SDimitry Andric                                        llvm::Type *Ty,
1553f785676fSDimitry Andric                                        GlobalDecl GD, bool ForVTable,
155439d628a0SDimitry Andric                                        bool DontDefer, bool IsThunk,
1555139f7f9bSDimitry Andric                                        llvm::AttributeSet ExtraAttrs) {
1556f785676fSDimitry Andric   const Decl *D = GD.getDecl();
1557f785676fSDimitry Andric 
1558f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1559f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1560f22ef01cSRoman Divacky   if (Entry) {
15613861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1562f785676fSDimitry Andric       const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
1563f22ef01cSRoman Divacky       if (FD && !FD->hasAttr<WeakAttr>())
1564f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1565f22ef01cSRoman Divacky     }
1566f22ef01cSRoman Divacky 
156739d628a0SDimitry Andric     // Handle dropped DLL attributes.
156839d628a0SDimitry Andric     if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
156939d628a0SDimitry Andric       Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
157039d628a0SDimitry Andric 
1571f22ef01cSRoman Divacky     if (Entry->getType()->getElementType() == Ty)
1572f22ef01cSRoman Divacky       return Entry;
1573f22ef01cSRoman Divacky 
1574f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
157517a519f9SDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
1576f22ef01cSRoman Divacky   }
1577f22ef01cSRoman Divacky 
1578f22ef01cSRoman Divacky   // This function doesn't have a complete type (for example, the return
1579f22ef01cSRoman Divacky   // type is an incomplete struct). Use a fake type instead, and make
1580f22ef01cSRoman Divacky   // sure not to try to set attributes.
1581f22ef01cSRoman Divacky   bool IsIncompleteFunction = false;
1582f22ef01cSRoman Divacky 
15836122f3e6SDimitry Andric   llvm::FunctionType *FTy;
1584f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(Ty)) {
1585f22ef01cSRoman Divacky     FTy = cast<llvm::FunctionType>(Ty);
1586f22ef01cSRoman Divacky   } else {
1587bd5abe19SDimitry Andric     FTy = llvm::FunctionType::get(VoidTy, false);
1588f22ef01cSRoman Divacky     IsIncompleteFunction = true;
1589f22ef01cSRoman Divacky   }
1590ffd1746dSEd Schouten 
1591f22ef01cSRoman Divacky   llvm::Function *F = llvm::Function::Create(FTy,
1592f22ef01cSRoman Divacky                                              llvm::Function::ExternalLinkage,
1593f22ef01cSRoman Divacky                                              MangledName, &getModule());
1594f22ef01cSRoman Divacky   assert(F->getName() == MangledName && "name was uniqued!");
1595f785676fSDimitry Andric   if (D)
159639d628a0SDimitry Andric     SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
1597139f7f9bSDimitry Andric   if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) {
1598139f7f9bSDimitry Andric     llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex);
1599139f7f9bSDimitry Andric     F->addAttributes(llvm::AttributeSet::FunctionIndex,
1600139f7f9bSDimitry Andric                      llvm::AttributeSet::get(VMContext,
1601139f7f9bSDimitry Andric                                              llvm::AttributeSet::FunctionIndex,
1602139f7f9bSDimitry Andric                                              B));
1603139f7f9bSDimitry Andric   }
1604f22ef01cSRoman Divacky 
160559d1ed5bSDimitry Andric   if (!DontDefer) {
160659d1ed5bSDimitry Andric     // All MSVC dtors other than the base dtor are linkonce_odr and delegate to
160759d1ed5bSDimitry Andric     // each other bottoming out with the base dtor.  Therefore we emit non-base
160859d1ed5bSDimitry Andric     // dtors on usage, even if there is no dtor definition in the TU.
160959d1ed5bSDimitry Andric     if (D && isa<CXXDestructorDecl>(D) &&
161059d1ed5bSDimitry Andric         getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
161159d1ed5bSDimitry Andric                                            GD.getDtorType()))
161259d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
161359d1ed5bSDimitry Andric 
1614f22ef01cSRoman Divacky     // This is the first use or definition of a mangled name.  If there is a
1615f22ef01cSRoman Divacky     // deferred decl with this name, remember that we need to emit it at the end
1616f22ef01cSRoman Divacky     // of the file.
161759d1ed5bSDimitry Andric     auto DDI = DeferredDecls.find(MangledName);
1618f22ef01cSRoman Divacky     if (DDI != DeferredDecls.end()) {
161959d1ed5bSDimitry Andric       // Move the potentially referenced deferred decl to the
162059d1ed5bSDimitry Andric       // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we
162159d1ed5bSDimitry Andric       // don't need it anymore).
162259d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, DDI->second);
1623f22ef01cSRoman Divacky       DeferredDecls.erase(DDI);
16242754fe60SDimitry Andric 
16252754fe60SDimitry Andric       // Otherwise, there are cases we have to worry about where we're
16262754fe60SDimitry Andric       // using a declaration for which we must emit a definition but where
16272754fe60SDimitry Andric       // we might not find a top-level definition:
16282754fe60SDimitry Andric       //   - member functions defined inline in their classes
16292754fe60SDimitry Andric       //   - friend functions defined inline in some class
16302754fe60SDimitry Andric       //   - special member functions with implicit definitions
16312754fe60SDimitry Andric       // If we ever change our AST traversal to walk into class methods,
16322754fe60SDimitry Andric       // this will be unnecessary.
16332754fe60SDimitry Andric       //
163459d1ed5bSDimitry Andric       // We also don't emit a definition for a function if it's going to be an
163539d628a0SDimitry Andric       // entry in a vtable, unless it's already marked as used.
1636f785676fSDimitry Andric     } else if (getLangOpts().CPlusPlus && D) {
16372754fe60SDimitry Andric       // Look for a declaration that's lexically in a record.
163839d628a0SDimitry Andric       for (const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD;
163939d628a0SDimitry Andric            FD = FD->getPreviousDecl()) {
16402754fe60SDimitry Andric         if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
164139d628a0SDimitry Andric           if (FD->doesThisDeclarationHaveABody()) {
164259d1ed5bSDimitry Andric             addDeferredDeclToEmit(F, GD.getWithDecl(FD));
16432754fe60SDimitry Andric             break;
1644f22ef01cSRoman Divacky           }
1645f22ef01cSRoman Divacky         }
164639d628a0SDimitry Andric       }
1647f22ef01cSRoman Divacky     }
164859d1ed5bSDimitry Andric   }
1649f22ef01cSRoman Divacky 
1650f22ef01cSRoman Divacky   // Make sure the result is of the requested type.
1651f22ef01cSRoman Divacky   if (!IsIncompleteFunction) {
1652f22ef01cSRoman Divacky     assert(F->getType()->getElementType() == Ty);
1653f22ef01cSRoman Divacky     return F;
1654f22ef01cSRoman Divacky   }
1655f22ef01cSRoman Divacky 
165617a519f9SDimitry Andric   llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
1657f22ef01cSRoman Divacky   return llvm::ConstantExpr::getBitCast(F, PTy);
1658f22ef01cSRoman Divacky }
1659f22ef01cSRoman Divacky 
1660f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function.  If Ty is
1661f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to
1662f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function).
1663f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
16646122f3e6SDimitry Andric                                                  llvm::Type *Ty,
166559d1ed5bSDimitry Andric                                                  bool ForVTable,
166659d1ed5bSDimitry Andric                                                  bool DontDefer) {
1667f22ef01cSRoman Divacky   // If there was no specific requested type, just convert it now.
1668f22ef01cSRoman Divacky   if (!Ty)
1669f22ef01cSRoman Divacky     Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
1670ffd1746dSEd Schouten 
16716122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
167259d1ed5bSDimitry Andric   return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer);
1673f22ef01cSRoman Divacky }
1674f22ef01cSRoman Divacky 
1675f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified
1676f22ef01cSRoman Divacky /// type and name.
1677f22ef01cSRoman Divacky llvm::Constant *
16786122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy,
16796122f3e6SDimitry Andric                                      StringRef Name,
1680139f7f9bSDimitry Andric                                      llvm::AttributeSet ExtraAttrs) {
168159d1ed5bSDimitry Andric   llvm::Constant *C =
168259d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
168339d628a0SDimitry Andric                               /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs);
168459d1ed5bSDimitry Andric   if (auto *F = dyn_cast<llvm::Function>(C))
1685139f7f9bSDimitry Andric     if (F->empty())
1686139f7f9bSDimitry Andric       F->setCallingConv(getRuntimeCC());
1687139f7f9bSDimitry Andric   return C;
1688f22ef01cSRoman Divacky }
1689f22ef01cSRoman Divacky 
169039d628a0SDimitry Andric /// CreateBuiltinFunction - Create a new builtin function with the specified
169139d628a0SDimitry Andric /// type and name.
169239d628a0SDimitry Andric llvm::Constant *
169339d628a0SDimitry Andric CodeGenModule::CreateBuiltinFunction(llvm::FunctionType *FTy,
169439d628a0SDimitry Andric                                      StringRef Name,
169539d628a0SDimitry Andric                                      llvm::AttributeSet ExtraAttrs) {
169639d628a0SDimitry Andric   llvm::Constant *C =
169739d628a0SDimitry Andric       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
169839d628a0SDimitry Andric                               /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs);
169939d628a0SDimitry Andric   if (auto *F = dyn_cast<llvm::Function>(C))
170039d628a0SDimitry Andric     if (F->empty())
170139d628a0SDimitry Andric       F->setCallingConv(getBuiltinCC());
170239d628a0SDimitry Andric   return C;
170339d628a0SDimitry Andric }
170439d628a0SDimitry Andric 
1705dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted
1706dff0c46cSDimitry Andric /// as a constant.
1707dff0c46cSDimitry Andric ///
1708dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs
1709dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is
1710dff0c46cSDimitry Andric /// not written to during its construction.
1711dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) {
1712dff0c46cSDimitry Andric   if (!Ty.isConstant(Context) && !Ty->isReferenceType())
1713f22ef01cSRoman Divacky     return false;
1714bd5abe19SDimitry Andric 
1715dff0c46cSDimitry Andric   if (Context.getLangOpts().CPlusPlus) {
1716dff0c46cSDimitry Andric     if (const CXXRecordDecl *Record
1717dff0c46cSDimitry Andric           = Context.getBaseElementType(Ty)->getAsCXXRecordDecl())
1718dff0c46cSDimitry Andric       return ExcludeCtor && !Record->hasMutableFields() &&
1719dff0c46cSDimitry Andric              Record->hasTrivialDestructor();
1720f22ef01cSRoman Divacky   }
1721bd5abe19SDimitry Andric 
1722f22ef01cSRoman Divacky   return true;
1723f22ef01cSRoman Divacky }
1724f22ef01cSRoman Divacky 
1725f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module,
1726f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type.  If there
1727f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1728f22ef01cSRoman Divacky /// bitcasted to the right type.
1729f22ef01cSRoman Divacky ///
1730f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1731f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created.
1732f22ef01cSRoman Divacky llvm::Constant *
17336122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
17346122f3e6SDimitry Andric                                      llvm::PointerType *Ty,
173559d1ed5bSDimitry Andric                                      const VarDecl *D) {
1736f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1737f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1738f22ef01cSRoman Divacky   if (Entry) {
17393861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1740f22ef01cSRoman Divacky       if (D && !D->hasAttr<WeakAttr>())
1741f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1742f22ef01cSRoman Divacky     }
1743f22ef01cSRoman Divacky 
174439d628a0SDimitry Andric     // Handle dropped DLL attributes.
174539d628a0SDimitry Andric     if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>())
174639d628a0SDimitry Andric       Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
174739d628a0SDimitry Andric 
1748f22ef01cSRoman Divacky     if (Entry->getType() == Ty)
1749f22ef01cSRoman Divacky       return Entry;
1750f22ef01cSRoman Divacky 
1751f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
1752f785676fSDimitry Andric     if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace())
1753f785676fSDimitry Andric       return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty);
1754f785676fSDimitry Andric 
1755f22ef01cSRoman Divacky     return llvm::ConstantExpr::getBitCast(Entry, Ty);
1756f22ef01cSRoman Divacky   }
1757f22ef01cSRoman Divacky 
175859d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace());
175959d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
176059d1ed5bSDimitry Andric       getModule(), Ty->getElementType(), false,
176159d1ed5bSDimitry Andric       llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, nullptr,
176259d1ed5bSDimitry Andric       llvm::GlobalVariable::NotThreadLocal, AddrSpace);
176359d1ed5bSDimitry Andric 
1764f22ef01cSRoman Divacky   // This is the first use or definition of a mangled name.  If there is a
1765f22ef01cSRoman Divacky   // deferred decl with this name, remember that we need to emit it at the end
1766f22ef01cSRoman Divacky   // of the file.
176759d1ed5bSDimitry Andric   auto DDI = DeferredDecls.find(MangledName);
1768f22ef01cSRoman Divacky   if (DDI != DeferredDecls.end()) {
1769f22ef01cSRoman Divacky     // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
1770f22ef01cSRoman Divacky     // list, and remove it from DeferredDecls (since we don't need it anymore).
177159d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, DDI->second);
1772f22ef01cSRoman Divacky     DeferredDecls.erase(DDI);
1773f22ef01cSRoman Divacky   }
1774f22ef01cSRoman Divacky 
1775f22ef01cSRoman Divacky   // Handle things which are present even on external declarations.
1776f22ef01cSRoman Divacky   if (D) {
1777f22ef01cSRoman Divacky     // FIXME: This code is overly simple and should be merged with other global
1778f22ef01cSRoman Divacky     // handling.
1779dff0c46cSDimitry Andric     GV->setConstant(isTypeConstant(D->getType(), false));
1780f22ef01cSRoman Divacky 
178133956c43SDimitry Andric     GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
178233956c43SDimitry Andric 
178359d1ed5bSDimitry Andric     setLinkageAndVisibilityForGV(GV, D);
17842754fe60SDimitry Andric 
1785284c1978SDimitry Andric     if (D->getTLSKind()) {
1786284c1978SDimitry Andric       if (D->getTLSKind() == VarDecl::TLS_Dynamic)
1787284c1978SDimitry Andric         CXXThreadLocals.push_back(std::make_pair(D, GV));
17887ae0e2c9SDimitry Andric       setTLSMode(GV, *D);
1789f22ef01cSRoman Divacky     }
1790f785676fSDimitry Andric 
1791f785676fSDimitry Andric     // If required by the ABI, treat declarations of static data members with
1792f785676fSDimitry Andric     // inline initializers as definitions.
179359d1ed5bSDimitry Andric     if (getContext().isMSStaticDataMemberInlineDefinition(D)) {
1794f785676fSDimitry Andric       EmitGlobalVarDefinition(D);
1795284c1978SDimitry Andric     }
1796f22ef01cSRoman Divacky 
179759d1ed5bSDimitry Andric     // Handle XCore specific ABI requirements.
179859d1ed5bSDimitry Andric     if (getTarget().getTriple().getArch() == llvm::Triple::xcore &&
179959d1ed5bSDimitry Andric         D->getLanguageLinkage() == CLanguageLinkage &&
180059d1ed5bSDimitry Andric         D->getType().isConstant(Context) &&
180159d1ed5bSDimitry Andric         isExternallyVisible(D->getLinkageAndVisibility().getLinkage()))
180259d1ed5bSDimitry Andric       GV->setSection(".cp.rodata");
180359d1ed5bSDimitry Andric   }
180459d1ed5bSDimitry Andric 
18057ae0e2c9SDimitry Andric   if (AddrSpace != Ty->getAddressSpace())
1806f785676fSDimitry Andric     return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty);
1807f785676fSDimitry Andric 
1808f22ef01cSRoman Divacky   return GV;
1809f22ef01cSRoman Divacky }
1810f22ef01cSRoman Divacky 
1811f22ef01cSRoman Divacky 
18122754fe60SDimitry Andric llvm::GlobalVariable *
18136122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
18146122f3e6SDimitry Andric                                       llvm::Type *Ty,
18152754fe60SDimitry Andric                                       llvm::GlobalValue::LinkageTypes Linkage) {
18162754fe60SDimitry Andric   llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name);
181759d1ed5bSDimitry Andric   llvm::GlobalVariable *OldGV = nullptr;
18182754fe60SDimitry Andric 
18192754fe60SDimitry Andric   if (GV) {
18202754fe60SDimitry Andric     // Check if the variable has the right type.
18212754fe60SDimitry Andric     if (GV->getType()->getElementType() == Ty)
18222754fe60SDimitry Andric       return GV;
18232754fe60SDimitry Andric 
18242754fe60SDimitry Andric     // Because C++ name mangling, the only way we can end up with an already
18252754fe60SDimitry Andric     // existing global with the same name is if it has been declared extern "C".
18262754fe60SDimitry Andric     assert(GV->isDeclaration() && "Declaration has wrong type!");
18272754fe60SDimitry Andric     OldGV = GV;
18282754fe60SDimitry Andric   }
18292754fe60SDimitry Andric 
18302754fe60SDimitry Andric   // Create a new variable.
18312754fe60SDimitry Andric   GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true,
183259d1ed5bSDimitry Andric                                 Linkage, nullptr, Name);
18332754fe60SDimitry Andric 
18342754fe60SDimitry Andric   if (OldGV) {
18352754fe60SDimitry Andric     // Replace occurrences of the old variable if needed.
18362754fe60SDimitry Andric     GV->takeName(OldGV);
18372754fe60SDimitry Andric 
18382754fe60SDimitry Andric     if (!OldGV->use_empty()) {
18392754fe60SDimitry Andric       llvm::Constant *NewPtrForOldDecl =
18402754fe60SDimitry Andric       llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
18412754fe60SDimitry Andric       OldGV->replaceAllUsesWith(NewPtrForOldDecl);
18422754fe60SDimitry Andric     }
18432754fe60SDimitry Andric 
18442754fe60SDimitry Andric     OldGV->eraseFromParent();
18452754fe60SDimitry Andric   }
18462754fe60SDimitry Andric 
184733956c43SDimitry Andric   if (supportsCOMDAT() && GV->isWeakForLinker() &&
184833956c43SDimitry Andric       !GV->hasAvailableExternallyLinkage())
184933956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
185033956c43SDimitry Andric 
18512754fe60SDimitry Andric   return GV;
18522754fe60SDimitry Andric }
18532754fe60SDimitry Andric 
1854f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the
1855f22ef01cSRoman Divacky /// given global variable.  If Ty is non-null and if the global doesn't exist,
1856cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the
1857f22ef01cSRoman Divacky /// normal requested type would be.
1858f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
18596122f3e6SDimitry Andric                                                   llvm::Type *Ty) {
1860f22ef01cSRoman Divacky   assert(D->hasGlobalStorage() && "Not a global variable");
1861f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
186259d1ed5bSDimitry Andric   if (!Ty)
1863f22ef01cSRoman Divacky     Ty = getTypes().ConvertTypeForMem(ASTTy);
1864f22ef01cSRoman Divacky 
18656122f3e6SDimitry Andric   llvm::PointerType *PTy =
18663b0f4066SDimitry Andric     llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy));
1867f22ef01cSRoman Divacky 
18686122f3e6SDimitry Andric   StringRef MangledName = getMangledName(D);
1869f22ef01cSRoman Divacky   return GetOrCreateLLVMGlobal(MangledName, PTy, D);
1870f22ef01cSRoman Divacky }
1871f22ef01cSRoman Divacky 
1872f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the
1873f22ef01cSRoman Divacky /// specified type and name.
1874f22ef01cSRoman Divacky llvm::Constant *
18756122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty,
18766122f3e6SDimitry Andric                                      StringRef Name) {
187759d1ed5bSDimitry Andric   return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr);
1878f22ef01cSRoman Divacky }
1879f22ef01cSRoman Divacky 
1880f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) {
1881f22ef01cSRoman Divacky   assert(!D->getInit() && "Cannot emit definite definitions here!");
1882f22ef01cSRoman Divacky 
188339d628a0SDimitry Andric   if (!MustBeEmitted(D)) {
1884f22ef01cSRoman Divacky     // If we have not seen a reference to this variable yet, place it
1885f22ef01cSRoman Divacky     // into the deferred declarations table to be emitted if needed
1886f22ef01cSRoman Divacky     // later.
18876122f3e6SDimitry Andric     StringRef MangledName = getMangledName(D);
1888f22ef01cSRoman Divacky     if (!GetGlobalValue(MangledName)) {
1889f22ef01cSRoman Divacky       DeferredDecls[MangledName] = D;
1890f22ef01cSRoman Divacky       return;
1891f22ef01cSRoman Divacky     }
1892f22ef01cSRoman Divacky   }
1893f22ef01cSRoman Divacky 
1894f22ef01cSRoman Divacky   // The tentative definition is the only definition.
1895f22ef01cSRoman Divacky   EmitGlobalVarDefinition(D);
1896f22ef01cSRoman Divacky }
1897f22ef01cSRoman Divacky 
18986122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const {
18992754fe60SDimitry Andric     return Context.toCharUnitsFromBits(
19003861d79fSDimitry Andric       TheDataLayout.getTypeStoreSizeInBits(Ty));
1901f22ef01cSRoman Divacky }
1902f22ef01cSRoman Divacky 
19037ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D,
19047ae0e2c9SDimitry Andric                                                  unsigned AddrSpace) {
190533956c43SDimitry Andric   if (LangOpts.CUDA && LangOpts.CUDAIsDevice) {
19067ae0e2c9SDimitry Andric     if (D->hasAttr<CUDAConstantAttr>())
19077ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant);
19087ae0e2c9SDimitry Andric     else if (D->hasAttr<CUDASharedAttr>())
19097ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared);
19107ae0e2c9SDimitry Andric     else
19117ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device);
19127ae0e2c9SDimitry Andric   }
19137ae0e2c9SDimitry Andric 
19147ae0e2c9SDimitry Andric   return AddrSpace;
19157ae0e2c9SDimitry Andric }
19167ae0e2c9SDimitry Andric 
1917284c1978SDimitry Andric template<typename SomeDecl>
1918284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
1919284c1978SDimitry Andric                                                llvm::GlobalValue *GV) {
1920284c1978SDimitry Andric   if (!getLangOpts().CPlusPlus)
1921284c1978SDimitry Andric     return;
1922284c1978SDimitry Andric 
1923284c1978SDimitry Andric   // Must have 'used' attribute, or else inline assembly can't rely on
1924284c1978SDimitry Andric   // the name existing.
1925284c1978SDimitry Andric   if (!D->template hasAttr<UsedAttr>())
1926284c1978SDimitry Andric     return;
1927284c1978SDimitry Andric 
1928284c1978SDimitry Andric   // Must have internal linkage and an ordinary name.
1929f785676fSDimitry Andric   if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage)
1930284c1978SDimitry Andric     return;
1931284c1978SDimitry Andric 
1932284c1978SDimitry Andric   // Must be in an extern "C" context. Entities declared directly within
1933284c1978SDimitry Andric   // a record are not extern "C" even if the record is in such a context.
1934f785676fSDimitry Andric   const SomeDecl *First = D->getFirstDecl();
1935284c1978SDimitry Andric   if (First->getDeclContext()->isRecord() || !First->isInExternCContext())
1936284c1978SDimitry Andric     return;
1937284c1978SDimitry Andric 
1938284c1978SDimitry Andric   // OK, this is an internal linkage entity inside an extern "C" linkage
1939284c1978SDimitry Andric   // specification. Make a note of that so we can give it the "expected"
1940284c1978SDimitry Andric   // mangled name if nothing else is using that name.
1941284c1978SDimitry Andric   std::pair<StaticExternCMap::iterator, bool> R =
1942284c1978SDimitry Andric       StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
1943284c1978SDimitry Andric 
1944284c1978SDimitry Andric   // If we have multiple internal linkage entities with the same name
1945284c1978SDimitry Andric   // in extern "C" regions, none of them gets that name.
1946284c1978SDimitry Andric   if (!R.second)
194759d1ed5bSDimitry Andric     R.first->second = nullptr;
1948284c1978SDimitry Andric }
1949284c1978SDimitry Andric 
195033956c43SDimitry Andric static bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D) {
195133956c43SDimitry Andric   if (!CGM.supportsCOMDAT())
195233956c43SDimitry Andric     return false;
195333956c43SDimitry Andric 
195433956c43SDimitry Andric   if (D.hasAttr<SelectAnyAttr>())
195533956c43SDimitry Andric     return true;
195633956c43SDimitry Andric 
195733956c43SDimitry Andric   GVALinkage Linkage;
195833956c43SDimitry Andric   if (auto *VD = dyn_cast<VarDecl>(&D))
195933956c43SDimitry Andric     Linkage = CGM.getContext().GetGVALinkageForVariable(VD);
196033956c43SDimitry Andric   else
196133956c43SDimitry Andric     Linkage = CGM.getContext().GetGVALinkageForFunction(cast<FunctionDecl>(&D));
196233956c43SDimitry Andric 
196333956c43SDimitry Andric   switch (Linkage) {
196433956c43SDimitry Andric   case GVA_Internal:
196533956c43SDimitry Andric   case GVA_AvailableExternally:
196633956c43SDimitry Andric   case GVA_StrongExternal:
196733956c43SDimitry Andric     return false;
196833956c43SDimitry Andric   case GVA_DiscardableODR:
196933956c43SDimitry Andric   case GVA_StrongODR:
197033956c43SDimitry Andric     return true;
197133956c43SDimitry Andric   }
197233956c43SDimitry Andric   llvm_unreachable("No such linkage");
197333956c43SDimitry Andric }
197433956c43SDimitry Andric 
197533956c43SDimitry Andric void CodeGenModule::maybeSetTrivialComdat(const Decl &D,
197633956c43SDimitry Andric                                           llvm::GlobalObject &GO) {
197733956c43SDimitry Andric   if (!shouldBeInCOMDAT(*this, D))
197833956c43SDimitry Andric     return;
197933956c43SDimitry Andric   GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
198033956c43SDimitry Andric }
198133956c43SDimitry Andric 
1982f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
198359d1ed5bSDimitry Andric   llvm::Constant *Init = nullptr;
1984f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
1985dff0c46cSDimitry Andric   CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1986dff0c46cSDimitry Andric   bool NeedsGlobalCtor = false;
1987dff0c46cSDimitry Andric   bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor();
1988f22ef01cSRoman Divacky 
1989dff0c46cSDimitry Andric   const VarDecl *InitDecl;
1990dff0c46cSDimitry Andric   const Expr *InitExpr = D->getAnyInitializer(InitDecl);
1991f22ef01cSRoman Divacky 
1992f22ef01cSRoman Divacky   if (!InitExpr) {
1993f22ef01cSRoman Divacky     // This is a tentative definition; tentative definitions are
1994f22ef01cSRoman Divacky     // implicitly initialized with { 0 }.
1995f22ef01cSRoman Divacky     //
1996f22ef01cSRoman Divacky     // Note that tentative definitions are only emitted at the end of
1997f22ef01cSRoman Divacky     // a translation unit, so they should never have incomplete
1998f22ef01cSRoman Divacky     // type. In addition, EmitTentativeDefinition makes sure that we
1999f22ef01cSRoman Divacky     // never attempt to emit a tentative definition if a real one
2000f22ef01cSRoman Divacky     // exists. A use may still exists, however, so we still may need
2001f22ef01cSRoman Divacky     // to do a RAUW.
2002f22ef01cSRoman Divacky     assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
2003f22ef01cSRoman Divacky     Init = EmitNullConstant(D->getType());
2004f22ef01cSRoman Divacky   } else {
20057ae0e2c9SDimitry Andric     initializedGlobalDecl = GlobalDecl(D);
2006dff0c46cSDimitry Andric     Init = EmitConstantInit(*InitDecl);
2007f785676fSDimitry Andric 
2008f22ef01cSRoman Divacky     if (!Init) {
2009f22ef01cSRoman Divacky       QualType T = InitExpr->getType();
2010f22ef01cSRoman Divacky       if (D->getType()->isReferenceType())
2011f22ef01cSRoman Divacky         T = D->getType();
2012f22ef01cSRoman Divacky 
2013dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus) {
2014f22ef01cSRoman Divacky         Init = EmitNullConstant(T);
2015dff0c46cSDimitry Andric         NeedsGlobalCtor = true;
2016f22ef01cSRoman Divacky       } else {
2017f22ef01cSRoman Divacky         ErrorUnsupported(D, "static initializer");
2018f22ef01cSRoman Divacky         Init = llvm::UndefValue::get(getTypes().ConvertType(T));
2019f22ef01cSRoman Divacky       }
2020e580952dSDimitry Andric     } else {
2021e580952dSDimitry Andric       // We don't need an initializer, so remove the entry for the delayed
2022dff0c46cSDimitry Andric       // initializer position (just in case this entry was delayed) if we
2023dff0c46cSDimitry Andric       // also don't need to register a destructor.
2024dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus && !NeedsGlobalDtor)
2025e580952dSDimitry Andric         DelayedCXXInitPosition.erase(D);
2026f22ef01cSRoman Divacky     }
2027f22ef01cSRoman Divacky   }
2028f22ef01cSRoman Divacky 
20296122f3e6SDimitry Andric   llvm::Type* InitType = Init->getType();
2030f22ef01cSRoman Divacky   llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType);
2031f22ef01cSRoman Divacky 
2032f22ef01cSRoman Divacky   // Strip off a bitcast if we got one back.
203359d1ed5bSDimitry Andric   if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
2034f22ef01cSRoman Divacky     assert(CE->getOpcode() == llvm::Instruction::BitCast ||
2035f785676fSDimitry Andric            CE->getOpcode() == llvm::Instruction::AddrSpaceCast ||
2036f785676fSDimitry Andric            // All zero index gep.
2037f22ef01cSRoman Divacky            CE->getOpcode() == llvm::Instruction::GetElementPtr);
2038f22ef01cSRoman Divacky     Entry = CE->getOperand(0);
2039f22ef01cSRoman Divacky   }
2040f22ef01cSRoman Divacky 
2041f22ef01cSRoman Divacky   // Entry is now either a Function or GlobalVariable.
204259d1ed5bSDimitry Andric   auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
2043f22ef01cSRoman Divacky 
2044f22ef01cSRoman Divacky   // We have a definition after a declaration with the wrong type.
2045f22ef01cSRoman Divacky   // We must make a new GlobalVariable* and update everything that used OldGV
2046f22ef01cSRoman Divacky   // (a declaration or tentative definition) with the new GlobalVariable*
2047f22ef01cSRoman Divacky   // (which will be a definition).
2048f22ef01cSRoman Divacky   //
2049f22ef01cSRoman Divacky   // This happens if there is a prototype for a global (e.g.
2050f22ef01cSRoman Divacky   // "extern int x[];") and then a definition of a different type (e.g.
2051f22ef01cSRoman Divacky   // "int x[10];"). This also happens when an initializer has a different type
2052f22ef01cSRoman Divacky   // from the type of the global (this happens with unions).
205359d1ed5bSDimitry Andric   if (!GV ||
2054f22ef01cSRoman Divacky       GV->getType()->getElementType() != InitType ||
20553b0f4066SDimitry Andric       GV->getType()->getAddressSpace() !=
20567ae0e2c9SDimitry Andric        GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) {
2057f22ef01cSRoman Divacky 
2058f22ef01cSRoman Divacky     // Move the old entry aside so that we'll create a new one.
20596122f3e6SDimitry Andric     Entry->setName(StringRef());
2060f22ef01cSRoman Divacky 
2061f22ef01cSRoman Divacky     // Make a new global with the correct type, this is now guaranteed to work.
2062f22ef01cSRoman Divacky     GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType));
2063f22ef01cSRoman Divacky 
2064f22ef01cSRoman Divacky     // Replace all uses of the old global with the new global
2065f22ef01cSRoman Divacky     llvm::Constant *NewPtrForOldDecl =
2066f22ef01cSRoman Divacky         llvm::ConstantExpr::getBitCast(GV, Entry->getType());
2067f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(NewPtrForOldDecl);
2068f22ef01cSRoman Divacky 
2069f22ef01cSRoman Divacky     // Erase the old global, since it is no longer used.
2070f22ef01cSRoman Divacky     cast<llvm::GlobalValue>(Entry)->eraseFromParent();
2071f22ef01cSRoman Divacky   }
2072f22ef01cSRoman Divacky 
2073284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, GV);
2074284c1978SDimitry Andric 
20756122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
20766122f3e6SDimitry Andric     AddGlobalAnnotations(D, GV);
2077f22ef01cSRoman Divacky 
2078f22ef01cSRoman Divacky   GV->setInitializer(Init);
2079f22ef01cSRoman Divacky 
2080f22ef01cSRoman Divacky   // If it is safe to mark the global 'constant', do so now.
2081dff0c46cSDimitry Andric   GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
2082dff0c46cSDimitry Andric                   isTypeConstant(D->getType(), true));
2083f22ef01cSRoman Divacky 
208439d628a0SDimitry Andric   // If it is in a read-only section, mark it 'constant'.
208539d628a0SDimitry Andric   if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
208639d628a0SDimitry Andric     const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
208739d628a0SDimitry Andric     if ((SI.SectionFlags & ASTContext::PSF_Write) == 0)
208839d628a0SDimitry Andric       GV->setConstant(true);
208939d628a0SDimitry Andric   }
209039d628a0SDimitry Andric 
2091f22ef01cSRoman Divacky   GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
2092f22ef01cSRoman Divacky 
2093f22ef01cSRoman Divacky   // Set the llvm linkage type as appropriate.
20942754fe60SDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
209559d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(D, GV->isConstant());
2096f785676fSDimitry Andric 
209759d1ed5bSDimitry Andric   // On Darwin, the backing variable for a C++11 thread_local variable always
209859d1ed5bSDimitry Andric   // has internal linkage; all accesses should just be calls to the
209959d1ed5bSDimitry Andric   // Itanium-specified entry point, which has the normal linkage of the
210059d1ed5bSDimitry Andric   // variable.
210139d628a0SDimitry Andric   if (!D->isStaticLocal() && D->getTLSKind() == VarDecl::TLS_Dynamic &&
210259d1ed5bSDimitry Andric       Context.getTargetInfo().getTriple().isMacOSX())
210359d1ed5bSDimitry Andric     Linkage = llvm::GlobalValue::InternalLinkage;
210459d1ed5bSDimitry Andric 
210559d1ed5bSDimitry Andric   GV->setLinkage(Linkage);
210659d1ed5bSDimitry Andric   if (D->hasAttr<DLLImportAttr>())
210759d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
210859d1ed5bSDimitry Andric   else if (D->hasAttr<DLLExportAttr>())
210959d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
211039d628a0SDimitry Andric   else
211139d628a0SDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
2112f785676fSDimitry Andric 
21132754fe60SDimitry Andric   if (Linkage == llvm::GlobalVariable::CommonLinkage)
2114f22ef01cSRoman Divacky     // common vars aren't constant even if declared const.
2115f22ef01cSRoman Divacky     GV->setConstant(false);
2116f22ef01cSRoman Divacky 
211759d1ed5bSDimitry Andric   setNonAliasAttributes(D, GV);
2118f22ef01cSRoman Divacky 
211939d628a0SDimitry Andric   if (D->getTLSKind() && !GV->isThreadLocal()) {
212039d628a0SDimitry Andric     if (D->getTLSKind() == VarDecl::TLS_Dynamic)
212139d628a0SDimitry Andric       CXXThreadLocals.push_back(std::make_pair(D, GV));
212239d628a0SDimitry Andric     setTLSMode(GV, *D);
212339d628a0SDimitry Andric   }
212439d628a0SDimitry Andric 
212533956c43SDimitry Andric   maybeSetTrivialComdat(*D, *GV);
212633956c43SDimitry Andric 
21272754fe60SDimitry Andric   // Emit the initializer function if necessary.
2128dff0c46cSDimitry Andric   if (NeedsGlobalCtor || NeedsGlobalDtor)
2129dff0c46cSDimitry Andric     EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
21302754fe60SDimitry Andric 
213139d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, *D, NeedsGlobalCtor);
21323861d79fSDimitry Andric 
2133f22ef01cSRoman Divacky   // Emit global variable debug information.
21346122f3e6SDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
21353861d79fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
2136f22ef01cSRoman Divacky       DI->EmitGlobalVariable(GV, D);
2137f22ef01cSRoman Divacky }
2138f22ef01cSRoman Divacky 
213939d628a0SDimitry Andric static bool isVarDeclStrongDefinition(const ASTContext &Context,
214033956c43SDimitry Andric                                       CodeGenModule &CGM, const VarDecl *D,
214133956c43SDimitry Andric                                       bool NoCommon) {
214259d1ed5bSDimitry Andric   // Don't give variables common linkage if -fno-common was specified unless it
214359d1ed5bSDimitry Andric   // was overridden by a NoCommon attribute.
214459d1ed5bSDimitry Andric   if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>())
214559d1ed5bSDimitry Andric     return true;
214659d1ed5bSDimitry Andric 
214759d1ed5bSDimitry Andric   // C11 6.9.2/2:
214859d1ed5bSDimitry Andric   //   A declaration of an identifier for an object that has file scope without
214959d1ed5bSDimitry Andric   //   an initializer, and without a storage-class specifier or with the
215059d1ed5bSDimitry Andric   //   storage-class specifier static, constitutes a tentative definition.
215159d1ed5bSDimitry Andric   if (D->getInit() || D->hasExternalStorage())
215259d1ed5bSDimitry Andric     return true;
215359d1ed5bSDimitry Andric 
215459d1ed5bSDimitry Andric   // A variable cannot be both common and exist in a section.
215559d1ed5bSDimitry Andric   if (D->hasAttr<SectionAttr>())
215659d1ed5bSDimitry Andric     return true;
215759d1ed5bSDimitry Andric 
215859d1ed5bSDimitry Andric   // Thread local vars aren't considered common linkage.
215959d1ed5bSDimitry Andric   if (D->getTLSKind())
216059d1ed5bSDimitry Andric     return true;
216159d1ed5bSDimitry Andric 
216259d1ed5bSDimitry Andric   // Tentative definitions marked with WeakImportAttr are true definitions.
216359d1ed5bSDimitry Andric   if (D->hasAttr<WeakImportAttr>())
216459d1ed5bSDimitry Andric     return true;
216559d1ed5bSDimitry Andric 
216633956c43SDimitry Andric   // A variable cannot be both common and exist in a comdat.
216733956c43SDimitry Andric   if (shouldBeInCOMDAT(CGM, *D))
216833956c43SDimitry Andric     return true;
216933956c43SDimitry Andric 
217039d628a0SDimitry Andric   // Declarations with a required alignment do not have common linakge in MSVC
217139d628a0SDimitry Andric   // mode.
217233956c43SDimitry Andric   if (Context.getLangOpts().MSVCCompat) {
217333956c43SDimitry Andric     if (D->hasAttr<AlignedAttr>())
217439d628a0SDimitry Andric       return true;
217533956c43SDimitry Andric     QualType VarType = D->getType();
217633956c43SDimitry Andric     if (Context.isAlignmentRequired(VarType))
217733956c43SDimitry Andric       return true;
217833956c43SDimitry Andric 
217933956c43SDimitry Andric     if (const auto *RT = VarType->getAs<RecordType>()) {
218033956c43SDimitry Andric       const RecordDecl *RD = RT->getDecl();
218133956c43SDimitry Andric       for (const FieldDecl *FD : RD->fields()) {
218233956c43SDimitry Andric         if (FD->isBitField())
218333956c43SDimitry Andric           continue;
218433956c43SDimitry Andric         if (FD->hasAttr<AlignedAttr>())
218533956c43SDimitry Andric           return true;
218633956c43SDimitry Andric         if (Context.isAlignmentRequired(FD->getType()))
218733956c43SDimitry Andric           return true;
218833956c43SDimitry Andric       }
218933956c43SDimitry Andric     }
219033956c43SDimitry Andric   }
219139d628a0SDimitry Andric 
219259d1ed5bSDimitry Andric   return false;
219359d1ed5bSDimitry Andric }
219459d1ed5bSDimitry Andric 
219559d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
219659d1ed5bSDimitry Andric     const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) {
21972754fe60SDimitry Andric   if (Linkage == GVA_Internal)
21982754fe60SDimitry Andric     return llvm::Function::InternalLinkage;
219959d1ed5bSDimitry Andric 
220059d1ed5bSDimitry Andric   if (D->hasAttr<WeakAttr>()) {
220159d1ed5bSDimitry Andric     if (IsConstantVariable)
220259d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakODRLinkage;
220359d1ed5bSDimitry Andric     else
220459d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakAnyLinkage;
220559d1ed5bSDimitry Andric   }
220659d1ed5bSDimitry Andric 
220759d1ed5bSDimitry Andric   // We are guaranteed to have a strong definition somewhere else,
220859d1ed5bSDimitry Andric   // so we can use available_externally linkage.
220959d1ed5bSDimitry Andric   if (Linkage == GVA_AvailableExternally)
221059d1ed5bSDimitry Andric     return llvm::Function::AvailableExternallyLinkage;
221159d1ed5bSDimitry Andric 
221259d1ed5bSDimitry Andric   // Note that Apple's kernel linker doesn't support symbol
221359d1ed5bSDimitry Andric   // coalescing, so we need to avoid linkonce and weak linkages there.
221459d1ed5bSDimitry Andric   // Normally, this means we just map to internal, but for explicit
221559d1ed5bSDimitry Andric   // instantiations we'll map to external.
221659d1ed5bSDimitry Andric 
221759d1ed5bSDimitry Andric   // In C++, the compiler has to emit a definition in every translation unit
221859d1ed5bSDimitry Andric   // that references the function.  We should use linkonce_odr because
221959d1ed5bSDimitry Andric   // a) if all references in this translation unit are optimized away, we
222059d1ed5bSDimitry Andric   // don't need to codegen it.  b) if the function persists, it needs to be
222159d1ed5bSDimitry Andric   // merged with other definitions. c) C++ has the ODR, so we know the
222259d1ed5bSDimitry Andric   // definition is dependable.
222359d1ed5bSDimitry Andric   if (Linkage == GVA_DiscardableODR)
222459d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
222559d1ed5bSDimitry Andric                                             : llvm::Function::InternalLinkage;
222659d1ed5bSDimitry Andric 
222759d1ed5bSDimitry Andric   // An explicit instantiation of a template has weak linkage, since
222859d1ed5bSDimitry Andric   // explicit instantiations can occur in multiple translation units
222959d1ed5bSDimitry Andric   // and must all be equivalent. However, we are not allowed to
223059d1ed5bSDimitry Andric   // throw away these explicit instantiations.
223159d1ed5bSDimitry Andric   if (Linkage == GVA_StrongODR)
223259d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage
223359d1ed5bSDimitry Andric                                             : llvm::Function::ExternalLinkage;
223459d1ed5bSDimitry Andric 
223559d1ed5bSDimitry Andric   // C++ doesn't have tentative definitions and thus cannot have common
223659d1ed5bSDimitry Andric   // linkage.
223759d1ed5bSDimitry Andric   if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) &&
223833956c43SDimitry Andric       !isVarDeclStrongDefinition(Context, *this, cast<VarDecl>(D),
223939d628a0SDimitry Andric                                  CodeGenOpts.NoCommon))
224059d1ed5bSDimitry Andric     return llvm::GlobalVariable::CommonLinkage;
224159d1ed5bSDimitry Andric 
2242f785676fSDimitry Andric   // selectany symbols are externally visible, so use weak instead of
2243f785676fSDimitry Andric   // linkonce.  MSVC optimizes away references to const selectany globals, so
2244f785676fSDimitry Andric   // all definitions should be the same and ODR linkage should be used.
2245f785676fSDimitry Andric   // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx
224659d1ed5bSDimitry Andric   if (D->hasAttr<SelectAnyAttr>())
2247f785676fSDimitry Andric     return llvm::GlobalVariable::WeakODRLinkage;
224859d1ed5bSDimitry Andric 
224959d1ed5bSDimitry Andric   // Otherwise, we have strong external linkage.
225059d1ed5bSDimitry Andric   assert(Linkage == GVA_StrongExternal);
22512754fe60SDimitry Andric   return llvm::GlobalVariable::ExternalLinkage;
22522754fe60SDimitry Andric }
22532754fe60SDimitry Andric 
225459d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition(
225559d1ed5bSDimitry Andric     const VarDecl *VD, bool IsConstant) {
225659d1ed5bSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD);
225759d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant);
225859d1ed5bSDimitry Andric }
225959d1ed5bSDimitry Andric 
2260139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type.
2261139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites
2262139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old,
2263139f7f9bSDimitry Andric                                           llvm::Function *newFn) {
2264139f7f9bSDimitry Andric   // Fast path.
2265139f7f9bSDimitry Andric   if (old->use_empty()) return;
2266139f7f9bSDimitry Andric 
2267139f7f9bSDimitry Andric   llvm::Type *newRetTy = newFn->getReturnType();
2268139f7f9bSDimitry Andric   SmallVector<llvm::Value*, 4> newArgs;
2269139f7f9bSDimitry Andric 
2270139f7f9bSDimitry Andric   for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
2271139f7f9bSDimitry Andric          ui != ue; ) {
2272139f7f9bSDimitry Andric     llvm::Value::use_iterator use = ui++; // Increment before the use is erased.
227359d1ed5bSDimitry Andric     llvm::User *user = use->getUser();
2274139f7f9bSDimitry Andric 
2275139f7f9bSDimitry Andric     // Recognize and replace uses of bitcasts.  Most calls to
2276139f7f9bSDimitry Andric     // unprototyped functions will use bitcasts.
227759d1ed5bSDimitry Andric     if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
2278139f7f9bSDimitry Andric       if (bitcast->getOpcode() == llvm::Instruction::BitCast)
2279139f7f9bSDimitry Andric         replaceUsesOfNonProtoConstant(bitcast, newFn);
2280139f7f9bSDimitry Andric       continue;
2281139f7f9bSDimitry Andric     }
2282139f7f9bSDimitry Andric 
2283139f7f9bSDimitry Andric     // Recognize calls to the function.
2284139f7f9bSDimitry Andric     llvm::CallSite callSite(user);
2285139f7f9bSDimitry Andric     if (!callSite) continue;
228659d1ed5bSDimitry Andric     if (!callSite.isCallee(&*use)) continue;
2287139f7f9bSDimitry Andric 
2288139f7f9bSDimitry Andric     // If the return types don't match exactly, then we can't
2289139f7f9bSDimitry Andric     // transform this call unless it's dead.
2290139f7f9bSDimitry Andric     if (callSite->getType() != newRetTy && !callSite->use_empty())
2291139f7f9bSDimitry Andric       continue;
2292139f7f9bSDimitry Andric 
2293139f7f9bSDimitry Andric     // Get the call site's attribute list.
2294139f7f9bSDimitry Andric     SmallVector<llvm::AttributeSet, 8> newAttrs;
2295139f7f9bSDimitry Andric     llvm::AttributeSet oldAttrs = callSite.getAttributes();
2296139f7f9bSDimitry Andric 
2297139f7f9bSDimitry Andric     // Collect any return attributes from the call.
2298139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex))
2299139f7f9bSDimitry Andric       newAttrs.push_back(
2300139f7f9bSDimitry Andric         llvm::AttributeSet::get(newFn->getContext(),
2301139f7f9bSDimitry Andric                                 oldAttrs.getRetAttributes()));
2302139f7f9bSDimitry Andric 
2303139f7f9bSDimitry Andric     // If the function was passed too few arguments, don't transform.
2304139f7f9bSDimitry Andric     unsigned newNumArgs = newFn->arg_size();
2305139f7f9bSDimitry Andric     if (callSite.arg_size() < newNumArgs) continue;
2306139f7f9bSDimitry Andric 
2307139f7f9bSDimitry Andric     // If extra arguments were passed, we silently drop them.
2308139f7f9bSDimitry Andric     // If any of the types mismatch, we don't transform.
2309139f7f9bSDimitry Andric     unsigned argNo = 0;
2310139f7f9bSDimitry Andric     bool dontTransform = false;
2311139f7f9bSDimitry Andric     for (llvm::Function::arg_iterator ai = newFn->arg_begin(),
2312139f7f9bSDimitry Andric            ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) {
2313139f7f9bSDimitry Andric       if (callSite.getArgument(argNo)->getType() != ai->getType()) {
2314139f7f9bSDimitry Andric         dontTransform = true;
2315139f7f9bSDimitry Andric         break;
2316139f7f9bSDimitry Andric       }
2317139f7f9bSDimitry Andric 
2318139f7f9bSDimitry Andric       // Add any parameter attributes.
2319139f7f9bSDimitry Andric       if (oldAttrs.hasAttributes(argNo + 1))
2320139f7f9bSDimitry Andric         newAttrs.
2321139f7f9bSDimitry Andric           push_back(llvm::
2322139f7f9bSDimitry Andric                     AttributeSet::get(newFn->getContext(),
2323139f7f9bSDimitry Andric                                       oldAttrs.getParamAttributes(argNo + 1)));
2324139f7f9bSDimitry Andric     }
2325139f7f9bSDimitry Andric     if (dontTransform)
2326139f7f9bSDimitry Andric       continue;
2327139f7f9bSDimitry Andric 
2328139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex))
2329139f7f9bSDimitry Andric       newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(),
2330139f7f9bSDimitry Andric                                                  oldAttrs.getFnAttributes()));
2331139f7f9bSDimitry Andric 
2332139f7f9bSDimitry Andric     // Okay, we can transform this.  Create the new call instruction and copy
2333139f7f9bSDimitry Andric     // over the required information.
2334139f7f9bSDimitry Andric     newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo);
2335139f7f9bSDimitry Andric 
2336139f7f9bSDimitry Andric     llvm::CallSite newCall;
2337139f7f9bSDimitry Andric     if (callSite.isCall()) {
2338139f7f9bSDimitry Andric       newCall = llvm::CallInst::Create(newFn, newArgs, "",
2339139f7f9bSDimitry Andric                                        callSite.getInstruction());
2340139f7f9bSDimitry Andric     } else {
234159d1ed5bSDimitry Andric       auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction());
2342139f7f9bSDimitry Andric       newCall = llvm::InvokeInst::Create(newFn,
2343139f7f9bSDimitry Andric                                          oldInvoke->getNormalDest(),
2344139f7f9bSDimitry Andric                                          oldInvoke->getUnwindDest(),
2345139f7f9bSDimitry Andric                                          newArgs, "",
2346139f7f9bSDimitry Andric                                          callSite.getInstruction());
2347139f7f9bSDimitry Andric     }
2348139f7f9bSDimitry Andric     newArgs.clear(); // for the next iteration
2349139f7f9bSDimitry Andric 
2350139f7f9bSDimitry Andric     if (!newCall->getType()->isVoidTy())
2351139f7f9bSDimitry Andric       newCall->takeName(callSite.getInstruction());
2352139f7f9bSDimitry Andric     newCall.setAttributes(
2353139f7f9bSDimitry Andric                      llvm::AttributeSet::get(newFn->getContext(), newAttrs));
2354139f7f9bSDimitry Andric     newCall.setCallingConv(callSite.getCallingConv());
2355139f7f9bSDimitry Andric 
2356139f7f9bSDimitry Andric     // Finally, remove the old call, replacing any uses with the new one.
2357139f7f9bSDimitry Andric     if (!callSite->use_empty())
2358139f7f9bSDimitry Andric       callSite->replaceAllUsesWith(newCall.getInstruction());
2359139f7f9bSDimitry Andric 
2360139f7f9bSDimitry Andric     // Copy debug location attached to CI.
236133956c43SDimitry Andric     if (callSite->getDebugLoc())
2362139f7f9bSDimitry Andric       newCall->setDebugLoc(callSite->getDebugLoc());
2363139f7f9bSDimitry Andric     callSite->eraseFromParent();
2364139f7f9bSDimitry Andric   }
2365139f7f9bSDimitry Andric }
2366139f7f9bSDimitry Andric 
2367f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we
2368f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}".  If there are
2369f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to
2370f22ef01cSRoman Divacky /// call the new function directly.
2371f22ef01cSRoman Divacky ///
2372f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to
2373f22ef01cSRoman Divacky /// functions to be able to inline them.  If there is a bitcast in the way, it
2374f22ef01cSRoman Divacky /// won't inline them.  Instcombine normally deletes these calls, but it isn't
2375f22ef01cSRoman Divacky /// run at -O0.
2376f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
2377f22ef01cSRoman Divacky                                                       llvm::Function *NewFn) {
2378f22ef01cSRoman Divacky   // If we're redefining a global as a function, don't transform it.
2379139f7f9bSDimitry Andric   if (!isa<llvm::Function>(Old)) return;
2380f22ef01cSRoman Divacky 
2381139f7f9bSDimitry Andric   replaceUsesOfNonProtoConstant(Old, NewFn);
2382f22ef01cSRoman Divacky }
2383f22ef01cSRoman Divacky 
2384dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2385dff0c46cSDimitry Andric   TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
2386dff0c46cSDimitry Andric   // If we have a definition, this might be a deferred decl. If the
2387dff0c46cSDimitry Andric   // instantiation is explicit, make sure we emit it at the end.
2388dff0c46cSDimitry Andric   if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
2389dff0c46cSDimitry Andric     GetAddrOfGlobalVar(VD);
2390139f7f9bSDimitry Andric 
2391139f7f9bSDimitry Andric   EmitTopLevelDecl(VD);
2392dff0c46cSDimitry Andric }
2393f22ef01cSRoman Divacky 
239459d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
239559d1ed5bSDimitry Andric                                                  llvm::GlobalValue *GV) {
239659d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
23973b0f4066SDimitry Andric 
23983b0f4066SDimitry Andric   // Compute the function info and LLVM type.
2399dff0c46cSDimitry Andric   const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
2400dff0c46cSDimitry Andric   llvm::FunctionType *Ty = getTypes().GetFunctionType(FI);
24013b0f4066SDimitry Andric 
2402f22ef01cSRoman Divacky   // Get or create the prototype for the function.
240359d1ed5bSDimitry Andric   if (!GV) {
240459d1ed5bSDimitry Andric     llvm::Constant *C =
240559d1ed5bSDimitry Andric         GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true);
2406f22ef01cSRoman Divacky 
2407f22ef01cSRoman Divacky     // Strip off a bitcast if we got one back.
240859d1ed5bSDimitry Andric     if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) {
2409f22ef01cSRoman Divacky       assert(CE->getOpcode() == llvm::Instruction::BitCast);
241059d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(CE->getOperand(0));
241159d1ed5bSDimitry Andric     } else {
241259d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(C);
241359d1ed5bSDimitry Andric     }
2414f22ef01cSRoman Divacky   }
2415f22ef01cSRoman Divacky 
241659d1ed5bSDimitry Andric   if (!GV->isDeclaration()) {
2417f785676fSDimitry Andric     getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name);
241839d628a0SDimitry Andric     GlobalDecl OldGD = Manglings.lookup(GV->getName());
241939d628a0SDimitry Andric     if (auto *Prev = OldGD.getDecl())
242039d628a0SDimitry Andric       getDiags().Report(Prev->getLocation(), diag::note_previous_definition);
2421f785676fSDimitry Andric     return;
2422f785676fSDimitry Andric   }
2423f22ef01cSRoman Divacky 
242459d1ed5bSDimitry Andric   if (GV->getType()->getElementType() != Ty) {
2425f22ef01cSRoman Divacky     // If the types mismatch then we have to rewrite the definition.
242659d1ed5bSDimitry Andric     assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
2427f22ef01cSRoman Divacky 
2428f22ef01cSRoman Divacky     // F is the Function* for the one with the wrong type, we must make a new
2429f22ef01cSRoman Divacky     // Function* and update everything that used F (a declaration) with the new
2430f22ef01cSRoman Divacky     // Function* (which will be a definition).
2431f22ef01cSRoman Divacky     //
2432f22ef01cSRoman Divacky     // This happens if there is a prototype for a function
2433f22ef01cSRoman Divacky     // (e.g. "int f()") and then a definition of a different type
2434f22ef01cSRoman Divacky     // (e.g. "int f(int x)").  Move the old function aside so that it
2435f22ef01cSRoman Divacky     // doesn't interfere with GetAddrOfFunction.
243659d1ed5bSDimitry Andric     GV->setName(StringRef());
243759d1ed5bSDimitry Andric     auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
2438f22ef01cSRoman Divacky 
2439139f7f9bSDimitry Andric     // This might be an implementation of a function without a
2440139f7f9bSDimitry Andric     // prototype, in which case, try to do special replacement of
2441139f7f9bSDimitry Andric     // calls which match the new prototype.  The really key thing here
2442139f7f9bSDimitry Andric     // is that we also potentially drop arguments from the call site
2443139f7f9bSDimitry Andric     // so as to make a direct call, which makes the inliner happier
2444139f7f9bSDimitry Andric     // and suppresses a number of optimizer warnings (!) about
2445139f7f9bSDimitry Andric     // dropping arguments.
244659d1ed5bSDimitry Andric     if (!GV->use_empty()) {
244759d1ed5bSDimitry Andric       ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn);
244859d1ed5bSDimitry Andric       GV->removeDeadConstantUsers();
2449f22ef01cSRoman Divacky     }
2450f22ef01cSRoman Divacky 
2451f22ef01cSRoman Divacky     // Replace uses of F with the Function we will endow with a body.
245259d1ed5bSDimitry Andric     if (!GV->use_empty()) {
2453f22ef01cSRoman Divacky       llvm::Constant *NewPtrForOldDecl =
245459d1ed5bSDimitry Andric           llvm::ConstantExpr::getBitCast(NewFn, GV->getType());
245559d1ed5bSDimitry Andric       GV->replaceAllUsesWith(NewPtrForOldDecl);
2456f22ef01cSRoman Divacky     }
2457f22ef01cSRoman Divacky 
2458f22ef01cSRoman Divacky     // Ok, delete the old function now, which is dead.
245959d1ed5bSDimitry Andric     GV->eraseFromParent();
2460f22ef01cSRoman Divacky 
246159d1ed5bSDimitry Andric     GV = NewFn;
2462f22ef01cSRoman Divacky   }
2463f22ef01cSRoman Divacky 
24642754fe60SDimitry Andric   // We need to set linkage and visibility on the function before
24652754fe60SDimitry Andric   // generating code for it because various parts of IR generation
24662754fe60SDimitry Andric   // want to propagate this information down (e.g. to local static
24672754fe60SDimitry Andric   // declarations).
246859d1ed5bSDimitry Andric   auto *Fn = cast<llvm::Function>(GV);
2469f785676fSDimitry Andric   setFunctionLinkage(GD, Fn);
247097bc6c73SDimitry Andric   setFunctionDLLStorageClass(GD, Fn);
2471f22ef01cSRoman Divacky 
247259d1ed5bSDimitry Andric   // FIXME: this is redundant with part of setFunctionDefinitionAttributes
24732754fe60SDimitry Andric   setGlobalVisibility(Fn, D);
24742754fe60SDimitry Andric 
2475284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, Fn);
2476284c1978SDimitry Andric 
247733956c43SDimitry Andric   maybeSetTrivialComdat(*D, *Fn);
247833956c43SDimitry Andric 
24793b0f4066SDimitry Andric   CodeGenFunction(*this).GenerateCode(D, Fn, FI);
2480f22ef01cSRoman Divacky 
248159d1ed5bSDimitry Andric   setFunctionDefinitionAttributes(D, Fn);
2482f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, Fn);
2483f22ef01cSRoman Divacky 
2484f22ef01cSRoman Divacky   if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>())
2485f22ef01cSRoman Divacky     AddGlobalCtor(Fn, CA->getPriority());
2486f22ef01cSRoman Divacky   if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
2487f22ef01cSRoman Divacky     AddGlobalDtor(Fn, DA->getPriority());
24886122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
24896122f3e6SDimitry Andric     AddGlobalAnnotations(D, Fn);
2490f22ef01cSRoman Divacky }
2491f22ef01cSRoman Divacky 
2492f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
249359d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
2494f22ef01cSRoman Divacky   const AliasAttr *AA = D->getAttr<AliasAttr>();
2495f22ef01cSRoman Divacky   assert(AA && "Not an alias?");
2496f22ef01cSRoman Divacky 
24976122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
2498f22ef01cSRoman Divacky 
2499f22ef01cSRoman Divacky   // If there is a definition in the module, then it wins over the alias.
2500f22ef01cSRoman Divacky   // This is dubious, but allow it to be safe.  Just ignore the alias.
2501f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2502f22ef01cSRoman Divacky   if (Entry && !Entry->isDeclaration())
2503f22ef01cSRoman Divacky     return;
2504f22ef01cSRoman Divacky 
2505f785676fSDimitry Andric   Aliases.push_back(GD);
2506f785676fSDimitry Andric 
25076122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType());
2508f22ef01cSRoman Divacky 
2509f22ef01cSRoman Divacky   // Create a reference to the named value.  This ensures that it is emitted
2510f22ef01cSRoman Divacky   // if a deferred decl.
2511f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
2512f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
25133861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
25142754fe60SDimitry Andric                                       /*ForVTable=*/false);
2515f22ef01cSRoman Divacky   else
2516f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
251759d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
251839d628a0SDimitry Andric                                     /*D=*/nullptr);
2519f22ef01cSRoman Divacky 
2520f22ef01cSRoman Divacky   // Create the new alias itself, but don't set a name yet.
252159d1ed5bSDimitry Andric   auto *GA = llvm::GlobalAlias::create(
252233956c43SDimitry Andric       cast<llvm::PointerType>(Aliasee->getType()),
252359d1ed5bSDimitry Andric       llvm::Function::ExternalLinkage, "", Aliasee, &getModule());
2524f22ef01cSRoman Divacky 
2525f22ef01cSRoman Divacky   if (Entry) {
252659d1ed5bSDimitry Andric     if (GA->getAliasee() == Entry) {
252759d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
252859d1ed5bSDimitry Andric       return;
252959d1ed5bSDimitry Andric     }
253059d1ed5bSDimitry Andric 
2531f22ef01cSRoman Divacky     assert(Entry->isDeclaration());
2532f22ef01cSRoman Divacky 
2533f22ef01cSRoman Divacky     // If there is a declaration in the module, then we had an extern followed
2534f22ef01cSRoman Divacky     // by the alias, as in:
2535f22ef01cSRoman Divacky     //   extern int test6();
2536f22ef01cSRoman Divacky     //   ...
2537f22ef01cSRoman Divacky     //   int test6() __attribute__((alias("test7")));
2538f22ef01cSRoman Divacky     //
2539f22ef01cSRoman Divacky     // Remove it and replace uses of it with the alias.
2540f22ef01cSRoman Divacky     GA->takeName(Entry);
2541f22ef01cSRoman Divacky 
2542f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA,
2543f22ef01cSRoman Divacky                                                           Entry->getType()));
2544f22ef01cSRoman Divacky     Entry->eraseFromParent();
2545f22ef01cSRoman Divacky   } else {
2546ffd1746dSEd Schouten     GA->setName(MangledName);
2547f22ef01cSRoman Divacky   }
2548f22ef01cSRoman Divacky 
2549f22ef01cSRoman Divacky   // Set attributes which are particular to an alias; this is a
2550f22ef01cSRoman Divacky   // specialization of the attributes which may be set on a global
2551f22ef01cSRoman Divacky   // variable/function.
255239d628a0SDimitry Andric   if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakRefAttr>() ||
25533b0f4066SDimitry Andric       D->isWeakImported()) {
2554f22ef01cSRoman Divacky     GA->setLinkage(llvm::Function::WeakAnyLinkage);
2555f22ef01cSRoman Divacky   }
2556f22ef01cSRoman Divacky 
255739d628a0SDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
255839d628a0SDimitry Andric     if (VD->getTLSKind())
255939d628a0SDimitry Andric       setTLSMode(GA, *VD);
256039d628a0SDimitry Andric 
256139d628a0SDimitry Andric   setAliasAttributes(D, GA);
2562f22ef01cSRoman Divacky }
2563f22ef01cSRoman Divacky 
256417a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
25656122f3e6SDimitry Andric                                             ArrayRef<llvm::Type*> Tys) {
256617a519f9SDimitry Andric   return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
256717a519f9SDimitry Andric                                          Tys);
2568f22ef01cSRoman Divacky }
2569f22ef01cSRoman Divacky 
257033956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> &
257133956c43SDimitry Andric GetConstantCFStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
257233956c43SDimitry Andric                          const StringLiteral *Literal, bool TargetIsLSB,
257333956c43SDimitry Andric                          bool &IsUTF16, unsigned &StringLength) {
25746122f3e6SDimitry Andric   StringRef String = Literal->getString();
2575e580952dSDimitry Andric   unsigned NumBytes = String.size();
2576f22ef01cSRoman Divacky 
2577f22ef01cSRoman Divacky   // Check for simple case.
2578f22ef01cSRoman Divacky   if (!Literal->containsNonAsciiOrNull()) {
2579f22ef01cSRoman Divacky     StringLength = NumBytes;
258039d628a0SDimitry Andric     return *Map.insert(std::make_pair(String, nullptr)).first;
2581f22ef01cSRoman Divacky   }
2582f22ef01cSRoman Divacky 
2583dff0c46cSDimitry Andric   // Otherwise, convert the UTF8 literals into a string of shorts.
2584dff0c46cSDimitry Andric   IsUTF16 = true;
2585dff0c46cSDimitry Andric 
2586dff0c46cSDimitry Andric   SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls.
25873861d79fSDimitry Andric   const UTF8 *FromPtr = (const UTF8 *)String.data();
2588f22ef01cSRoman Divacky   UTF16 *ToPtr = &ToBuf[0];
2589f22ef01cSRoman Divacky 
25902754fe60SDimitry Andric   (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes,
2591f22ef01cSRoman Divacky                            &ToPtr, ToPtr + NumBytes,
2592f22ef01cSRoman Divacky                            strictConversion);
2593f22ef01cSRoman Divacky 
2594f22ef01cSRoman Divacky   // ConvertUTF8toUTF16 returns the length in ToPtr.
2595f22ef01cSRoman Divacky   StringLength = ToPtr - &ToBuf[0];
2596f22ef01cSRoman Divacky 
2597dff0c46cSDimitry Andric   // Add an explicit null.
2598dff0c46cSDimitry Andric   *ToPtr = 0;
259939d628a0SDimitry Andric   return *Map.insert(std::make_pair(
260039d628a0SDimitry Andric                          StringRef(reinterpret_cast<const char *>(ToBuf.data()),
260139d628a0SDimitry Andric                                    (StringLength + 1) * 2),
260239d628a0SDimitry Andric                          nullptr)).first;
2603f22ef01cSRoman Divacky }
2604f22ef01cSRoman Divacky 
260533956c43SDimitry Andric static llvm::StringMapEntry<llvm::GlobalVariable *> &
260633956c43SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
260733956c43SDimitry Andric                        const StringLiteral *Literal, unsigned &StringLength) {
26086122f3e6SDimitry Andric   StringRef String = Literal->getString();
2609bd5abe19SDimitry Andric   StringLength = String.size();
261039d628a0SDimitry Andric   return *Map.insert(std::make_pair(String, nullptr)).first;
2611bd5abe19SDimitry Andric }
2612bd5abe19SDimitry Andric 
2613f22ef01cSRoman Divacky llvm::Constant *
2614f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
2615f22ef01cSRoman Divacky   unsigned StringLength = 0;
2616f22ef01cSRoman Divacky   bool isUTF16 = false;
261733956c43SDimitry Andric   llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
2618f22ef01cSRoman Divacky       GetConstantCFStringEntry(CFConstantStringMap, Literal,
261933956c43SDimitry Andric                                getDataLayout().isLittleEndian(), isUTF16,
262033956c43SDimitry Andric                                StringLength);
2621f22ef01cSRoman Divacky 
262239d628a0SDimitry Andric   if (auto *C = Entry.second)
2623f22ef01cSRoman Divacky     return C;
2624f22ef01cSRoman Divacky 
2625dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2626f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2627284c1978SDimitry Andric   llvm::Value *V;
2628f22ef01cSRoman Divacky 
2629f22ef01cSRoman Divacky   // If we don't already have it, get __CFConstantStringClassReference.
2630f22ef01cSRoman Divacky   if (!CFConstantStringClassRef) {
26316122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
2632f22ef01cSRoman Divacky     Ty = llvm::ArrayType::get(Ty, 0);
2633f22ef01cSRoman Divacky     llvm::Constant *GV = CreateRuntimeVariable(Ty,
2634f22ef01cSRoman Divacky                                            "__CFConstantStringClassReference");
2635f22ef01cSRoman Divacky     // Decay array -> ptr
263633956c43SDimitry Andric     V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros);
2637284c1978SDimitry Andric     CFConstantStringClassRef = V;
2638f22ef01cSRoman Divacky   }
2639284c1978SDimitry Andric   else
2640284c1978SDimitry Andric     V = CFConstantStringClassRef;
2641f22ef01cSRoman Divacky 
2642f22ef01cSRoman Divacky   QualType CFTy = getContext().getCFConstantStringType();
2643f22ef01cSRoman Divacky 
264459d1ed5bSDimitry Andric   auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy));
2645f22ef01cSRoman Divacky 
2646dff0c46cSDimitry Andric   llvm::Constant *Fields[4];
2647f22ef01cSRoman Divacky 
2648f22ef01cSRoman Divacky   // Class pointer.
2649284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2650f22ef01cSRoman Divacky 
2651f22ef01cSRoman Divacky   // Flags.
26526122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2653f22ef01cSRoman Divacky   Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) :
2654f22ef01cSRoman Divacky     llvm::ConstantInt::get(Ty, 0x07C8);
2655f22ef01cSRoman Divacky 
2656f22ef01cSRoman Divacky   // String pointer.
265759d1ed5bSDimitry Andric   llvm::Constant *C = nullptr;
2658dff0c46cSDimitry Andric   if (isUTF16) {
265939d628a0SDimitry Andric     ArrayRef<uint16_t> Arr = llvm::makeArrayRef<uint16_t>(
266039d628a0SDimitry Andric         reinterpret_cast<uint16_t *>(const_cast<char *>(Entry.first().data())),
266139d628a0SDimitry Andric         Entry.first().size() / 2);
2662dff0c46cSDimitry Andric     C = llvm::ConstantDataArray::get(VMContext, Arr);
2663dff0c46cSDimitry Andric   } else {
266439d628a0SDimitry Andric     C = llvm::ConstantDataArray::getString(VMContext, Entry.first());
2665dff0c46cSDimitry Andric   }
2666f22ef01cSRoman Divacky 
2667dff0c46cSDimitry Andric   // Note: -fwritable-strings doesn't make the backing store strings of
2668dff0c46cSDimitry Andric   // CFStrings writable. (See <rdar://problem/10657500>)
266959d1ed5bSDimitry Andric   auto *GV =
2670dff0c46cSDimitry Andric       new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true,
267159d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, C, ".str");
26722754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2673284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2674284c1978SDimitry Andric   // of the string is via this class initializer.
267559d1ed5bSDimitry Andric   // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without
267659d1ed5bSDimitry Andric   // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing
267759d1ed5bSDimitry Andric   // that changes the section it ends in, which surprises ld64.
2678f22ef01cSRoman Divacky   if (isUTF16) {
2679f22ef01cSRoman Divacky     CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy);
2680f22ef01cSRoman Divacky     GV->setAlignment(Align.getQuantity());
268159d1ed5bSDimitry Andric     GV->setSection("__TEXT,__ustring");
26823b0f4066SDimitry Andric   } else {
26833b0f4066SDimitry Andric     CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
26843b0f4066SDimitry Andric     GV->setAlignment(Align.getQuantity());
268559d1ed5bSDimitry Andric     GV->setSection("__TEXT,__cstring,cstring_literals");
2686f22ef01cSRoman Divacky   }
2687dff0c46cSDimitry Andric 
2688dff0c46cSDimitry Andric   // String.
268933956c43SDimitry Andric   Fields[2] =
269033956c43SDimitry Andric       llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros);
2691f22ef01cSRoman Divacky 
2692dff0c46cSDimitry Andric   if (isUTF16)
2693dff0c46cSDimitry Andric     // Cast the UTF16 string to the correct type.
2694dff0c46cSDimitry Andric     Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy);
2695dff0c46cSDimitry Andric 
2696f22ef01cSRoman Divacky   // String length.
2697f22ef01cSRoman Divacky   Ty = getTypes().ConvertType(getContext().LongTy);
2698f22ef01cSRoman Divacky   Fields[3] = llvm::ConstantInt::get(Ty, StringLength);
2699f22ef01cSRoman Divacky 
2700f22ef01cSRoman Divacky   // The struct.
2701f22ef01cSRoman Divacky   C = llvm::ConstantStruct::get(STy, Fields);
2702f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2703f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2704f22ef01cSRoman Divacky                                 "_unnamed_cfstring_");
270559d1ed5bSDimitry Andric   GV->setSection("__DATA,__cfstring");
270639d628a0SDimitry Andric   Entry.second = GV;
2707f22ef01cSRoman Divacky 
2708f22ef01cSRoman Divacky   return GV;
2709f22ef01cSRoman Divacky }
2710f22ef01cSRoman Divacky 
271133956c43SDimitry Andric llvm::GlobalVariable *
27122754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
2713f22ef01cSRoman Divacky   unsigned StringLength = 0;
271433956c43SDimitry Andric   llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
2715bd5abe19SDimitry Andric       GetConstantStringEntry(CFConstantStringMap, Literal, StringLength);
2716f22ef01cSRoman Divacky 
271739d628a0SDimitry Andric   if (auto *C = Entry.second)
2718f22ef01cSRoman Divacky     return C;
2719f22ef01cSRoman Divacky 
2720dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2721f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2722284c1978SDimitry Andric   llvm::Value *V;
2723f22ef01cSRoman Divacky   // If we don't already have it, get _NSConstantStringClassReference.
27242754fe60SDimitry Andric   if (!ConstantStringClassRef) {
2725dff0c46cSDimitry Andric     std::string StringClass(getLangOpts().ObjCConstantStringClass);
27266122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
27272754fe60SDimitry Andric     llvm::Constant *GV;
27287ae0e2c9SDimitry Andric     if (LangOpts.ObjCRuntime.isNonFragile()) {
2729bd5abe19SDimitry Andric       std::string str =
2730bd5abe19SDimitry Andric         StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
2731bd5abe19SDimitry Andric                             : "OBJC_CLASS_$_" + StringClass;
2732bd5abe19SDimitry Andric       GV = getObjCRuntime().GetClassGlobal(str);
2733bd5abe19SDimitry Andric       // Make sure the result is of the correct type.
27346122f3e6SDimitry Andric       llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
2735284c1978SDimitry Andric       V = llvm::ConstantExpr::getBitCast(GV, PTy);
2736284c1978SDimitry Andric       ConstantStringClassRef = V;
2737bd5abe19SDimitry Andric     } else {
2738bd5abe19SDimitry Andric       std::string str =
2739bd5abe19SDimitry Andric         StringClass.empty() ? "_NSConstantStringClassReference"
2740bd5abe19SDimitry Andric                             : "_" + StringClass + "ClassReference";
27416122f3e6SDimitry Andric       llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
2742bd5abe19SDimitry Andric       GV = CreateRuntimeVariable(PTy, str);
2743f22ef01cSRoman Divacky       // Decay array -> ptr
274433956c43SDimitry Andric       V = llvm::ConstantExpr::getGetElementPtr(PTy, GV, Zeros);
2745284c1978SDimitry Andric       ConstantStringClassRef = V;
2746f22ef01cSRoman Divacky     }
274733956c43SDimitry Andric   } else
2748284c1978SDimitry Andric     V = ConstantStringClassRef;
2749f22ef01cSRoman Divacky 
27506122f3e6SDimitry Andric   if (!NSConstantStringType) {
27516122f3e6SDimitry Andric     // Construct the type for a constant NSString.
275259d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString");
27536122f3e6SDimitry Andric     D->startDefinition();
2754f22ef01cSRoman Divacky 
27556122f3e6SDimitry Andric     QualType FieldTypes[3];
27566122f3e6SDimitry Andric 
27576122f3e6SDimitry Andric     // const int *isa;
27586122f3e6SDimitry Andric     FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst());
27596122f3e6SDimitry Andric     // const char *str;
27606122f3e6SDimitry Andric     FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst());
27616122f3e6SDimitry Andric     // unsigned int length;
27626122f3e6SDimitry Andric     FieldTypes[2] = Context.UnsignedIntTy;
27636122f3e6SDimitry Andric 
27646122f3e6SDimitry Andric     // Create fields
27656122f3e6SDimitry Andric     for (unsigned i = 0; i < 3; ++i) {
27666122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context, D,
27676122f3e6SDimitry Andric                                            SourceLocation(),
276859d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
276959d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
277059d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
27716122f3e6SDimitry Andric                                            /*Mutable=*/false,
27727ae0e2c9SDimitry Andric                                            ICIS_NoInit);
27736122f3e6SDimitry Andric       Field->setAccess(AS_public);
27746122f3e6SDimitry Andric       D->addDecl(Field);
27756122f3e6SDimitry Andric     }
27766122f3e6SDimitry Andric 
27776122f3e6SDimitry Andric     D->completeDefinition();
27786122f3e6SDimitry Andric     QualType NSTy = Context.getTagDeclType(D);
27796122f3e6SDimitry Andric     NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy));
27806122f3e6SDimitry Andric   }
2781f22ef01cSRoman Divacky 
2782dff0c46cSDimitry Andric   llvm::Constant *Fields[3];
2783f22ef01cSRoman Divacky 
2784f22ef01cSRoman Divacky   // Class pointer.
2785284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2786f22ef01cSRoman Divacky 
2787f22ef01cSRoman Divacky   // String pointer.
2788dff0c46cSDimitry Andric   llvm::Constant *C =
278939d628a0SDimitry Andric       llvm::ConstantDataArray::getString(VMContext, Entry.first());
2790f22ef01cSRoman Divacky 
2791f22ef01cSRoman Divacky   llvm::GlobalValue::LinkageTypes Linkage;
2792f22ef01cSRoman Divacky   bool isConstant;
2793f22ef01cSRoman Divacky   Linkage = llvm::GlobalValue::PrivateLinkage;
2794dff0c46cSDimitry Andric   isConstant = !LangOpts.WritableStrings;
2795f22ef01cSRoman Divacky 
279659d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant,
279759d1ed5bSDimitry Andric                                       Linkage, C, ".str");
27982754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2799284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2800284c1978SDimitry Andric   // of the string is via this class initializer.
28013b0f4066SDimitry Andric   CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
28023b0f4066SDimitry Andric   GV->setAlignment(Align.getQuantity());
280333956c43SDimitry Andric   Fields[1] =
280433956c43SDimitry Andric       llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros);
2805f22ef01cSRoman Divacky 
2806f22ef01cSRoman Divacky   // String length.
28076122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2808f22ef01cSRoman Divacky   Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
2809f22ef01cSRoman Divacky 
2810f22ef01cSRoman Divacky   // The struct.
28116122f3e6SDimitry Andric   C = llvm::ConstantStruct::get(NSConstantStringType, Fields);
2812f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2813f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2814f22ef01cSRoman Divacky                                 "_unnamed_nsstring_");
281559d1ed5bSDimitry Andric   const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
281659d1ed5bSDimitry Andric   const char *NSStringNonFragileABISection =
281759d1ed5bSDimitry Andric       "__DATA,__objc_stringobj,regular,no_dead_strip";
2818f22ef01cSRoman Divacky   // FIXME. Fix section.
281959d1ed5bSDimitry Andric   GV->setSection(LangOpts.ObjCRuntime.isNonFragile()
282059d1ed5bSDimitry Andric                      ? NSStringNonFragileABISection
282159d1ed5bSDimitry Andric                      : NSStringSection);
282239d628a0SDimitry Andric   Entry.second = GV;
2823f22ef01cSRoman Divacky 
2824f22ef01cSRoman Divacky   return GV;
2825f22ef01cSRoman Divacky }
2826f22ef01cSRoman Divacky 
28276122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() {
28286122f3e6SDimitry Andric   if (ObjCFastEnumerationStateType.isNull()) {
282959d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState");
28306122f3e6SDimitry Andric     D->startDefinition();
28316122f3e6SDimitry Andric 
28326122f3e6SDimitry Andric     QualType FieldTypes[] = {
28336122f3e6SDimitry Andric       Context.UnsignedLongTy,
28346122f3e6SDimitry Andric       Context.getPointerType(Context.getObjCIdType()),
28356122f3e6SDimitry Andric       Context.getPointerType(Context.UnsignedLongTy),
28366122f3e6SDimitry Andric       Context.getConstantArrayType(Context.UnsignedLongTy,
28376122f3e6SDimitry Andric                            llvm::APInt(32, 5), ArrayType::Normal, 0)
28386122f3e6SDimitry Andric     };
28396122f3e6SDimitry Andric 
28406122f3e6SDimitry Andric     for (size_t i = 0; i < 4; ++i) {
28416122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context,
28426122f3e6SDimitry Andric                                            D,
28436122f3e6SDimitry Andric                                            SourceLocation(),
284459d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
284559d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
284659d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
28476122f3e6SDimitry Andric                                            /*Mutable=*/false,
28487ae0e2c9SDimitry Andric                                            ICIS_NoInit);
28496122f3e6SDimitry Andric       Field->setAccess(AS_public);
28506122f3e6SDimitry Andric       D->addDecl(Field);
28516122f3e6SDimitry Andric     }
28526122f3e6SDimitry Andric 
28536122f3e6SDimitry Andric     D->completeDefinition();
28546122f3e6SDimitry Andric     ObjCFastEnumerationStateType = Context.getTagDeclType(D);
28556122f3e6SDimitry Andric   }
28566122f3e6SDimitry Andric 
28576122f3e6SDimitry Andric   return ObjCFastEnumerationStateType;
28586122f3e6SDimitry Andric }
28596122f3e6SDimitry Andric 
2860dff0c46cSDimitry Andric llvm::Constant *
2861dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
2862dff0c46cSDimitry Andric   assert(!E->getType()->isPointerType() && "Strings are always arrays");
2863f22ef01cSRoman Divacky 
2864dff0c46cSDimitry Andric   // Don't emit it as the address of the string, emit the string data itself
2865dff0c46cSDimitry Andric   // as an inline array.
2866dff0c46cSDimitry Andric   if (E->getCharByteWidth() == 1) {
2867dff0c46cSDimitry Andric     SmallString<64> Str(E->getString());
2868f22ef01cSRoman Divacky 
2869dff0c46cSDimitry Andric     // Resize the string to the right size, which is indicated by its type.
2870dff0c46cSDimitry Andric     const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType());
2871dff0c46cSDimitry Andric     Str.resize(CAT->getSize().getZExtValue());
2872dff0c46cSDimitry Andric     return llvm::ConstantDataArray::getString(VMContext, Str, false);
28736122f3e6SDimitry Andric   }
2874f22ef01cSRoman Divacky 
287559d1ed5bSDimitry Andric   auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
2876dff0c46cSDimitry Andric   llvm::Type *ElemTy = AType->getElementType();
2877dff0c46cSDimitry Andric   unsigned NumElements = AType->getNumElements();
2878f22ef01cSRoman Divacky 
2879dff0c46cSDimitry Andric   // Wide strings have either 2-byte or 4-byte elements.
2880dff0c46cSDimitry Andric   if (ElemTy->getPrimitiveSizeInBits() == 16) {
2881dff0c46cSDimitry Andric     SmallVector<uint16_t, 32> Elements;
2882dff0c46cSDimitry Andric     Elements.reserve(NumElements);
2883dff0c46cSDimitry Andric 
2884dff0c46cSDimitry Andric     for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2885dff0c46cSDimitry Andric       Elements.push_back(E->getCodeUnit(i));
2886dff0c46cSDimitry Andric     Elements.resize(NumElements);
2887dff0c46cSDimitry Andric     return llvm::ConstantDataArray::get(VMContext, Elements);
2888dff0c46cSDimitry Andric   }
2889dff0c46cSDimitry Andric 
2890dff0c46cSDimitry Andric   assert(ElemTy->getPrimitiveSizeInBits() == 32);
2891dff0c46cSDimitry Andric   SmallVector<uint32_t, 32> Elements;
2892dff0c46cSDimitry Andric   Elements.reserve(NumElements);
2893dff0c46cSDimitry Andric 
2894dff0c46cSDimitry Andric   for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2895dff0c46cSDimitry Andric     Elements.push_back(E->getCodeUnit(i));
2896dff0c46cSDimitry Andric   Elements.resize(NumElements);
2897dff0c46cSDimitry Andric   return llvm::ConstantDataArray::get(VMContext, Elements);
2898f22ef01cSRoman Divacky }
2899f22ef01cSRoman Divacky 
290059d1ed5bSDimitry Andric static llvm::GlobalVariable *
290159d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT,
290259d1ed5bSDimitry Andric                       CodeGenModule &CGM, StringRef GlobalName,
290359d1ed5bSDimitry Andric                       unsigned Alignment) {
290459d1ed5bSDimitry Andric   // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
290559d1ed5bSDimitry Andric   unsigned AddrSpace = 0;
290659d1ed5bSDimitry Andric   if (CGM.getLangOpts().OpenCL)
290759d1ed5bSDimitry Andric     AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
2908dff0c46cSDimitry Andric 
290933956c43SDimitry Andric   llvm::Module &M = CGM.getModule();
291059d1ed5bSDimitry Andric   // Create a global variable for this string
291159d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
291233956c43SDimitry Andric       M, C->getType(), !CGM.getLangOpts().WritableStrings, LT, C, GlobalName,
291333956c43SDimitry Andric       nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
291459d1ed5bSDimitry Andric   GV->setAlignment(Alignment);
291559d1ed5bSDimitry Andric   GV->setUnnamedAddr(true);
291633956c43SDimitry Andric   if (GV->isWeakForLinker()) {
291733956c43SDimitry Andric     assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals");
291833956c43SDimitry Andric     GV->setComdat(M.getOrInsertComdat(GV->getName()));
291933956c43SDimitry Andric   }
292033956c43SDimitry Andric 
292159d1ed5bSDimitry Andric   return GV;
2922f22ef01cSRoman Divacky }
2923dff0c46cSDimitry Andric 
292459d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a
292559d1ed5bSDimitry Andric /// constant array for the given string literal.
292659d1ed5bSDimitry Andric llvm::GlobalVariable *
292739d628a0SDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S,
292839d628a0SDimitry Andric                                                   StringRef Name) {
292959d1ed5bSDimitry Andric   auto Alignment =
293059d1ed5bSDimitry Andric       getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
2931dff0c46cSDimitry Andric 
293259d1ed5bSDimitry Andric   llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
293359d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
293459d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
293559d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
293659d1ed5bSDimitry Andric     if (auto GV = *Entry) {
293759d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
293859d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
293959d1ed5bSDimitry Andric       return GV;
294059d1ed5bSDimitry Andric     }
294159d1ed5bSDimitry Andric   }
294259d1ed5bSDimitry Andric 
294359d1ed5bSDimitry Andric   SmallString<256> MangledNameBuffer;
294459d1ed5bSDimitry Andric   StringRef GlobalVariableName;
294559d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes LT;
294659d1ed5bSDimitry Andric 
294759d1ed5bSDimitry Andric   // Mangle the string literal if the ABI allows for it.  However, we cannot
294859d1ed5bSDimitry Andric   // do this if  we are compiling with ASan or -fwritable-strings because they
294959d1ed5bSDimitry Andric   // rely on strings having normal linkage.
295039d628a0SDimitry Andric   if (!LangOpts.WritableStrings &&
295139d628a0SDimitry Andric       !LangOpts.Sanitize.has(SanitizerKind::Address) &&
295259d1ed5bSDimitry Andric       getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) {
295359d1ed5bSDimitry Andric     llvm::raw_svector_ostream Out(MangledNameBuffer);
295459d1ed5bSDimitry Andric     getCXXABI().getMangleContext().mangleStringLiteral(S, Out);
295559d1ed5bSDimitry Andric     Out.flush();
295659d1ed5bSDimitry Andric 
295759d1ed5bSDimitry Andric     LT = llvm::GlobalValue::LinkOnceODRLinkage;
295859d1ed5bSDimitry Andric     GlobalVariableName = MangledNameBuffer;
295959d1ed5bSDimitry Andric   } else {
296059d1ed5bSDimitry Andric     LT = llvm::GlobalValue::PrivateLinkage;
296139d628a0SDimitry Andric     GlobalVariableName = Name;
296259d1ed5bSDimitry Andric   }
296359d1ed5bSDimitry Andric 
296459d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
296559d1ed5bSDimitry Andric   if (Entry)
296659d1ed5bSDimitry Andric     *Entry = GV;
296759d1ed5bSDimitry Andric 
296839d628a0SDimitry Andric   SanitizerMD->reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>",
296939d628a0SDimitry Andric                                   QualType());
2970dff0c46cSDimitry Andric   return GV;
2971f22ef01cSRoman Divacky }
2972f22ef01cSRoman Divacky 
2973f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant
2974f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node.
297559d1ed5bSDimitry Andric llvm::GlobalVariable *
2976f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
2977f22ef01cSRoman Divacky   std::string Str;
2978f22ef01cSRoman Divacky   getContext().getObjCEncodingForType(E->getEncodedType(), Str);
2979f22ef01cSRoman Divacky 
2980f22ef01cSRoman Divacky   return GetAddrOfConstantCString(Str);
2981f22ef01cSRoman Divacky }
2982f22ef01cSRoman Divacky 
298359d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing
298459d1ed5bSDimitry Andric /// the literal and a terminating '\0' character.
298559d1ed5bSDimitry Andric /// The result has pointer to array type.
298659d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
298759d1ed5bSDimitry Andric     const std::string &Str, const char *GlobalName, unsigned Alignment) {
298859d1ed5bSDimitry Andric   StringRef StrWithNull(Str.c_str(), Str.size() + 1);
298959d1ed5bSDimitry Andric   if (Alignment == 0) {
299059d1ed5bSDimitry Andric     Alignment = getContext()
299159d1ed5bSDimitry Andric                     .getAlignOfGlobalVarInChars(getContext().CharTy)
299259d1ed5bSDimitry Andric                     .getQuantity();
2993f22ef01cSRoman Divacky   }
2994f22ef01cSRoman Divacky 
299559d1ed5bSDimitry Andric   llvm::Constant *C =
299659d1ed5bSDimitry Andric       llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
299759d1ed5bSDimitry Andric 
299859d1ed5bSDimitry Andric   // Don't share any string literals if strings aren't constant.
299959d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
300059d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
300159d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
300259d1ed5bSDimitry Andric     if (auto GV = *Entry) {
300359d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
300459d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
300559d1ed5bSDimitry Andric       return GV;
300659d1ed5bSDimitry Andric     }
300759d1ed5bSDimitry Andric   }
300859d1ed5bSDimitry Andric 
3009f22ef01cSRoman Divacky   // Get the default prefix if a name wasn't specified.
3010f22ef01cSRoman Divacky   if (!GlobalName)
3011f22ef01cSRoman Divacky     GlobalName = ".str";
3012f22ef01cSRoman Divacky   // Create a global variable for this.
301359d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
301459d1ed5bSDimitry Andric                                   GlobalName, Alignment);
301559d1ed5bSDimitry Andric   if (Entry)
301659d1ed5bSDimitry Andric     *Entry = GV;
30176122f3e6SDimitry Andric   return GV;
3018f22ef01cSRoman Divacky }
3019f22ef01cSRoman Divacky 
3020f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
3021f785676fSDimitry Andric     const MaterializeTemporaryExpr *E, const Expr *Init) {
3022f785676fSDimitry Andric   assert((E->getStorageDuration() == SD_Static ||
3023f785676fSDimitry Andric           E->getStorageDuration() == SD_Thread) && "not a global temporary");
302459d1ed5bSDimitry Andric   const auto *VD = cast<VarDecl>(E->getExtendingDecl());
3025f785676fSDimitry Andric 
3026f785676fSDimitry Andric   // If we're not materializing a subobject of the temporary, keep the
3027f785676fSDimitry Andric   // cv-qualifiers from the type of the MaterializeTemporaryExpr.
3028f785676fSDimitry Andric   QualType MaterializedType = Init->getType();
3029f785676fSDimitry Andric   if (Init == E->GetTemporaryExpr())
3030f785676fSDimitry Andric     MaterializedType = E->getType();
3031f785676fSDimitry Andric 
3032f785676fSDimitry Andric   llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E];
3033f785676fSDimitry Andric   if (Slot)
3034f785676fSDimitry Andric     return Slot;
3035f785676fSDimitry Andric 
3036f785676fSDimitry Andric   // FIXME: If an externally-visible declaration extends multiple temporaries,
3037f785676fSDimitry Andric   // we need to give each temporary the same name in every translation unit (and
3038f785676fSDimitry Andric   // we also need to make the temporaries externally-visible).
3039f785676fSDimitry Andric   SmallString<256> Name;
3040f785676fSDimitry Andric   llvm::raw_svector_ostream Out(Name);
304159d1ed5bSDimitry Andric   getCXXABI().getMangleContext().mangleReferenceTemporary(
304259d1ed5bSDimitry Andric       VD, E->getManglingNumber(), Out);
3043f785676fSDimitry Andric   Out.flush();
3044f785676fSDimitry Andric 
304559d1ed5bSDimitry Andric   APValue *Value = nullptr;
3046f785676fSDimitry Andric   if (E->getStorageDuration() == SD_Static) {
3047f785676fSDimitry Andric     // We might have a cached constant initializer for this temporary. Note
3048f785676fSDimitry Andric     // that this might have a different value from the value computed by
3049f785676fSDimitry Andric     // evaluating the initializer if the surrounding constant expression
3050f785676fSDimitry Andric     // modifies the temporary.
3051f785676fSDimitry Andric     Value = getContext().getMaterializedTemporaryValue(E, false);
3052f785676fSDimitry Andric     if (Value && Value->isUninit())
305359d1ed5bSDimitry Andric       Value = nullptr;
3054f785676fSDimitry Andric   }
3055f785676fSDimitry Andric 
3056f785676fSDimitry Andric   // Try evaluating it now, it might have a constant initializer.
3057f785676fSDimitry Andric   Expr::EvalResult EvalResult;
3058f785676fSDimitry Andric   if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) &&
3059f785676fSDimitry Andric       !EvalResult.hasSideEffects())
3060f785676fSDimitry Andric     Value = &EvalResult.Val;
3061f785676fSDimitry Andric 
306259d1ed5bSDimitry Andric   llvm::Constant *InitialValue = nullptr;
3063f785676fSDimitry Andric   bool Constant = false;
3064f785676fSDimitry Andric   llvm::Type *Type;
3065f785676fSDimitry Andric   if (Value) {
3066f785676fSDimitry Andric     // The temporary has a constant initializer, use it.
306759d1ed5bSDimitry Andric     InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr);
3068f785676fSDimitry Andric     Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value);
3069f785676fSDimitry Andric     Type = InitialValue->getType();
3070f785676fSDimitry Andric   } else {
3071f785676fSDimitry Andric     // No initializer, the initialization will be provided when we
3072f785676fSDimitry Andric     // initialize the declaration which performed lifetime extension.
3073f785676fSDimitry Andric     Type = getTypes().ConvertTypeForMem(MaterializedType);
3074f785676fSDimitry Andric   }
3075f785676fSDimitry Andric 
3076f785676fSDimitry Andric   // Create a global variable for this lifetime-extended temporary.
307759d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
307859d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(VD, Constant);
307933956c43SDimitry Andric   if (Linkage == llvm::GlobalVariable::ExternalLinkage) {
308033956c43SDimitry Andric     const VarDecl *InitVD;
308133956c43SDimitry Andric     if (VD->isStaticDataMember() && VD->getAnyInitializer(InitVD) &&
308233956c43SDimitry Andric         isa<CXXRecordDecl>(InitVD->getLexicalDeclContext())) {
308333956c43SDimitry Andric       // Temporaries defined inside a class get linkonce_odr linkage because the
308433956c43SDimitry Andric       // class can be defined in multipe translation units.
308533956c43SDimitry Andric       Linkage = llvm::GlobalVariable::LinkOnceODRLinkage;
308633956c43SDimitry Andric     } else {
308733956c43SDimitry Andric       // There is no need for this temporary to have external linkage if the
308833956c43SDimitry Andric       // VarDecl has external linkage.
308933956c43SDimitry Andric       Linkage = llvm::GlobalVariable::InternalLinkage;
309033956c43SDimitry Andric     }
309133956c43SDimitry Andric   }
309259d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(
309359d1ed5bSDimitry Andric       VD, getContext().getTargetAddressSpace(MaterializedType));
309459d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
309559d1ed5bSDimitry Andric       getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
309659d1ed5bSDimitry Andric       /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal,
309759d1ed5bSDimitry Andric       AddrSpace);
309859d1ed5bSDimitry Andric   setGlobalVisibility(GV, VD);
3099f785676fSDimitry Andric   GV->setAlignment(
3100f785676fSDimitry Andric       getContext().getTypeAlignInChars(MaterializedType).getQuantity());
310133956c43SDimitry Andric   if (supportsCOMDAT() && GV->isWeakForLinker())
310233956c43SDimitry Andric     GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
3103f785676fSDimitry Andric   if (VD->getTLSKind())
3104f785676fSDimitry Andric     setTLSMode(GV, *VD);
3105f785676fSDimitry Andric   Slot = GV;
3106f785676fSDimitry Andric   return GV;
3107f785676fSDimitry Andric }
3108f785676fSDimitry Andric 
3109f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized
3110f22ef01cSRoman Divacky /// properties for an implementation.
3111f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const
3112f22ef01cSRoman Divacky                                                     ObjCImplementationDecl *D) {
311359d1ed5bSDimitry Andric   for (const auto *PID : D->property_impls()) {
3114f22ef01cSRoman Divacky     // Dynamic is just for type-checking.
3115f22ef01cSRoman Divacky     if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3116f22ef01cSRoman Divacky       ObjCPropertyDecl *PD = PID->getPropertyDecl();
3117f22ef01cSRoman Divacky 
3118f22ef01cSRoman Divacky       // Determine which methods need to be implemented, some may have
31193861d79fSDimitry Andric       // been overridden. Note that ::isPropertyAccessor is not the method
3120f22ef01cSRoman Divacky       // we want, that just indicates if the decl came from a
3121f22ef01cSRoman Divacky       // property. What we want to know is if the method is defined in
3122f22ef01cSRoman Divacky       // this implementation.
3123f22ef01cSRoman Divacky       if (!D->getInstanceMethod(PD->getGetterName()))
3124f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCGetter(
3125f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3126f22ef01cSRoman Divacky       if (!PD->isReadOnly() &&
3127f22ef01cSRoman Divacky           !D->getInstanceMethod(PD->getSetterName()))
3128f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCSetter(
3129f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
3130f22ef01cSRoman Divacky     }
3131f22ef01cSRoman Divacky   }
3132f22ef01cSRoman Divacky }
3133f22ef01cSRoman Divacky 
31343b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) {
31356122f3e6SDimitry Andric   const ObjCInterfaceDecl *iface = impl->getClassInterface();
31366122f3e6SDimitry Andric   for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
31373b0f4066SDimitry Andric        ivar; ivar = ivar->getNextIvar())
31383b0f4066SDimitry Andric     if (ivar->getType().isDestructedType())
31393b0f4066SDimitry Andric       return true;
31403b0f4066SDimitry Andric 
31413b0f4066SDimitry Andric   return false;
31423b0f4066SDimitry Andric }
31433b0f4066SDimitry Andric 
314439d628a0SDimitry Andric static bool AllTrivialInitializers(CodeGenModule &CGM,
314539d628a0SDimitry Andric                                    ObjCImplementationDecl *D) {
314639d628a0SDimitry Andric   CodeGenFunction CGF(CGM);
314739d628a0SDimitry Andric   for (ObjCImplementationDecl::init_iterator B = D->init_begin(),
314839d628a0SDimitry Andric        E = D->init_end(); B != E; ++B) {
314939d628a0SDimitry Andric     CXXCtorInitializer *CtorInitExp = *B;
315039d628a0SDimitry Andric     Expr *Init = CtorInitExp->getInit();
315139d628a0SDimitry Andric     if (!CGF.isTrivialInitializer(Init))
315239d628a0SDimitry Andric       return false;
315339d628a0SDimitry Andric   }
315439d628a0SDimitry Andric   return true;
315539d628a0SDimitry Andric }
315639d628a0SDimitry Andric 
3157f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization
3158f22ef01cSRoman Divacky /// for an implementation.
3159f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
31603b0f4066SDimitry Andric   // We might need a .cxx_destruct even if we don't have any ivar initializers.
31613b0f4066SDimitry Andric   if (needsDestructMethod(D)) {
3162f22ef01cSRoman Divacky     IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
3163f22ef01cSRoman Divacky     Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
31643b0f4066SDimitry Andric     ObjCMethodDecl *DTORMethod =
31653b0f4066SDimitry Andric       ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
316659d1ed5bSDimitry Andric                              cxxSelector, getContext().VoidTy, nullptr, D,
31676122f3e6SDimitry Andric                              /*isInstance=*/true, /*isVariadic=*/false,
31683861d79fSDimitry Andric                           /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true,
31696122f3e6SDimitry Andric                              /*isDefined=*/false, ObjCMethodDecl::Required);
3170f22ef01cSRoman Divacky     D->addInstanceMethod(DTORMethod);
3171f22ef01cSRoman Divacky     CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
31723861d79fSDimitry Andric     D->setHasDestructors(true);
31733b0f4066SDimitry Andric   }
3174f22ef01cSRoman Divacky 
31753b0f4066SDimitry Andric   // If the implementation doesn't have any ivar initializers, we don't need
31763b0f4066SDimitry Andric   // a .cxx_construct.
317739d628a0SDimitry Andric   if (D->getNumIvarInitializers() == 0 ||
317839d628a0SDimitry Andric       AllTrivialInitializers(*this, D))
31793b0f4066SDimitry Andric     return;
31803b0f4066SDimitry Andric 
31813b0f4066SDimitry Andric   IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
31823b0f4066SDimitry Andric   Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
3183f22ef01cSRoman Divacky   // The constructor returns 'self'.
3184f22ef01cSRoman Divacky   ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
3185f22ef01cSRoman Divacky                                                 D->getLocation(),
31866122f3e6SDimitry Andric                                                 D->getLocation(),
31876122f3e6SDimitry Andric                                                 cxxSelector,
318859d1ed5bSDimitry Andric                                                 getContext().getObjCIdType(),
318959d1ed5bSDimitry Andric                                                 nullptr, D, /*isInstance=*/true,
31906122f3e6SDimitry Andric                                                 /*isVariadic=*/false,
31913861d79fSDimitry Andric                                                 /*isPropertyAccessor=*/true,
31926122f3e6SDimitry Andric                                                 /*isImplicitlyDeclared=*/true,
31936122f3e6SDimitry Andric                                                 /*isDefined=*/false,
3194f22ef01cSRoman Divacky                                                 ObjCMethodDecl::Required);
3195f22ef01cSRoman Divacky   D->addInstanceMethod(CTORMethod);
3196f22ef01cSRoman Divacky   CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
31973861d79fSDimitry Andric   D->setHasNonZeroConstructors(true);
3198f22ef01cSRoman Divacky }
3199f22ef01cSRoman Divacky 
3200f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace.
3201f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) {
320259d1ed5bSDimitry Andric   for (auto *I : ND->decls()) {
320359d1ed5bSDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(I))
3204f785676fSDimitry Andric       if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
3205f785676fSDimitry Andric           VD->getTemplateSpecializationKind() != TSK_Undeclared)
3206f785676fSDimitry Andric         continue;
320759d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3208f22ef01cSRoman Divacky   }
3209f785676fSDimitry Andric }
3210f22ef01cSRoman Divacky 
3211f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec.
3212f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
3213f22ef01cSRoman Divacky   if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
3214f22ef01cSRoman Divacky       LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
3215f22ef01cSRoman Divacky     ErrorUnsupported(LSD, "linkage spec");
3216f22ef01cSRoman Divacky     return;
3217f22ef01cSRoman Divacky   }
3218f22ef01cSRoman Divacky 
321959d1ed5bSDimitry Andric   for (auto *I : LSD->decls()) {
32203861d79fSDimitry Andric     // Meta-data for ObjC class includes references to implemented methods.
32213861d79fSDimitry Andric     // Generate class's method definitions first.
322259d1ed5bSDimitry Andric     if (auto *OID = dyn_cast<ObjCImplDecl>(I)) {
322359d1ed5bSDimitry Andric       for (auto *M : OID->methods())
322459d1ed5bSDimitry Andric         EmitTopLevelDecl(M);
32253861d79fSDimitry Andric     }
322659d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3227f22ef01cSRoman Divacky   }
32283861d79fSDimitry Andric }
3229f22ef01cSRoman Divacky 
3230f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration.
3231f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) {
3232f22ef01cSRoman Divacky   // Ignore dependent declarations.
3233f22ef01cSRoman Divacky   if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
3234f22ef01cSRoman Divacky     return;
3235f22ef01cSRoman Divacky 
3236f22ef01cSRoman Divacky   switch (D->getKind()) {
3237f22ef01cSRoman Divacky   case Decl::CXXConversion:
3238f22ef01cSRoman Divacky   case Decl::CXXMethod:
3239f22ef01cSRoman Divacky   case Decl::Function:
3240f22ef01cSRoman Divacky     // Skip function templates
32413b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
32423b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3243f22ef01cSRoman Divacky       return;
3244f22ef01cSRoman Divacky 
3245f22ef01cSRoman Divacky     EmitGlobal(cast<FunctionDecl>(D));
324639d628a0SDimitry Andric     // Always provide some coverage mapping
324739d628a0SDimitry Andric     // even for the functions that aren't emitted.
324839d628a0SDimitry Andric     AddDeferredUnusedCoverageMapping(D);
3249f22ef01cSRoman Divacky     break;
3250f22ef01cSRoman Divacky 
3251f22ef01cSRoman Divacky   case Decl::Var:
3252f785676fSDimitry Andric     // Skip variable templates
3253f785676fSDimitry Andric     if (cast<VarDecl>(D)->getDescribedVarTemplate())
3254f785676fSDimitry Andric       return;
3255f785676fSDimitry Andric   case Decl::VarTemplateSpecialization:
3256f22ef01cSRoman Divacky     EmitGlobal(cast<VarDecl>(D));
3257f22ef01cSRoman Divacky     break;
3258f22ef01cSRoman Divacky 
32593b0f4066SDimitry Andric   // Indirect fields from global anonymous structs and unions can be
32603b0f4066SDimitry Andric   // ignored; only the actual variable requires IR gen support.
32613b0f4066SDimitry Andric   case Decl::IndirectField:
32623b0f4066SDimitry Andric     break;
32633b0f4066SDimitry Andric 
3264f22ef01cSRoman Divacky   // C++ Decls
3265f22ef01cSRoman Divacky   case Decl::Namespace:
3266f22ef01cSRoman Divacky     EmitNamespace(cast<NamespaceDecl>(D));
3267f22ef01cSRoman Divacky     break;
3268f22ef01cSRoman Divacky     // No code generation needed.
3269f22ef01cSRoman Divacky   case Decl::UsingShadow:
3270f22ef01cSRoman Divacky   case Decl::ClassTemplate:
3271f785676fSDimitry Andric   case Decl::VarTemplate:
3272f785676fSDimitry Andric   case Decl::VarTemplatePartialSpecialization:
3273f22ef01cSRoman Divacky   case Decl::FunctionTemplate:
3274bd5abe19SDimitry Andric   case Decl::TypeAliasTemplate:
3275bd5abe19SDimitry Andric   case Decl::Block:
3276139f7f9bSDimitry Andric   case Decl::Empty:
3277f22ef01cSRoman Divacky     break;
327859d1ed5bSDimitry Andric   case Decl::Using:          // using X; [C++]
327959d1ed5bSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
328059d1ed5bSDimitry Andric         DI->EmitUsingDecl(cast<UsingDecl>(*D));
328159d1ed5bSDimitry Andric     return;
3282f785676fSDimitry Andric   case Decl::NamespaceAlias:
3283f785676fSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3284f785676fSDimitry Andric         DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D));
3285f785676fSDimitry Andric     return;
3286284c1978SDimitry Andric   case Decl::UsingDirective: // using namespace X; [C++]
3287284c1978SDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3288284c1978SDimitry Andric       DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D));
3289284c1978SDimitry Andric     return;
3290f22ef01cSRoman Divacky   case Decl::CXXConstructor:
3291f22ef01cSRoman Divacky     // Skip function templates
32923b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
32933b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3294f22ef01cSRoman Divacky       return;
3295f22ef01cSRoman Divacky 
3296f785676fSDimitry Andric     getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D));
3297f22ef01cSRoman Divacky     break;
3298f22ef01cSRoman Divacky   case Decl::CXXDestructor:
32993b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->isLateTemplateParsed())
33003b0f4066SDimitry Andric       return;
3301f785676fSDimitry Andric     getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D));
3302f22ef01cSRoman Divacky     break;
3303f22ef01cSRoman Divacky 
3304f22ef01cSRoman Divacky   case Decl::StaticAssert:
3305f22ef01cSRoman Divacky     // Nothing to do.
3306f22ef01cSRoman Divacky     break;
3307f22ef01cSRoman Divacky 
3308f22ef01cSRoman Divacky   // Objective-C Decls
3309f22ef01cSRoman Divacky 
3310f22ef01cSRoman Divacky   // Forward declarations, no (immediate) code generation.
3311f22ef01cSRoman Divacky   case Decl::ObjCInterface:
33127ae0e2c9SDimitry Andric   case Decl::ObjCCategory:
3313f22ef01cSRoman Divacky     break;
3314f22ef01cSRoman Divacky 
3315dff0c46cSDimitry Andric   case Decl::ObjCProtocol: {
331659d1ed5bSDimitry Andric     auto *Proto = cast<ObjCProtocolDecl>(D);
3317dff0c46cSDimitry Andric     if (Proto->isThisDeclarationADefinition())
3318dff0c46cSDimitry Andric       ObjCRuntime->GenerateProtocol(Proto);
3319f22ef01cSRoman Divacky     break;
3320dff0c46cSDimitry Andric   }
3321f22ef01cSRoman Divacky 
3322f22ef01cSRoman Divacky   case Decl::ObjCCategoryImpl:
3323f22ef01cSRoman Divacky     // Categories have properties but don't support synthesize so we
3324f22ef01cSRoman Divacky     // can ignore them here.
33256122f3e6SDimitry Andric     ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
3326f22ef01cSRoman Divacky     break;
3327f22ef01cSRoman Divacky 
3328f22ef01cSRoman Divacky   case Decl::ObjCImplementation: {
332959d1ed5bSDimitry Andric     auto *OMD = cast<ObjCImplementationDecl>(D);
3330f22ef01cSRoman Divacky     EmitObjCPropertyImplementations(OMD);
3331f22ef01cSRoman Divacky     EmitObjCIvarInitializations(OMD);
33326122f3e6SDimitry Andric     ObjCRuntime->GenerateClass(OMD);
3333dff0c46cSDimitry Andric     // Emit global variable debug information.
3334dff0c46cSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3335139f7f9bSDimitry Andric       if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
3336139f7f9bSDimitry Andric         DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
3337139f7f9bSDimitry Andric             OMD->getClassInterface()), OMD->getLocation());
3338f22ef01cSRoman Divacky     break;
3339f22ef01cSRoman Divacky   }
3340f22ef01cSRoman Divacky   case Decl::ObjCMethod: {
334159d1ed5bSDimitry Andric     auto *OMD = cast<ObjCMethodDecl>(D);
3342f22ef01cSRoman Divacky     // If this is not a prototype, emit the body.
3343f22ef01cSRoman Divacky     if (OMD->getBody())
3344f22ef01cSRoman Divacky       CodeGenFunction(*this).GenerateObjCMethod(OMD);
3345f22ef01cSRoman Divacky     break;
3346f22ef01cSRoman Divacky   }
3347f22ef01cSRoman Divacky   case Decl::ObjCCompatibleAlias:
3348dff0c46cSDimitry Andric     ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D));
3349f22ef01cSRoman Divacky     break;
3350f22ef01cSRoman Divacky 
3351f22ef01cSRoman Divacky   case Decl::LinkageSpec:
3352f22ef01cSRoman Divacky     EmitLinkageSpec(cast<LinkageSpecDecl>(D));
3353f22ef01cSRoman Divacky     break;
3354f22ef01cSRoman Divacky 
3355f22ef01cSRoman Divacky   case Decl::FileScopeAsm: {
335633956c43SDimitry Andric     // File-scope asm is ignored during device-side CUDA compilation.
335733956c43SDimitry Andric     if (LangOpts.CUDA && LangOpts.CUDAIsDevice)
335833956c43SDimitry Andric       break;
335959d1ed5bSDimitry Andric     auto *AD = cast<FileScopeAsmDecl>(D);
336033956c43SDimitry Andric     getModule().appendModuleInlineAsm(AD->getAsmString()->getString());
3361f22ef01cSRoman Divacky     break;
3362f22ef01cSRoman Divacky   }
3363f22ef01cSRoman Divacky 
3364139f7f9bSDimitry Andric   case Decl::Import: {
336559d1ed5bSDimitry Andric     auto *Import = cast<ImportDecl>(D);
3366139f7f9bSDimitry Andric 
3367139f7f9bSDimitry Andric     // Ignore import declarations that come from imported modules.
336833956c43SDimitry Andric     if (clang::Module *Owner = Import->getImportedOwningModule()) {
3369139f7f9bSDimitry Andric       if (getLangOpts().CurrentModule.empty() ||
3370139f7f9bSDimitry Andric           Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)
3371139f7f9bSDimitry Andric         break;
3372139f7f9bSDimitry Andric     }
3373139f7f9bSDimitry Andric 
3374139f7f9bSDimitry Andric     ImportedModules.insert(Import->getImportedModule());
3375139f7f9bSDimitry Andric     break;
3376139f7f9bSDimitry Andric   }
3377139f7f9bSDimitry Andric 
337839d628a0SDimitry Andric   case Decl::OMPThreadPrivate:
337939d628a0SDimitry Andric     EmitOMPThreadPrivateDecl(cast<OMPThreadPrivateDecl>(D));
338039d628a0SDimitry Andric     break;
338139d628a0SDimitry Andric 
338259d1ed5bSDimitry Andric   case Decl::ClassTemplateSpecialization: {
338359d1ed5bSDimitry Andric     const auto *Spec = cast<ClassTemplateSpecializationDecl>(D);
338459d1ed5bSDimitry Andric     if (DebugInfo &&
338539d628a0SDimitry Andric         Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition &&
338639d628a0SDimitry Andric         Spec->hasDefinition())
338759d1ed5bSDimitry Andric       DebugInfo->completeTemplateDefinition(*Spec);
338839d628a0SDimitry Andric     break;
338959d1ed5bSDimitry Andric   }
339059d1ed5bSDimitry Andric 
3391f22ef01cSRoman Divacky   default:
3392f22ef01cSRoman Divacky     // Make sure we handled everything we should, every other kind is a
3393f22ef01cSRoman Divacky     // non-top-level decl.  FIXME: Would be nice to have an isTopLevelDeclKind
3394f22ef01cSRoman Divacky     // function. Need to recode Decl::Kind to do that easily.
3395f22ef01cSRoman Divacky     assert(isa<TypeDecl>(D) && "Unsupported decl kind");
339639d628a0SDimitry Andric     break;
339739d628a0SDimitry Andric   }
339839d628a0SDimitry Andric }
339939d628a0SDimitry Andric 
340039d628a0SDimitry Andric void CodeGenModule::AddDeferredUnusedCoverageMapping(Decl *D) {
340139d628a0SDimitry Andric   // Do we need to generate coverage mapping?
340239d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
340339d628a0SDimitry Andric     return;
340439d628a0SDimitry Andric   switch (D->getKind()) {
340539d628a0SDimitry Andric   case Decl::CXXConversion:
340639d628a0SDimitry Andric   case Decl::CXXMethod:
340739d628a0SDimitry Andric   case Decl::Function:
340839d628a0SDimitry Andric   case Decl::ObjCMethod:
340939d628a0SDimitry Andric   case Decl::CXXConstructor:
341039d628a0SDimitry Andric   case Decl::CXXDestructor: {
341139d628a0SDimitry Andric     if (!cast<FunctionDecl>(D)->hasBody())
341239d628a0SDimitry Andric       return;
341339d628a0SDimitry Andric     auto I = DeferredEmptyCoverageMappingDecls.find(D);
341439d628a0SDimitry Andric     if (I == DeferredEmptyCoverageMappingDecls.end())
341539d628a0SDimitry Andric       DeferredEmptyCoverageMappingDecls[D] = true;
341639d628a0SDimitry Andric     break;
341739d628a0SDimitry Andric   }
341839d628a0SDimitry Andric   default:
341939d628a0SDimitry Andric     break;
342039d628a0SDimitry Andric   };
342139d628a0SDimitry Andric }
342239d628a0SDimitry Andric 
342339d628a0SDimitry Andric void CodeGenModule::ClearUnusedCoverageMapping(const Decl *D) {
342439d628a0SDimitry Andric   // Do we need to generate coverage mapping?
342539d628a0SDimitry Andric   if (!CodeGenOpts.CoverageMapping)
342639d628a0SDimitry Andric     return;
342739d628a0SDimitry Andric   if (const auto *Fn = dyn_cast<FunctionDecl>(D)) {
342839d628a0SDimitry Andric     if (Fn->isTemplateInstantiation())
342939d628a0SDimitry Andric       ClearUnusedCoverageMapping(Fn->getTemplateInstantiationPattern());
343039d628a0SDimitry Andric   }
343139d628a0SDimitry Andric   auto I = DeferredEmptyCoverageMappingDecls.find(D);
343239d628a0SDimitry Andric   if (I == DeferredEmptyCoverageMappingDecls.end())
343339d628a0SDimitry Andric     DeferredEmptyCoverageMappingDecls[D] = false;
343439d628a0SDimitry Andric   else
343539d628a0SDimitry Andric     I->second = false;
343639d628a0SDimitry Andric }
343739d628a0SDimitry Andric 
343839d628a0SDimitry Andric void CodeGenModule::EmitDeferredUnusedCoverageMappings() {
343939d628a0SDimitry Andric   std::vector<const Decl *> DeferredDecls;
344033956c43SDimitry Andric   for (const auto &I : DeferredEmptyCoverageMappingDecls) {
344139d628a0SDimitry Andric     if (!I.second)
344239d628a0SDimitry Andric       continue;
344339d628a0SDimitry Andric     DeferredDecls.push_back(I.first);
344439d628a0SDimitry Andric   }
344539d628a0SDimitry Andric   // Sort the declarations by their location to make sure that the tests get a
344639d628a0SDimitry Andric   // predictable order for the coverage mapping for the unused declarations.
344739d628a0SDimitry Andric   if (CodeGenOpts.DumpCoverageMapping)
344839d628a0SDimitry Andric     std::sort(DeferredDecls.begin(), DeferredDecls.end(),
344939d628a0SDimitry Andric               [] (const Decl *LHS, const Decl *RHS) {
345039d628a0SDimitry Andric       return LHS->getLocStart() < RHS->getLocStart();
345139d628a0SDimitry Andric     });
345239d628a0SDimitry Andric   for (const auto *D : DeferredDecls) {
345339d628a0SDimitry Andric     switch (D->getKind()) {
345439d628a0SDimitry Andric     case Decl::CXXConversion:
345539d628a0SDimitry Andric     case Decl::CXXMethod:
345639d628a0SDimitry Andric     case Decl::Function:
345739d628a0SDimitry Andric     case Decl::ObjCMethod: {
345839d628a0SDimitry Andric       CodeGenPGO PGO(*this);
345939d628a0SDimitry Andric       GlobalDecl GD(cast<FunctionDecl>(D));
346039d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
346139d628a0SDimitry Andric                                   getFunctionLinkage(GD));
346239d628a0SDimitry Andric       break;
346339d628a0SDimitry Andric     }
346439d628a0SDimitry Andric     case Decl::CXXConstructor: {
346539d628a0SDimitry Andric       CodeGenPGO PGO(*this);
346639d628a0SDimitry Andric       GlobalDecl GD(cast<CXXConstructorDecl>(D), Ctor_Base);
346739d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
346839d628a0SDimitry Andric                                   getFunctionLinkage(GD));
346939d628a0SDimitry Andric       break;
347039d628a0SDimitry Andric     }
347139d628a0SDimitry Andric     case Decl::CXXDestructor: {
347239d628a0SDimitry Andric       CodeGenPGO PGO(*this);
347339d628a0SDimitry Andric       GlobalDecl GD(cast<CXXDestructorDecl>(D), Dtor_Base);
347439d628a0SDimitry Andric       PGO.emitEmptyCounterMapping(D, getMangledName(GD),
347539d628a0SDimitry Andric                                   getFunctionLinkage(GD));
347639d628a0SDimitry Andric       break;
347739d628a0SDimitry Andric     }
347839d628a0SDimitry Andric     default:
347939d628a0SDimitry Andric       break;
348039d628a0SDimitry Andric     };
3481f22ef01cSRoman Divacky   }
3482f22ef01cSRoman Divacky }
3483ffd1746dSEd Schouten 
3484ffd1746dSEd Schouten /// Turns the given pointer into a constant.
3485ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context,
3486ffd1746dSEd Schouten                                           const void *Ptr) {
3487ffd1746dSEd Schouten   uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr);
34886122f3e6SDimitry Andric   llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
3489ffd1746dSEd Schouten   return llvm::ConstantInt::get(i64, PtrInt);
3490ffd1746dSEd Schouten }
3491ffd1746dSEd Schouten 
3492ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
3493ffd1746dSEd Schouten                                    llvm::NamedMDNode *&GlobalMetadata,
3494ffd1746dSEd Schouten                                    GlobalDecl D,
3495ffd1746dSEd Schouten                                    llvm::GlobalValue *Addr) {
3496ffd1746dSEd Schouten   if (!GlobalMetadata)
3497ffd1746dSEd Schouten     GlobalMetadata =
3498ffd1746dSEd Schouten       CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
3499ffd1746dSEd Schouten 
3500ffd1746dSEd Schouten   // TODO: should we report variant information for ctors/dtors?
350139d628a0SDimitry Andric   llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
350239d628a0SDimitry Andric                            llvm::ConstantAsMetadata::get(GetPointerConstant(
350339d628a0SDimitry Andric                                CGM.getLLVMContext(), D.getDecl()))};
35043b0f4066SDimitry Andric   GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
3505ffd1746dSEd Schouten }
3506ffd1746dSEd Schouten 
3507284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked
3508284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled
3509284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer
3510284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the
3511284c1978SDimitry Andric /// same translation unit.
3512284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() {
3513284c1978SDimitry Andric   for (StaticExternCMap::iterator I = StaticExternCValues.begin(),
3514284c1978SDimitry Andric                                   E = StaticExternCValues.end();
3515284c1978SDimitry Andric        I != E; ++I) {
3516284c1978SDimitry Andric     IdentifierInfo *Name = I->first;
3517284c1978SDimitry Andric     llvm::GlobalValue *Val = I->second;
3518284c1978SDimitry Andric     if (Val && !getModule().getNamedValue(Name->getName()))
351959d1ed5bSDimitry Andric       addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val));
3520284c1978SDimitry Andric   }
3521284c1978SDimitry Andric }
3522284c1978SDimitry Andric 
352359d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName,
352459d1ed5bSDimitry Andric                                              GlobalDecl &Result) const {
352559d1ed5bSDimitry Andric   auto Res = Manglings.find(MangledName);
352659d1ed5bSDimitry Andric   if (Res == Manglings.end())
352759d1ed5bSDimitry Andric     return false;
352859d1ed5bSDimitry Andric   Result = Res->getValue();
352959d1ed5bSDimitry Andric   return true;
353059d1ed5bSDimitry Andric }
353159d1ed5bSDimitry Andric 
3532ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the
3533ffd1746dSEd Schouten /// current module with the Decls they came from.  This is useful for
3534ffd1746dSEd Schouten /// projects using IR gen as a subroutine.
3535ffd1746dSEd Schouten ///
3536ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly
3537ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata
3538ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'.
3539ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() {
354059d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3541ffd1746dSEd Schouten 
3542ffd1746dSEd Schouten   // StaticLocalDeclMap
354359d1ed5bSDimitry Andric   for (auto &I : MangledDeclNames) {
354459d1ed5bSDimitry Andric     llvm::GlobalValue *Addr = getModule().getNamedValue(I.second);
354559d1ed5bSDimitry Andric     EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr);
3546ffd1746dSEd Schouten   }
3547ffd1746dSEd Schouten }
3548ffd1746dSEd Schouten 
3549ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current
3550ffd1746dSEd Schouten /// function.
3551ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() {
3552ffd1746dSEd Schouten   if (LocalDeclMap.empty()) return;
3553ffd1746dSEd Schouten 
3554ffd1746dSEd Schouten   llvm::LLVMContext &Context = getLLVMContext();
3555ffd1746dSEd Schouten 
3556ffd1746dSEd Schouten   // Find the unique metadata ID for this name.
3557ffd1746dSEd Schouten   unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr");
3558ffd1746dSEd Schouten 
355959d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3560ffd1746dSEd Schouten 
356159d1ed5bSDimitry Andric   for (auto &I : LocalDeclMap) {
356259d1ed5bSDimitry Andric     const Decl *D = I.first;
356359d1ed5bSDimitry Andric     llvm::Value *Addr = I.second;
356459d1ed5bSDimitry Andric     if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
3565ffd1746dSEd Schouten       llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D);
356639d628a0SDimitry Andric       Alloca->setMetadata(
356739d628a0SDimitry Andric           DeclPtrKind, llvm::MDNode::get(
356839d628a0SDimitry Andric                            Context, llvm::ValueAsMetadata::getConstant(DAddr)));
356959d1ed5bSDimitry Andric     } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
3570ffd1746dSEd Schouten       GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
3571ffd1746dSEd Schouten       EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
3572ffd1746dSEd Schouten     }
3573ffd1746dSEd Schouten   }
3574ffd1746dSEd Schouten }
3575e580952dSDimitry Andric 
3576f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() {
3577f785676fSDimitry Andric   llvm::NamedMDNode *IdentMetadata =
3578f785676fSDimitry Andric     TheModule.getOrInsertNamedMetadata("llvm.ident");
3579f785676fSDimitry Andric   std::string Version = getClangFullVersion();
3580f785676fSDimitry Andric   llvm::LLVMContext &Ctx = TheModule.getContext();
3581f785676fSDimitry Andric 
358239d628a0SDimitry Andric   llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx, Version)};
3583f785676fSDimitry Andric   IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
3584f785676fSDimitry Andric }
3585f785676fSDimitry Andric 
358659d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() {
358739d628a0SDimitry Andric   // Warning, new MangledDeclNames may be appended within this loop.
358839d628a0SDimitry Andric   // We rely on MapVector insertions adding new elements to the end
358939d628a0SDimitry Andric   // of the container.
359039d628a0SDimitry Andric   // FIXME: Move this loop into the one target that needs it, and only
359139d628a0SDimitry Andric   // loop over those declarations for which we couldn't emit the target
359239d628a0SDimitry Andric   // metadata when we emitted the declaration.
359339d628a0SDimitry Andric   for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
359439d628a0SDimitry Andric     auto Val = *(MangledDeclNames.begin() + I);
359539d628a0SDimitry Andric     const Decl *D = Val.first.getDecl()->getMostRecentDecl();
359639d628a0SDimitry Andric     llvm::GlobalValue *GV = GetGlobalValue(Val.second);
359759d1ed5bSDimitry Andric     getTargetCodeGenInfo().emitTargetMD(D, GV, *this);
359859d1ed5bSDimitry Andric   }
359959d1ed5bSDimitry Andric }
360059d1ed5bSDimitry Andric 
3601bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() {
3602bd5abe19SDimitry Andric   if (!getCodeGenOpts().CoverageFile.empty()) {
3603bd5abe19SDimitry Andric     if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
3604bd5abe19SDimitry Andric       llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov");
3605bd5abe19SDimitry Andric       llvm::LLVMContext &Ctx = TheModule.getContext();
3606bd5abe19SDimitry Andric       llvm::MDString *CoverageFile =
3607bd5abe19SDimitry Andric           llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile);
3608bd5abe19SDimitry Andric       for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
3609bd5abe19SDimitry Andric         llvm::MDNode *CU = CUNode->getOperand(i);
361039d628a0SDimitry Andric         llvm::Metadata *Elts[] = {CoverageFile, CU};
361139d628a0SDimitry Andric         GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
3612bd5abe19SDimitry Andric       }
3613bd5abe19SDimitry Andric     }
3614bd5abe19SDimitry Andric   }
3615bd5abe19SDimitry Andric }
36163861d79fSDimitry Andric 
361739d628a0SDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) {
36183861d79fSDimitry Andric   // Sema has checked that all uuid strings are of the form
36193861d79fSDimitry Andric   // "12345678-1234-1234-1234-1234567890ab".
36203861d79fSDimitry Andric   assert(Uuid.size() == 36);
3621f785676fSDimitry Andric   for (unsigned i = 0; i < 36; ++i) {
3622f785676fSDimitry Andric     if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-');
3623f785676fSDimitry Andric     else                                         assert(isHexDigit(Uuid[i]));
36243861d79fSDimitry Andric   }
36253861d79fSDimitry Andric 
362639d628a0SDimitry Andric   // The starts of all bytes of Field3 in Uuid. Field 3 is "1234-1234567890ab".
3627f785676fSDimitry Andric   const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 };
36283861d79fSDimitry Andric 
3629f785676fSDimitry Andric   llvm::Constant *Field3[8];
3630f785676fSDimitry Andric   for (unsigned Idx = 0; Idx < 8; ++Idx)
3631f785676fSDimitry Andric     Field3[Idx] = llvm::ConstantInt::get(
3632f785676fSDimitry Andric         Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16);
36333861d79fSDimitry Andric 
3634f785676fSDimitry Andric   llvm::Constant *Fields[4] = {
3635f785676fSDimitry Andric     llvm::ConstantInt::get(Int32Ty, Uuid.substr(0,  8), 16),
3636f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(9,  4), 16),
3637f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16),
3638f785676fSDimitry Andric     llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3)
3639f785676fSDimitry Andric   };
3640f785676fSDimitry Andric 
3641f785676fSDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
36423861d79fSDimitry Andric }
364359d1ed5bSDimitry Andric 
364433956c43SDimitry Andric llvm::Constant *
364533956c43SDimitry Andric CodeGenModule::getAddrOfCXXCatchHandlerType(QualType Ty,
364633956c43SDimitry Andric                                             QualType CatchHandlerType) {
364733956c43SDimitry Andric   return getCXXABI().getAddrOfCXXCatchHandlerType(Ty, CatchHandlerType);
364833956c43SDimitry Andric }
364933956c43SDimitry Andric 
365059d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty,
365159d1ed5bSDimitry Andric                                                        bool ForEH) {
365259d1ed5bSDimitry Andric   // Return a bogus pointer if RTTI is disabled, unless it's for EH.
365359d1ed5bSDimitry Andric   // FIXME: should we even be calling this method if RTTI is disabled
365459d1ed5bSDimitry Andric   // and it's not for EH?
365559d1ed5bSDimitry Andric   if (!ForEH && !getLangOpts().RTTI)
365659d1ed5bSDimitry Andric     return llvm::Constant::getNullValue(Int8PtrTy);
365759d1ed5bSDimitry Andric 
365859d1ed5bSDimitry Andric   if (ForEH && Ty->isObjCObjectPointerType() &&
365959d1ed5bSDimitry Andric       LangOpts.ObjCRuntime.isGNUFamily())
366059d1ed5bSDimitry Andric     return ObjCRuntime->GetEHType(Ty);
366159d1ed5bSDimitry Andric 
366259d1ed5bSDimitry Andric   return getCXXABI().getAddrOfRTTIDescriptor(Ty);
366359d1ed5bSDimitry Andric }
366459d1ed5bSDimitry Andric 
366539d628a0SDimitry Andric void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
366639d628a0SDimitry Andric   for (auto RefExpr : D->varlists()) {
366739d628a0SDimitry Andric     auto *VD = cast<VarDecl>(cast<DeclRefExpr>(RefExpr)->getDecl());
366839d628a0SDimitry Andric     bool PerformInit =
366939d628a0SDimitry Andric         VD->getAnyInitializer() &&
367039d628a0SDimitry Andric         !VD->getAnyInitializer()->isConstantInitializer(getContext(),
367139d628a0SDimitry Andric                                                         /*ForRef=*/false);
367233956c43SDimitry Andric     if (auto InitFunction = getOpenMPRuntime().emitThreadPrivateVarDefinition(
367333956c43SDimitry Andric             VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(), PerformInit))
367439d628a0SDimitry Andric       CXXGlobalInits.push_back(InitFunction);
367539d628a0SDimitry Andric   }
367639d628a0SDimitry Andric }
3677