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"
25f22ef01cSRoman Divacky #include "TargetInfo.h"
26f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h"
27f22ef01cSRoman Divacky #include "clang/AST/CharUnits.h"
28f22ef01cSRoman Divacky #include "clang/AST/DeclCXX.h"
29139f7f9bSDimitry Andric #include "clang/AST/DeclObjC.h"
30ffd1746dSEd Schouten #include "clang/AST/DeclTemplate.h"
312754fe60SDimitry Andric #include "clang/AST/Mangle.h"
32f22ef01cSRoman Divacky #include "clang/AST/RecordLayout.h"
33f8254f43SDimitry Andric #include "clang/AST/RecursiveASTVisitor.h"
34dff0c46cSDimitry Andric #include "clang/Basic/Builtins.h"
35139f7f9bSDimitry Andric #include "clang/Basic/CharInfo.h"
36f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h"
37139f7f9bSDimitry Andric #include "clang/Basic/Module.h"
38f22ef01cSRoman Divacky #include "clang/Basic/SourceManager.h"
39f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h"
40f785676fSDimitry Andric #include "clang/Basic/Version.h"
41139f7f9bSDimitry Andric #include "clang/Frontend/CodeGenOptions.h"
42f785676fSDimitry Andric #include "clang/Sema/SemaDiagnostic.h"
43dff0c46cSDimitry Andric #include "llvm/ADT/APSInt.h"
44f22ef01cSRoman Divacky #include "llvm/ADT/Triple.h"
4559d1ed5bSDimitry Andric #include "llvm/IR/CallSite.h"
46139f7f9bSDimitry Andric #include "llvm/IR/CallingConv.h"
47139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h"
48139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h"
49139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h"
50139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
5159d1ed5bSDimitry Andric #include "llvm/ProfileData/InstrProfReader.h"
52139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h"
53f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
54139f7f9bSDimitry Andric 
55f22ef01cSRoman Divacky using namespace clang;
56f22ef01cSRoman Divacky using namespace CodeGen;
57f22ef01cSRoman Divacky 
586122f3e6SDimitry Andric static const char AnnotationSection[] = "llvm.metadata";
596122f3e6SDimitry Andric 
6059d1ed5bSDimitry Andric static CGCXXABI *createCXXABI(CodeGenModule &CGM) {
61284c1978SDimitry Andric   switch (CGM.getTarget().getCXXABI().getKind()) {
62139f7f9bSDimitry Andric   case TargetCXXABI::GenericAArch64:
63139f7f9bSDimitry Andric   case TargetCXXABI::GenericARM:
64139f7f9bSDimitry Andric   case TargetCXXABI::iOS:
6559d1ed5bSDimitry Andric   case TargetCXXABI::iOS64:
66139f7f9bSDimitry Andric   case TargetCXXABI::GenericItanium:
6759d1ed5bSDimitry Andric     return CreateItaniumCXXABI(CGM);
68139f7f9bSDimitry Andric   case TargetCXXABI::Microsoft:
6959d1ed5bSDimitry Andric     return CreateMicrosoftCXXABI(CGM);
70e580952dSDimitry Andric   }
71e580952dSDimitry Andric 
72e580952dSDimitry Andric   llvm_unreachable("invalid C++ ABI kind");
73e580952dSDimitry Andric }
74e580952dSDimitry Andric 
75f22ef01cSRoman Divacky CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
76284c1978SDimitry Andric                              llvm::Module &M, const llvm::DataLayout &TD,
776122f3e6SDimitry Andric                              DiagnosticsEngine &diags)
78284c1978SDimitry Andric     : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M),
79284c1978SDimitry Andric       Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()),
8059d1ed5bSDimitry Andric       ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(nullptr),
8159d1ed5bSDimitry Andric       TheTargetCodeGenInfo(nullptr), Types(*this), VTables(*this),
8259d1ed5bSDimitry Andric       ObjCRuntime(nullptr), OpenCLRuntime(nullptr), OpenMPRuntime(nullptr),
8359d1ed5bSDimitry Andric       CUDARuntime(nullptr), DebugInfo(nullptr), ARCData(nullptr),
8459d1ed5bSDimitry Andric       NoObjCARCExceptionsMetadata(nullptr), RRData(nullptr), PGOReader(nullptr),
8559d1ed5bSDimitry Andric       CFConstantStringClassRef(nullptr), ConstantStringClassRef(nullptr),
8659d1ed5bSDimitry Andric       NSConstantStringType(nullptr), NSConcreteGlobalBlock(nullptr),
8759d1ed5bSDimitry Andric       NSConcreteStackBlock(nullptr), BlockObjectAssign(nullptr),
8859d1ed5bSDimitry Andric       BlockObjectDispose(nullptr), BlockDescriptorType(nullptr),
8959d1ed5bSDimitry Andric       GenericBlockLiteralType(nullptr), LifetimeStartFn(nullptr),
9059d1ed5bSDimitry Andric       LifetimeEndFn(nullptr), SanitizerBL(llvm::SpecialCaseList::createOrDie(
9159d1ed5bSDimitry Andric                                   CGO.SanitizerBlacklistFile)) {
92dff0c46cSDimitry Andric 
93dff0c46cSDimitry Andric   // Initialize the type cache.
94dff0c46cSDimitry Andric   llvm::LLVMContext &LLVMContext = M.getContext();
95dff0c46cSDimitry Andric   VoidTy = llvm::Type::getVoidTy(LLVMContext);
96dff0c46cSDimitry Andric   Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
97dff0c46cSDimitry Andric   Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
98dff0c46cSDimitry Andric   Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
99dff0c46cSDimitry Andric   Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
100dff0c46cSDimitry Andric   FloatTy = llvm::Type::getFloatTy(LLVMContext);
101dff0c46cSDimitry Andric   DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
102dff0c46cSDimitry Andric   PointerWidthInBits = C.getTargetInfo().getPointerWidth(0);
103dff0c46cSDimitry Andric   PointerAlignInBytes =
104dff0c46cSDimitry Andric   C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity();
105dff0c46cSDimitry Andric   IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth());
106dff0c46cSDimitry Andric   IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits);
107dff0c46cSDimitry Andric   Int8PtrTy = Int8Ty->getPointerTo(0);
108dff0c46cSDimitry Andric   Int8PtrPtrTy = Int8PtrTy->getPointerTo(0);
109dff0c46cSDimitry Andric 
110139f7f9bSDimitry Andric   RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC();
111139f7f9bSDimitry Andric 
112dff0c46cSDimitry Andric   if (LangOpts.ObjC1)
1133b0f4066SDimitry Andric     createObjCRuntime();
114dff0c46cSDimitry Andric   if (LangOpts.OpenCL)
1156122f3e6SDimitry Andric     createOpenCLRuntime();
11659d1ed5bSDimitry Andric   if (LangOpts.OpenMP)
11759d1ed5bSDimitry Andric     createOpenMPRuntime();
118dff0c46cSDimitry Andric   if (LangOpts.CUDA)
1196122f3e6SDimitry Andric     createCUDARuntime();
120f22ef01cSRoman Divacky 
1217ae0e2c9SDimitry Andric   // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0.
12259d1ed5bSDimitry Andric   if (LangOpts.Sanitize.Thread ||
1237ae0e2c9SDimitry Andric       (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
1247ae0e2c9SDimitry Andric     TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(),
12559d1ed5bSDimitry Andric                            getCXXABI().getMangleContext());
1262754fe60SDimitry Andric 
1273b0f4066SDimitry Andric   // If debug info or coverage generation is enabled, create the CGDebugInfo
1283b0f4066SDimitry Andric   // object.
1293861d79fSDimitry Andric   if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo ||
1307ae0e2c9SDimitry Andric       CodeGenOpts.EmitGcovArcs ||
1313b0f4066SDimitry Andric       CodeGenOpts.EmitGcovNotes)
1323b0f4066SDimitry Andric     DebugInfo = new CGDebugInfo(*this);
1332754fe60SDimitry Andric 
1342754fe60SDimitry Andric   Block.GlobalUniqueCount = 0;
1352754fe60SDimitry Andric 
136dff0c46cSDimitry Andric   if (C.getLangOpts().ObjCAutoRefCount)
13717a519f9SDimitry Andric     ARCData = new ARCEntrypoints();
13817a519f9SDimitry Andric   RRData = new RREntrypoints();
13959d1ed5bSDimitry Andric 
14059d1ed5bSDimitry Andric   if (!CodeGenOpts.InstrProfileInput.empty()) {
14159d1ed5bSDimitry Andric     if (std::error_code EC = llvm::IndexedInstrProfReader::create(
14259d1ed5bSDimitry Andric             CodeGenOpts.InstrProfileInput, PGOReader)) {
14359d1ed5bSDimitry Andric       unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
14459d1ed5bSDimitry Andric                                               "Could not read profile: %0");
14559d1ed5bSDimitry Andric       getDiags().Report(DiagID) << EC.message();
14659d1ed5bSDimitry Andric     }
14759d1ed5bSDimitry Andric   }
148f22ef01cSRoman Divacky }
149f22ef01cSRoman Divacky 
150f22ef01cSRoman Divacky CodeGenModule::~CodeGenModule() {
1516122f3e6SDimitry Andric   delete ObjCRuntime;
1526122f3e6SDimitry Andric   delete OpenCLRuntime;
15359d1ed5bSDimitry Andric   delete OpenMPRuntime;
1546122f3e6SDimitry Andric   delete CUDARuntime;
1556122f3e6SDimitry Andric   delete TheTargetCodeGenInfo;
1562754fe60SDimitry Andric   delete TBAA;
157f22ef01cSRoman Divacky   delete DebugInfo;
15817a519f9SDimitry Andric   delete ARCData;
15917a519f9SDimitry Andric   delete RRData;
160f22ef01cSRoman Divacky }
161f22ef01cSRoman Divacky 
162f22ef01cSRoman Divacky void CodeGenModule::createObjCRuntime() {
1637ae0e2c9SDimitry Andric   // This is just isGNUFamily(), but we want to force implementors of
1647ae0e2c9SDimitry Andric   // new ABIs to decide how best to do this.
1657ae0e2c9SDimitry Andric   switch (LangOpts.ObjCRuntime.getKind()) {
1667ae0e2c9SDimitry Andric   case ObjCRuntime::GNUstep:
1677ae0e2c9SDimitry Andric   case ObjCRuntime::GCC:
1687ae0e2c9SDimitry Andric   case ObjCRuntime::ObjFW:
1696122f3e6SDimitry Andric     ObjCRuntime = CreateGNUObjCRuntime(*this);
1707ae0e2c9SDimitry Andric     return;
1717ae0e2c9SDimitry Andric 
1727ae0e2c9SDimitry Andric   case ObjCRuntime::FragileMacOSX:
1737ae0e2c9SDimitry Andric   case ObjCRuntime::MacOSX:
1747ae0e2c9SDimitry Andric   case ObjCRuntime::iOS:
1756122f3e6SDimitry Andric     ObjCRuntime = CreateMacObjCRuntime(*this);
1767ae0e2c9SDimitry Andric     return;
1777ae0e2c9SDimitry Andric   }
1787ae0e2c9SDimitry Andric   llvm_unreachable("bad runtime kind");
1796122f3e6SDimitry Andric }
1806122f3e6SDimitry Andric 
1816122f3e6SDimitry Andric void CodeGenModule::createOpenCLRuntime() {
1826122f3e6SDimitry Andric   OpenCLRuntime = new CGOpenCLRuntime(*this);
1836122f3e6SDimitry Andric }
1846122f3e6SDimitry Andric 
18559d1ed5bSDimitry Andric void CodeGenModule::createOpenMPRuntime() {
18659d1ed5bSDimitry Andric   OpenMPRuntime = new CGOpenMPRuntime(*this);
18759d1ed5bSDimitry Andric }
18859d1ed5bSDimitry Andric 
1896122f3e6SDimitry Andric void CodeGenModule::createCUDARuntime() {
1906122f3e6SDimitry Andric   CUDARuntime = CreateNVCUDARuntime(*this);
191f22ef01cSRoman Divacky }
192f22ef01cSRoman Divacky 
193f785676fSDimitry Andric void CodeGenModule::applyReplacements() {
194f785676fSDimitry Andric   for (ReplacementsTy::iterator I = Replacements.begin(),
195f785676fSDimitry Andric                                 E = Replacements.end();
196f785676fSDimitry Andric        I != E; ++I) {
197f785676fSDimitry Andric     StringRef MangledName = I->first();
198f785676fSDimitry Andric     llvm::Constant *Replacement = I->second;
199f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
200f785676fSDimitry Andric     if (!Entry)
201f785676fSDimitry Andric       continue;
20259d1ed5bSDimitry Andric     auto *OldF = cast<llvm::Function>(Entry);
20359d1ed5bSDimitry Andric     auto *NewF = dyn_cast<llvm::Function>(Replacement);
204f785676fSDimitry Andric     if (!NewF) {
20559d1ed5bSDimitry Andric       if (auto *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) {
20659d1ed5bSDimitry Andric         NewF = dyn_cast<llvm::Function>(Alias->getAliasee());
20759d1ed5bSDimitry Andric       } else {
20859d1ed5bSDimitry Andric         auto *CE = cast<llvm::ConstantExpr>(Replacement);
209f785676fSDimitry Andric         assert(CE->getOpcode() == llvm::Instruction::BitCast ||
210f785676fSDimitry Andric                CE->getOpcode() == llvm::Instruction::GetElementPtr);
211f785676fSDimitry Andric         NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
212f785676fSDimitry Andric       }
21359d1ed5bSDimitry Andric     }
214f785676fSDimitry Andric 
215f785676fSDimitry Andric     // Replace old with new, but keep the old order.
216f785676fSDimitry Andric     OldF->replaceAllUsesWith(Replacement);
217f785676fSDimitry Andric     if (NewF) {
218f785676fSDimitry Andric       NewF->removeFromParent();
219f785676fSDimitry Andric       OldF->getParent()->getFunctionList().insertAfter(OldF, NewF);
220f785676fSDimitry Andric     }
221f785676fSDimitry Andric     OldF->eraseFromParent();
222f785676fSDimitry Andric   }
223f785676fSDimitry Andric }
224f785676fSDimitry Andric 
22559d1ed5bSDimitry Andric // This is only used in aliases that we created and we know they have a
22659d1ed5bSDimitry Andric // linear structure.
22759d1ed5bSDimitry Andric static const llvm::GlobalObject *getAliasedGlobal(const llvm::GlobalAlias &GA) {
22859d1ed5bSDimitry Andric   llvm::SmallPtrSet<const llvm::GlobalAlias*, 4> Visited;
22959d1ed5bSDimitry Andric   const llvm::Constant *C = &GA;
23059d1ed5bSDimitry Andric   for (;;) {
23159d1ed5bSDimitry Andric     C = C->stripPointerCasts();
23259d1ed5bSDimitry Andric     if (auto *GO = dyn_cast<llvm::GlobalObject>(C))
23359d1ed5bSDimitry Andric       return GO;
23459d1ed5bSDimitry Andric     // stripPointerCasts will not walk over weak aliases.
23559d1ed5bSDimitry Andric     auto *GA2 = dyn_cast<llvm::GlobalAlias>(C);
23659d1ed5bSDimitry Andric     if (!GA2)
23759d1ed5bSDimitry Andric       return nullptr;
23859d1ed5bSDimitry Andric     if (!Visited.insert(GA2))
23959d1ed5bSDimitry Andric       return nullptr;
24059d1ed5bSDimitry Andric     C = GA2->getAliasee();
24159d1ed5bSDimitry Andric   }
24259d1ed5bSDimitry Andric }
24359d1ed5bSDimitry Andric 
244f785676fSDimitry Andric void CodeGenModule::checkAliases() {
24559d1ed5bSDimitry Andric   // Check if the constructed aliases are well formed. It is really unfortunate
24659d1ed5bSDimitry Andric   // that we have to do this in CodeGen, but we only construct mangled names
24759d1ed5bSDimitry Andric   // and aliases during codegen.
248f785676fSDimitry Andric   bool Error = false;
24959d1ed5bSDimitry Andric   DiagnosticsEngine &Diags = getDiags();
250f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
251f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
252f785676fSDimitry Andric     const GlobalDecl &GD = *I;
25359d1ed5bSDimitry Andric     const auto *D = cast<ValueDecl>(GD.getDecl());
254f785676fSDimitry Andric     const AliasAttr *AA = D->getAttr<AliasAttr>();
255f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
256f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
25759d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
25859d1ed5bSDimitry Andric     const llvm::GlobalValue *GV = getAliasedGlobal(*Alias);
25959d1ed5bSDimitry Andric     if (!GV) {
260f785676fSDimitry Andric       Error = true;
26159d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
26259d1ed5bSDimitry Andric     } else if (GV->isDeclaration()) {
263f785676fSDimitry Andric       Error = true;
26459d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_alias_to_undefined);
26559d1ed5bSDimitry Andric     }
26659d1ed5bSDimitry Andric 
26759d1ed5bSDimitry Andric     llvm::Constant *Aliasee = Alias->getAliasee();
26859d1ed5bSDimitry Andric     llvm::GlobalValue *AliaseeGV;
26959d1ed5bSDimitry Andric     if (auto CE = dyn_cast<llvm::ConstantExpr>(Aliasee))
27059d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(CE->getOperand(0));
27159d1ed5bSDimitry Andric     else
27259d1ed5bSDimitry Andric       AliaseeGV = cast<llvm::GlobalValue>(Aliasee);
27359d1ed5bSDimitry Andric 
27459d1ed5bSDimitry Andric     if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
27559d1ed5bSDimitry Andric       StringRef AliasSection = SA->getName();
27659d1ed5bSDimitry Andric       if (AliasSection != AliaseeGV->getSection())
27759d1ed5bSDimitry Andric         Diags.Report(SA->getLocation(), diag::warn_alias_with_section)
27859d1ed5bSDimitry Andric             << AliasSection;
27959d1ed5bSDimitry Andric     }
28059d1ed5bSDimitry Andric 
28159d1ed5bSDimitry Andric     // We have to handle alias to weak aliases in here. LLVM itself disallows
28259d1ed5bSDimitry Andric     // this since the object semantics would not match the IL one. For
28359d1ed5bSDimitry Andric     // compatibility with gcc we implement it by just pointing the alias
28459d1ed5bSDimitry Andric     // to its aliasee's aliasee. We also warn, since the user is probably
28559d1ed5bSDimitry Andric     // expecting the link to be weak.
28659d1ed5bSDimitry Andric     if (auto GA = dyn_cast<llvm::GlobalAlias>(AliaseeGV)) {
28759d1ed5bSDimitry Andric       if (GA->mayBeOverridden()) {
28859d1ed5bSDimitry Andric         Diags.Report(AA->getLocation(), diag::warn_alias_to_weak_alias)
28959d1ed5bSDimitry Andric             << GV->getName() << GA->getName();
29059d1ed5bSDimitry Andric         Aliasee = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
29159d1ed5bSDimitry Andric             GA->getAliasee(), Alias->getType());
29259d1ed5bSDimitry Andric         Alias->setAliasee(Aliasee);
29359d1ed5bSDimitry Andric       }
294f785676fSDimitry Andric     }
295f785676fSDimitry Andric   }
296f785676fSDimitry Andric   if (!Error)
297f785676fSDimitry Andric     return;
298f785676fSDimitry Andric 
299f785676fSDimitry Andric   for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
300f785676fSDimitry Andric          E = Aliases.end(); I != E; ++I) {
301f785676fSDimitry Andric     const GlobalDecl &GD = *I;
302f785676fSDimitry Andric     StringRef MangledName = getMangledName(GD);
303f785676fSDimitry Andric     llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
30459d1ed5bSDimitry Andric     auto *Alias = cast<llvm::GlobalAlias>(Entry);
305f785676fSDimitry Andric     Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
306f785676fSDimitry Andric     Alias->eraseFromParent();
307f785676fSDimitry Andric   }
308f785676fSDimitry Andric }
309f785676fSDimitry Andric 
31059d1ed5bSDimitry Andric void CodeGenModule::clear() {
31159d1ed5bSDimitry Andric   DeferredDeclsToEmit.clear();
31259d1ed5bSDimitry Andric }
31359d1ed5bSDimitry Andric 
31459d1ed5bSDimitry Andric void InstrProfStats::reportDiagnostics(DiagnosticsEngine &Diags,
31559d1ed5bSDimitry Andric                                        StringRef MainFile) {
31659d1ed5bSDimitry Andric   if (!hasDiagnostics())
31759d1ed5bSDimitry Andric     return;
31859d1ed5bSDimitry Andric   if (VisitedInMainFile > 0 && VisitedInMainFile == MissingInMainFile) {
31959d1ed5bSDimitry Andric     if (MainFile.empty())
32059d1ed5bSDimitry Andric       MainFile = "<stdin>";
32159d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_unprofiled) << MainFile;
32259d1ed5bSDimitry Andric   } else
32359d1ed5bSDimitry Andric     Diags.Report(diag::warn_profile_data_out_of_date) << Visited << Missing
32459d1ed5bSDimitry Andric                                                       << Mismatched;
32559d1ed5bSDimitry Andric }
32659d1ed5bSDimitry Andric 
327f22ef01cSRoman Divacky void CodeGenModule::Release() {
328f22ef01cSRoman Divacky   EmitDeferred();
329f785676fSDimitry Andric   applyReplacements();
330f785676fSDimitry Andric   checkAliases();
331f22ef01cSRoman Divacky   EmitCXXGlobalInitFunc();
332f22ef01cSRoman Divacky   EmitCXXGlobalDtorFunc();
333284c1978SDimitry Andric   EmitCXXThreadLocalInitFunc();
3346122f3e6SDimitry Andric   if (ObjCRuntime)
3356122f3e6SDimitry Andric     if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
336f22ef01cSRoman Divacky       AddGlobalCtor(ObjCInitFunction);
33759d1ed5bSDimitry Andric   if (getCodeGenOpts().ProfileInstrGenerate)
33859d1ed5bSDimitry Andric     if (llvm::Function *PGOInit = CodeGenPGO::emitInitialization(*this))
33959d1ed5bSDimitry Andric       AddGlobalCtor(PGOInit, 0);
34059d1ed5bSDimitry Andric   if (PGOReader && PGOStats.hasDiagnostics())
34159d1ed5bSDimitry Andric     PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName);
342f22ef01cSRoman Divacky   EmitCtorList(GlobalCtors, "llvm.global_ctors");
343f22ef01cSRoman Divacky   EmitCtorList(GlobalDtors, "llvm.global_dtors");
3446122f3e6SDimitry Andric   EmitGlobalAnnotations();
345284c1978SDimitry Andric   EmitStaticExternCAliases();
34659d1ed5bSDimitry Andric   emitLLVMUsed();
347ffd1746dSEd Schouten 
348f785676fSDimitry Andric   if (CodeGenOpts.Autolink &&
349f785676fSDimitry Andric       (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
350139f7f9bSDimitry Andric     EmitModuleLinkOptions();
351139f7f9bSDimitry Andric   }
352f785676fSDimitry Andric   if (CodeGenOpts.DwarfVersion)
353f785676fSDimitry Andric     // We actually want the latest version when there are conflicts.
354f785676fSDimitry Andric     // We can change from Warning to Latest if such mode is supported.
355f785676fSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
356f785676fSDimitry Andric                               CodeGenOpts.DwarfVersion);
357f785676fSDimitry Andric   if (DebugInfo)
35859d1ed5bSDimitry Andric     // We support a single version in the linked module. The LLVM
35959d1ed5bSDimitry Andric     // parser will drop debug info with a different version number
36059d1ed5bSDimitry Andric     // (and warn about it, too).
36159d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Warning, "Debug Info Version",
362f785676fSDimitry Andric                               llvm::DEBUG_METADATA_VERSION);
363139f7f9bSDimitry Andric 
36459d1ed5bSDimitry Andric   // We need to record the widths of enums and wchar_t, so that we can generate
36559d1ed5bSDimitry Andric   // the correct build attributes in the ARM backend.
36659d1ed5bSDimitry Andric   llvm::Triple::ArchType Arch = Context.getTargetInfo().getTriple().getArch();
36759d1ed5bSDimitry Andric   if (   Arch == llvm::Triple::arm
36859d1ed5bSDimitry Andric       || Arch == llvm::Triple::armeb
36959d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumb
37059d1ed5bSDimitry Andric       || Arch == llvm::Triple::thumbeb) {
37159d1ed5bSDimitry Andric     // Width of wchar_t in bytes
37259d1ed5bSDimitry Andric     uint64_t WCharWidth =
37359d1ed5bSDimitry Andric         Context.getTypeSizeInChars(Context.getWideCharType()).getQuantity();
37459d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "wchar_size", WCharWidth);
37559d1ed5bSDimitry Andric 
37659d1ed5bSDimitry Andric     // The minimum width of an enum in bytes
37759d1ed5bSDimitry Andric     uint64_t EnumWidth = Context.getLangOpts().ShortEnums ? 1 : 4;
37859d1ed5bSDimitry Andric     getModule().addModuleFlag(llvm::Module::Error, "min_enum_size", EnumWidth);
37959d1ed5bSDimitry Andric   }
38059d1ed5bSDimitry Andric 
3812754fe60SDimitry Andric   SimplifyPersonality();
3822754fe60SDimitry Andric 
383ffd1746dSEd Schouten   if (getCodeGenOpts().EmitDeclMetadata)
384ffd1746dSEd Schouten     EmitDeclMetadata();
385bd5abe19SDimitry Andric 
386bd5abe19SDimitry Andric   if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
387bd5abe19SDimitry Andric     EmitCoverageFile();
3886122f3e6SDimitry Andric 
3896122f3e6SDimitry Andric   if (DebugInfo)
3906122f3e6SDimitry Andric     DebugInfo->finalize();
391f785676fSDimitry Andric 
392f785676fSDimitry Andric   EmitVersionIdentMetadata();
39359d1ed5bSDimitry Andric 
39459d1ed5bSDimitry Andric   EmitTargetMetadata();
395f22ef01cSRoman Divacky }
396f22ef01cSRoman Divacky 
3973b0f4066SDimitry Andric void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
3983b0f4066SDimitry Andric   // Make sure that this type is translated.
3993b0f4066SDimitry Andric   Types.UpdateCompletedType(TD);
4003b0f4066SDimitry Andric }
4013b0f4066SDimitry Andric 
4022754fe60SDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
4032754fe60SDimitry Andric   if (!TBAA)
40459d1ed5bSDimitry Andric     return nullptr;
4052754fe60SDimitry Andric   return TBAA->getTBAAInfo(QTy);
4062754fe60SDimitry Andric }
4072754fe60SDimitry Andric 
408dff0c46cSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
409dff0c46cSDimitry Andric   if (!TBAA)
41059d1ed5bSDimitry Andric     return nullptr;
411dff0c46cSDimitry Andric   return TBAA->getTBAAInfoForVTablePtr();
412dff0c46cSDimitry Andric }
413dff0c46cSDimitry Andric 
4143861d79fSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) {
4153861d79fSDimitry Andric   if (!TBAA)
41659d1ed5bSDimitry Andric     return nullptr;
4173861d79fSDimitry Andric   return TBAA->getTBAAStructInfo(QTy);
4183861d79fSDimitry Andric }
4193861d79fSDimitry Andric 
420139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
421139f7f9bSDimitry Andric   if (!TBAA)
42259d1ed5bSDimitry Andric     return nullptr;
423139f7f9bSDimitry Andric   return TBAA->getTBAAStructTypeInfo(QTy);
424139f7f9bSDimitry Andric }
425139f7f9bSDimitry Andric 
426139f7f9bSDimitry Andric llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
427139f7f9bSDimitry Andric                                                   llvm::MDNode *AccessN,
428139f7f9bSDimitry Andric                                                   uint64_t O) {
429139f7f9bSDimitry Andric   if (!TBAA)
43059d1ed5bSDimitry Andric     return nullptr;
431139f7f9bSDimitry Andric   return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
432139f7f9bSDimitry Andric }
433139f7f9bSDimitry Andric 
434f785676fSDimitry Andric /// Decorate the instruction with a TBAA tag. For both scalar TBAA
435f785676fSDimitry Andric /// and struct-path aware TBAA, the tag has the same format:
436f785676fSDimitry Andric /// base type, access type and offset.
437284c1978SDimitry Andric /// When ConvertTypeToTag is true, we create a tag based on the scalar type.
4382754fe60SDimitry Andric void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
439284c1978SDimitry Andric                                         llvm::MDNode *TBAAInfo,
440284c1978SDimitry Andric                                         bool ConvertTypeToTag) {
441f785676fSDimitry Andric   if (ConvertTypeToTag && TBAA)
442284c1978SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa,
443284c1978SDimitry Andric                       TBAA->getTBAAScalarTagInfo(TBAAInfo));
444284c1978SDimitry Andric   else
4452754fe60SDimitry Andric     Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
4462754fe60SDimitry Andric }
4472754fe60SDimitry Andric 
44859d1ed5bSDimitry Andric void CodeGenModule::Error(SourceLocation loc, StringRef message) {
44959d1ed5bSDimitry Andric   unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, "%0");
45059d1ed5bSDimitry Andric   getDiags().Report(Context.getFullLoc(loc), diagID) << message;
451f22ef01cSRoman Divacky }
452f22ef01cSRoman Divacky 
453f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
454f22ef01cSRoman Divacky /// specified stmt yet.
455f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
4566122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
457f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
458f22ef01cSRoman Divacky   std::string Msg = Type;
459f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
460f22ef01cSRoman Divacky     << Msg << S->getSourceRange();
461f22ef01cSRoman Divacky }
462f22ef01cSRoman Divacky 
463f22ef01cSRoman Divacky /// ErrorUnsupported - Print out an error that codegen doesn't support the
464f22ef01cSRoman Divacky /// specified decl yet.
465f785676fSDimitry Andric void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
4666122f3e6SDimitry Andric   unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
467f22ef01cSRoman Divacky                                                "cannot compile this %0 yet");
468f22ef01cSRoman Divacky   std::string Msg = Type;
469f22ef01cSRoman Divacky   getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
470f22ef01cSRoman Divacky }
471f22ef01cSRoman Divacky 
47217a519f9SDimitry Andric llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
47317a519f9SDimitry Andric   return llvm::ConstantInt::get(SizeTy, size.getQuantity());
47417a519f9SDimitry Andric }
47517a519f9SDimitry Andric 
476f22ef01cSRoman Divacky void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
4772754fe60SDimitry Andric                                         const NamedDecl *D) const {
478f22ef01cSRoman Divacky   // Internal definitions always have default visibility.
479f22ef01cSRoman Divacky   if (GV->hasLocalLinkage()) {
480f22ef01cSRoman Divacky     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
481f22ef01cSRoman Divacky     return;
482f22ef01cSRoman Divacky   }
483f22ef01cSRoman Divacky 
4842754fe60SDimitry Andric   // Set visibility for definitions.
485139f7f9bSDimitry Andric   LinkageInfo LV = D->getLinkageAndVisibility();
486139f7f9bSDimitry Andric   if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
487139f7f9bSDimitry Andric     GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
488f22ef01cSRoman Divacky }
489f22ef01cSRoman Divacky 
4907ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) {
4917ae0e2c9SDimitry Andric   return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
4927ae0e2c9SDimitry Andric       .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
4937ae0e2c9SDimitry Andric       .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
4947ae0e2c9SDimitry Andric       .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
4957ae0e2c9SDimitry Andric       .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel);
4967ae0e2c9SDimitry Andric }
4977ae0e2c9SDimitry Andric 
4987ae0e2c9SDimitry Andric static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(
4997ae0e2c9SDimitry Andric     CodeGenOptions::TLSModel M) {
5007ae0e2c9SDimitry Andric   switch (M) {
5017ae0e2c9SDimitry Andric   case CodeGenOptions::GeneralDynamicTLSModel:
5027ae0e2c9SDimitry Andric     return llvm::GlobalVariable::GeneralDynamicTLSModel;
5037ae0e2c9SDimitry Andric   case CodeGenOptions::LocalDynamicTLSModel:
5047ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalDynamicTLSModel;
5057ae0e2c9SDimitry Andric   case CodeGenOptions::InitialExecTLSModel:
5067ae0e2c9SDimitry Andric     return llvm::GlobalVariable::InitialExecTLSModel;
5077ae0e2c9SDimitry Andric   case CodeGenOptions::LocalExecTLSModel:
5087ae0e2c9SDimitry Andric     return llvm::GlobalVariable::LocalExecTLSModel;
5097ae0e2c9SDimitry Andric   }
5107ae0e2c9SDimitry Andric   llvm_unreachable("Invalid TLS model!");
5117ae0e2c9SDimitry Andric }
5127ae0e2c9SDimitry Andric 
5137ae0e2c9SDimitry Andric void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV,
5147ae0e2c9SDimitry Andric                                const VarDecl &D) const {
515284c1978SDimitry Andric   assert(D.getTLSKind() && "setting TLS mode on non-TLS var!");
5167ae0e2c9SDimitry Andric 
5177ae0e2c9SDimitry Andric   llvm::GlobalVariable::ThreadLocalMode TLM;
5183861d79fSDimitry Andric   TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
5197ae0e2c9SDimitry Andric 
5207ae0e2c9SDimitry Andric   // Override the TLS model if it is explicitly specified.
52159d1ed5bSDimitry Andric   if (const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>()) {
5227ae0e2c9SDimitry Andric     TLM = GetLLVMTLSModel(Attr->getModel());
5237ae0e2c9SDimitry Andric   }
5247ae0e2c9SDimitry Andric 
5257ae0e2c9SDimitry Andric   GV->setThreadLocalMode(TLM);
5267ae0e2c9SDimitry Andric }
5277ae0e2c9SDimitry Andric 
5286122f3e6SDimitry Andric StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
52959d1ed5bSDimitry Andric   StringRef &FoundStr = MangledDeclNames[GD.getCanonicalDecl()];
53059d1ed5bSDimitry Andric   if (!FoundStr.empty())
53159d1ed5bSDimitry Andric     return FoundStr;
532f22ef01cSRoman Divacky 
53359d1ed5bSDimitry Andric   const auto *ND = cast<NamedDecl>(GD.getDecl());
534dff0c46cSDimitry Andric   SmallString<256> Buffer;
53559d1ed5bSDimitry Andric   StringRef Str;
53659d1ed5bSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(ND)) {
5372754fe60SDimitry Andric     llvm::raw_svector_ostream Out(Buffer);
53859d1ed5bSDimitry Andric     if (const auto *D = dyn_cast<CXXConstructorDecl>(ND))
5392754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out);
54059d1ed5bSDimitry Andric     else if (const auto *D = dyn_cast<CXXDestructorDecl>(ND))
5412754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out);
542ffd1746dSEd Schouten     else
5432754fe60SDimitry Andric       getCXXABI().getMangleContext().mangleName(ND, Out);
54459d1ed5bSDimitry Andric     Str = Out.str();
54559d1ed5bSDimitry Andric   } else {
54659d1ed5bSDimitry Andric     IdentifierInfo *II = ND->getIdentifier();
54759d1ed5bSDimitry Andric     assert(II && "Attempt to mangle unnamed decl.");
54859d1ed5bSDimitry Andric     Str = II->getName();
549ffd1746dSEd Schouten   }
550ffd1746dSEd Schouten 
55159d1ed5bSDimitry Andric   auto &Mangled = Manglings.GetOrCreateValue(Str);
55259d1ed5bSDimitry Andric   Mangled.second = GD;
55359d1ed5bSDimitry Andric   return FoundStr = Mangled.first();
55459d1ed5bSDimitry Andric }
55559d1ed5bSDimitry Andric 
55659d1ed5bSDimitry Andric StringRef CodeGenModule::getBlockMangledName(GlobalDecl GD,
557ffd1746dSEd Schouten                                              const BlockDecl *BD) {
5582754fe60SDimitry Andric   MangleContext &MangleCtx = getCXXABI().getMangleContext();
5592754fe60SDimitry Andric   const Decl *D = GD.getDecl();
56059d1ed5bSDimitry Andric 
56159d1ed5bSDimitry Andric   SmallString<256> Buffer;
56259d1ed5bSDimitry Andric   llvm::raw_svector_ostream Out(Buffer);
56359d1ed5bSDimitry Andric   if (!D)
5647ae0e2c9SDimitry Andric     MangleCtx.mangleGlobalBlock(BD,
5657ae0e2c9SDimitry Andric       dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
56659d1ed5bSDimitry Andric   else if (const auto *CD = dyn_cast<CXXConstructorDecl>(D))
5672754fe60SDimitry Andric     MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out);
56859d1ed5bSDimitry Andric   else if (const auto *DD = dyn_cast<CXXDestructorDecl>(D))
5692754fe60SDimitry Andric     MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out);
5702754fe60SDimitry Andric   else
5712754fe60SDimitry Andric     MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out);
57259d1ed5bSDimitry Andric 
57359d1ed5bSDimitry Andric   auto &Mangled = Manglings.GetOrCreateValue(Out.str());
57459d1ed5bSDimitry Andric   Mangled.second = BD;
57559d1ed5bSDimitry Andric   return Mangled.first();
576f22ef01cSRoman Divacky }
577f22ef01cSRoman Divacky 
5786122f3e6SDimitry Andric llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) {
579f22ef01cSRoman Divacky   return getModule().getNamedValue(Name);
580f22ef01cSRoman Divacky }
581f22ef01cSRoman Divacky 
582f22ef01cSRoman Divacky /// AddGlobalCtor - Add a function to the list that will be called before
583f22ef01cSRoman Divacky /// main() runs.
58459d1ed5bSDimitry Andric void CodeGenModule::AddGlobalCtor(llvm::Function *Ctor, int Priority,
58559d1ed5bSDimitry Andric                                   llvm::Constant *AssociatedData) {
586f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
58759d1ed5bSDimitry Andric   GlobalCtors.push_back(Structor(Priority, Ctor, AssociatedData));
588f22ef01cSRoman Divacky }
589f22ef01cSRoman Divacky 
590f22ef01cSRoman Divacky /// AddGlobalDtor - Add a function to the list that will be called
591f22ef01cSRoman Divacky /// when the module is unloaded.
592f22ef01cSRoman Divacky void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) {
593f22ef01cSRoman Divacky   // FIXME: Type coercion of void()* types.
59459d1ed5bSDimitry Andric   GlobalDtors.push_back(Structor(Priority, Dtor, nullptr));
595f22ef01cSRoman Divacky }
596f22ef01cSRoman Divacky 
597f22ef01cSRoman Divacky void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
598f22ef01cSRoman Divacky   // Ctor function type is void()*.
599bd5abe19SDimitry Andric   llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
600f22ef01cSRoman Divacky   llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
601f22ef01cSRoman Divacky 
60259d1ed5bSDimitry Andric   // Get the type of a ctor entry, { i32, void ()*, i8* }.
60359d1ed5bSDimitry Andric   llvm::StructType *CtorStructTy = llvm::StructType::get(
60459d1ed5bSDimitry Andric       Int32Ty, llvm::PointerType::getUnqual(CtorFTy), VoidPtrTy, NULL);
605f22ef01cSRoman Divacky 
606f22ef01cSRoman Divacky   // Construct the constructor and destructor arrays.
607dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> Ctors;
608f22ef01cSRoman Divacky   for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
609dff0c46cSDimitry Andric     llvm::Constant *S[] = {
61059d1ed5bSDimitry Andric       llvm::ConstantInt::get(Int32Ty, I->Priority, false),
61159d1ed5bSDimitry Andric       llvm::ConstantExpr::getBitCast(I->Initializer, CtorPFTy),
61259d1ed5bSDimitry Andric       (I->AssociatedData
61359d1ed5bSDimitry Andric            ? llvm::ConstantExpr::getBitCast(I->AssociatedData, VoidPtrTy)
61459d1ed5bSDimitry Andric            : llvm::Constant::getNullValue(VoidPtrTy))
615dff0c46cSDimitry Andric     };
616f22ef01cSRoman Divacky     Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
617f22ef01cSRoman Divacky   }
618f22ef01cSRoman Divacky 
619f22ef01cSRoman Divacky   if (!Ctors.empty()) {
620f22ef01cSRoman Divacky     llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
621f22ef01cSRoman Divacky     new llvm::GlobalVariable(TheModule, AT, false,
622f22ef01cSRoman Divacky                              llvm::GlobalValue::AppendingLinkage,
623f22ef01cSRoman Divacky                              llvm::ConstantArray::get(AT, Ctors),
624f22ef01cSRoman Divacky                              GlobalName);
625f22ef01cSRoman Divacky   }
626f22ef01cSRoman Divacky }
627f22ef01cSRoman Divacky 
628f22ef01cSRoman Divacky llvm::GlobalValue::LinkageTypes
629f785676fSDimitry Andric CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
63059d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
631f785676fSDimitry Andric 
632e580952dSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
633f22ef01cSRoman Divacky 
63459d1ed5bSDimitry Andric   if (isa<CXXDestructorDecl>(D) &&
63559d1ed5bSDimitry Andric       getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
63659d1ed5bSDimitry Andric                                          GD.getDtorType())) {
63759d1ed5bSDimitry Andric     // Destructor variants in the Microsoft C++ ABI are always internal or
63859d1ed5bSDimitry Andric     // linkonce_odr thunks emitted on an as-needed basis.
63959d1ed5bSDimitry Andric     return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
64059d1ed5bSDimitry Andric                                    : llvm::GlobalValue::LinkOnceODRLinkage;
641f22ef01cSRoman Divacky   }
642f22ef01cSRoman Divacky 
64359d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false);
64459d1ed5bSDimitry Andric }
645f22ef01cSRoman Divacky 
64659d1ed5bSDimitry Andric void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D,
64759d1ed5bSDimitry Andric                                                     llvm::Function *F) {
64859d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
649f22ef01cSRoman Divacky }
650f22ef01cSRoman Divacky 
651f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D,
652f22ef01cSRoman Divacky                                               const CGFunctionInfo &Info,
653f22ef01cSRoman Divacky                                               llvm::Function *F) {
654f22ef01cSRoman Divacky   unsigned CallingConv;
655f22ef01cSRoman Divacky   AttributeListType AttributeList;
656139f7f9bSDimitry Andric   ConstructAttributeList(Info, D, AttributeList, CallingConv, false);
657139f7f9bSDimitry Andric   F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList));
658f22ef01cSRoman Divacky   F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
659f22ef01cSRoman Divacky }
660f22ef01cSRoman Divacky 
6616122f3e6SDimitry Andric /// Determines whether the language options require us to model
6626122f3e6SDimitry Andric /// unwind exceptions.  We treat -fexceptions as mandating this
6636122f3e6SDimitry Andric /// except under the fragile ObjC ABI with only ObjC exceptions
6646122f3e6SDimitry Andric /// enabled.  This means, for example, that C with -fexceptions
6656122f3e6SDimitry Andric /// enables this.
666dff0c46cSDimitry Andric static bool hasUnwindExceptions(const LangOptions &LangOpts) {
6676122f3e6SDimitry Andric   // If exceptions are completely disabled, obviously this is false.
668dff0c46cSDimitry Andric   if (!LangOpts.Exceptions) return false;
6696122f3e6SDimitry Andric 
6706122f3e6SDimitry Andric   // If C++ exceptions are enabled, this is true.
671dff0c46cSDimitry Andric   if (LangOpts.CXXExceptions) return true;
6726122f3e6SDimitry Andric 
6736122f3e6SDimitry Andric   // If ObjC exceptions are enabled, this depends on the ABI.
674dff0c46cSDimitry Andric   if (LangOpts.ObjCExceptions) {
6757ae0e2c9SDimitry Andric     return LangOpts.ObjCRuntime.hasUnwindExceptions();
6766122f3e6SDimitry Andric   }
6776122f3e6SDimitry Andric 
6786122f3e6SDimitry Andric   return true;
6796122f3e6SDimitry Andric }
6806122f3e6SDimitry Andric 
681f22ef01cSRoman Divacky void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
682f22ef01cSRoman Divacky                                                            llvm::Function *F) {
683f785676fSDimitry Andric   llvm::AttrBuilder B;
684f785676fSDimitry Andric 
685bd5abe19SDimitry Andric   if (CodeGenOpts.UnwindTables)
686f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::UWTable);
687bd5abe19SDimitry Andric 
688dff0c46cSDimitry Andric   if (!hasUnwindExceptions(LangOpts))
689f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoUnwind);
690f22ef01cSRoman Divacky 
6916122f3e6SDimitry Andric   if (D->hasAttr<NakedAttr>()) {
6926122f3e6SDimitry Andric     // Naked implies noinline: we should not be inlining such functions.
693f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Naked);
694f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
69559d1ed5bSDimitry Andric   } else if (D->hasAttr<OptimizeNoneAttr>()) {
69659d1ed5bSDimitry Andric     // OptimizeNone implies noinline; we should not be inlining such functions.
69759d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::OptimizeNone);
69859d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
69959d1ed5bSDimitry Andric   } else if (D->hasAttr<NoDuplicateAttr>()) {
70059d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::NoDuplicate);
701f785676fSDimitry Andric   } else if (D->hasAttr<NoInlineAttr>()) {
702f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::NoInline);
70359d1ed5bSDimitry Andric   } else if (D->hasAttr<AlwaysInlineAttr>() &&
704f785676fSDimitry Andric              !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
705f785676fSDimitry Andric                                               llvm::Attribute::NoInline)) {
706f785676fSDimitry Andric     // (noinline wins over always_inline, and we can't specify both in IR)
707f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::AlwaysInline);
7086122f3e6SDimitry Andric   }
7092754fe60SDimitry Andric 
710f785676fSDimitry Andric   if (D->hasAttr<ColdAttr>()) {
711f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::OptimizeForSize);
712f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::Cold);
713f785676fSDimitry Andric   }
7143861d79fSDimitry Andric 
7153861d79fSDimitry Andric   if (D->hasAttr<MinSizeAttr>())
716f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::MinSize);
717f22ef01cSRoman Divacky 
71859d1ed5bSDimitry Andric   if (D->hasAttr<OptimizeNoneAttr>()) {
71959d1ed5bSDimitry Andric     // OptimizeNone wins over OptimizeForSize and MinSize.
72059d1ed5bSDimitry Andric     B.removeAttribute(llvm::Attribute::OptimizeForSize);
72159d1ed5bSDimitry Andric     B.removeAttribute(llvm::Attribute::MinSize);
72259d1ed5bSDimitry Andric   }
72359d1ed5bSDimitry Andric 
7243861d79fSDimitry Andric   if (LangOpts.getStackProtector() == LangOptions::SSPOn)
725f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtect);
72659d1ed5bSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
72759d1ed5bSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectStrong);
7283861d79fSDimitry Andric   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
729f785676fSDimitry Andric     B.addAttribute(llvm::Attribute::StackProtectReq);
7303861d79fSDimitry Andric 
731139f7f9bSDimitry Andric   // Add sanitizer attributes if function is not blacklisted.
73259d1ed5bSDimitry Andric   if (!SanitizerBL.isIn(*F)) {
733139f7f9bSDimitry Andric     // When AddressSanitizer is enabled, set SanitizeAddress attribute
734139f7f9bSDimitry Andric     // unless __attribute__((no_sanitize_address)) is used.
73559d1ed5bSDimitry Andric     if (LangOpts.Sanitize.Address && !D->hasAttr<NoSanitizeAddressAttr>())
736f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeAddress);
737139f7f9bSDimitry Andric     // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
73859d1ed5bSDimitry Andric     if (LangOpts.Sanitize.Thread && !D->hasAttr<NoSanitizeThreadAttr>())
739f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeThread);
740139f7f9bSDimitry Andric     // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
74159d1ed5bSDimitry Andric     if (LangOpts.Sanitize.Memory && !D->hasAttr<NoSanitizeMemoryAttr>())
742f785676fSDimitry Andric       B.addAttribute(llvm::Attribute::SanitizeMemory);
743dff0c46cSDimitry Andric   }
744dff0c46cSDimitry Andric 
745f785676fSDimitry Andric   F->addAttributes(llvm::AttributeSet::FunctionIndex,
746f785676fSDimitry Andric                    llvm::AttributeSet::get(
747f785676fSDimitry Andric                        F->getContext(), llvm::AttributeSet::FunctionIndex, B));
748f785676fSDimitry Andric 
749f785676fSDimitry Andric   if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
750f785676fSDimitry Andric     F->setUnnamedAddr(true);
75159d1ed5bSDimitry Andric   else if (const auto *MD = dyn_cast<CXXMethodDecl>(D))
752f785676fSDimitry Andric     if (MD->isVirtual())
753f785676fSDimitry Andric       F->setUnnamedAddr(true);
754f785676fSDimitry Andric 
755e580952dSDimitry Andric   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
756e580952dSDimitry Andric   if (alignment)
757e580952dSDimitry Andric     F->setAlignment(alignment);
758e580952dSDimitry Andric 
759f22ef01cSRoman Divacky   // C++ ABI requires 2-byte alignment for member functions.
760f22ef01cSRoman Divacky   if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D))
761f22ef01cSRoman Divacky     F->setAlignment(2);
762f22ef01cSRoman Divacky }
763f22ef01cSRoman Divacky 
764f22ef01cSRoman Divacky void CodeGenModule::SetCommonAttributes(const Decl *D,
765f22ef01cSRoman Divacky                                         llvm::GlobalValue *GV) {
76659d1ed5bSDimitry Andric   if (const auto *ND = dyn_cast<NamedDecl>(D))
7672754fe60SDimitry Andric     setGlobalVisibility(GV, ND);
7682754fe60SDimitry Andric   else
7692754fe60SDimitry Andric     GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
770f22ef01cSRoman Divacky 
771f22ef01cSRoman Divacky   if (D->hasAttr<UsedAttr>())
77259d1ed5bSDimitry Andric     addUsedGlobal(GV);
77359d1ed5bSDimitry Andric }
77459d1ed5bSDimitry Andric 
77559d1ed5bSDimitry Andric void CodeGenModule::setNonAliasAttributes(const Decl *D,
77659d1ed5bSDimitry Andric                                           llvm::GlobalObject *GO) {
77759d1ed5bSDimitry Andric   SetCommonAttributes(D, GO);
778f22ef01cSRoman Divacky 
779f22ef01cSRoman Divacky   if (const SectionAttr *SA = D->getAttr<SectionAttr>())
78059d1ed5bSDimitry Andric     GO->setSection(SA->getName());
781f22ef01cSRoman Divacky 
78259d1ed5bSDimitry Andric   getTargetCodeGenInfo().SetTargetAttributes(D, GO, *this);
783f22ef01cSRoman Divacky }
784f22ef01cSRoman Divacky 
785f22ef01cSRoman Divacky void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
786f22ef01cSRoman Divacky                                                   llvm::Function *F,
787f22ef01cSRoman Divacky                                                   const CGFunctionInfo &FI) {
788f22ef01cSRoman Divacky   SetLLVMFunctionAttributes(D, FI, F);
789f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, F);
790f22ef01cSRoman Divacky 
791f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::InternalLinkage);
792f22ef01cSRoman Divacky 
79359d1ed5bSDimitry Andric   setNonAliasAttributes(D, F);
79459d1ed5bSDimitry Andric }
79559d1ed5bSDimitry Andric 
79659d1ed5bSDimitry Andric static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
79759d1ed5bSDimitry Andric                                          const NamedDecl *ND) {
79859d1ed5bSDimitry Andric   // Set linkage and visibility in case we never see a definition.
79959d1ed5bSDimitry Andric   LinkageInfo LV = ND->getLinkageAndVisibility();
80059d1ed5bSDimitry Andric   if (LV.getLinkage() != ExternalLinkage) {
80159d1ed5bSDimitry Andric     // Don't set internal linkage on declarations.
80259d1ed5bSDimitry Andric   } else {
80359d1ed5bSDimitry Andric     if (ND->hasAttr<DLLImportAttr>()) {
80459d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
80559d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
80659d1ed5bSDimitry Andric     } else if (ND->hasAttr<DLLExportAttr>()) {
80759d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalLinkage);
80859d1ed5bSDimitry Andric       GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
80959d1ed5bSDimitry Andric     } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) {
81059d1ed5bSDimitry Andric       // "extern_weak" is overloaded in LLVM; we probably should have
81159d1ed5bSDimitry Andric       // separate linkage types for this.
81259d1ed5bSDimitry Andric       GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
81359d1ed5bSDimitry Andric     }
81459d1ed5bSDimitry Andric 
81559d1ed5bSDimitry Andric     // Set visibility on a declaration only if it's explicit.
81659d1ed5bSDimitry Andric     if (LV.isVisibilityExplicit())
81759d1ed5bSDimitry Andric       GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
81859d1ed5bSDimitry Andric   }
819f22ef01cSRoman Divacky }
820f22ef01cSRoman Divacky 
821f22ef01cSRoman Divacky void CodeGenModule::SetFunctionAttributes(GlobalDecl GD,
822f22ef01cSRoman Divacky                                           llvm::Function *F,
823f22ef01cSRoman Divacky                                           bool IsIncompleteFunction) {
8243b0f4066SDimitry Andric   if (unsigned IID = F->getIntrinsicID()) {
8253b0f4066SDimitry Andric     // If this is an intrinsic function, set the function's attributes
8263b0f4066SDimitry Andric     // to the intrinsic's attributes.
8273861d79fSDimitry Andric     F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(),
8283861d79fSDimitry Andric                                                     (llvm::Intrinsic::ID)IID));
8293b0f4066SDimitry Andric     return;
8303b0f4066SDimitry Andric   }
8313b0f4066SDimitry Andric 
83259d1ed5bSDimitry Andric   const auto *FD = cast<FunctionDecl>(GD.getDecl());
833f22ef01cSRoman Divacky 
834f22ef01cSRoman Divacky   if (!IsIncompleteFunction)
835dff0c46cSDimitry Andric     SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F);
836f22ef01cSRoman Divacky 
83759d1ed5bSDimitry Andric   // Add the Returned attribute for "this", except for iOS 5 and earlier
83859d1ed5bSDimitry Andric   // where substantial code, including the libstdc++ dylib, was compiled with
83959d1ed5bSDimitry Andric   // GCC and does not actually return "this".
84059d1ed5bSDimitry Andric   if (getCXXABI().HasThisReturn(GD) &&
84159d1ed5bSDimitry Andric       !(getTarget().getTriple().isiOS() &&
84259d1ed5bSDimitry Andric         getTarget().getTriple().isOSVersionLT(6))) {
843f785676fSDimitry Andric     assert(!F->arg_empty() &&
844f785676fSDimitry Andric            F->arg_begin()->getType()
845f785676fSDimitry Andric              ->canLosslesslyBitCastTo(F->getReturnType()) &&
846f785676fSDimitry Andric            "unexpected this return");
847f785676fSDimitry Andric     F->addAttribute(1, llvm::Attribute::Returned);
848f785676fSDimitry Andric   }
849f785676fSDimitry Andric 
850f22ef01cSRoman Divacky   // Only a few attributes are set on declarations; these may later be
851f22ef01cSRoman Divacky   // overridden by a definition.
852f22ef01cSRoman Divacky 
85359d1ed5bSDimitry Andric   setLinkageAndVisibilityForGV(F, FD);
8542754fe60SDimitry Andric 
85559d1ed5bSDimitry Andric   if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
85659d1ed5bSDimitry Andric     if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
85759d1ed5bSDimitry Andric       // Don't dllexport/import destructor thunks.
85859d1ed5bSDimitry Andric       F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
8592754fe60SDimitry Andric     }
860f22ef01cSRoman Divacky   }
861f22ef01cSRoman Divacky 
862f22ef01cSRoman Divacky   if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
863f22ef01cSRoman Divacky     F->setSection(SA->getName());
864f785676fSDimitry Andric 
865f785676fSDimitry Andric   // A replaceable global allocation function does not act like a builtin by
866f785676fSDimitry Andric   // default, only if it is invoked by a new-expression or delete-expression.
867f785676fSDimitry Andric   if (FD->isReplaceableGlobalAllocationFunction())
868f785676fSDimitry Andric     F->addAttribute(llvm::AttributeSet::FunctionIndex,
869f785676fSDimitry Andric                     llvm::Attribute::NoBuiltin);
870f22ef01cSRoman Divacky }
871f22ef01cSRoman Divacky 
87259d1ed5bSDimitry Andric void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
873f22ef01cSRoman Divacky   assert(!GV->isDeclaration() &&
874f22ef01cSRoman Divacky          "Only globals with definition can force usage.");
875f22ef01cSRoman Divacky   LLVMUsed.push_back(GV);
876f22ef01cSRoman Divacky }
877f22ef01cSRoman Divacky 
87859d1ed5bSDimitry Andric void CodeGenModule::addCompilerUsedGlobal(llvm::GlobalValue *GV) {
87959d1ed5bSDimitry Andric   assert(!GV->isDeclaration() &&
88059d1ed5bSDimitry Andric          "Only globals with definition can force usage.");
88159d1ed5bSDimitry Andric   LLVMCompilerUsed.push_back(GV);
88259d1ed5bSDimitry Andric }
88359d1ed5bSDimitry Andric 
88459d1ed5bSDimitry Andric static void emitUsed(CodeGenModule &CGM, StringRef Name,
88559d1ed5bSDimitry Andric                      std::vector<llvm::WeakVH> &List) {
886f22ef01cSRoman Divacky   // Don't create llvm.used if there is no need.
88759d1ed5bSDimitry Andric   if (List.empty())
888f22ef01cSRoman Divacky     return;
889f22ef01cSRoman Divacky 
89059d1ed5bSDimitry Andric   // Convert List to what ConstantArray needs.
891dff0c46cSDimitry Andric   SmallVector<llvm::Constant*, 8> UsedArray;
89259d1ed5bSDimitry Andric   UsedArray.resize(List.size());
89359d1ed5bSDimitry Andric   for (unsigned i = 0, e = List.size(); i != e; ++i) {
894f22ef01cSRoman Divacky     UsedArray[i] =
89559d1ed5bSDimitry Andric      llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*List[i]),
89659d1ed5bSDimitry Andric                                     CGM.Int8PtrTy);
897f22ef01cSRoman Divacky   }
898f22ef01cSRoman Divacky 
899f22ef01cSRoman Divacky   if (UsedArray.empty())
900f22ef01cSRoman Divacky     return;
90159d1ed5bSDimitry Andric   llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
902f22ef01cSRoman Divacky 
90359d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
90459d1ed5bSDimitry Andric       CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,
90559d1ed5bSDimitry Andric       llvm::ConstantArray::get(ATy, UsedArray), Name);
906f22ef01cSRoman Divacky 
907f22ef01cSRoman Divacky   GV->setSection("llvm.metadata");
908f22ef01cSRoman Divacky }
909f22ef01cSRoman Divacky 
91059d1ed5bSDimitry Andric void CodeGenModule::emitLLVMUsed() {
91159d1ed5bSDimitry Andric   emitUsed(*this, "llvm.used", LLVMUsed);
91259d1ed5bSDimitry Andric   emitUsed(*this, "llvm.compiler.used", LLVMCompilerUsed);
91359d1ed5bSDimitry Andric }
91459d1ed5bSDimitry Andric 
915f785676fSDimitry Andric void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
916f785676fSDimitry Andric   llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
917f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
918f785676fSDimitry Andric }
919f785676fSDimitry Andric 
920f785676fSDimitry Andric void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) {
921f785676fSDimitry Andric   llvm::SmallString<32> Opt;
922f785676fSDimitry Andric   getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt);
923f785676fSDimitry Andric   llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
924f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
925f785676fSDimitry Andric }
926f785676fSDimitry Andric 
927f785676fSDimitry Andric void CodeGenModule::AddDependentLib(StringRef Lib) {
928f785676fSDimitry Andric   llvm::SmallString<24> Opt;
929f785676fSDimitry Andric   getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
930f785676fSDimitry Andric   llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
931f785676fSDimitry Andric   LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
932f785676fSDimitry Andric }
933f785676fSDimitry Andric 
934139f7f9bSDimitry Andric /// \brief Add link options implied by the given module, including modules
935139f7f9bSDimitry Andric /// it depends on, using a postorder walk.
936f785676fSDimitry Andric static void addLinkOptionsPostorder(CodeGenModule &CGM,
937139f7f9bSDimitry Andric                                     Module *Mod,
938139f7f9bSDimitry Andric                                     SmallVectorImpl<llvm::Value *> &Metadata,
939139f7f9bSDimitry Andric                                     llvm::SmallPtrSet<Module *, 16> &Visited) {
940139f7f9bSDimitry Andric   // Import this module's parent.
941139f7f9bSDimitry Andric   if (Mod->Parent && Visited.insert(Mod->Parent)) {
942f785676fSDimitry Andric     addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited);
943139f7f9bSDimitry Andric   }
944139f7f9bSDimitry Andric 
945139f7f9bSDimitry Andric   // Import this module's dependencies.
946139f7f9bSDimitry Andric   for (unsigned I = Mod->Imports.size(); I > 0; --I) {
947139f7f9bSDimitry Andric     if (Visited.insert(Mod->Imports[I-1]))
948f785676fSDimitry Andric       addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited);
949139f7f9bSDimitry Andric   }
950139f7f9bSDimitry Andric 
951139f7f9bSDimitry Andric   // Add linker options to link against the libraries/frameworks
952139f7f9bSDimitry Andric   // described by this module.
953f785676fSDimitry Andric   llvm::LLVMContext &Context = CGM.getLLVMContext();
954139f7f9bSDimitry Andric   for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) {
955f785676fSDimitry Andric     // Link against a framework.  Frameworks are currently Darwin only, so we
956f785676fSDimitry Andric     // don't to ask TargetCodeGenInfo for the spelling of the linker option.
957139f7f9bSDimitry Andric     if (Mod->LinkLibraries[I-1].IsFramework) {
958139f7f9bSDimitry Andric       llvm::Value *Args[2] = {
959139f7f9bSDimitry Andric         llvm::MDString::get(Context, "-framework"),
960139f7f9bSDimitry Andric         llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library)
961139f7f9bSDimitry Andric       };
962139f7f9bSDimitry Andric 
963139f7f9bSDimitry Andric       Metadata.push_back(llvm::MDNode::get(Context, Args));
964139f7f9bSDimitry Andric       continue;
965139f7f9bSDimitry Andric     }
966139f7f9bSDimitry Andric 
967139f7f9bSDimitry Andric     // Link against a library.
968f785676fSDimitry Andric     llvm::SmallString<24> Opt;
969f785676fSDimitry Andric     CGM.getTargetCodeGenInfo().getDependentLibraryOption(
970f785676fSDimitry Andric       Mod->LinkLibraries[I-1].Library, Opt);
971f785676fSDimitry Andric     llvm::Value *OptString = llvm::MDString::get(Context, Opt);
972139f7f9bSDimitry Andric     Metadata.push_back(llvm::MDNode::get(Context, OptString));
973139f7f9bSDimitry Andric   }
974139f7f9bSDimitry Andric }
975139f7f9bSDimitry Andric 
976139f7f9bSDimitry Andric void CodeGenModule::EmitModuleLinkOptions() {
977139f7f9bSDimitry Andric   // Collect the set of all of the modules we want to visit to emit link
978139f7f9bSDimitry Andric   // options, which is essentially the imported modules and all of their
979139f7f9bSDimitry Andric   // non-explicit child modules.
980139f7f9bSDimitry Andric   llvm::SetVector<clang::Module *> LinkModules;
981139f7f9bSDimitry Andric   llvm::SmallPtrSet<clang::Module *, 16> Visited;
982139f7f9bSDimitry Andric   SmallVector<clang::Module *, 16> Stack;
983139f7f9bSDimitry Andric 
984139f7f9bSDimitry Andric   // Seed the stack with imported modules.
985139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(),
986139f7f9bSDimitry Andric                                                MEnd = ImportedModules.end();
987139f7f9bSDimitry Andric        M != MEnd; ++M) {
988139f7f9bSDimitry Andric     if (Visited.insert(*M))
989139f7f9bSDimitry Andric       Stack.push_back(*M);
990139f7f9bSDimitry Andric   }
991139f7f9bSDimitry Andric 
992139f7f9bSDimitry Andric   // Find all of the modules to import, making a little effort to prune
993139f7f9bSDimitry Andric   // non-leaf modules.
994139f7f9bSDimitry Andric   while (!Stack.empty()) {
995f785676fSDimitry Andric     clang::Module *Mod = Stack.pop_back_val();
996139f7f9bSDimitry Andric 
997139f7f9bSDimitry Andric     bool AnyChildren = false;
998139f7f9bSDimitry Andric 
999139f7f9bSDimitry Andric     // Visit the submodules of this module.
1000139f7f9bSDimitry Andric     for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(),
1001139f7f9bSDimitry Andric                                         SubEnd = Mod->submodule_end();
1002139f7f9bSDimitry Andric          Sub != SubEnd; ++Sub) {
1003139f7f9bSDimitry Andric       // Skip explicit children; they need to be explicitly imported to be
1004139f7f9bSDimitry Andric       // linked against.
1005139f7f9bSDimitry Andric       if ((*Sub)->IsExplicit)
1006139f7f9bSDimitry Andric         continue;
1007139f7f9bSDimitry Andric 
1008139f7f9bSDimitry Andric       if (Visited.insert(*Sub)) {
1009139f7f9bSDimitry Andric         Stack.push_back(*Sub);
1010139f7f9bSDimitry Andric         AnyChildren = true;
1011139f7f9bSDimitry Andric       }
1012139f7f9bSDimitry Andric     }
1013139f7f9bSDimitry Andric 
1014139f7f9bSDimitry Andric     // We didn't find any children, so add this module to the list of
1015139f7f9bSDimitry Andric     // modules to link against.
1016139f7f9bSDimitry Andric     if (!AnyChildren) {
1017139f7f9bSDimitry Andric       LinkModules.insert(Mod);
1018139f7f9bSDimitry Andric     }
1019139f7f9bSDimitry Andric   }
1020139f7f9bSDimitry Andric 
1021139f7f9bSDimitry Andric   // Add link options for all of the imported modules in reverse topological
1022f785676fSDimitry Andric   // order.  We don't do anything to try to order import link flags with respect
1023f785676fSDimitry Andric   // to linker options inserted by things like #pragma comment().
1024139f7f9bSDimitry Andric   SmallVector<llvm::Value *, 16> MetadataArgs;
1025139f7f9bSDimitry Andric   Visited.clear();
1026139f7f9bSDimitry Andric   for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(),
1027139f7f9bSDimitry Andric                                                MEnd = LinkModules.end();
1028139f7f9bSDimitry Andric        M != MEnd; ++M) {
1029139f7f9bSDimitry Andric     if (Visited.insert(*M))
1030f785676fSDimitry Andric       addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited);
1031139f7f9bSDimitry Andric   }
1032139f7f9bSDimitry Andric   std::reverse(MetadataArgs.begin(), MetadataArgs.end());
1033f785676fSDimitry Andric   LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
1034139f7f9bSDimitry Andric 
1035139f7f9bSDimitry Andric   // Add the linker options metadata flag.
1036139f7f9bSDimitry Andric   getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options",
1037f785676fSDimitry Andric                             llvm::MDNode::get(getLLVMContext(),
1038f785676fSDimitry Andric                                               LinkerOptionsMetadata));
1039139f7f9bSDimitry Andric }
1040139f7f9bSDimitry Andric 
1041f22ef01cSRoman Divacky void CodeGenModule::EmitDeferred() {
1042f22ef01cSRoman Divacky   // Emit code for any potentially referenced deferred decls.  Since a
1043f22ef01cSRoman Divacky   // previously unused static decl may become used during the generation of code
1044f22ef01cSRoman Divacky   // for a static function, iterate until no changes are made.
1045f22ef01cSRoman Divacky 
1046139f7f9bSDimitry Andric   while (true) {
1047f22ef01cSRoman Divacky     if (!DeferredVTables.empty()) {
1048139f7f9bSDimitry Andric       EmitDeferredVTables();
1049139f7f9bSDimitry Andric 
1050139f7f9bSDimitry Andric       // Emitting a v-table doesn't directly cause more v-tables to
1051139f7f9bSDimitry Andric       // become deferred, although it can cause functions to be
1052139f7f9bSDimitry Andric       // emitted that then need those v-tables.
1053139f7f9bSDimitry Andric       assert(DeferredVTables.empty());
1054f22ef01cSRoman Divacky     }
1055f22ef01cSRoman Divacky 
1056139f7f9bSDimitry Andric     // Stop if we're out of both deferred v-tables and deferred declarations.
1057139f7f9bSDimitry Andric     if (DeferredDeclsToEmit.empty()) break;
1058139f7f9bSDimitry Andric 
105959d1ed5bSDimitry Andric     DeferredGlobal &G = DeferredDeclsToEmit.back();
106059d1ed5bSDimitry Andric     GlobalDecl D = G.GD;
106159d1ed5bSDimitry Andric     llvm::GlobalValue *GV = G.GV;
1062f22ef01cSRoman Divacky     DeferredDeclsToEmit.pop_back();
1063f22ef01cSRoman Divacky 
106459d1ed5bSDimitry Andric     assert(GV == GetGlobalValue(getMangledName(D)));
1065f22ef01cSRoman Divacky     // Check to see if we've already emitted this.  This is necessary
1066f22ef01cSRoman Divacky     // for a couple of reasons: first, decls can end up in the
1067f22ef01cSRoman Divacky     // deferred-decls queue multiple times, and second, decls can end
1068f22ef01cSRoman Divacky     // up with definitions in unusual ways (e.g. by an extern inline
1069f22ef01cSRoman Divacky     // function acquiring a strong function redefinition).  Just
1070f22ef01cSRoman Divacky     // ignore these cases.
107159d1ed5bSDimitry Andric     if(!GV->isDeclaration())
1072f22ef01cSRoman Divacky       continue;
1073f22ef01cSRoman Divacky 
1074f22ef01cSRoman Divacky     // Otherwise, emit the definition and move on to the next one.
107559d1ed5bSDimitry Andric     EmitGlobalDefinition(D, GV);
1076f22ef01cSRoman Divacky   }
1077f22ef01cSRoman Divacky }
1078f22ef01cSRoman Divacky 
10796122f3e6SDimitry Andric void CodeGenModule::EmitGlobalAnnotations() {
10806122f3e6SDimitry Andric   if (Annotations.empty())
10816122f3e6SDimitry Andric     return;
10826122f3e6SDimitry Andric 
10836122f3e6SDimitry Andric   // Create a new global variable for the ConstantStruct in the Module.
10846122f3e6SDimitry Andric   llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
10856122f3e6SDimitry Andric     Annotations[0]->getType(), Annotations.size()), Annotations);
108659d1ed5bSDimitry Andric   auto *gv = new llvm::GlobalVariable(getModule(), Array->getType(), false,
108759d1ed5bSDimitry Andric                                       llvm::GlobalValue::AppendingLinkage,
108859d1ed5bSDimitry Andric                                       Array, "llvm.global.annotations");
10896122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
10906122f3e6SDimitry Andric }
10916122f3e6SDimitry Andric 
1092139f7f9bSDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) {
1093f785676fSDimitry Andric   llvm::Constant *&AStr = AnnotationStrings[Str];
1094f785676fSDimitry Andric   if (AStr)
1095f785676fSDimitry Andric     return AStr;
10966122f3e6SDimitry Andric 
10976122f3e6SDimitry Andric   // Not found yet, create a new global.
1098dff0c46cSDimitry Andric   llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
109959d1ed5bSDimitry Andric   auto *gv =
110059d1ed5bSDimitry Andric       new llvm::GlobalVariable(getModule(), s->getType(), true,
110159d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, s, ".str");
11026122f3e6SDimitry Andric   gv->setSection(AnnotationSection);
11036122f3e6SDimitry Andric   gv->setUnnamedAddr(true);
1104f785676fSDimitry Andric   AStr = gv;
11056122f3e6SDimitry Andric   return gv;
11066122f3e6SDimitry Andric }
11076122f3e6SDimitry Andric 
11086122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) {
11096122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11106122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(Loc);
11116122f3e6SDimitry Andric   if (PLoc.isValid())
11126122f3e6SDimitry Andric     return EmitAnnotationString(PLoc.getFilename());
11136122f3e6SDimitry Andric   return EmitAnnotationString(SM.getBufferName(Loc));
11146122f3e6SDimitry Andric }
11156122f3e6SDimitry Andric 
11166122f3e6SDimitry Andric llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) {
11176122f3e6SDimitry Andric   SourceManager &SM = getContext().getSourceManager();
11186122f3e6SDimitry Andric   PresumedLoc PLoc = SM.getPresumedLoc(L);
11196122f3e6SDimitry Andric   unsigned LineNo = PLoc.isValid() ? PLoc.getLine() :
11206122f3e6SDimitry Andric     SM.getExpansionLineNumber(L);
11216122f3e6SDimitry Andric   return llvm::ConstantInt::get(Int32Ty, LineNo);
11226122f3e6SDimitry Andric }
11236122f3e6SDimitry Andric 
1124f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
1125f22ef01cSRoman Divacky                                                 const AnnotateAttr *AA,
11266122f3e6SDimitry Andric                                                 SourceLocation L) {
11276122f3e6SDimitry Andric   // Get the globals for file name, annotation, and the line number.
11286122f3e6SDimitry Andric   llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()),
11296122f3e6SDimitry Andric                  *UnitGV = EmitAnnotationUnit(L),
11306122f3e6SDimitry Andric                  *LineNoCst = EmitAnnotationLineNo(L);
1131f22ef01cSRoman Divacky 
1132f22ef01cSRoman Divacky   // Create the ConstantStruct for the global annotation.
1133f22ef01cSRoman Divacky   llvm::Constant *Fields[4] = {
11346122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
11356122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
11366122f3e6SDimitry Andric     llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
11376122f3e6SDimitry Andric     LineNoCst
1138f22ef01cSRoman Divacky   };
113917a519f9SDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
1140f22ef01cSRoman Divacky }
1141f22ef01cSRoman Divacky 
11426122f3e6SDimitry Andric void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
11436122f3e6SDimitry Andric                                          llvm::GlobalValue *GV) {
11446122f3e6SDimitry Andric   assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
11456122f3e6SDimitry Andric   // Get the struct elements for these annotations.
114659d1ed5bSDimitry Andric   for (const auto *I : D->specific_attrs<AnnotateAttr>())
114759d1ed5bSDimitry Andric     Annotations.push_back(EmitAnnotateAttr(GV, I, D->getLocation()));
11486122f3e6SDimitry Andric }
11496122f3e6SDimitry Andric 
1150f22ef01cSRoman Divacky bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
1151e580952dSDimitry Andric   // Never defer when EmitAllDecls is specified.
1152dff0c46cSDimitry Andric   if (LangOpts.EmitAllDecls)
1153f22ef01cSRoman Divacky     return false;
1154f22ef01cSRoman Divacky 
1155e580952dSDimitry Andric   return !getContext().DeclMustBeEmitted(Global);
1156f22ef01cSRoman Divacky }
1157f22ef01cSRoman Divacky 
11583861d79fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
11593861d79fSDimitry Andric     const CXXUuidofExpr* E) {
11603861d79fSDimitry Andric   // Sema has verified that IIDSource has a __declspec(uuid()), and that its
11613861d79fSDimitry Andric   // well-formed.
1162f785676fSDimitry Andric   StringRef Uuid = E->getUuidAsStringRef(Context);
1163f785676fSDimitry Andric   std::string Name = "_GUID_" + Uuid.lower();
1164f785676fSDimitry Andric   std::replace(Name.begin(), Name.end(), '-', '_');
11653861d79fSDimitry Andric 
11663861d79fSDimitry Andric   // Look for an existing global.
11673861d79fSDimitry Andric   if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
11683861d79fSDimitry Andric     return GV;
11693861d79fSDimitry Andric 
11703861d79fSDimitry Andric   llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType());
11713861d79fSDimitry Andric   assert(Init && "failed to initialize as constant");
11723861d79fSDimitry Andric 
117359d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
1174f785676fSDimitry Andric       getModule(), Init->getType(),
1175f785676fSDimitry Andric       /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
11763861d79fSDimitry Andric   return GV;
11773861d79fSDimitry Andric }
11783861d79fSDimitry Andric 
1179f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
1180f22ef01cSRoman Divacky   const AliasAttr *AA = VD->getAttr<AliasAttr>();
1181f22ef01cSRoman Divacky   assert(AA && "No alias?");
1182f22ef01cSRoman Divacky 
11836122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType());
1184f22ef01cSRoman Divacky 
1185f22ef01cSRoman Divacky   // See if there is already something with the target's name in the module.
1186f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
11873861d79fSDimitry Andric   if (Entry) {
11883861d79fSDimitry Andric     unsigned AS = getContext().getTargetAddressSpace(VD->getType());
11893861d79fSDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
11903861d79fSDimitry Andric   }
1191f22ef01cSRoman Divacky 
1192f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
1193f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
11943861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
11953861d79fSDimitry Andric                                       GlobalDecl(cast<FunctionDecl>(VD)),
11962754fe60SDimitry Andric                                       /*ForVTable=*/false);
1197f22ef01cSRoman Divacky   else
1198f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
119959d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
120059d1ed5bSDimitry Andric                                     nullptr);
12013861d79fSDimitry Andric 
120259d1ed5bSDimitry Andric   auto *F = cast<llvm::GlobalValue>(Aliasee);
1203f22ef01cSRoman Divacky   F->setLinkage(llvm::Function::ExternalWeakLinkage);
1204f22ef01cSRoman Divacky   WeakRefReferences.insert(F);
1205f22ef01cSRoman Divacky 
1206f22ef01cSRoman Divacky   return Aliasee;
1207f22ef01cSRoman Divacky }
1208f22ef01cSRoman Divacky 
1209f22ef01cSRoman Divacky void CodeGenModule::EmitGlobal(GlobalDecl GD) {
121059d1ed5bSDimitry Andric   const auto *Global = cast<ValueDecl>(GD.getDecl());
1211f22ef01cSRoman Divacky 
1212f22ef01cSRoman Divacky   // Weak references don't produce any output by themselves.
1213f22ef01cSRoman Divacky   if (Global->hasAttr<WeakRefAttr>())
1214f22ef01cSRoman Divacky     return;
1215f22ef01cSRoman Divacky 
1216f22ef01cSRoman Divacky   // If this is an alias definition (which otherwise looks like a declaration)
1217f22ef01cSRoman Divacky   // emit it now.
1218f22ef01cSRoman Divacky   if (Global->hasAttr<AliasAttr>())
1219f22ef01cSRoman Divacky     return EmitAliasDefinition(GD);
1220f22ef01cSRoman Divacky 
12216122f3e6SDimitry Andric   // If this is CUDA, be selective about which declarations we emit.
1222dff0c46cSDimitry Andric   if (LangOpts.CUDA) {
12236122f3e6SDimitry Andric     if (CodeGenOpts.CUDAIsDevice) {
12246122f3e6SDimitry Andric       if (!Global->hasAttr<CUDADeviceAttr>() &&
12256122f3e6SDimitry Andric           !Global->hasAttr<CUDAGlobalAttr>() &&
12266122f3e6SDimitry Andric           !Global->hasAttr<CUDAConstantAttr>() &&
12276122f3e6SDimitry Andric           !Global->hasAttr<CUDASharedAttr>())
12286122f3e6SDimitry Andric         return;
12296122f3e6SDimitry Andric     } else {
12306122f3e6SDimitry Andric       if (!Global->hasAttr<CUDAHostAttr>() && (
12316122f3e6SDimitry Andric             Global->hasAttr<CUDADeviceAttr>() ||
12326122f3e6SDimitry Andric             Global->hasAttr<CUDAConstantAttr>() ||
12336122f3e6SDimitry Andric             Global->hasAttr<CUDASharedAttr>()))
12346122f3e6SDimitry Andric         return;
1235e580952dSDimitry Andric     }
1236e580952dSDimitry Andric   }
1237e580952dSDimitry Andric 
12386122f3e6SDimitry Andric   // Ignore declarations, they will be emitted on their first use.
123959d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
1240f22ef01cSRoman Divacky     // Forward declarations are emitted lazily on first use.
12416122f3e6SDimitry Andric     if (!FD->doesThisDeclarationHaveABody()) {
12426122f3e6SDimitry Andric       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
1243f22ef01cSRoman Divacky         return;
12446122f3e6SDimitry Andric 
12456122f3e6SDimitry Andric       StringRef MangledName = getMangledName(GD);
124659d1ed5bSDimitry Andric 
124759d1ed5bSDimitry Andric       // Compute the function info and LLVM type.
124859d1ed5bSDimitry Andric       const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
124959d1ed5bSDimitry Andric       llvm::Type *Ty = getTypes().GetFunctionType(FI);
125059d1ed5bSDimitry Andric 
125159d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(MangledName, Ty, GD, /*ForVTable=*/false,
125259d1ed5bSDimitry Andric                               /*DontDefer=*/false);
12536122f3e6SDimitry Andric       return;
12546122f3e6SDimitry Andric     }
1255f22ef01cSRoman Divacky   } else {
125659d1ed5bSDimitry Andric     const auto *VD = cast<VarDecl>(Global);
1257f22ef01cSRoman Divacky     assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
1258f22ef01cSRoman Divacky 
125959d1ed5bSDimitry Andric     if (VD->isThisDeclarationADefinition() != VarDecl::Definition &&
126059d1ed5bSDimitry Andric         !Context.isMSStaticDataMemberInlineDefinition(VD))
1261f22ef01cSRoman Divacky       return;
1262f22ef01cSRoman Divacky   }
1263f22ef01cSRoman Divacky 
1264f22ef01cSRoman Divacky   // Defer code generation when possible if this is a static definition, inline
1265f22ef01cSRoman Divacky   // function etc.  These we only want to emit if they are used.
1266f22ef01cSRoman Divacky   if (!MayDeferGeneration(Global)) {
1267f22ef01cSRoman Divacky     // Emit the definition if it can't be deferred.
1268f22ef01cSRoman Divacky     EmitGlobalDefinition(GD);
1269f22ef01cSRoman Divacky     return;
1270f22ef01cSRoman Divacky   }
1271f22ef01cSRoman Divacky 
1272e580952dSDimitry Andric   // If we're deferring emission of a C++ variable with an
1273e580952dSDimitry Andric   // initializer, remember the order in which it appeared in the file.
1274dff0c46cSDimitry Andric   if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) &&
1275e580952dSDimitry Andric       cast<VarDecl>(Global)->hasInit()) {
1276e580952dSDimitry Andric     DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
127759d1ed5bSDimitry Andric     CXXGlobalInits.push_back(nullptr);
1278e580952dSDimitry Andric   }
1279e580952dSDimitry Andric 
1280f22ef01cSRoman Divacky   // If the value has already been used, add it directly to the
1281f22ef01cSRoman Divacky   // DeferredDeclsToEmit list.
12826122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
128359d1ed5bSDimitry Andric   if (llvm::GlobalValue *GV = GetGlobalValue(MangledName))
128459d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, GD);
1285f22ef01cSRoman Divacky   else {
1286f22ef01cSRoman Divacky     // Otherwise, remember that we saw a deferred decl with this name.  The
1287f22ef01cSRoman Divacky     // first use of the mangled name will cause it to move into
1288f22ef01cSRoman Divacky     // DeferredDeclsToEmit.
1289f22ef01cSRoman Divacky     DeferredDecls[MangledName] = GD;
1290f22ef01cSRoman Divacky   }
1291f22ef01cSRoman Divacky }
1292f22ef01cSRoman Divacky 
1293f8254f43SDimitry Andric namespace {
1294f8254f43SDimitry Andric   struct FunctionIsDirectlyRecursive :
1295f8254f43SDimitry Andric     public RecursiveASTVisitor<FunctionIsDirectlyRecursive> {
1296f8254f43SDimitry Andric     const StringRef Name;
1297dff0c46cSDimitry Andric     const Builtin::Context &BI;
1298f8254f43SDimitry Andric     bool Result;
1299dff0c46cSDimitry Andric     FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) :
1300dff0c46cSDimitry Andric       Name(N), BI(C), Result(false) {
1301f8254f43SDimitry Andric     }
1302f8254f43SDimitry Andric     typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base;
1303f8254f43SDimitry Andric 
1304f8254f43SDimitry Andric     bool TraverseCallExpr(CallExpr *E) {
1305dff0c46cSDimitry Andric       const FunctionDecl *FD = E->getDirectCallee();
1306dff0c46cSDimitry Andric       if (!FD)
1307f8254f43SDimitry Andric         return true;
1308dff0c46cSDimitry Andric       AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1309dff0c46cSDimitry Andric       if (Attr && Name == Attr->getLabel()) {
1310dff0c46cSDimitry Andric         Result = true;
1311dff0c46cSDimitry Andric         return false;
1312dff0c46cSDimitry Andric       }
1313dff0c46cSDimitry Andric       unsigned BuiltinID = FD->getBuiltinID();
1314dff0c46cSDimitry Andric       if (!BuiltinID)
1315f8254f43SDimitry Andric         return true;
1316dff0c46cSDimitry Andric       StringRef BuiltinName = BI.GetName(BuiltinID);
1317dff0c46cSDimitry Andric       if (BuiltinName.startswith("__builtin_") &&
1318dff0c46cSDimitry Andric           Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) {
1319f8254f43SDimitry Andric         Result = true;
1320f8254f43SDimitry Andric         return false;
1321f8254f43SDimitry Andric       }
1322f8254f43SDimitry Andric       return true;
1323f8254f43SDimitry Andric     }
1324f8254f43SDimitry Andric   };
1325f8254f43SDimitry Andric }
1326f8254f43SDimitry Andric 
1327dff0c46cSDimitry Andric // isTriviallyRecursive - Check if this function calls another
1328dff0c46cSDimitry Andric // decl that, because of the asm attribute or the other decl being a builtin,
1329dff0c46cSDimitry Andric // ends up pointing to itself.
1330f8254f43SDimitry Andric bool
1331dff0c46cSDimitry Andric CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) {
1332dff0c46cSDimitry Andric   StringRef Name;
1333dff0c46cSDimitry Andric   if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
1334dff0c46cSDimitry Andric     // asm labels are a special kind of mangling we have to support.
1335dff0c46cSDimitry Andric     AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1336dff0c46cSDimitry Andric     if (!Attr)
1337f8254f43SDimitry Andric       return false;
1338dff0c46cSDimitry Andric     Name = Attr->getLabel();
1339dff0c46cSDimitry Andric   } else {
1340dff0c46cSDimitry Andric     Name = FD->getName();
1341dff0c46cSDimitry Andric   }
1342f8254f43SDimitry Andric 
1343dff0c46cSDimitry Andric   FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
1344dff0c46cSDimitry Andric   Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
1345f8254f43SDimitry Andric   return Walker.Result;
1346f8254f43SDimitry Andric }
1347f8254f43SDimitry Andric 
1348f8254f43SDimitry Andric bool
1349f785676fSDimitry Andric CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
1350f785676fSDimitry Andric   if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage)
1351f8254f43SDimitry Andric     return true;
135259d1ed5bSDimitry Andric   const auto *F = cast<FunctionDecl>(GD.getDecl());
135359d1ed5bSDimitry Andric   if (CodeGenOpts.OptimizationLevel == 0 && !F->hasAttr<AlwaysInlineAttr>())
1354f8254f43SDimitry Andric     return false;
1355f8254f43SDimitry Andric   // PR9614. Avoid cases where the source code is lying to us. An available
1356f8254f43SDimitry Andric   // externally function should have an equivalent function somewhere else,
1357f8254f43SDimitry Andric   // but a function that calls itself is clearly not equivalent to the real
1358f8254f43SDimitry Andric   // implementation.
1359f8254f43SDimitry Andric   // This happens in glibc's btowc and in some configure checks.
1360dff0c46cSDimitry Andric   return !isTriviallyRecursive(F);
1361f8254f43SDimitry Andric }
1362f8254f43SDimitry Andric 
1363f785676fSDimitry Andric /// If the type for the method's class was generated by
1364f785676fSDimitry Andric /// CGDebugInfo::createContextChain(), the cache contains only a
1365f785676fSDimitry Andric /// limited DIType without any declarations. Since EmitFunctionStart()
1366f785676fSDimitry Andric /// needs to find the canonical declaration for each method, we need
1367f785676fSDimitry Andric /// to construct the complete type prior to emitting the method.
1368f785676fSDimitry Andric void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) {
1369f785676fSDimitry Andric   if (!D->isInstance())
1370f785676fSDimitry Andric     return;
1371f785676fSDimitry Andric 
1372f785676fSDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
1373f785676fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
137459d1ed5bSDimitry Andric       const auto *ThisPtr = cast<PointerType>(D->getThisType(getContext()));
1375f785676fSDimitry Andric       DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation());
1376f785676fSDimitry Andric     }
1377f785676fSDimitry Andric }
1378f785676fSDimitry Andric 
137959d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
138059d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
1381f22ef01cSRoman Divacky 
1382f22ef01cSRoman Divacky   PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(),
1383f22ef01cSRoman Divacky                                  Context.getSourceManager(),
1384f22ef01cSRoman Divacky                                  "Generating code for declaration");
1385f22ef01cSRoman Divacky 
1386f785676fSDimitry Andric   if (isa<FunctionDecl>(D)) {
1387ffd1746dSEd Schouten     // At -O0, don't generate IR for functions with available_externally
1388ffd1746dSEd Schouten     // linkage.
1389f785676fSDimitry Andric     if (!shouldEmitFunction(GD))
1390ffd1746dSEd Schouten       return;
1391ffd1746dSEd Schouten 
139259d1ed5bSDimitry Andric     if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
1393f785676fSDimitry Andric       CompleteDIClassType(Method);
1394bd5abe19SDimitry Andric       // Make sure to emit the definition(s) before we emit the thunks.
1395bd5abe19SDimitry Andric       // This is necessary for the generation of certain thunks.
139659d1ed5bSDimitry Andric       if (const auto *CD = dyn_cast<CXXConstructorDecl>(Method))
1397bd5abe19SDimitry Andric         EmitCXXConstructor(CD, GD.getCtorType());
139859d1ed5bSDimitry Andric       else if (const auto *DD = dyn_cast<CXXDestructorDecl>(Method))
1399bd5abe19SDimitry Andric         EmitCXXDestructor(DD, GD.getDtorType());
1400bd5abe19SDimitry Andric       else
140159d1ed5bSDimitry Andric         EmitGlobalFunctionDefinition(GD, GV);
1402bd5abe19SDimitry Andric 
1403f22ef01cSRoman Divacky       if (Method->isVirtual())
1404f22ef01cSRoman Divacky         getVTables().EmitThunks(GD);
1405f22ef01cSRoman Divacky 
1406bd5abe19SDimitry Andric       return;
1407ffd1746dSEd Schouten     }
1408f22ef01cSRoman Divacky 
140959d1ed5bSDimitry Andric     return EmitGlobalFunctionDefinition(GD, GV);
1410ffd1746dSEd Schouten   }
1411f22ef01cSRoman Divacky 
141259d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
1413f22ef01cSRoman Divacky     return EmitGlobalVarDefinition(VD);
1414f22ef01cSRoman Divacky 
14156122f3e6SDimitry Andric   llvm_unreachable("Invalid argument to EmitGlobalDefinition()");
1416f22ef01cSRoman Divacky }
1417f22ef01cSRoman Divacky 
1418f22ef01cSRoman Divacky /// GetOrCreateLLVMFunction - If the specified mangled name is not in the
1419f22ef01cSRoman Divacky /// module, create and return an llvm Function with the specified type. If there
1420f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1421f22ef01cSRoman Divacky /// bitcasted to the right type.
1422f22ef01cSRoman Divacky ///
1423f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1424f22ef01cSRoman Divacky /// to set the attributes on the function when it is first created.
1425f22ef01cSRoman Divacky llvm::Constant *
14266122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
14276122f3e6SDimitry Andric                                        llvm::Type *Ty,
1428f785676fSDimitry Andric                                        GlobalDecl GD, bool ForVTable,
142959d1ed5bSDimitry Andric                                        bool DontDefer,
1430139f7f9bSDimitry Andric                                        llvm::AttributeSet ExtraAttrs) {
1431f785676fSDimitry Andric   const Decl *D = GD.getDecl();
1432f785676fSDimitry Andric 
1433f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1434f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1435f22ef01cSRoman Divacky   if (Entry) {
14363861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1437f785676fSDimitry Andric       const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
1438f22ef01cSRoman Divacky       if (FD && !FD->hasAttr<WeakAttr>())
1439f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1440f22ef01cSRoman Divacky     }
1441f22ef01cSRoman Divacky 
1442f22ef01cSRoman Divacky     if (Entry->getType()->getElementType() == Ty)
1443f22ef01cSRoman Divacky       return Entry;
1444f22ef01cSRoman Divacky 
1445f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
144617a519f9SDimitry Andric     return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
1447f22ef01cSRoman Divacky   }
1448f22ef01cSRoman Divacky 
1449f22ef01cSRoman Divacky   // This function doesn't have a complete type (for example, the return
1450f22ef01cSRoman Divacky   // type is an incomplete struct). Use a fake type instead, and make
1451f22ef01cSRoman Divacky   // sure not to try to set attributes.
1452f22ef01cSRoman Divacky   bool IsIncompleteFunction = false;
1453f22ef01cSRoman Divacky 
14546122f3e6SDimitry Andric   llvm::FunctionType *FTy;
1455f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(Ty)) {
1456f22ef01cSRoman Divacky     FTy = cast<llvm::FunctionType>(Ty);
1457f22ef01cSRoman Divacky   } else {
1458bd5abe19SDimitry Andric     FTy = llvm::FunctionType::get(VoidTy, false);
1459f22ef01cSRoman Divacky     IsIncompleteFunction = true;
1460f22ef01cSRoman Divacky   }
1461ffd1746dSEd Schouten 
1462f22ef01cSRoman Divacky   llvm::Function *F = llvm::Function::Create(FTy,
1463f22ef01cSRoman Divacky                                              llvm::Function::ExternalLinkage,
1464f22ef01cSRoman Divacky                                              MangledName, &getModule());
1465f22ef01cSRoman Divacky   assert(F->getName() == MangledName && "name was uniqued!");
1466f785676fSDimitry Andric   if (D)
1467f785676fSDimitry Andric     SetFunctionAttributes(GD, F, IsIncompleteFunction);
1468139f7f9bSDimitry Andric   if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) {
1469139f7f9bSDimitry Andric     llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex);
1470139f7f9bSDimitry Andric     F->addAttributes(llvm::AttributeSet::FunctionIndex,
1471139f7f9bSDimitry Andric                      llvm::AttributeSet::get(VMContext,
1472139f7f9bSDimitry Andric                                              llvm::AttributeSet::FunctionIndex,
1473139f7f9bSDimitry Andric                                              B));
1474139f7f9bSDimitry Andric   }
1475f22ef01cSRoman Divacky 
147659d1ed5bSDimitry Andric   if (!DontDefer) {
147759d1ed5bSDimitry Andric     // All MSVC dtors other than the base dtor are linkonce_odr and delegate to
147859d1ed5bSDimitry Andric     // each other bottoming out with the base dtor.  Therefore we emit non-base
147959d1ed5bSDimitry Andric     // dtors on usage, even if there is no dtor definition in the TU.
148059d1ed5bSDimitry Andric     if (D && isa<CXXDestructorDecl>(D) &&
148159d1ed5bSDimitry Andric         getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
148259d1ed5bSDimitry Andric                                            GD.getDtorType()))
148359d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
148459d1ed5bSDimitry Andric 
1485f22ef01cSRoman Divacky     // This is the first use or definition of a mangled name.  If there is a
1486f22ef01cSRoman Divacky     // deferred decl with this name, remember that we need to emit it at the end
1487f22ef01cSRoman Divacky     // of the file.
148859d1ed5bSDimitry Andric     auto DDI = DeferredDecls.find(MangledName);
1489f22ef01cSRoman Divacky     if (DDI != DeferredDecls.end()) {
149059d1ed5bSDimitry Andric       // Move the potentially referenced deferred decl to the
149159d1ed5bSDimitry Andric       // DeferredDeclsToEmit list, and remove it from DeferredDecls (since we
149259d1ed5bSDimitry Andric       // don't need it anymore).
149359d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, DDI->second);
1494f22ef01cSRoman Divacky       DeferredDecls.erase(DDI);
14952754fe60SDimitry Andric 
149659d1ed5bSDimitry Andric       // Otherwise, if this is a sized deallocation function, emit a weak
149759d1ed5bSDimitry Andric       // definition
1498f785676fSDimitry Andric       // for it at the end of the translation unit.
1499f785676fSDimitry Andric     } else if (D && cast<FunctionDecl>(D)
1500f785676fSDimitry Andric                         ->getCorrespondingUnsizedGlobalDeallocationFunction()) {
150159d1ed5bSDimitry Andric       addDeferredDeclToEmit(F, GD);
1502f785676fSDimitry Andric 
15032754fe60SDimitry Andric       // Otherwise, there are cases we have to worry about where we're
15042754fe60SDimitry Andric       // using a declaration for which we must emit a definition but where
15052754fe60SDimitry Andric       // we might not find a top-level definition:
15062754fe60SDimitry Andric       //   - member functions defined inline in their classes
15072754fe60SDimitry Andric       //   - friend functions defined inline in some class
15082754fe60SDimitry Andric       //   - special member functions with implicit definitions
15092754fe60SDimitry Andric       // If we ever change our AST traversal to walk into class methods,
15102754fe60SDimitry Andric       // this will be unnecessary.
15112754fe60SDimitry Andric       //
151259d1ed5bSDimitry Andric       // We also don't emit a definition for a function if it's going to be an
151359d1ed5bSDimitry Andric       // entry
15142754fe60SDimitry Andric       // in a vtable, unless it's already marked as used.
1515f785676fSDimitry Andric     } else if (getLangOpts().CPlusPlus && D) {
15162754fe60SDimitry Andric       // Look for a declaration that's lexically in a record.
151759d1ed5bSDimitry Andric       const auto *FD = cast<FunctionDecl>(D);
15187ae0e2c9SDimitry Andric       FD = FD->getMostRecentDecl();
15192754fe60SDimitry Andric       do {
15202754fe60SDimitry Andric         if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
15212754fe60SDimitry Andric           if (FD->isImplicit() && !ForVTable) {
152259d1ed5bSDimitry Andric             assert(FD->isUsed() &&
152359d1ed5bSDimitry Andric                    "Sema didn't mark implicit function as used!");
152459d1ed5bSDimitry Andric             addDeferredDeclToEmit(F, GD.getWithDecl(FD));
15252754fe60SDimitry Andric             break;
1526bd5abe19SDimitry Andric           } else if (FD->doesThisDeclarationHaveABody()) {
152759d1ed5bSDimitry Andric             addDeferredDeclToEmit(F, GD.getWithDecl(FD));
15282754fe60SDimitry Andric             break;
1529f22ef01cSRoman Divacky           }
1530f22ef01cSRoman Divacky         }
1531dff0c46cSDimitry Andric         FD = FD->getPreviousDecl();
15322754fe60SDimitry Andric       } while (FD);
1533f22ef01cSRoman Divacky     }
153459d1ed5bSDimitry Andric   }
1535f22ef01cSRoman Divacky 
1536f22ef01cSRoman Divacky   // Make sure the result is of the requested type.
1537f22ef01cSRoman Divacky   if (!IsIncompleteFunction) {
1538f22ef01cSRoman Divacky     assert(F->getType()->getElementType() == Ty);
1539f22ef01cSRoman Divacky     return F;
1540f22ef01cSRoman Divacky   }
1541f22ef01cSRoman Divacky 
154217a519f9SDimitry Andric   llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
1543f22ef01cSRoman Divacky   return llvm::ConstantExpr::getBitCast(F, PTy);
1544f22ef01cSRoman Divacky }
1545f22ef01cSRoman Divacky 
1546f22ef01cSRoman Divacky /// GetAddrOfFunction - Return the address of the given function.  If Ty is
1547f22ef01cSRoman Divacky /// non-null, then this function will use the specified type if it has to
1548f22ef01cSRoman Divacky /// create it (this occurs when we see a definition of the function).
1549f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
15506122f3e6SDimitry Andric                                                  llvm::Type *Ty,
155159d1ed5bSDimitry Andric                                                  bool ForVTable,
155259d1ed5bSDimitry Andric                                                  bool DontDefer) {
1553f22ef01cSRoman Divacky   // If there was no specific requested type, just convert it now.
1554f22ef01cSRoman Divacky   if (!Ty)
1555f22ef01cSRoman Divacky     Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
1556ffd1746dSEd Schouten 
15576122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
155859d1ed5bSDimitry Andric   return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable, DontDefer);
1559f22ef01cSRoman Divacky }
1560f22ef01cSRoman Divacky 
1561f22ef01cSRoman Divacky /// CreateRuntimeFunction - Create a new runtime function with the specified
1562f22ef01cSRoman Divacky /// type and name.
1563f22ef01cSRoman Divacky llvm::Constant *
15646122f3e6SDimitry Andric CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy,
15656122f3e6SDimitry Andric                                      StringRef Name,
1566139f7f9bSDimitry Andric                                      llvm::AttributeSet ExtraAttrs) {
156759d1ed5bSDimitry Andric   llvm::Constant *C =
156859d1ed5bSDimitry Andric       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
156959d1ed5bSDimitry Andric                               /*DontDefer=*/false, ExtraAttrs);
157059d1ed5bSDimitry Andric   if (auto *F = dyn_cast<llvm::Function>(C))
1571139f7f9bSDimitry Andric     if (F->empty())
1572139f7f9bSDimitry Andric       F->setCallingConv(getRuntimeCC());
1573139f7f9bSDimitry Andric   return C;
1574f22ef01cSRoman Divacky }
1575f22ef01cSRoman Divacky 
1576dff0c46cSDimitry Andric /// isTypeConstant - Determine whether an object of this type can be emitted
1577dff0c46cSDimitry Andric /// as a constant.
1578dff0c46cSDimitry Andric ///
1579dff0c46cSDimitry Andric /// If ExcludeCtor is true, the duration when the object's constructor runs
1580dff0c46cSDimitry Andric /// will not be considered. The caller will need to verify that the object is
1581dff0c46cSDimitry Andric /// not written to during its construction.
1582dff0c46cSDimitry Andric bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) {
1583dff0c46cSDimitry Andric   if (!Ty.isConstant(Context) && !Ty->isReferenceType())
1584f22ef01cSRoman Divacky     return false;
1585bd5abe19SDimitry Andric 
1586dff0c46cSDimitry Andric   if (Context.getLangOpts().CPlusPlus) {
1587dff0c46cSDimitry Andric     if (const CXXRecordDecl *Record
1588dff0c46cSDimitry Andric           = Context.getBaseElementType(Ty)->getAsCXXRecordDecl())
1589dff0c46cSDimitry Andric       return ExcludeCtor && !Record->hasMutableFields() &&
1590dff0c46cSDimitry Andric              Record->hasTrivialDestructor();
1591f22ef01cSRoman Divacky   }
1592bd5abe19SDimitry Andric 
1593f22ef01cSRoman Divacky   return true;
1594f22ef01cSRoman Divacky }
1595f22ef01cSRoman Divacky 
1596f22ef01cSRoman Divacky /// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module,
1597f22ef01cSRoman Divacky /// create and return an llvm GlobalVariable with the specified type.  If there
1598f22ef01cSRoman Divacky /// is something in the module with the specified name, return it potentially
1599f22ef01cSRoman Divacky /// bitcasted to the right type.
1600f22ef01cSRoman Divacky ///
1601f22ef01cSRoman Divacky /// If D is non-null, it specifies a decl that correspond to this.  This is used
1602f22ef01cSRoman Divacky /// to set the attributes on the global when it is first created.
1603f22ef01cSRoman Divacky llvm::Constant *
16046122f3e6SDimitry Andric CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
16056122f3e6SDimitry Andric                                      llvm::PointerType *Ty,
160659d1ed5bSDimitry Andric                                      const VarDecl *D) {
1607f22ef01cSRoman Divacky   // Lookup the entry, lazily creating it if necessary.
1608f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
1609f22ef01cSRoman Divacky   if (Entry) {
16103861d79fSDimitry Andric     if (WeakRefReferences.erase(Entry)) {
1611f22ef01cSRoman Divacky       if (D && !D->hasAttr<WeakAttr>())
1612f22ef01cSRoman Divacky         Entry->setLinkage(llvm::Function::ExternalLinkage);
1613f22ef01cSRoman Divacky     }
1614f22ef01cSRoman Divacky 
1615f22ef01cSRoman Divacky     if (Entry->getType() == Ty)
1616f22ef01cSRoman Divacky       return Entry;
1617f22ef01cSRoman Divacky 
1618f22ef01cSRoman Divacky     // Make sure the result is of the correct type.
1619f785676fSDimitry Andric     if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace())
1620f785676fSDimitry Andric       return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty);
1621f785676fSDimitry Andric 
1622f22ef01cSRoman Divacky     return llvm::ConstantExpr::getBitCast(Entry, Ty);
1623f22ef01cSRoman Divacky   }
1624f22ef01cSRoman Divacky 
162559d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace());
162659d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
162759d1ed5bSDimitry Andric       getModule(), Ty->getElementType(), false,
162859d1ed5bSDimitry Andric       llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, nullptr,
162959d1ed5bSDimitry Andric       llvm::GlobalVariable::NotThreadLocal, AddrSpace);
163059d1ed5bSDimitry Andric 
1631f22ef01cSRoman Divacky   // This is the first use or definition of a mangled name.  If there is a
1632f22ef01cSRoman Divacky   // deferred decl with this name, remember that we need to emit it at the end
1633f22ef01cSRoman Divacky   // of the file.
163459d1ed5bSDimitry Andric   auto DDI = DeferredDecls.find(MangledName);
1635f22ef01cSRoman Divacky   if (DDI != DeferredDecls.end()) {
1636f22ef01cSRoman Divacky     // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
1637f22ef01cSRoman Divacky     // list, and remove it from DeferredDecls (since we don't need it anymore).
163859d1ed5bSDimitry Andric     addDeferredDeclToEmit(GV, DDI->second);
1639f22ef01cSRoman Divacky     DeferredDecls.erase(DDI);
1640f22ef01cSRoman Divacky   }
1641f22ef01cSRoman Divacky 
1642f22ef01cSRoman Divacky   // Handle things which are present even on external declarations.
1643f22ef01cSRoman Divacky   if (D) {
1644f22ef01cSRoman Divacky     // FIXME: This code is overly simple and should be merged with other global
1645f22ef01cSRoman Divacky     // handling.
1646dff0c46cSDimitry Andric     GV->setConstant(isTypeConstant(D->getType(), false));
1647f22ef01cSRoman Divacky 
164859d1ed5bSDimitry Andric     setLinkageAndVisibilityForGV(GV, D);
16492754fe60SDimitry Andric 
1650284c1978SDimitry Andric     if (D->getTLSKind()) {
1651284c1978SDimitry Andric       if (D->getTLSKind() == VarDecl::TLS_Dynamic)
1652284c1978SDimitry Andric         CXXThreadLocals.push_back(std::make_pair(D, GV));
16537ae0e2c9SDimitry Andric       setTLSMode(GV, *D);
1654f22ef01cSRoman Divacky     }
1655f785676fSDimitry Andric 
1656f785676fSDimitry Andric     // If required by the ABI, treat declarations of static data members with
1657f785676fSDimitry Andric     // inline initializers as definitions.
165859d1ed5bSDimitry Andric     if (getContext().isMSStaticDataMemberInlineDefinition(D)) {
1659f785676fSDimitry Andric       EmitGlobalVarDefinition(D);
1660284c1978SDimitry Andric     }
1661f22ef01cSRoman Divacky 
166259d1ed5bSDimitry Andric     // Handle XCore specific ABI requirements.
166359d1ed5bSDimitry Andric     if (getTarget().getTriple().getArch() == llvm::Triple::xcore &&
166459d1ed5bSDimitry Andric         D->getLanguageLinkage() == CLanguageLinkage &&
166559d1ed5bSDimitry Andric         D->getType().isConstant(Context) &&
166659d1ed5bSDimitry Andric         isExternallyVisible(D->getLinkageAndVisibility().getLinkage()))
166759d1ed5bSDimitry Andric       GV->setSection(".cp.rodata");
166859d1ed5bSDimitry Andric   }
166959d1ed5bSDimitry Andric 
16707ae0e2c9SDimitry Andric   if (AddrSpace != Ty->getAddressSpace())
1671f785676fSDimitry Andric     return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty);
1672f785676fSDimitry Andric 
1673f22ef01cSRoman Divacky   return GV;
1674f22ef01cSRoman Divacky }
1675f22ef01cSRoman Divacky 
1676f22ef01cSRoman Divacky 
16772754fe60SDimitry Andric llvm::GlobalVariable *
16786122f3e6SDimitry Andric CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
16796122f3e6SDimitry Andric                                       llvm::Type *Ty,
16802754fe60SDimitry Andric                                       llvm::GlobalValue::LinkageTypes Linkage) {
16812754fe60SDimitry Andric   llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name);
168259d1ed5bSDimitry Andric   llvm::GlobalVariable *OldGV = nullptr;
16832754fe60SDimitry Andric 
16842754fe60SDimitry Andric   if (GV) {
16852754fe60SDimitry Andric     // Check if the variable has the right type.
16862754fe60SDimitry Andric     if (GV->getType()->getElementType() == Ty)
16872754fe60SDimitry Andric       return GV;
16882754fe60SDimitry Andric 
16892754fe60SDimitry Andric     // Because C++ name mangling, the only way we can end up with an already
16902754fe60SDimitry Andric     // existing global with the same name is if it has been declared extern "C".
16912754fe60SDimitry Andric     assert(GV->isDeclaration() && "Declaration has wrong type!");
16922754fe60SDimitry Andric     OldGV = GV;
16932754fe60SDimitry Andric   }
16942754fe60SDimitry Andric 
16952754fe60SDimitry Andric   // Create a new variable.
16962754fe60SDimitry Andric   GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true,
169759d1ed5bSDimitry Andric                                 Linkage, nullptr, Name);
16982754fe60SDimitry Andric 
16992754fe60SDimitry Andric   if (OldGV) {
17002754fe60SDimitry Andric     // Replace occurrences of the old variable if needed.
17012754fe60SDimitry Andric     GV->takeName(OldGV);
17022754fe60SDimitry Andric 
17032754fe60SDimitry Andric     if (!OldGV->use_empty()) {
17042754fe60SDimitry Andric       llvm::Constant *NewPtrForOldDecl =
17052754fe60SDimitry Andric       llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
17062754fe60SDimitry Andric       OldGV->replaceAllUsesWith(NewPtrForOldDecl);
17072754fe60SDimitry Andric     }
17082754fe60SDimitry Andric 
17092754fe60SDimitry Andric     OldGV->eraseFromParent();
17102754fe60SDimitry Andric   }
17112754fe60SDimitry Andric 
17122754fe60SDimitry Andric   return GV;
17132754fe60SDimitry Andric }
17142754fe60SDimitry Andric 
1715f22ef01cSRoman Divacky /// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the
1716f22ef01cSRoman Divacky /// given global variable.  If Ty is non-null and if the global doesn't exist,
1717cb4dff85SDimitry Andric /// then it will be created with the specified type instead of whatever the
1718f22ef01cSRoman Divacky /// normal requested type would be.
1719f22ef01cSRoman Divacky llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
17206122f3e6SDimitry Andric                                                   llvm::Type *Ty) {
1721f22ef01cSRoman Divacky   assert(D->hasGlobalStorage() && "Not a global variable");
1722f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
172359d1ed5bSDimitry Andric   if (!Ty)
1724f22ef01cSRoman Divacky     Ty = getTypes().ConvertTypeForMem(ASTTy);
1725f22ef01cSRoman Divacky 
17266122f3e6SDimitry Andric   llvm::PointerType *PTy =
17273b0f4066SDimitry Andric     llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy));
1728f22ef01cSRoman Divacky 
17296122f3e6SDimitry Andric   StringRef MangledName = getMangledName(D);
1730f22ef01cSRoman Divacky   return GetOrCreateLLVMGlobal(MangledName, PTy, D);
1731f22ef01cSRoman Divacky }
1732f22ef01cSRoman Divacky 
1733f22ef01cSRoman Divacky /// CreateRuntimeVariable - Create a new runtime global variable with the
1734f22ef01cSRoman Divacky /// specified type and name.
1735f22ef01cSRoman Divacky llvm::Constant *
17366122f3e6SDimitry Andric CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty,
17376122f3e6SDimitry Andric                                      StringRef Name) {
173859d1ed5bSDimitry Andric   return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr);
1739f22ef01cSRoman Divacky }
1740f22ef01cSRoman Divacky 
1741f22ef01cSRoman Divacky void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) {
1742f22ef01cSRoman Divacky   assert(!D->getInit() && "Cannot emit definite definitions here!");
1743f22ef01cSRoman Divacky 
1744f22ef01cSRoman Divacky   if (MayDeferGeneration(D)) {
1745f22ef01cSRoman Divacky     // If we have not seen a reference to this variable yet, place it
1746f22ef01cSRoman Divacky     // into the deferred declarations table to be emitted if needed
1747f22ef01cSRoman Divacky     // later.
17486122f3e6SDimitry Andric     StringRef MangledName = getMangledName(D);
1749f22ef01cSRoman Divacky     if (!GetGlobalValue(MangledName)) {
1750f22ef01cSRoman Divacky       DeferredDecls[MangledName] = D;
1751f22ef01cSRoman Divacky       return;
1752f22ef01cSRoman Divacky     }
1753f22ef01cSRoman Divacky   }
1754f22ef01cSRoman Divacky 
1755f22ef01cSRoman Divacky   // The tentative definition is the only definition.
1756f22ef01cSRoman Divacky   EmitGlobalVarDefinition(D);
1757f22ef01cSRoman Divacky }
1758f22ef01cSRoman Divacky 
17596122f3e6SDimitry Andric CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const {
17602754fe60SDimitry Andric     return Context.toCharUnitsFromBits(
17613861d79fSDimitry Andric       TheDataLayout.getTypeStoreSizeInBits(Ty));
1762f22ef01cSRoman Divacky }
1763f22ef01cSRoman Divacky 
17647ae0e2c9SDimitry Andric unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D,
17657ae0e2c9SDimitry Andric                                                  unsigned AddrSpace) {
17667ae0e2c9SDimitry Andric   if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) {
17677ae0e2c9SDimitry Andric     if (D->hasAttr<CUDAConstantAttr>())
17687ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant);
17697ae0e2c9SDimitry Andric     else if (D->hasAttr<CUDASharedAttr>())
17707ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared);
17717ae0e2c9SDimitry Andric     else
17727ae0e2c9SDimitry Andric       AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device);
17737ae0e2c9SDimitry Andric   }
17747ae0e2c9SDimitry Andric 
17757ae0e2c9SDimitry Andric   return AddrSpace;
17767ae0e2c9SDimitry Andric }
17777ae0e2c9SDimitry Andric 
1778284c1978SDimitry Andric template<typename SomeDecl>
1779284c1978SDimitry Andric void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
1780284c1978SDimitry Andric                                                llvm::GlobalValue *GV) {
1781284c1978SDimitry Andric   if (!getLangOpts().CPlusPlus)
1782284c1978SDimitry Andric     return;
1783284c1978SDimitry Andric 
1784284c1978SDimitry Andric   // Must have 'used' attribute, or else inline assembly can't rely on
1785284c1978SDimitry Andric   // the name existing.
1786284c1978SDimitry Andric   if (!D->template hasAttr<UsedAttr>())
1787284c1978SDimitry Andric     return;
1788284c1978SDimitry Andric 
1789284c1978SDimitry Andric   // Must have internal linkage and an ordinary name.
1790f785676fSDimitry Andric   if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage)
1791284c1978SDimitry Andric     return;
1792284c1978SDimitry Andric 
1793284c1978SDimitry Andric   // Must be in an extern "C" context. Entities declared directly within
1794284c1978SDimitry Andric   // a record are not extern "C" even if the record is in such a context.
1795f785676fSDimitry Andric   const SomeDecl *First = D->getFirstDecl();
1796284c1978SDimitry Andric   if (First->getDeclContext()->isRecord() || !First->isInExternCContext())
1797284c1978SDimitry Andric     return;
1798284c1978SDimitry Andric 
1799284c1978SDimitry Andric   // OK, this is an internal linkage entity inside an extern "C" linkage
1800284c1978SDimitry Andric   // specification. Make a note of that so we can give it the "expected"
1801284c1978SDimitry Andric   // mangled name if nothing else is using that name.
1802284c1978SDimitry Andric   std::pair<StaticExternCMap::iterator, bool> R =
1803284c1978SDimitry Andric       StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
1804284c1978SDimitry Andric 
1805284c1978SDimitry Andric   // If we have multiple internal linkage entities with the same name
1806284c1978SDimitry Andric   // in extern "C" regions, none of them gets that name.
1807284c1978SDimitry Andric   if (!R.second)
180859d1ed5bSDimitry Andric     R.first->second = nullptr;
1809284c1978SDimitry Andric }
1810284c1978SDimitry Andric 
1811f22ef01cSRoman Divacky void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
181259d1ed5bSDimitry Andric   llvm::Constant *Init = nullptr;
1813f22ef01cSRoman Divacky   QualType ASTTy = D->getType();
1814dff0c46cSDimitry Andric   CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1815dff0c46cSDimitry Andric   bool NeedsGlobalCtor = false;
1816dff0c46cSDimitry Andric   bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor();
1817f22ef01cSRoman Divacky 
1818dff0c46cSDimitry Andric   const VarDecl *InitDecl;
1819dff0c46cSDimitry Andric   const Expr *InitExpr = D->getAnyInitializer(InitDecl);
1820f22ef01cSRoman Divacky 
1821f22ef01cSRoman Divacky   if (!InitExpr) {
1822f22ef01cSRoman Divacky     // This is a tentative definition; tentative definitions are
1823f22ef01cSRoman Divacky     // implicitly initialized with { 0 }.
1824f22ef01cSRoman Divacky     //
1825f22ef01cSRoman Divacky     // Note that tentative definitions are only emitted at the end of
1826f22ef01cSRoman Divacky     // a translation unit, so they should never have incomplete
1827f22ef01cSRoman Divacky     // type. In addition, EmitTentativeDefinition makes sure that we
1828f22ef01cSRoman Divacky     // never attempt to emit a tentative definition if a real one
1829f22ef01cSRoman Divacky     // exists. A use may still exists, however, so we still may need
1830f22ef01cSRoman Divacky     // to do a RAUW.
1831f22ef01cSRoman Divacky     assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
1832f22ef01cSRoman Divacky     Init = EmitNullConstant(D->getType());
1833f22ef01cSRoman Divacky   } else {
18347ae0e2c9SDimitry Andric     initializedGlobalDecl = GlobalDecl(D);
1835dff0c46cSDimitry Andric     Init = EmitConstantInit(*InitDecl);
1836f785676fSDimitry Andric 
1837f22ef01cSRoman Divacky     if (!Init) {
1838f22ef01cSRoman Divacky       QualType T = InitExpr->getType();
1839f22ef01cSRoman Divacky       if (D->getType()->isReferenceType())
1840f22ef01cSRoman Divacky         T = D->getType();
1841f22ef01cSRoman Divacky 
1842dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus) {
1843f22ef01cSRoman Divacky         Init = EmitNullConstant(T);
1844dff0c46cSDimitry Andric         NeedsGlobalCtor = true;
1845f22ef01cSRoman Divacky       } else {
1846f22ef01cSRoman Divacky         ErrorUnsupported(D, "static initializer");
1847f22ef01cSRoman Divacky         Init = llvm::UndefValue::get(getTypes().ConvertType(T));
1848f22ef01cSRoman Divacky       }
1849e580952dSDimitry Andric     } else {
1850e580952dSDimitry Andric       // We don't need an initializer, so remove the entry for the delayed
1851dff0c46cSDimitry Andric       // initializer position (just in case this entry was delayed) if we
1852dff0c46cSDimitry Andric       // also don't need to register a destructor.
1853dff0c46cSDimitry Andric       if (getLangOpts().CPlusPlus && !NeedsGlobalDtor)
1854e580952dSDimitry Andric         DelayedCXXInitPosition.erase(D);
1855f22ef01cSRoman Divacky     }
1856f22ef01cSRoman Divacky   }
1857f22ef01cSRoman Divacky 
18586122f3e6SDimitry Andric   llvm::Type* InitType = Init->getType();
1859f22ef01cSRoman Divacky   llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType);
1860f22ef01cSRoman Divacky 
1861f22ef01cSRoman Divacky   // Strip off a bitcast if we got one back.
186259d1ed5bSDimitry Andric   if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
1863f22ef01cSRoman Divacky     assert(CE->getOpcode() == llvm::Instruction::BitCast ||
1864f785676fSDimitry Andric            CE->getOpcode() == llvm::Instruction::AddrSpaceCast ||
1865f785676fSDimitry Andric            // All zero index gep.
1866f22ef01cSRoman Divacky            CE->getOpcode() == llvm::Instruction::GetElementPtr);
1867f22ef01cSRoman Divacky     Entry = CE->getOperand(0);
1868f22ef01cSRoman Divacky   }
1869f22ef01cSRoman Divacky 
1870f22ef01cSRoman Divacky   // Entry is now either a Function or GlobalVariable.
187159d1ed5bSDimitry Andric   auto *GV = dyn_cast<llvm::GlobalVariable>(Entry);
1872f22ef01cSRoman Divacky 
1873f22ef01cSRoman Divacky   // We have a definition after a declaration with the wrong type.
1874f22ef01cSRoman Divacky   // We must make a new GlobalVariable* and update everything that used OldGV
1875f22ef01cSRoman Divacky   // (a declaration or tentative definition) with the new GlobalVariable*
1876f22ef01cSRoman Divacky   // (which will be a definition).
1877f22ef01cSRoman Divacky   //
1878f22ef01cSRoman Divacky   // This happens if there is a prototype for a global (e.g.
1879f22ef01cSRoman Divacky   // "extern int x[];") and then a definition of a different type (e.g.
1880f22ef01cSRoman Divacky   // "int x[10];"). This also happens when an initializer has a different type
1881f22ef01cSRoman Divacky   // from the type of the global (this happens with unions).
188259d1ed5bSDimitry Andric   if (!GV ||
1883f22ef01cSRoman Divacky       GV->getType()->getElementType() != InitType ||
18843b0f4066SDimitry Andric       GV->getType()->getAddressSpace() !=
18857ae0e2c9SDimitry Andric        GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) {
1886f22ef01cSRoman Divacky 
1887f22ef01cSRoman Divacky     // Move the old entry aside so that we'll create a new one.
18886122f3e6SDimitry Andric     Entry->setName(StringRef());
1889f22ef01cSRoman Divacky 
1890f22ef01cSRoman Divacky     // Make a new global with the correct type, this is now guaranteed to work.
1891f22ef01cSRoman Divacky     GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType));
1892f22ef01cSRoman Divacky 
1893f22ef01cSRoman Divacky     // Replace all uses of the old global with the new global
1894f22ef01cSRoman Divacky     llvm::Constant *NewPtrForOldDecl =
1895f22ef01cSRoman Divacky         llvm::ConstantExpr::getBitCast(GV, Entry->getType());
1896f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(NewPtrForOldDecl);
1897f22ef01cSRoman Divacky 
1898f22ef01cSRoman Divacky     // Erase the old global, since it is no longer used.
1899f22ef01cSRoman Divacky     cast<llvm::GlobalValue>(Entry)->eraseFromParent();
1900f22ef01cSRoman Divacky   }
1901f22ef01cSRoman Divacky 
1902284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, GV);
1903284c1978SDimitry Andric 
19046122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
19056122f3e6SDimitry Andric     AddGlobalAnnotations(D, GV);
1906f22ef01cSRoman Divacky 
1907f22ef01cSRoman Divacky   GV->setInitializer(Init);
1908f22ef01cSRoman Divacky 
1909f22ef01cSRoman Divacky   // If it is safe to mark the global 'constant', do so now.
1910dff0c46cSDimitry Andric   GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
1911dff0c46cSDimitry Andric                   isTypeConstant(D->getType(), true));
1912f22ef01cSRoman Divacky 
1913f22ef01cSRoman Divacky   GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
1914f22ef01cSRoman Divacky 
1915f22ef01cSRoman Divacky   // Set the llvm linkage type as appropriate.
19162754fe60SDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
191759d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(D, GV->isConstant());
1918f785676fSDimitry Andric 
191959d1ed5bSDimitry Andric   // On Darwin, the backing variable for a C++11 thread_local variable always
192059d1ed5bSDimitry Andric   // has internal linkage; all accesses should just be calls to the
192159d1ed5bSDimitry Andric   // Itanium-specified entry point, which has the normal linkage of the
192259d1ed5bSDimitry Andric   // variable.
192359d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(D))
192459d1ed5bSDimitry Andric     if (!VD->isStaticLocal() && VD->getTLSKind() == VarDecl::TLS_Dynamic &&
192559d1ed5bSDimitry Andric         Context.getTargetInfo().getTriple().isMacOSX())
192659d1ed5bSDimitry Andric       Linkage = llvm::GlobalValue::InternalLinkage;
192759d1ed5bSDimitry Andric 
192859d1ed5bSDimitry Andric   GV->setLinkage(Linkage);
192959d1ed5bSDimitry Andric   if (D->hasAttr<DLLImportAttr>())
193059d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
193159d1ed5bSDimitry Andric   else if (D->hasAttr<DLLExportAttr>())
193259d1ed5bSDimitry Andric     GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
1933f785676fSDimitry Andric 
19342754fe60SDimitry Andric   if (Linkage == llvm::GlobalVariable::CommonLinkage)
1935f22ef01cSRoman Divacky     // common vars aren't constant even if declared const.
1936f22ef01cSRoman Divacky     GV->setConstant(false);
1937f22ef01cSRoman Divacky 
193859d1ed5bSDimitry Andric   setNonAliasAttributes(D, GV);
1939f22ef01cSRoman Divacky 
19402754fe60SDimitry Andric   // Emit the initializer function if necessary.
1941dff0c46cSDimitry Andric   if (NeedsGlobalCtor || NeedsGlobalDtor)
1942dff0c46cSDimitry Andric     EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
19432754fe60SDimitry Andric 
194459d1ed5bSDimitry Andric   reportGlobalToASan(GV, *D, NeedsGlobalCtor);
19453861d79fSDimitry Andric 
1946f22ef01cSRoman Divacky   // Emit global variable debug information.
19476122f3e6SDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
19483861d79fSDimitry Andric     if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
1949f22ef01cSRoman Divacky       DI->EmitGlobalVariable(GV, D);
1950f22ef01cSRoman Divacky }
1951f22ef01cSRoman Divacky 
195259d1ed5bSDimitry Andric void CodeGenModule::reportGlobalToASan(llvm::GlobalVariable *GV,
195359d1ed5bSDimitry Andric                                        SourceLocation Loc, StringRef Name,
195459d1ed5bSDimitry Andric                                        bool IsDynInit, bool IsBlacklisted) {
195559d1ed5bSDimitry Andric   if (!LangOpts.Sanitize.Address)
195659d1ed5bSDimitry Andric     return;
195759d1ed5bSDimitry Andric   IsDynInit &= !SanitizerBL.isIn(*GV, "init");
195859d1ed5bSDimitry Andric   IsBlacklisted |= SanitizerBL.isIn(*GV);
195959d1ed5bSDimitry Andric 
196059d1ed5bSDimitry Andric   llvm::GlobalVariable *LocDescr = nullptr;
196159d1ed5bSDimitry Andric   llvm::GlobalVariable *GlobalName = nullptr;
196259d1ed5bSDimitry Andric   if (!IsBlacklisted) {
196359d1ed5bSDimitry Andric     // Don't generate source location and global name if it is blacklisted -
196459d1ed5bSDimitry Andric     // it won't be instrumented anyway.
196559d1ed5bSDimitry Andric     PresumedLoc PLoc = Context.getSourceManager().getPresumedLoc(Loc);
196659d1ed5bSDimitry Andric     if (PLoc.isValid()) {
196759d1ed5bSDimitry Andric       llvm::Constant *LocData[] = {
196859d1ed5bSDimitry Andric           GetAddrOfConstantCString(PLoc.getFilename()),
196959d1ed5bSDimitry Andric           llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
197059d1ed5bSDimitry Andric                                  PLoc.getLine()),
197159d1ed5bSDimitry Andric           llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
197259d1ed5bSDimitry Andric                                  PLoc.getColumn()),
197359d1ed5bSDimitry Andric       };
197459d1ed5bSDimitry Andric       auto LocStruct = llvm::ConstantStruct::getAnon(LocData);
197559d1ed5bSDimitry Andric       LocDescr = new llvm::GlobalVariable(TheModule, LocStruct->getType(), true,
197659d1ed5bSDimitry Andric                                           llvm::GlobalValue::PrivateLinkage,
197759d1ed5bSDimitry Andric                                           LocStruct, ".asan_loc_descr");
197859d1ed5bSDimitry Andric       LocDescr->setUnnamedAddr(true);
197959d1ed5bSDimitry Andric       // Add LocDescr to llvm.compiler.used, so that it won't be removed by
198059d1ed5bSDimitry Andric       // the optimizer before the ASan instrumentation pass.
198159d1ed5bSDimitry Andric       addCompilerUsedGlobal(LocDescr);
198259d1ed5bSDimitry Andric     }
198359d1ed5bSDimitry Andric     if (!Name.empty()) {
198459d1ed5bSDimitry Andric       GlobalName = GetAddrOfConstantCString(Name);
198559d1ed5bSDimitry Andric       // GlobalName shouldn't be removed by the optimizer.
198659d1ed5bSDimitry Andric       addCompilerUsedGlobal(GlobalName);
198759d1ed5bSDimitry Andric     }
198859d1ed5bSDimitry Andric   }
198959d1ed5bSDimitry Andric 
199059d1ed5bSDimitry Andric   llvm::Value *GlobalMetadata[] = {
199159d1ed5bSDimitry Andric       GV, LocDescr, GlobalName,
199259d1ed5bSDimitry Andric       llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsDynInit),
199359d1ed5bSDimitry Andric       llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsBlacklisted)};
199459d1ed5bSDimitry Andric 
199559d1ed5bSDimitry Andric   llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalMetadata);
199659d1ed5bSDimitry Andric   llvm::NamedMDNode *AsanGlobals =
199759d1ed5bSDimitry Andric       TheModule.getOrInsertNamedMetadata("llvm.asan.globals");
199859d1ed5bSDimitry Andric   AsanGlobals->addOperand(ThisGlobal);
199959d1ed5bSDimitry Andric }
200059d1ed5bSDimitry Andric 
200159d1ed5bSDimitry Andric void CodeGenModule::reportGlobalToASan(llvm::GlobalVariable *GV,
200259d1ed5bSDimitry Andric                                        const VarDecl &D, bool IsDynInit) {
200359d1ed5bSDimitry Andric   if (!LangOpts.Sanitize.Address)
200459d1ed5bSDimitry Andric     return;
200559d1ed5bSDimitry Andric   std::string QualName;
200659d1ed5bSDimitry Andric   llvm::raw_string_ostream OS(QualName);
200759d1ed5bSDimitry Andric   D.printQualifiedName(OS);
200859d1ed5bSDimitry Andric   reportGlobalToASan(GV, D.getLocation(), OS.str(), IsDynInit);
200959d1ed5bSDimitry Andric }
201059d1ed5bSDimitry Andric 
201159d1ed5bSDimitry Andric void CodeGenModule::disableSanitizerForGlobal(llvm::GlobalVariable *GV) {
201259d1ed5bSDimitry Andric   // For now, just make sure the global is not modified by the ASan
201359d1ed5bSDimitry Andric   // instrumentation.
201459d1ed5bSDimitry Andric   if (LangOpts.Sanitize.Address)
201559d1ed5bSDimitry Andric     reportGlobalToASan(GV, SourceLocation(), "", false, true);
201659d1ed5bSDimitry Andric }
201759d1ed5bSDimitry Andric 
201859d1ed5bSDimitry Andric static bool isVarDeclStrongDefinition(const VarDecl *D, bool NoCommon) {
201959d1ed5bSDimitry Andric   // Don't give variables common linkage if -fno-common was specified unless it
202059d1ed5bSDimitry Andric   // was overridden by a NoCommon attribute.
202159d1ed5bSDimitry Andric   if ((NoCommon || D->hasAttr<NoCommonAttr>()) && !D->hasAttr<CommonAttr>())
202259d1ed5bSDimitry Andric     return true;
202359d1ed5bSDimitry Andric 
202459d1ed5bSDimitry Andric   // C11 6.9.2/2:
202559d1ed5bSDimitry Andric   //   A declaration of an identifier for an object that has file scope without
202659d1ed5bSDimitry Andric   //   an initializer, and without a storage-class specifier or with the
202759d1ed5bSDimitry Andric   //   storage-class specifier static, constitutes a tentative definition.
202859d1ed5bSDimitry Andric   if (D->getInit() || D->hasExternalStorage())
202959d1ed5bSDimitry Andric     return true;
203059d1ed5bSDimitry Andric 
203159d1ed5bSDimitry Andric   // A variable cannot be both common and exist in a section.
203259d1ed5bSDimitry Andric   if (D->hasAttr<SectionAttr>())
203359d1ed5bSDimitry Andric     return true;
203459d1ed5bSDimitry Andric 
203559d1ed5bSDimitry Andric   // Thread local vars aren't considered common linkage.
203659d1ed5bSDimitry Andric   if (D->getTLSKind())
203759d1ed5bSDimitry Andric     return true;
203859d1ed5bSDimitry Andric 
203959d1ed5bSDimitry Andric   // Tentative definitions marked with WeakImportAttr are true definitions.
204059d1ed5bSDimitry Andric   if (D->hasAttr<WeakImportAttr>())
204159d1ed5bSDimitry Andric     return true;
204259d1ed5bSDimitry Andric 
204359d1ed5bSDimitry Andric   return false;
204459d1ed5bSDimitry Andric }
204559d1ed5bSDimitry Andric 
204659d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
204759d1ed5bSDimitry Andric     const DeclaratorDecl *D, GVALinkage Linkage, bool IsConstantVariable) {
20482754fe60SDimitry Andric   if (Linkage == GVA_Internal)
20492754fe60SDimitry Andric     return llvm::Function::InternalLinkage;
205059d1ed5bSDimitry Andric 
205159d1ed5bSDimitry Andric   if (D->hasAttr<WeakAttr>()) {
205259d1ed5bSDimitry Andric     if (IsConstantVariable)
205359d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakODRLinkage;
205459d1ed5bSDimitry Andric     else
205559d1ed5bSDimitry Andric       return llvm::GlobalVariable::WeakAnyLinkage;
205659d1ed5bSDimitry Andric   }
205759d1ed5bSDimitry Andric 
205859d1ed5bSDimitry Andric   // We are guaranteed to have a strong definition somewhere else,
205959d1ed5bSDimitry Andric   // so we can use available_externally linkage.
206059d1ed5bSDimitry Andric   if (Linkage == GVA_AvailableExternally)
206159d1ed5bSDimitry Andric     return llvm::Function::AvailableExternallyLinkage;
206259d1ed5bSDimitry Andric 
206359d1ed5bSDimitry Andric   // Note that Apple's kernel linker doesn't support symbol
206459d1ed5bSDimitry Andric   // coalescing, so we need to avoid linkonce and weak linkages there.
206559d1ed5bSDimitry Andric   // Normally, this means we just map to internal, but for explicit
206659d1ed5bSDimitry Andric   // instantiations we'll map to external.
206759d1ed5bSDimitry Andric 
206859d1ed5bSDimitry Andric   // In C++, the compiler has to emit a definition in every translation unit
206959d1ed5bSDimitry Andric   // that references the function.  We should use linkonce_odr because
207059d1ed5bSDimitry Andric   // a) if all references in this translation unit are optimized away, we
207159d1ed5bSDimitry Andric   // don't need to codegen it.  b) if the function persists, it needs to be
207259d1ed5bSDimitry Andric   // merged with other definitions. c) C++ has the ODR, so we know the
207359d1ed5bSDimitry Andric   // definition is dependable.
207459d1ed5bSDimitry Andric   if (Linkage == GVA_DiscardableODR)
207559d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::LinkOnceODRLinkage
207659d1ed5bSDimitry Andric                                             : llvm::Function::InternalLinkage;
207759d1ed5bSDimitry Andric 
207859d1ed5bSDimitry Andric   // An explicit instantiation of a template has weak linkage, since
207959d1ed5bSDimitry Andric   // explicit instantiations can occur in multiple translation units
208059d1ed5bSDimitry Andric   // and must all be equivalent. However, we are not allowed to
208159d1ed5bSDimitry Andric   // throw away these explicit instantiations.
208259d1ed5bSDimitry Andric   if (Linkage == GVA_StrongODR)
208359d1ed5bSDimitry Andric     return !Context.getLangOpts().AppleKext ? llvm::Function::WeakODRLinkage
208459d1ed5bSDimitry Andric                                             : llvm::Function::ExternalLinkage;
208559d1ed5bSDimitry Andric 
208659d1ed5bSDimitry Andric   // C++ doesn't have tentative definitions and thus cannot have common
208759d1ed5bSDimitry Andric   // linkage.
208859d1ed5bSDimitry Andric   if (!getLangOpts().CPlusPlus && isa<VarDecl>(D) &&
208959d1ed5bSDimitry Andric       !isVarDeclStrongDefinition(cast<VarDecl>(D), CodeGenOpts.NoCommon))
209059d1ed5bSDimitry Andric     return llvm::GlobalVariable::CommonLinkage;
209159d1ed5bSDimitry Andric 
2092f785676fSDimitry Andric   // selectany symbols are externally visible, so use weak instead of
2093f785676fSDimitry Andric   // linkonce.  MSVC optimizes away references to const selectany globals, so
2094f785676fSDimitry Andric   // all definitions should be the same and ODR linkage should be used.
2095f785676fSDimitry Andric   // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx
209659d1ed5bSDimitry Andric   if (D->hasAttr<SelectAnyAttr>())
2097f785676fSDimitry Andric     return llvm::GlobalVariable::WeakODRLinkage;
209859d1ed5bSDimitry Andric 
209959d1ed5bSDimitry Andric   // Otherwise, we have strong external linkage.
210059d1ed5bSDimitry Andric   assert(Linkage == GVA_StrongExternal);
21012754fe60SDimitry Andric   return llvm::GlobalVariable::ExternalLinkage;
21022754fe60SDimitry Andric }
21032754fe60SDimitry Andric 
210459d1ed5bSDimitry Andric llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageVarDefinition(
210559d1ed5bSDimitry Andric     const VarDecl *VD, bool IsConstant) {
210659d1ed5bSDimitry Andric   GVALinkage Linkage = getContext().GetGVALinkageForVariable(VD);
210759d1ed5bSDimitry Andric   return getLLVMLinkageForDeclarator(VD, Linkage, IsConstant);
210859d1ed5bSDimitry Andric }
210959d1ed5bSDimitry Andric 
2110139f7f9bSDimitry Andric /// Replace the uses of a function that was declared with a non-proto type.
2111139f7f9bSDimitry Andric /// We want to silently drop extra arguments from call sites
2112139f7f9bSDimitry Andric static void replaceUsesOfNonProtoConstant(llvm::Constant *old,
2113139f7f9bSDimitry Andric                                           llvm::Function *newFn) {
2114139f7f9bSDimitry Andric   // Fast path.
2115139f7f9bSDimitry Andric   if (old->use_empty()) return;
2116139f7f9bSDimitry Andric 
2117139f7f9bSDimitry Andric   llvm::Type *newRetTy = newFn->getReturnType();
2118139f7f9bSDimitry Andric   SmallVector<llvm::Value*, 4> newArgs;
2119139f7f9bSDimitry Andric 
2120139f7f9bSDimitry Andric   for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
2121139f7f9bSDimitry Andric          ui != ue; ) {
2122139f7f9bSDimitry Andric     llvm::Value::use_iterator use = ui++; // Increment before the use is erased.
212359d1ed5bSDimitry Andric     llvm::User *user = use->getUser();
2124139f7f9bSDimitry Andric 
2125139f7f9bSDimitry Andric     // Recognize and replace uses of bitcasts.  Most calls to
2126139f7f9bSDimitry Andric     // unprototyped functions will use bitcasts.
212759d1ed5bSDimitry Andric     if (auto *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
2128139f7f9bSDimitry Andric       if (bitcast->getOpcode() == llvm::Instruction::BitCast)
2129139f7f9bSDimitry Andric         replaceUsesOfNonProtoConstant(bitcast, newFn);
2130139f7f9bSDimitry Andric       continue;
2131139f7f9bSDimitry Andric     }
2132139f7f9bSDimitry Andric 
2133139f7f9bSDimitry Andric     // Recognize calls to the function.
2134139f7f9bSDimitry Andric     llvm::CallSite callSite(user);
2135139f7f9bSDimitry Andric     if (!callSite) continue;
213659d1ed5bSDimitry Andric     if (!callSite.isCallee(&*use)) continue;
2137139f7f9bSDimitry Andric 
2138139f7f9bSDimitry Andric     // If the return types don't match exactly, then we can't
2139139f7f9bSDimitry Andric     // transform this call unless it's dead.
2140139f7f9bSDimitry Andric     if (callSite->getType() != newRetTy && !callSite->use_empty())
2141139f7f9bSDimitry Andric       continue;
2142139f7f9bSDimitry Andric 
2143139f7f9bSDimitry Andric     // Get the call site's attribute list.
2144139f7f9bSDimitry Andric     SmallVector<llvm::AttributeSet, 8> newAttrs;
2145139f7f9bSDimitry Andric     llvm::AttributeSet oldAttrs = callSite.getAttributes();
2146139f7f9bSDimitry Andric 
2147139f7f9bSDimitry Andric     // Collect any return attributes from the call.
2148139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex))
2149139f7f9bSDimitry Andric       newAttrs.push_back(
2150139f7f9bSDimitry Andric         llvm::AttributeSet::get(newFn->getContext(),
2151139f7f9bSDimitry Andric                                 oldAttrs.getRetAttributes()));
2152139f7f9bSDimitry Andric 
2153139f7f9bSDimitry Andric     // If the function was passed too few arguments, don't transform.
2154139f7f9bSDimitry Andric     unsigned newNumArgs = newFn->arg_size();
2155139f7f9bSDimitry Andric     if (callSite.arg_size() < newNumArgs) continue;
2156139f7f9bSDimitry Andric 
2157139f7f9bSDimitry Andric     // If extra arguments were passed, we silently drop them.
2158139f7f9bSDimitry Andric     // If any of the types mismatch, we don't transform.
2159139f7f9bSDimitry Andric     unsigned argNo = 0;
2160139f7f9bSDimitry Andric     bool dontTransform = false;
2161139f7f9bSDimitry Andric     for (llvm::Function::arg_iterator ai = newFn->arg_begin(),
2162139f7f9bSDimitry Andric            ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) {
2163139f7f9bSDimitry Andric       if (callSite.getArgument(argNo)->getType() != ai->getType()) {
2164139f7f9bSDimitry Andric         dontTransform = true;
2165139f7f9bSDimitry Andric         break;
2166139f7f9bSDimitry Andric       }
2167139f7f9bSDimitry Andric 
2168139f7f9bSDimitry Andric       // Add any parameter attributes.
2169139f7f9bSDimitry Andric       if (oldAttrs.hasAttributes(argNo + 1))
2170139f7f9bSDimitry Andric         newAttrs.
2171139f7f9bSDimitry Andric           push_back(llvm::
2172139f7f9bSDimitry Andric                     AttributeSet::get(newFn->getContext(),
2173139f7f9bSDimitry Andric                                       oldAttrs.getParamAttributes(argNo + 1)));
2174139f7f9bSDimitry Andric     }
2175139f7f9bSDimitry Andric     if (dontTransform)
2176139f7f9bSDimitry Andric       continue;
2177139f7f9bSDimitry Andric 
2178139f7f9bSDimitry Andric     if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex))
2179139f7f9bSDimitry Andric       newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(),
2180139f7f9bSDimitry Andric                                                  oldAttrs.getFnAttributes()));
2181139f7f9bSDimitry Andric 
2182139f7f9bSDimitry Andric     // Okay, we can transform this.  Create the new call instruction and copy
2183139f7f9bSDimitry Andric     // over the required information.
2184139f7f9bSDimitry Andric     newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo);
2185139f7f9bSDimitry Andric 
2186139f7f9bSDimitry Andric     llvm::CallSite newCall;
2187139f7f9bSDimitry Andric     if (callSite.isCall()) {
2188139f7f9bSDimitry Andric       newCall = llvm::CallInst::Create(newFn, newArgs, "",
2189139f7f9bSDimitry Andric                                        callSite.getInstruction());
2190139f7f9bSDimitry Andric     } else {
219159d1ed5bSDimitry Andric       auto *oldInvoke = cast<llvm::InvokeInst>(callSite.getInstruction());
2192139f7f9bSDimitry Andric       newCall = llvm::InvokeInst::Create(newFn,
2193139f7f9bSDimitry Andric                                          oldInvoke->getNormalDest(),
2194139f7f9bSDimitry Andric                                          oldInvoke->getUnwindDest(),
2195139f7f9bSDimitry Andric                                          newArgs, "",
2196139f7f9bSDimitry Andric                                          callSite.getInstruction());
2197139f7f9bSDimitry Andric     }
2198139f7f9bSDimitry Andric     newArgs.clear(); // for the next iteration
2199139f7f9bSDimitry Andric 
2200139f7f9bSDimitry Andric     if (!newCall->getType()->isVoidTy())
2201139f7f9bSDimitry Andric       newCall->takeName(callSite.getInstruction());
2202139f7f9bSDimitry Andric     newCall.setAttributes(
2203139f7f9bSDimitry Andric                      llvm::AttributeSet::get(newFn->getContext(), newAttrs));
2204139f7f9bSDimitry Andric     newCall.setCallingConv(callSite.getCallingConv());
2205139f7f9bSDimitry Andric 
2206139f7f9bSDimitry Andric     // Finally, remove the old call, replacing any uses with the new one.
2207139f7f9bSDimitry Andric     if (!callSite->use_empty())
2208139f7f9bSDimitry Andric       callSite->replaceAllUsesWith(newCall.getInstruction());
2209139f7f9bSDimitry Andric 
2210139f7f9bSDimitry Andric     // Copy debug location attached to CI.
2211139f7f9bSDimitry Andric     if (!callSite->getDebugLoc().isUnknown())
2212139f7f9bSDimitry Andric       newCall->setDebugLoc(callSite->getDebugLoc());
2213139f7f9bSDimitry Andric     callSite->eraseFromParent();
2214139f7f9bSDimitry Andric   }
2215139f7f9bSDimitry Andric }
2216139f7f9bSDimitry Andric 
2217f22ef01cSRoman Divacky /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we
2218f22ef01cSRoman Divacky /// implement a function with no prototype, e.g. "int foo() {}".  If there are
2219f22ef01cSRoman Divacky /// existing call uses of the old function in the module, this adjusts them to
2220f22ef01cSRoman Divacky /// call the new function directly.
2221f22ef01cSRoman Divacky ///
2222f22ef01cSRoman Divacky /// This is not just a cleanup: the always_inline pass requires direct calls to
2223f22ef01cSRoman Divacky /// functions to be able to inline them.  If there is a bitcast in the way, it
2224f22ef01cSRoman Divacky /// won't inline them.  Instcombine normally deletes these calls, but it isn't
2225f22ef01cSRoman Divacky /// run at -O0.
2226f22ef01cSRoman Divacky static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
2227f22ef01cSRoman Divacky                                                       llvm::Function *NewFn) {
2228f22ef01cSRoman Divacky   // If we're redefining a global as a function, don't transform it.
2229139f7f9bSDimitry Andric   if (!isa<llvm::Function>(Old)) return;
2230f22ef01cSRoman Divacky 
2231139f7f9bSDimitry Andric   replaceUsesOfNonProtoConstant(Old, NewFn);
2232f22ef01cSRoman Divacky }
2233f22ef01cSRoman Divacky 
2234dff0c46cSDimitry Andric void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2235dff0c46cSDimitry Andric   TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
2236dff0c46cSDimitry Andric   // If we have a definition, this might be a deferred decl. If the
2237dff0c46cSDimitry Andric   // instantiation is explicit, make sure we emit it at the end.
2238dff0c46cSDimitry Andric   if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
2239dff0c46cSDimitry Andric     GetAddrOfGlobalVar(VD);
2240139f7f9bSDimitry Andric 
2241139f7f9bSDimitry Andric   EmitTopLevelDecl(VD);
2242dff0c46cSDimitry Andric }
2243f22ef01cSRoman Divacky 
224459d1ed5bSDimitry Andric void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
224559d1ed5bSDimitry Andric                                                  llvm::GlobalValue *GV) {
224659d1ed5bSDimitry Andric   const auto *D = cast<FunctionDecl>(GD.getDecl());
22473b0f4066SDimitry Andric 
22483b0f4066SDimitry Andric   // Compute the function info and LLVM type.
2249dff0c46cSDimitry Andric   const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
2250dff0c46cSDimitry Andric   llvm::FunctionType *Ty = getTypes().GetFunctionType(FI);
22513b0f4066SDimitry Andric 
2252f22ef01cSRoman Divacky   // Get or create the prototype for the function.
225359d1ed5bSDimitry Andric   if (!GV) {
225459d1ed5bSDimitry Andric     llvm::Constant *C =
225559d1ed5bSDimitry Andric         GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, /*DontDefer*/ true);
2256f22ef01cSRoman Divacky 
2257f22ef01cSRoman Divacky     // Strip off a bitcast if we got one back.
225859d1ed5bSDimitry Andric     if (auto *CE = dyn_cast<llvm::ConstantExpr>(C)) {
2259f22ef01cSRoman Divacky       assert(CE->getOpcode() == llvm::Instruction::BitCast);
226059d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(CE->getOperand(0));
226159d1ed5bSDimitry Andric     } else {
226259d1ed5bSDimitry Andric       GV = cast<llvm::GlobalValue>(C);
226359d1ed5bSDimitry Andric     }
2264f22ef01cSRoman Divacky   }
2265f22ef01cSRoman Divacky 
226659d1ed5bSDimitry Andric   if (!GV->isDeclaration()) {
2267f785676fSDimitry Andric     getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name);
2268f785676fSDimitry Andric     return;
2269f785676fSDimitry Andric   }
2270f22ef01cSRoman Divacky 
227159d1ed5bSDimitry Andric   if (GV->getType()->getElementType() != Ty) {
2272f22ef01cSRoman Divacky     // If the types mismatch then we have to rewrite the definition.
227359d1ed5bSDimitry Andric     assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
2274f22ef01cSRoman Divacky 
2275f22ef01cSRoman Divacky     // F is the Function* for the one with the wrong type, we must make a new
2276f22ef01cSRoman Divacky     // Function* and update everything that used F (a declaration) with the new
2277f22ef01cSRoman Divacky     // Function* (which will be a definition).
2278f22ef01cSRoman Divacky     //
2279f22ef01cSRoman Divacky     // This happens if there is a prototype for a function
2280f22ef01cSRoman Divacky     // (e.g. "int f()") and then a definition of a different type
2281f22ef01cSRoman Divacky     // (e.g. "int f(int x)").  Move the old function aside so that it
2282f22ef01cSRoman Divacky     // doesn't interfere with GetAddrOfFunction.
228359d1ed5bSDimitry Andric     GV->setName(StringRef());
228459d1ed5bSDimitry Andric     auto *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
2285f22ef01cSRoman Divacky 
2286139f7f9bSDimitry Andric     // This might be an implementation of a function without a
2287139f7f9bSDimitry Andric     // prototype, in which case, try to do special replacement of
2288139f7f9bSDimitry Andric     // calls which match the new prototype.  The really key thing here
2289139f7f9bSDimitry Andric     // is that we also potentially drop arguments from the call site
2290139f7f9bSDimitry Andric     // so as to make a direct call, which makes the inliner happier
2291139f7f9bSDimitry Andric     // and suppresses a number of optimizer warnings (!) about
2292139f7f9bSDimitry Andric     // dropping arguments.
229359d1ed5bSDimitry Andric     if (!GV->use_empty()) {
229459d1ed5bSDimitry Andric       ReplaceUsesOfNonProtoTypeWithRealFunction(GV, NewFn);
229559d1ed5bSDimitry Andric       GV->removeDeadConstantUsers();
2296f22ef01cSRoman Divacky     }
2297f22ef01cSRoman Divacky 
2298f22ef01cSRoman Divacky     // Replace uses of F with the Function we will endow with a body.
229959d1ed5bSDimitry Andric     if (!GV->use_empty()) {
2300f22ef01cSRoman Divacky       llvm::Constant *NewPtrForOldDecl =
230159d1ed5bSDimitry Andric           llvm::ConstantExpr::getBitCast(NewFn, GV->getType());
230259d1ed5bSDimitry Andric       GV->replaceAllUsesWith(NewPtrForOldDecl);
2303f22ef01cSRoman Divacky     }
2304f22ef01cSRoman Divacky 
2305f22ef01cSRoman Divacky     // Ok, delete the old function now, which is dead.
230659d1ed5bSDimitry Andric     GV->eraseFromParent();
2307f22ef01cSRoman Divacky 
230859d1ed5bSDimitry Andric     GV = NewFn;
2309f22ef01cSRoman Divacky   }
2310f22ef01cSRoman Divacky 
23112754fe60SDimitry Andric   // We need to set linkage and visibility on the function before
23122754fe60SDimitry Andric   // generating code for it because various parts of IR generation
23132754fe60SDimitry Andric   // want to propagate this information down (e.g. to local static
23142754fe60SDimitry Andric   // declarations).
231559d1ed5bSDimitry Andric   auto *Fn = cast<llvm::Function>(GV);
2316f785676fSDimitry Andric   setFunctionLinkage(GD, Fn);
2317f22ef01cSRoman Divacky 
231859d1ed5bSDimitry Andric   // FIXME: this is redundant with part of setFunctionDefinitionAttributes
23192754fe60SDimitry Andric   setGlobalVisibility(Fn, D);
23202754fe60SDimitry Andric 
2321284c1978SDimitry Andric   MaybeHandleStaticInExternC(D, Fn);
2322284c1978SDimitry Andric 
23233b0f4066SDimitry Andric   CodeGenFunction(*this).GenerateCode(D, Fn, FI);
2324f22ef01cSRoman Divacky 
232559d1ed5bSDimitry Andric   setFunctionDefinitionAttributes(D, Fn);
2326f22ef01cSRoman Divacky   SetLLVMFunctionAttributesForDefinition(D, Fn);
2327f22ef01cSRoman Divacky 
2328f22ef01cSRoman Divacky   if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>())
2329f22ef01cSRoman Divacky     AddGlobalCtor(Fn, CA->getPriority());
2330f22ef01cSRoman Divacky   if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
2331f22ef01cSRoman Divacky     AddGlobalDtor(Fn, DA->getPriority());
23326122f3e6SDimitry Andric   if (D->hasAttr<AnnotateAttr>())
23336122f3e6SDimitry Andric     AddGlobalAnnotations(D, Fn);
2334f22ef01cSRoman Divacky }
2335f22ef01cSRoman Divacky 
2336f22ef01cSRoman Divacky void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
233759d1ed5bSDimitry Andric   const auto *D = cast<ValueDecl>(GD.getDecl());
2338f22ef01cSRoman Divacky   const AliasAttr *AA = D->getAttr<AliasAttr>();
2339f22ef01cSRoman Divacky   assert(AA && "Not an alias?");
2340f22ef01cSRoman Divacky 
23416122f3e6SDimitry Andric   StringRef MangledName = getMangledName(GD);
2342f22ef01cSRoman Divacky 
2343f22ef01cSRoman Divacky   // If there is a definition in the module, then it wins over the alias.
2344f22ef01cSRoman Divacky   // This is dubious, but allow it to be safe.  Just ignore the alias.
2345f22ef01cSRoman Divacky   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2346f22ef01cSRoman Divacky   if (Entry && !Entry->isDeclaration())
2347f22ef01cSRoman Divacky     return;
2348f22ef01cSRoman Divacky 
2349f785676fSDimitry Andric   Aliases.push_back(GD);
2350f785676fSDimitry Andric 
23516122f3e6SDimitry Andric   llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType());
2352f22ef01cSRoman Divacky 
2353f22ef01cSRoman Divacky   // Create a reference to the named value.  This ensures that it is emitted
2354f22ef01cSRoman Divacky   // if a deferred decl.
2355f22ef01cSRoman Divacky   llvm::Constant *Aliasee;
2356f22ef01cSRoman Divacky   if (isa<llvm::FunctionType>(DeclTy))
23573861d79fSDimitry Andric     Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
23582754fe60SDimitry Andric                                       /*ForVTable=*/false);
2359f22ef01cSRoman Divacky   else
2360f22ef01cSRoman Divacky     Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
236159d1ed5bSDimitry Andric                                     llvm::PointerType::getUnqual(DeclTy),
236259d1ed5bSDimitry Andric                                     nullptr);
2363f22ef01cSRoman Divacky 
2364f22ef01cSRoman Divacky   // Create the new alias itself, but don't set a name yet.
236559d1ed5bSDimitry Andric   auto *GA = llvm::GlobalAlias::create(
236659d1ed5bSDimitry Andric       cast<llvm::PointerType>(Aliasee->getType())->getElementType(), 0,
236759d1ed5bSDimitry Andric       llvm::Function::ExternalLinkage, "", Aliasee, &getModule());
2368f22ef01cSRoman Divacky 
2369f22ef01cSRoman Divacky   if (Entry) {
237059d1ed5bSDimitry Andric     if (GA->getAliasee() == Entry) {
237159d1ed5bSDimitry Andric       Diags.Report(AA->getLocation(), diag::err_cyclic_alias);
237259d1ed5bSDimitry Andric       return;
237359d1ed5bSDimitry Andric     }
237459d1ed5bSDimitry Andric 
2375f22ef01cSRoman Divacky     assert(Entry->isDeclaration());
2376f22ef01cSRoman Divacky 
2377f22ef01cSRoman Divacky     // If there is a declaration in the module, then we had an extern followed
2378f22ef01cSRoman Divacky     // by the alias, as in:
2379f22ef01cSRoman Divacky     //   extern int test6();
2380f22ef01cSRoman Divacky     //   ...
2381f22ef01cSRoman Divacky     //   int test6() __attribute__((alias("test7")));
2382f22ef01cSRoman Divacky     //
2383f22ef01cSRoman Divacky     // Remove it and replace uses of it with the alias.
2384f22ef01cSRoman Divacky     GA->takeName(Entry);
2385f22ef01cSRoman Divacky 
2386f22ef01cSRoman Divacky     Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA,
2387f22ef01cSRoman Divacky                                                           Entry->getType()));
2388f22ef01cSRoman Divacky     Entry->eraseFromParent();
2389f22ef01cSRoman Divacky   } else {
2390ffd1746dSEd Schouten     GA->setName(MangledName);
2391f22ef01cSRoman Divacky   }
2392f22ef01cSRoman Divacky 
2393f22ef01cSRoman Divacky   // Set attributes which are particular to an alias; this is a
2394f22ef01cSRoman Divacky   // specialization of the attributes which may be set on a global
2395f22ef01cSRoman Divacky   // variable/function.
2396f22ef01cSRoman Divacky   if (D->hasAttr<DLLExportAttr>()) {
239759d1ed5bSDimitry Andric     if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2398f22ef01cSRoman Divacky       // The dllexport attribute is ignored for undefined symbols.
2399ffd1746dSEd Schouten       if (FD->hasBody())
240059d1ed5bSDimitry Andric         GA->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
2401f22ef01cSRoman Divacky     } else {
240259d1ed5bSDimitry Andric       GA->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
2403f22ef01cSRoman Divacky     }
2404f22ef01cSRoman Divacky   } else if (D->hasAttr<WeakAttr>() ||
2405f22ef01cSRoman Divacky              D->hasAttr<WeakRefAttr>() ||
24063b0f4066SDimitry Andric              D->isWeakImported()) {
2407f22ef01cSRoman Divacky     GA->setLinkage(llvm::Function::WeakAnyLinkage);
2408f22ef01cSRoman Divacky   }
2409f22ef01cSRoman Divacky 
2410f22ef01cSRoman Divacky   SetCommonAttributes(D, GA);
2411f22ef01cSRoman Divacky }
2412f22ef01cSRoman Divacky 
241317a519f9SDimitry Andric llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
24146122f3e6SDimitry Andric                                             ArrayRef<llvm::Type*> Tys) {
241517a519f9SDimitry Andric   return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
241617a519f9SDimitry Andric                                          Tys);
2417f22ef01cSRoman Divacky }
2418f22ef01cSRoman Divacky 
2419f22ef01cSRoman Divacky static llvm::StringMapEntry<llvm::Constant*> &
2420f22ef01cSRoman Divacky GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map,
2421f22ef01cSRoman Divacky                          const StringLiteral *Literal,
2422f22ef01cSRoman Divacky                          bool TargetIsLSB,
2423f22ef01cSRoman Divacky                          bool &IsUTF16,
2424f22ef01cSRoman Divacky                          unsigned &StringLength) {
24256122f3e6SDimitry Andric   StringRef String = Literal->getString();
2426e580952dSDimitry Andric   unsigned NumBytes = String.size();
2427f22ef01cSRoman Divacky 
2428f22ef01cSRoman Divacky   // Check for simple case.
2429f22ef01cSRoman Divacky   if (!Literal->containsNonAsciiOrNull()) {
2430f22ef01cSRoman Divacky     StringLength = NumBytes;
2431e580952dSDimitry Andric     return Map.GetOrCreateValue(String);
2432f22ef01cSRoman Divacky   }
2433f22ef01cSRoman Divacky 
2434dff0c46cSDimitry Andric   // Otherwise, convert the UTF8 literals into a string of shorts.
2435dff0c46cSDimitry Andric   IsUTF16 = true;
2436dff0c46cSDimitry Andric 
2437dff0c46cSDimitry Andric   SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls.
24383861d79fSDimitry Andric   const UTF8 *FromPtr = (const UTF8 *)String.data();
2439f22ef01cSRoman Divacky   UTF16 *ToPtr = &ToBuf[0];
2440f22ef01cSRoman Divacky 
24412754fe60SDimitry Andric   (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes,
2442f22ef01cSRoman Divacky                            &ToPtr, ToPtr + NumBytes,
2443f22ef01cSRoman Divacky                            strictConversion);
2444f22ef01cSRoman Divacky 
2445f22ef01cSRoman Divacky   // ConvertUTF8toUTF16 returns the length in ToPtr.
2446f22ef01cSRoman Divacky   StringLength = ToPtr - &ToBuf[0];
2447f22ef01cSRoman Divacky 
2448dff0c46cSDimitry Andric   // Add an explicit null.
2449dff0c46cSDimitry Andric   *ToPtr = 0;
2450dff0c46cSDimitry Andric   return Map.
2451dff0c46cSDimitry Andric     GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()),
2452dff0c46cSDimitry Andric                                (StringLength + 1) * 2));
2453f22ef01cSRoman Divacky }
2454f22ef01cSRoman Divacky 
2455bd5abe19SDimitry Andric static llvm::StringMapEntry<llvm::Constant*> &
2456bd5abe19SDimitry Andric GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map,
2457bd5abe19SDimitry Andric                        const StringLiteral *Literal,
2458dff0c46cSDimitry Andric                        unsigned &StringLength) {
24596122f3e6SDimitry Andric   StringRef String = Literal->getString();
2460bd5abe19SDimitry Andric   StringLength = String.size();
2461bd5abe19SDimitry Andric   return Map.GetOrCreateValue(String);
2462bd5abe19SDimitry Andric }
2463bd5abe19SDimitry Andric 
2464f22ef01cSRoman Divacky llvm::Constant *
2465f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
2466f22ef01cSRoman Divacky   unsigned StringLength = 0;
2467f22ef01cSRoman Divacky   bool isUTF16 = false;
2468f22ef01cSRoman Divacky   llvm::StringMapEntry<llvm::Constant*> &Entry =
2469f22ef01cSRoman Divacky     GetConstantCFStringEntry(CFConstantStringMap, Literal,
24703861d79fSDimitry Andric                              getDataLayout().isLittleEndian(),
2471f22ef01cSRoman Divacky                              isUTF16, StringLength);
2472f22ef01cSRoman Divacky 
2473f22ef01cSRoman Divacky   if (llvm::Constant *C = Entry.getValue())
2474f22ef01cSRoman Divacky     return C;
2475f22ef01cSRoman Divacky 
2476dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2477f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2478284c1978SDimitry Andric   llvm::Value *V;
2479f22ef01cSRoman Divacky 
2480f22ef01cSRoman Divacky   // If we don't already have it, get __CFConstantStringClassReference.
2481f22ef01cSRoman Divacky   if (!CFConstantStringClassRef) {
24826122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
2483f22ef01cSRoman Divacky     Ty = llvm::ArrayType::get(Ty, 0);
2484f22ef01cSRoman Divacky     llvm::Constant *GV = CreateRuntimeVariable(Ty,
2485f22ef01cSRoman Divacky                                            "__CFConstantStringClassReference");
2486f22ef01cSRoman Divacky     // Decay array -> ptr
2487284c1978SDimitry Andric     V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2488284c1978SDimitry Andric     CFConstantStringClassRef = V;
2489f22ef01cSRoman Divacky   }
2490284c1978SDimitry Andric   else
2491284c1978SDimitry Andric     V = CFConstantStringClassRef;
2492f22ef01cSRoman Divacky 
2493f22ef01cSRoman Divacky   QualType CFTy = getContext().getCFConstantStringType();
2494f22ef01cSRoman Divacky 
249559d1ed5bSDimitry Andric   auto *STy = cast<llvm::StructType>(getTypes().ConvertType(CFTy));
2496f22ef01cSRoman Divacky 
2497dff0c46cSDimitry Andric   llvm::Constant *Fields[4];
2498f22ef01cSRoman Divacky 
2499f22ef01cSRoman Divacky   // Class pointer.
2500284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2501f22ef01cSRoman Divacky 
2502f22ef01cSRoman Divacky   // Flags.
25036122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2504f22ef01cSRoman Divacky   Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) :
2505f22ef01cSRoman Divacky     llvm::ConstantInt::get(Ty, 0x07C8);
2506f22ef01cSRoman Divacky 
2507f22ef01cSRoman Divacky   // String pointer.
250859d1ed5bSDimitry Andric   llvm::Constant *C = nullptr;
2509dff0c46cSDimitry Andric   if (isUTF16) {
2510dff0c46cSDimitry Andric     ArrayRef<uint16_t> Arr =
2511139f7f9bSDimitry Andric       llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>(
2512139f7f9bSDimitry Andric                                      const_cast<char *>(Entry.getKey().data())),
2513dff0c46cSDimitry Andric                                    Entry.getKey().size() / 2);
2514dff0c46cSDimitry Andric     C = llvm::ConstantDataArray::get(VMContext, Arr);
2515dff0c46cSDimitry Andric   } else {
2516dff0c46cSDimitry Andric     C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey());
2517dff0c46cSDimitry Andric   }
2518f22ef01cSRoman Divacky 
2519dff0c46cSDimitry Andric   // Note: -fwritable-strings doesn't make the backing store strings of
2520dff0c46cSDimitry Andric   // CFStrings writable. (See <rdar://problem/10657500>)
252159d1ed5bSDimitry Andric   auto *GV =
2522dff0c46cSDimitry Andric       new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true,
252359d1ed5bSDimitry Andric                                llvm::GlobalValue::PrivateLinkage, C, ".str");
25242754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2525284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2526284c1978SDimitry Andric   // of the string is via this class initializer.
252759d1ed5bSDimitry Andric   // FIXME: We set the section explicitly to avoid a bug in ld64 224.1. Without
252859d1ed5bSDimitry Andric   // it LLVM can merge the string with a non unnamed_addr one during LTO. Doing
252959d1ed5bSDimitry Andric   // that changes the section it ends in, which surprises ld64.
2530f22ef01cSRoman Divacky   if (isUTF16) {
2531f22ef01cSRoman Divacky     CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy);
2532f22ef01cSRoman Divacky     GV->setAlignment(Align.getQuantity());
253359d1ed5bSDimitry Andric     GV->setSection("__TEXT,__ustring");
25343b0f4066SDimitry Andric   } else {
25353b0f4066SDimitry Andric     CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
25363b0f4066SDimitry Andric     GV->setAlignment(Align.getQuantity());
253759d1ed5bSDimitry Andric     GV->setSection("__TEXT,__cstring,cstring_literals");
2538f22ef01cSRoman Divacky   }
2539dff0c46cSDimitry Andric 
2540dff0c46cSDimitry Andric   // String.
25416122f3e6SDimitry Andric   Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2542f22ef01cSRoman Divacky 
2543dff0c46cSDimitry Andric   if (isUTF16)
2544dff0c46cSDimitry Andric     // Cast the UTF16 string to the correct type.
2545dff0c46cSDimitry Andric     Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy);
2546dff0c46cSDimitry Andric 
2547f22ef01cSRoman Divacky   // String length.
2548f22ef01cSRoman Divacky   Ty = getTypes().ConvertType(getContext().LongTy);
2549f22ef01cSRoman Divacky   Fields[3] = llvm::ConstantInt::get(Ty, StringLength);
2550f22ef01cSRoman Divacky 
2551f22ef01cSRoman Divacky   // The struct.
2552f22ef01cSRoman Divacky   C = llvm::ConstantStruct::get(STy, Fields);
2553f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2554f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2555f22ef01cSRoman Divacky                                 "_unnamed_cfstring_");
255659d1ed5bSDimitry Andric   GV->setSection("__DATA,__cfstring");
2557f22ef01cSRoman Divacky   Entry.setValue(GV);
2558f22ef01cSRoman Divacky 
2559f22ef01cSRoman Divacky   return GV;
2560f22ef01cSRoman Divacky }
2561f22ef01cSRoman Divacky 
2562f22ef01cSRoman Divacky llvm::Constant *
25632754fe60SDimitry Andric CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
2564f22ef01cSRoman Divacky   unsigned StringLength = 0;
2565f22ef01cSRoman Divacky   llvm::StringMapEntry<llvm::Constant*> &Entry =
2566bd5abe19SDimitry Andric     GetConstantStringEntry(CFConstantStringMap, Literal, StringLength);
2567f22ef01cSRoman Divacky 
2568f22ef01cSRoman Divacky   if (llvm::Constant *C = Entry.getValue())
2569f22ef01cSRoman Divacky     return C;
2570f22ef01cSRoman Divacky 
2571dff0c46cSDimitry Andric   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
2572f22ef01cSRoman Divacky   llvm::Constant *Zeros[] = { Zero, Zero };
2573284c1978SDimitry Andric   llvm::Value *V;
2574f22ef01cSRoman Divacky   // If we don't already have it, get _NSConstantStringClassReference.
25752754fe60SDimitry Andric   if (!ConstantStringClassRef) {
2576dff0c46cSDimitry Andric     std::string StringClass(getLangOpts().ObjCConstantStringClass);
25776122f3e6SDimitry Andric     llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
25782754fe60SDimitry Andric     llvm::Constant *GV;
25797ae0e2c9SDimitry Andric     if (LangOpts.ObjCRuntime.isNonFragile()) {
2580bd5abe19SDimitry Andric       std::string str =
2581bd5abe19SDimitry Andric         StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
2582bd5abe19SDimitry Andric                             : "OBJC_CLASS_$_" + StringClass;
2583bd5abe19SDimitry Andric       GV = getObjCRuntime().GetClassGlobal(str);
2584bd5abe19SDimitry Andric       // Make sure the result is of the correct type.
25856122f3e6SDimitry Andric       llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
2586284c1978SDimitry Andric       V = llvm::ConstantExpr::getBitCast(GV, PTy);
2587284c1978SDimitry Andric       ConstantStringClassRef = V;
2588bd5abe19SDimitry Andric     } else {
2589bd5abe19SDimitry Andric       std::string str =
2590bd5abe19SDimitry Andric         StringClass.empty() ? "_NSConstantStringClassReference"
2591bd5abe19SDimitry Andric                             : "_" + StringClass + "ClassReference";
25926122f3e6SDimitry Andric       llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
2593bd5abe19SDimitry Andric       GV = CreateRuntimeVariable(PTy, str);
2594f22ef01cSRoman Divacky       // Decay array -> ptr
2595284c1978SDimitry Andric       V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2596284c1978SDimitry Andric       ConstantStringClassRef = V;
2597f22ef01cSRoman Divacky     }
2598bd5abe19SDimitry Andric   }
2599284c1978SDimitry Andric   else
2600284c1978SDimitry Andric     V = ConstantStringClassRef;
2601f22ef01cSRoman Divacky 
26026122f3e6SDimitry Andric   if (!NSConstantStringType) {
26036122f3e6SDimitry Andric     // Construct the type for a constant NSString.
260459d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__builtin_NSString");
26056122f3e6SDimitry Andric     D->startDefinition();
2606f22ef01cSRoman Divacky 
26076122f3e6SDimitry Andric     QualType FieldTypes[3];
26086122f3e6SDimitry Andric 
26096122f3e6SDimitry Andric     // const int *isa;
26106122f3e6SDimitry Andric     FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst());
26116122f3e6SDimitry Andric     // const char *str;
26126122f3e6SDimitry Andric     FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst());
26136122f3e6SDimitry Andric     // unsigned int length;
26146122f3e6SDimitry Andric     FieldTypes[2] = Context.UnsignedIntTy;
26156122f3e6SDimitry Andric 
26166122f3e6SDimitry Andric     // Create fields
26176122f3e6SDimitry Andric     for (unsigned i = 0; i < 3; ++i) {
26186122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context, D,
26196122f3e6SDimitry Andric                                            SourceLocation(),
262059d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
262159d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
262259d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
26236122f3e6SDimitry Andric                                            /*Mutable=*/false,
26247ae0e2c9SDimitry Andric                                            ICIS_NoInit);
26256122f3e6SDimitry Andric       Field->setAccess(AS_public);
26266122f3e6SDimitry Andric       D->addDecl(Field);
26276122f3e6SDimitry Andric     }
26286122f3e6SDimitry Andric 
26296122f3e6SDimitry Andric     D->completeDefinition();
26306122f3e6SDimitry Andric     QualType NSTy = Context.getTagDeclType(D);
26316122f3e6SDimitry Andric     NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy));
26326122f3e6SDimitry Andric   }
2633f22ef01cSRoman Divacky 
2634dff0c46cSDimitry Andric   llvm::Constant *Fields[3];
2635f22ef01cSRoman Divacky 
2636f22ef01cSRoman Divacky   // Class pointer.
2637284c1978SDimitry Andric   Fields[0] = cast<llvm::ConstantExpr>(V);
2638f22ef01cSRoman Divacky 
2639f22ef01cSRoman Divacky   // String pointer.
2640dff0c46cSDimitry Andric   llvm::Constant *C =
2641dff0c46cSDimitry Andric     llvm::ConstantDataArray::getString(VMContext, Entry.getKey());
2642f22ef01cSRoman Divacky 
2643f22ef01cSRoman Divacky   llvm::GlobalValue::LinkageTypes Linkage;
2644f22ef01cSRoman Divacky   bool isConstant;
2645f22ef01cSRoman Divacky   Linkage = llvm::GlobalValue::PrivateLinkage;
2646dff0c46cSDimitry Andric   isConstant = !LangOpts.WritableStrings;
2647f22ef01cSRoman Divacky 
264859d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(getModule(), C->getType(), isConstant,
264959d1ed5bSDimitry Andric                                       Linkage, C, ".str");
26502754fe60SDimitry Andric   GV->setUnnamedAddr(true);
2651284c1978SDimitry Andric   // Don't enforce the target's minimum global alignment, since the only use
2652284c1978SDimitry Andric   // of the string is via this class initializer.
26533b0f4066SDimitry Andric   CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
26543b0f4066SDimitry Andric   GV->setAlignment(Align.getQuantity());
26556122f3e6SDimitry Andric   Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2656f22ef01cSRoman Divacky 
2657f22ef01cSRoman Divacky   // String length.
26586122f3e6SDimitry Andric   llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
2659f22ef01cSRoman Divacky   Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
2660f22ef01cSRoman Divacky 
2661f22ef01cSRoman Divacky   // The struct.
26626122f3e6SDimitry Andric   C = llvm::ConstantStruct::get(NSConstantStringType, Fields);
2663f22ef01cSRoman Divacky   GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2664f22ef01cSRoman Divacky                                 llvm::GlobalVariable::PrivateLinkage, C,
2665f22ef01cSRoman Divacky                                 "_unnamed_nsstring_");
266659d1ed5bSDimitry Andric   const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
266759d1ed5bSDimitry Andric   const char *NSStringNonFragileABISection =
266859d1ed5bSDimitry Andric       "__DATA,__objc_stringobj,regular,no_dead_strip";
2669f22ef01cSRoman Divacky   // FIXME. Fix section.
267059d1ed5bSDimitry Andric   GV->setSection(LangOpts.ObjCRuntime.isNonFragile()
267159d1ed5bSDimitry Andric                      ? NSStringNonFragileABISection
267259d1ed5bSDimitry Andric                      : NSStringSection);
2673f22ef01cSRoman Divacky   Entry.setValue(GV);
2674f22ef01cSRoman Divacky 
2675f22ef01cSRoman Divacky   return GV;
2676f22ef01cSRoman Divacky }
2677f22ef01cSRoman Divacky 
26786122f3e6SDimitry Andric QualType CodeGenModule::getObjCFastEnumerationStateType() {
26796122f3e6SDimitry Andric   if (ObjCFastEnumerationStateType.isNull()) {
268059d1ed5bSDimitry Andric     RecordDecl *D = Context.buildImplicitRecord("__objcFastEnumerationState");
26816122f3e6SDimitry Andric     D->startDefinition();
26826122f3e6SDimitry Andric 
26836122f3e6SDimitry Andric     QualType FieldTypes[] = {
26846122f3e6SDimitry Andric       Context.UnsignedLongTy,
26856122f3e6SDimitry Andric       Context.getPointerType(Context.getObjCIdType()),
26866122f3e6SDimitry Andric       Context.getPointerType(Context.UnsignedLongTy),
26876122f3e6SDimitry Andric       Context.getConstantArrayType(Context.UnsignedLongTy,
26886122f3e6SDimitry Andric                            llvm::APInt(32, 5), ArrayType::Normal, 0)
26896122f3e6SDimitry Andric     };
26906122f3e6SDimitry Andric 
26916122f3e6SDimitry Andric     for (size_t i = 0; i < 4; ++i) {
26926122f3e6SDimitry Andric       FieldDecl *Field = FieldDecl::Create(Context,
26936122f3e6SDimitry Andric                                            D,
26946122f3e6SDimitry Andric                                            SourceLocation(),
269559d1ed5bSDimitry Andric                                            SourceLocation(), nullptr,
269659d1ed5bSDimitry Andric                                            FieldTypes[i], /*TInfo=*/nullptr,
269759d1ed5bSDimitry Andric                                            /*BitWidth=*/nullptr,
26986122f3e6SDimitry Andric                                            /*Mutable=*/false,
26997ae0e2c9SDimitry Andric                                            ICIS_NoInit);
27006122f3e6SDimitry Andric       Field->setAccess(AS_public);
27016122f3e6SDimitry Andric       D->addDecl(Field);
27026122f3e6SDimitry Andric     }
27036122f3e6SDimitry Andric 
27046122f3e6SDimitry Andric     D->completeDefinition();
27056122f3e6SDimitry Andric     ObjCFastEnumerationStateType = Context.getTagDeclType(D);
27066122f3e6SDimitry Andric   }
27076122f3e6SDimitry Andric 
27086122f3e6SDimitry Andric   return ObjCFastEnumerationStateType;
27096122f3e6SDimitry Andric }
27106122f3e6SDimitry Andric 
2711dff0c46cSDimitry Andric llvm::Constant *
2712dff0c46cSDimitry Andric CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
2713dff0c46cSDimitry Andric   assert(!E->getType()->isPointerType() && "Strings are always arrays");
2714f22ef01cSRoman Divacky 
2715dff0c46cSDimitry Andric   // Don't emit it as the address of the string, emit the string data itself
2716dff0c46cSDimitry Andric   // as an inline array.
2717dff0c46cSDimitry Andric   if (E->getCharByteWidth() == 1) {
2718dff0c46cSDimitry Andric     SmallString<64> Str(E->getString());
2719f22ef01cSRoman Divacky 
2720dff0c46cSDimitry Andric     // Resize the string to the right size, which is indicated by its type.
2721dff0c46cSDimitry Andric     const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType());
2722dff0c46cSDimitry Andric     Str.resize(CAT->getSize().getZExtValue());
2723dff0c46cSDimitry Andric     return llvm::ConstantDataArray::getString(VMContext, Str, false);
27246122f3e6SDimitry Andric   }
2725f22ef01cSRoman Divacky 
272659d1ed5bSDimitry Andric   auto *AType = cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
2727dff0c46cSDimitry Andric   llvm::Type *ElemTy = AType->getElementType();
2728dff0c46cSDimitry Andric   unsigned NumElements = AType->getNumElements();
2729f22ef01cSRoman Divacky 
2730dff0c46cSDimitry Andric   // Wide strings have either 2-byte or 4-byte elements.
2731dff0c46cSDimitry Andric   if (ElemTy->getPrimitiveSizeInBits() == 16) {
2732dff0c46cSDimitry Andric     SmallVector<uint16_t, 32> Elements;
2733dff0c46cSDimitry Andric     Elements.reserve(NumElements);
2734dff0c46cSDimitry Andric 
2735dff0c46cSDimitry Andric     for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2736dff0c46cSDimitry Andric       Elements.push_back(E->getCodeUnit(i));
2737dff0c46cSDimitry Andric     Elements.resize(NumElements);
2738dff0c46cSDimitry Andric     return llvm::ConstantDataArray::get(VMContext, Elements);
2739dff0c46cSDimitry Andric   }
2740dff0c46cSDimitry Andric 
2741dff0c46cSDimitry Andric   assert(ElemTy->getPrimitiveSizeInBits() == 32);
2742dff0c46cSDimitry Andric   SmallVector<uint32_t, 32> Elements;
2743dff0c46cSDimitry Andric   Elements.reserve(NumElements);
2744dff0c46cSDimitry Andric 
2745dff0c46cSDimitry Andric   for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2746dff0c46cSDimitry Andric     Elements.push_back(E->getCodeUnit(i));
2747dff0c46cSDimitry Andric   Elements.resize(NumElements);
2748dff0c46cSDimitry Andric   return llvm::ConstantDataArray::get(VMContext, Elements);
2749f22ef01cSRoman Divacky }
2750f22ef01cSRoman Divacky 
275159d1ed5bSDimitry Andric static llvm::GlobalVariable *
275259d1ed5bSDimitry Andric GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT,
275359d1ed5bSDimitry Andric                       CodeGenModule &CGM, StringRef GlobalName,
275459d1ed5bSDimitry Andric                       unsigned Alignment) {
275559d1ed5bSDimitry Andric   // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
275659d1ed5bSDimitry Andric   unsigned AddrSpace = 0;
275759d1ed5bSDimitry Andric   if (CGM.getLangOpts().OpenCL)
275859d1ed5bSDimitry Andric     AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
2759dff0c46cSDimitry Andric 
276059d1ed5bSDimitry Andric   // Create a global variable for this string
276159d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
276259d1ed5bSDimitry Andric       CGM.getModule(), C->getType(), !CGM.getLangOpts().WritableStrings, LT, C,
276359d1ed5bSDimitry Andric       GlobalName, nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
276459d1ed5bSDimitry Andric   GV->setAlignment(Alignment);
276559d1ed5bSDimitry Andric   GV->setUnnamedAddr(true);
276659d1ed5bSDimitry Andric   return GV;
2767f22ef01cSRoman Divacky }
2768dff0c46cSDimitry Andric 
276959d1ed5bSDimitry Andric /// GetAddrOfConstantStringFromLiteral - Return a pointer to a
277059d1ed5bSDimitry Andric /// constant array for the given string literal.
277159d1ed5bSDimitry Andric llvm::GlobalVariable *
277259d1ed5bSDimitry Andric CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) {
277359d1ed5bSDimitry Andric   auto Alignment =
277459d1ed5bSDimitry Andric       getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
2775dff0c46cSDimitry Andric 
277659d1ed5bSDimitry Andric   llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
277759d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
277859d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
277959d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
278059d1ed5bSDimitry Andric     if (auto GV = *Entry) {
278159d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
278259d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
278359d1ed5bSDimitry Andric       return GV;
278459d1ed5bSDimitry Andric     }
278559d1ed5bSDimitry Andric   }
278659d1ed5bSDimitry Andric 
278759d1ed5bSDimitry Andric   SmallString<256> MangledNameBuffer;
278859d1ed5bSDimitry Andric   StringRef GlobalVariableName;
278959d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes LT;
279059d1ed5bSDimitry Andric 
279159d1ed5bSDimitry Andric   // Mangle the string literal if the ABI allows for it.  However, we cannot
279259d1ed5bSDimitry Andric   // do this if  we are compiling with ASan or -fwritable-strings because they
279359d1ed5bSDimitry Andric   // rely on strings having normal linkage.
279459d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings && !LangOpts.Sanitize.Address &&
279559d1ed5bSDimitry Andric       getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) {
279659d1ed5bSDimitry Andric     llvm::raw_svector_ostream Out(MangledNameBuffer);
279759d1ed5bSDimitry Andric     getCXXABI().getMangleContext().mangleStringLiteral(S, Out);
279859d1ed5bSDimitry Andric     Out.flush();
279959d1ed5bSDimitry Andric 
280059d1ed5bSDimitry Andric     LT = llvm::GlobalValue::LinkOnceODRLinkage;
280159d1ed5bSDimitry Andric     GlobalVariableName = MangledNameBuffer;
280259d1ed5bSDimitry Andric   } else {
280359d1ed5bSDimitry Andric     LT = llvm::GlobalValue::PrivateLinkage;
280459d1ed5bSDimitry Andric     GlobalVariableName = ".str";
280559d1ed5bSDimitry Andric   }
280659d1ed5bSDimitry Andric 
280759d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName, Alignment);
280859d1ed5bSDimitry Andric   if (Entry)
280959d1ed5bSDimitry Andric     *Entry = GV;
281059d1ed5bSDimitry Andric 
281159d1ed5bSDimitry Andric   reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>");
2812dff0c46cSDimitry Andric   return GV;
2813f22ef01cSRoman Divacky }
2814f22ef01cSRoman Divacky 
2815f22ef01cSRoman Divacky /// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant
2816f22ef01cSRoman Divacky /// array for the given ObjCEncodeExpr node.
281759d1ed5bSDimitry Andric llvm::GlobalVariable *
2818f22ef01cSRoman Divacky CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
2819f22ef01cSRoman Divacky   std::string Str;
2820f22ef01cSRoman Divacky   getContext().getObjCEncodingForType(E->getEncodedType(), Str);
2821f22ef01cSRoman Divacky 
2822f22ef01cSRoman Divacky   return GetAddrOfConstantCString(Str);
2823f22ef01cSRoman Divacky }
2824f22ef01cSRoman Divacky 
282559d1ed5bSDimitry Andric /// GetAddrOfConstantCString - Returns a pointer to a character array containing
282659d1ed5bSDimitry Andric /// the literal and a terminating '\0' character.
282759d1ed5bSDimitry Andric /// The result has pointer to array type.
282859d1ed5bSDimitry Andric llvm::GlobalVariable *CodeGenModule::GetAddrOfConstantCString(
282959d1ed5bSDimitry Andric     const std::string &Str, const char *GlobalName, unsigned Alignment) {
283059d1ed5bSDimitry Andric   StringRef StrWithNull(Str.c_str(), Str.size() + 1);
283159d1ed5bSDimitry Andric   if (Alignment == 0) {
283259d1ed5bSDimitry Andric     Alignment = getContext()
283359d1ed5bSDimitry Andric                     .getAlignOfGlobalVarInChars(getContext().CharTy)
283459d1ed5bSDimitry Andric                     .getQuantity();
2835f22ef01cSRoman Divacky   }
2836f22ef01cSRoman Divacky 
283759d1ed5bSDimitry Andric   llvm::Constant *C =
283859d1ed5bSDimitry Andric       llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false);
283959d1ed5bSDimitry Andric 
284059d1ed5bSDimitry Andric   // Don't share any string literals if strings aren't constant.
284159d1ed5bSDimitry Andric   llvm::GlobalVariable **Entry = nullptr;
284259d1ed5bSDimitry Andric   if (!LangOpts.WritableStrings) {
284359d1ed5bSDimitry Andric     Entry = &ConstantStringMap[C];
284459d1ed5bSDimitry Andric     if (auto GV = *Entry) {
284559d1ed5bSDimitry Andric       if (Alignment > GV->getAlignment())
284659d1ed5bSDimitry Andric         GV->setAlignment(Alignment);
284759d1ed5bSDimitry Andric       return GV;
284859d1ed5bSDimitry Andric     }
284959d1ed5bSDimitry Andric   }
285059d1ed5bSDimitry Andric 
2851f22ef01cSRoman Divacky   // Get the default prefix if a name wasn't specified.
2852f22ef01cSRoman Divacky   if (!GlobalName)
2853f22ef01cSRoman Divacky     GlobalName = ".str";
2854f22ef01cSRoman Divacky   // Create a global variable for this.
285559d1ed5bSDimitry Andric   auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage, *this,
285659d1ed5bSDimitry Andric                                   GlobalName, Alignment);
285759d1ed5bSDimitry Andric   if (Entry)
285859d1ed5bSDimitry Andric     *Entry = GV;
28596122f3e6SDimitry Andric   return GV;
2860f22ef01cSRoman Divacky }
2861f22ef01cSRoman Divacky 
2862f785676fSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
2863f785676fSDimitry Andric     const MaterializeTemporaryExpr *E, const Expr *Init) {
2864f785676fSDimitry Andric   assert((E->getStorageDuration() == SD_Static ||
2865f785676fSDimitry Andric           E->getStorageDuration() == SD_Thread) && "not a global temporary");
286659d1ed5bSDimitry Andric   const auto *VD = cast<VarDecl>(E->getExtendingDecl());
2867f785676fSDimitry Andric 
2868f785676fSDimitry Andric   // If we're not materializing a subobject of the temporary, keep the
2869f785676fSDimitry Andric   // cv-qualifiers from the type of the MaterializeTemporaryExpr.
2870f785676fSDimitry Andric   QualType MaterializedType = Init->getType();
2871f785676fSDimitry Andric   if (Init == E->GetTemporaryExpr())
2872f785676fSDimitry Andric     MaterializedType = E->getType();
2873f785676fSDimitry Andric 
2874f785676fSDimitry Andric   llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E];
2875f785676fSDimitry Andric   if (Slot)
2876f785676fSDimitry Andric     return Slot;
2877f785676fSDimitry Andric 
2878f785676fSDimitry Andric   // FIXME: If an externally-visible declaration extends multiple temporaries,
2879f785676fSDimitry Andric   // we need to give each temporary the same name in every translation unit (and
2880f785676fSDimitry Andric   // we also need to make the temporaries externally-visible).
2881f785676fSDimitry Andric   SmallString<256> Name;
2882f785676fSDimitry Andric   llvm::raw_svector_ostream Out(Name);
288359d1ed5bSDimitry Andric   getCXXABI().getMangleContext().mangleReferenceTemporary(
288459d1ed5bSDimitry Andric       VD, E->getManglingNumber(), Out);
2885f785676fSDimitry Andric   Out.flush();
2886f785676fSDimitry Andric 
288759d1ed5bSDimitry Andric   APValue *Value = nullptr;
2888f785676fSDimitry Andric   if (E->getStorageDuration() == SD_Static) {
2889f785676fSDimitry Andric     // We might have a cached constant initializer for this temporary. Note
2890f785676fSDimitry Andric     // that this might have a different value from the value computed by
2891f785676fSDimitry Andric     // evaluating the initializer if the surrounding constant expression
2892f785676fSDimitry Andric     // modifies the temporary.
2893f785676fSDimitry Andric     Value = getContext().getMaterializedTemporaryValue(E, false);
2894f785676fSDimitry Andric     if (Value && Value->isUninit())
289559d1ed5bSDimitry Andric       Value = nullptr;
2896f785676fSDimitry Andric   }
2897f785676fSDimitry Andric 
2898f785676fSDimitry Andric   // Try evaluating it now, it might have a constant initializer.
2899f785676fSDimitry Andric   Expr::EvalResult EvalResult;
2900f785676fSDimitry Andric   if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) &&
2901f785676fSDimitry Andric       !EvalResult.hasSideEffects())
2902f785676fSDimitry Andric     Value = &EvalResult.Val;
2903f785676fSDimitry Andric 
290459d1ed5bSDimitry Andric   llvm::Constant *InitialValue = nullptr;
2905f785676fSDimitry Andric   bool Constant = false;
2906f785676fSDimitry Andric   llvm::Type *Type;
2907f785676fSDimitry Andric   if (Value) {
2908f785676fSDimitry Andric     // The temporary has a constant initializer, use it.
290959d1ed5bSDimitry Andric     InitialValue = EmitConstantValue(*Value, MaterializedType, nullptr);
2910f785676fSDimitry Andric     Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value);
2911f785676fSDimitry Andric     Type = InitialValue->getType();
2912f785676fSDimitry Andric   } else {
2913f785676fSDimitry Andric     // No initializer, the initialization will be provided when we
2914f785676fSDimitry Andric     // initialize the declaration which performed lifetime extension.
2915f785676fSDimitry Andric     Type = getTypes().ConvertTypeForMem(MaterializedType);
2916f785676fSDimitry Andric   }
2917f785676fSDimitry Andric 
2918f785676fSDimitry Andric   // Create a global variable for this lifetime-extended temporary.
291959d1ed5bSDimitry Andric   llvm::GlobalValue::LinkageTypes Linkage =
292059d1ed5bSDimitry Andric       getLLVMLinkageVarDefinition(VD, Constant);
292159d1ed5bSDimitry Andric   // There is no need for this temporary to have global linkage if the global
292259d1ed5bSDimitry Andric   // variable has external linkage.
292359d1ed5bSDimitry Andric   if (Linkage == llvm::GlobalVariable::ExternalLinkage)
292459d1ed5bSDimitry Andric     Linkage = llvm::GlobalVariable::PrivateLinkage;
292559d1ed5bSDimitry Andric   unsigned AddrSpace = GetGlobalVarAddressSpace(
292659d1ed5bSDimitry Andric       VD, getContext().getTargetAddressSpace(MaterializedType));
292759d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
292859d1ed5bSDimitry Andric       getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
292959d1ed5bSDimitry Andric       /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal,
293059d1ed5bSDimitry Andric       AddrSpace);
293159d1ed5bSDimitry Andric   setGlobalVisibility(GV, VD);
2932f785676fSDimitry Andric   GV->setAlignment(
2933f785676fSDimitry Andric       getContext().getTypeAlignInChars(MaterializedType).getQuantity());
2934f785676fSDimitry Andric   if (VD->getTLSKind())
2935f785676fSDimitry Andric     setTLSMode(GV, *VD);
2936f785676fSDimitry Andric   Slot = GV;
2937f785676fSDimitry Andric   return GV;
2938f785676fSDimitry Andric }
2939f785676fSDimitry Andric 
2940f22ef01cSRoman Divacky /// EmitObjCPropertyImplementations - Emit information for synthesized
2941f22ef01cSRoman Divacky /// properties for an implementation.
2942f22ef01cSRoman Divacky void CodeGenModule::EmitObjCPropertyImplementations(const
2943f22ef01cSRoman Divacky                                                     ObjCImplementationDecl *D) {
294459d1ed5bSDimitry Andric   for (const auto *PID : D->property_impls()) {
2945f22ef01cSRoman Divacky     // Dynamic is just for type-checking.
2946f22ef01cSRoman Divacky     if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
2947f22ef01cSRoman Divacky       ObjCPropertyDecl *PD = PID->getPropertyDecl();
2948f22ef01cSRoman Divacky 
2949f22ef01cSRoman Divacky       // Determine which methods need to be implemented, some may have
29503861d79fSDimitry Andric       // been overridden. Note that ::isPropertyAccessor is not the method
2951f22ef01cSRoman Divacky       // we want, that just indicates if the decl came from a
2952f22ef01cSRoman Divacky       // property. What we want to know is if the method is defined in
2953f22ef01cSRoman Divacky       // this implementation.
2954f22ef01cSRoman Divacky       if (!D->getInstanceMethod(PD->getGetterName()))
2955f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCGetter(
2956f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
2957f22ef01cSRoman Divacky       if (!PD->isReadOnly() &&
2958f22ef01cSRoman Divacky           !D->getInstanceMethod(PD->getSetterName()))
2959f22ef01cSRoman Divacky         CodeGenFunction(*this).GenerateObjCSetter(
2960f22ef01cSRoman Divacky                                  const_cast<ObjCImplementationDecl *>(D), PID);
2961f22ef01cSRoman Divacky     }
2962f22ef01cSRoman Divacky   }
2963f22ef01cSRoman Divacky }
2964f22ef01cSRoman Divacky 
29653b0f4066SDimitry Andric static bool needsDestructMethod(ObjCImplementationDecl *impl) {
29666122f3e6SDimitry Andric   const ObjCInterfaceDecl *iface = impl->getClassInterface();
29676122f3e6SDimitry Andric   for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
29683b0f4066SDimitry Andric        ivar; ivar = ivar->getNextIvar())
29693b0f4066SDimitry Andric     if (ivar->getType().isDestructedType())
29703b0f4066SDimitry Andric       return true;
29713b0f4066SDimitry Andric 
29723b0f4066SDimitry Andric   return false;
29733b0f4066SDimitry Andric }
29743b0f4066SDimitry Andric 
2975f22ef01cSRoman Divacky /// EmitObjCIvarInitializations - Emit information for ivar initialization
2976f22ef01cSRoman Divacky /// for an implementation.
2977f22ef01cSRoman Divacky void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
29783b0f4066SDimitry Andric   // We might need a .cxx_destruct even if we don't have any ivar initializers.
29793b0f4066SDimitry Andric   if (needsDestructMethod(D)) {
2980f22ef01cSRoman Divacky     IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
2981f22ef01cSRoman Divacky     Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
29823b0f4066SDimitry Andric     ObjCMethodDecl *DTORMethod =
29833b0f4066SDimitry Andric       ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
298459d1ed5bSDimitry Andric                              cxxSelector, getContext().VoidTy, nullptr, D,
29856122f3e6SDimitry Andric                              /*isInstance=*/true, /*isVariadic=*/false,
29863861d79fSDimitry Andric                           /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true,
29876122f3e6SDimitry Andric                              /*isDefined=*/false, ObjCMethodDecl::Required);
2988f22ef01cSRoman Divacky     D->addInstanceMethod(DTORMethod);
2989f22ef01cSRoman Divacky     CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
29903861d79fSDimitry Andric     D->setHasDestructors(true);
29913b0f4066SDimitry Andric   }
2992f22ef01cSRoman Divacky 
29933b0f4066SDimitry Andric   // If the implementation doesn't have any ivar initializers, we don't need
29943b0f4066SDimitry Andric   // a .cxx_construct.
29953b0f4066SDimitry Andric   if (D->getNumIvarInitializers() == 0)
29963b0f4066SDimitry Andric     return;
29973b0f4066SDimitry Andric 
29983b0f4066SDimitry Andric   IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
29993b0f4066SDimitry Andric   Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
3000f22ef01cSRoman Divacky   // The constructor returns 'self'.
3001f22ef01cSRoman Divacky   ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
3002f22ef01cSRoman Divacky                                                 D->getLocation(),
30036122f3e6SDimitry Andric                                                 D->getLocation(),
30046122f3e6SDimitry Andric                                                 cxxSelector,
300559d1ed5bSDimitry Andric                                                 getContext().getObjCIdType(),
300659d1ed5bSDimitry Andric                                                 nullptr, D, /*isInstance=*/true,
30076122f3e6SDimitry Andric                                                 /*isVariadic=*/false,
30083861d79fSDimitry Andric                                                 /*isPropertyAccessor=*/true,
30096122f3e6SDimitry Andric                                                 /*isImplicitlyDeclared=*/true,
30106122f3e6SDimitry Andric                                                 /*isDefined=*/false,
3011f22ef01cSRoman Divacky                                                 ObjCMethodDecl::Required);
3012f22ef01cSRoman Divacky   D->addInstanceMethod(CTORMethod);
3013f22ef01cSRoman Divacky   CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
30143861d79fSDimitry Andric   D->setHasNonZeroConstructors(true);
3015f22ef01cSRoman Divacky }
3016f22ef01cSRoman Divacky 
3017f22ef01cSRoman Divacky /// EmitNamespace - Emit all declarations in a namespace.
3018f22ef01cSRoman Divacky void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) {
301959d1ed5bSDimitry Andric   for (auto *I : ND->decls()) {
302059d1ed5bSDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(I))
3021f785676fSDimitry Andric       if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
3022f785676fSDimitry Andric           VD->getTemplateSpecializationKind() != TSK_Undeclared)
3023f785676fSDimitry Andric         continue;
302459d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3025f22ef01cSRoman Divacky   }
3026f785676fSDimitry Andric }
3027f22ef01cSRoman Divacky 
3028f22ef01cSRoman Divacky // EmitLinkageSpec - Emit all declarations in a linkage spec.
3029f22ef01cSRoman Divacky void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
3030f22ef01cSRoman Divacky   if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
3031f22ef01cSRoman Divacky       LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
3032f22ef01cSRoman Divacky     ErrorUnsupported(LSD, "linkage spec");
3033f22ef01cSRoman Divacky     return;
3034f22ef01cSRoman Divacky   }
3035f22ef01cSRoman Divacky 
303659d1ed5bSDimitry Andric   for (auto *I : LSD->decls()) {
30373861d79fSDimitry Andric     // Meta-data for ObjC class includes references to implemented methods.
30383861d79fSDimitry Andric     // Generate class's method definitions first.
303959d1ed5bSDimitry Andric     if (auto *OID = dyn_cast<ObjCImplDecl>(I)) {
304059d1ed5bSDimitry Andric       for (auto *M : OID->methods())
304159d1ed5bSDimitry Andric         EmitTopLevelDecl(M);
30423861d79fSDimitry Andric     }
304359d1ed5bSDimitry Andric     EmitTopLevelDecl(I);
3044f22ef01cSRoman Divacky   }
30453861d79fSDimitry Andric }
3046f22ef01cSRoman Divacky 
3047f22ef01cSRoman Divacky /// EmitTopLevelDecl - Emit code for a single top level declaration.
3048f22ef01cSRoman Divacky void CodeGenModule::EmitTopLevelDecl(Decl *D) {
3049f22ef01cSRoman Divacky   // Ignore dependent declarations.
3050f22ef01cSRoman Divacky   if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
3051f22ef01cSRoman Divacky     return;
3052f22ef01cSRoman Divacky 
3053f22ef01cSRoman Divacky   switch (D->getKind()) {
3054f22ef01cSRoman Divacky   case Decl::CXXConversion:
3055f22ef01cSRoman Divacky   case Decl::CXXMethod:
3056f22ef01cSRoman Divacky   case Decl::Function:
3057f22ef01cSRoman Divacky     // Skip function templates
30583b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
30593b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3060f22ef01cSRoman Divacky       return;
3061f22ef01cSRoman Divacky 
3062f22ef01cSRoman Divacky     EmitGlobal(cast<FunctionDecl>(D));
3063f22ef01cSRoman Divacky     break;
3064f22ef01cSRoman Divacky 
3065f22ef01cSRoman Divacky   case Decl::Var:
3066f785676fSDimitry Andric     // Skip variable templates
3067f785676fSDimitry Andric     if (cast<VarDecl>(D)->getDescribedVarTemplate())
3068f785676fSDimitry Andric       return;
3069f785676fSDimitry Andric   case Decl::VarTemplateSpecialization:
3070f22ef01cSRoman Divacky     EmitGlobal(cast<VarDecl>(D));
3071f22ef01cSRoman Divacky     break;
3072f22ef01cSRoman Divacky 
30733b0f4066SDimitry Andric   // Indirect fields from global anonymous structs and unions can be
30743b0f4066SDimitry Andric   // ignored; only the actual variable requires IR gen support.
30753b0f4066SDimitry Andric   case Decl::IndirectField:
30763b0f4066SDimitry Andric     break;
30773b0f4066SDimitry Andric 
3078f22ef01cSRoman Divacky   // C++ Decls
3079f22ef01cSRoman Divacky   case Decl::Namespace:
3080f22ef01cSRoman Divacky     EmitNamespace(cast<NamespaceDecl>(D));
3081f22ef01cSRoman Divacky     break;
3082f22ef01cSRoman Divacky     // No code generation needed.
3083f22ef01cSRoman Divacky   case Decl::UsingShadow:
3084f22ef01cSRoman Divacky   case Decl::ClassTemplate:
3085f785676fSDimitry Andric   case Decl::VarTemplate:
3086f785676fSDimitry Andric   case Decl::VarTemplatePartialSpecialization:
3087f22ef01cSRoman Divacky   case Decl::FunctionTemplate:
3088bd5abe19SDimitry Andric   case Decl::TypeAliasTemplate:
3089bd5abe19SDimitry Andric   case Decl::Block:
3090139f7f9bSDimitry Andric   case Decl::Empty:
3091f22ef01cSRoman Divacky     break;
309259d1ed5bSDimitry Andric   case Decl::Using:          // using X; [C++]
309359d1ed5bSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
309459d1ed5bSDimitry Andric         DI->EmitUsingDecl(cast<UsingDecl>(*D));
309559d1ed5bSDimitry Andric     return;
3096f785676fSDimitry Andric   case Decl::NamespaceAlias:
3097f785676fSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3098f785676fSDimitry Andric         DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D));
3099f785676fSDimitry Andric     return;
3100284c1978SDimitry Andric   case Decl::UsingDirective: // using namespace X; [C++]
3101284c1978SDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3102284c1978SDimitry Andric       DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D));
3103284c1978SDimitry Andric     return;
3104f22ef01cSRoman Divacky   case Decl::CXXConstructor:
3105f22ef01cSRoman Divacky     // Skip function templates
31063b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
31073b0f4066SDimitry Andric         cast<FunctionDecl>(D)->isLateTemplateParsed())
3108f22ef01cSRoman Divacky       return;
3109f22ef01cSRoman Divacky 
3110f785676fSDimitry Andric     getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D));
3111f22ef01cSRoman Divacky     break;
3112f22ef01cSRoman Divacky   case Decl::CXXDestructor:
31133b0f4066SDimitry Andric     if (cast<FunctionDecl>(D)->isLateTemplateParsed())
31143b0f4066SDimitry Andric       return;
3115f785676fSDimitry Andric     getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D));
3116f22ef01cSRoman Divacky     break;
3117f22ef01cSRoman Divacky 
3118f22ef01cSRoman Divacky   case Decl::StaticAssert:
3119f22ef01cSRoman Divacky     // Nothing to do.
3120f22ef01cSRoman Divacky     break;
3121f22ef01cSRoman Divacky 
3122f22ef01cSRoman Divacky   // Objective-C Decls
3123f22ef01cSRoman Divacky 
3124f22ef01cSRoman Divacky   // Forward declarations, no (immediate) code generation.
3125f22ef01cSRoman Divacky   case Decl::ObjCInterface:
31267ae0e2c9SDimitry Andric   case Decl::ObjCCategory:
3127f22ef01cSRoman Divacky     break;
3128f22ef01cSRoman Divacky 
3129dff0c46cSDimitry Andric   case Decl::ObjCProtocol: {
313059d1ed5bSDimitry Andric     auto *Proto = cast<ObjCProtocolDecl>(D);
3131dff0c46cSDimitry Andric     if (Proto->isThisDeclarationADefinition())
3132dff0c46cSDimitry Andric       ObjCRuntime->GenerateProtocol(Proto);
3133f22ef01cSRoman Divacky     break;
3134dff0c46cSDimitry Andric   }
3135f22ef01cSRoman Divacky 
3136f22ef01cSRoman Divacky   case Decl::ObjCCategoryImpl:
3137f22ef01cSRoman Divacky     // Categories have properties but don't support synthesize so we
3138f22ef01cSRoman Divacky     // can ignore them here.
31396122f3e6SDimitry Andric     ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
3140f22ef01cSRoman Divacky     break;
3141f22ef01cSRoman Divacky 
3142f22ef01cSRoman Divacky   case Decl::ObjCImplementation: {
314359d1ed5bSDimitry Andric     auto *OMD = cast<ObjCImplementationDecl>(D);
3144f22ef01cSRoman Divacky     EmitObjCPropertyImplementations(OMD);
3145f22ef01cSRoman Divacky     EmitObjCIvarInitializations(OMD);
31466122f3e6SDimitry Andric     ObjCRuntime->GenerateClass(OMD);
3147dff0c46cSDimitry Andric     // Emit global variable debug information.
3148dff0c46cSDimitry Andric     if (CGDebugInfo *DI = getModuleDebugInfo())
3149139f7f9bSDimitry Andric       if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
3150139f7f9bSDimitry Andric         DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
3151139f7f9bSDimitry Andric             OMD->getClassInterface()), OMD->getLocation());
3152f22ef01cSRoman Divacky     break;
3153f22ef01cSRoman Divacky   }
3154f22ef01cSRoman Divacky   case Decl::ObjCMethod: {
315559d1ed5bSDimitry Andric     auto *OMD = cast<ObjCMethodDecl>(D);
3156f22ef01cSRoman Divacky     // If this is not a prototype, emit the body.
3157f22ef01cSRoman Divacky     if (OMD->getBody())
3158f22ef01cSRoman Divacky       CodeGenFunction(*this).GenerateObjCMethod(OMD);
3159f22ef01cSRoman Divacky     break;
3160f22ef01cSRoman Divacky   }
3161f22ef01cSRoman Divacky   case Decl::ObjCCompatibleAlias:
3162dff0c46cSDimitry Andric     ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D));
3163f22ef01cSRoman Divacky     break;
3164f22ef01cSRoman Divacky 
3165f22ef01cSRoman Divacky   case Decl::LinkageSpec:
3166f22ef01cSRoman Divacky     EmitLinkageSpec(cast<LinkageSpecDecl>(D));
3167f22ef01cSRoman Divacky     break;
3168f22ef01cSRoman Divacky 
3169f22ef01cSRoman Divacky   case Decl::FileScopeAsm: {
317059d1ed5bSDimitry Andric     auto *AD = cast<FileScopeAsmDecl>(D);
31716122f3e6SDimitry Andric     StringRef AsmString = AD->getAsmString()->getString();
3172f22ef01cSRoman Divacky 
3173f22ef01cSRoman Divacky     const std::string &S = getModule().getModuleInlineAsm();
3174f22ef01cSRoman Divacky     if (S.empty())
3175f22ef01cSRoman Divacky       getModule().setModuleInlineAsm(AsmString);
31767ae0e2c9SDimitry Andric     else if (S.end()[-1] == '\n')
31776122f3e6SDimitry Andric       getModule().setModuleInlineAsm(S + AsmString.str());
3178f22ef01cSRoman Divacky     else
3179f22ef01cSRoman Divacky       getModule().setModuleInlineAsm(S + '\n' + AsmString.str());
3180f22ef01cSRoman Divacky     break;
3181f22ef01cSRoman Divacky   }
3182f22ef01cSRoman Divacky 
3183139f7f9bSDimitry Andric   case Decl::Import: {
318459d1ed5bSDimitry Andric     auto *Import = cast<ImportDecl>(D);
3185139f7f9bSDimitry Andric 
3186139f7f9bSDimitry Andric     // Ignore import declarations that come from imported modules.
3187139f7f9bSDimitry Andric     if (clang::Module *Owner = Import->getOwningModule()) {
3188139f7f9bSDimitry Andric       if (getLangOpts().CurrentModule.empty() ||
3189139f7f9bSDimitry Andric           Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)
3190139f7f9bSDimitry Andric         break;
3191139f7f9bSDimitry Andric     }
3192139f7f9bSDimitry Andric 
3193139f7f9bSDimitry Andric     ImportedModules.insert(Import->getImportedModule());
3194139f7f9bSDimitry Andric     break;
3195139f7f9bSDimitry Andric   }
3196139f7f9bSDimitry Andric 
319759d1ed5bSDimitry Andric   case Decl::ClassTemplateSpecialization: {
319859d1ed5bSDimitry Andric     const auto *Spec = cast<ClassTemplateSpecializationDecl>(D);
319959d1ed5bSDimitry Andric     if (DebugInfo &&
320059d1ed5bSDimitry Andric         Spec->getSpecializationKind() == TSK_ExplicitInstantiationDefinition)
320159d1ed5bSDimitry Andric       DebugInfo->completeTemplateDefinition(*Spec);
320259d1ed5bSDimitry Andric   }
320359d1ed5bSDimitry Andric 
3204f22ef01cSRoman Divacky   default:
3205f22ef01cSRoman Divacky     // Make sure we handled everything we should, every other kind is a
3206f22ef01cSRoman Divacky     // non-top-level decl.  FIXME: Would be nice to have an isTopLevelDeclKind
3207f22ef01cSRoman Divacky     // function. Need to recode Decl::Kind to do that easily.
3208f22ef01cSRoman Divacky     assert(isa<TypeDecl>(D) && "Unsupported decl kind");
3209f22ef01cSRoman Divacky   }
3210f22ef01cSRoman Divacky }
3211ffd1746dSEd Schouten 
3212ffd1746dSEd Schouten /// Turns the given pointer into a constant.
3213ffd1746dSEd Schouten static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context,
3214ffd1746dSEd Schouten                                           const void *Ptr) {
3215ffd1746dSEd Schouten   uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr);
32166122f3e6SDimitry Andric   llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
3217ffd1746dSEd Schouten   return llvm::ConstantInt::get(i64, PtrInt);
3218ffd1746dSEd Schouten }
3219ffd1746dSEd Schouten 
3220ffd1746dSEd Schouten static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
3221ffd1746dSEd Schouten                                    llvm::NamedMDNode *&GlobalMetadata,
3222ffd1746dSEd Schouten                                    GlobalDecl D,
3223ffd1746dSEd Schouten                                    llvm::GlobalValue *Addr) {
3224ffd1746dSEd Schouten   if (!GlobalMetadata)
3225ffd1746dSEd Schouten     GlobalMetadata =
3226ffd1746dSEd Schouten       CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
3227ffd1746dSEd Schouten 
3228ffd1746dSEd Schouten   // TODO: should we report variant information for ctors/dtors?
3229ffd1746dSEd Schouten   llvm::Value *Ops[] = {
3230ffd1746dSEd Schouten     Addr,
3231ffd1746dSEd Schouten     GetPointerConstant(CGM.getLLVMContext(), D.getDecl())
3232ffd1746dSEd Schouten   };
32333b0f4066SDimitry Andric   GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
3234ffd1746dSEd Schouten }
3235ffd1746dSEd Schouten 
3236284c1978SDimitry Andric /// For each function which is declared within an extern "C" region and marked
3237284c1978SDimitry Andric /// as 'used', but has internal linkage, create an alias from the unmangled
3238284c1978SDimitry Andric /// name to the mangled name if possible. People expect to be able to refer
3239284c1978SDimitry Andric /// to such functions with an unmangled name from inline assembly within the
3240284c1978SDimitry Andric /// same translation unit.
3241284c1978SDimitry Andric void CodeGenModule::EmitStaticExternCAliases() {
3242284c1978SDimitry Andric   for (StaticExternCMap::iterator I = StaticExternCValues.begin(),
3243284c1978SDimitry Andric                                   E = StaticExternCValues.end();
3244284c1978SDimitry Andric        I != E; ++I) {
3245284c1978SDimitry Andric     IdentifierInfo *Name = I->first;
3246284c1978SDimitry Andric     llvm::GlobalValue *Val = I->second;
3247284c1978SDimitry Andric     if (Val && !getModule().getNamedValue(Name->getName()))
324859d1ed5bSDimitry Andric       addUsedGlobal(llvm::GlobalAlias::create(Name->getName(), Val));
3249284c1978SDimitry Andric   }
3250284c1978SDimitry Andric }
3251284c1978SDimitry Andric 
325259d1ed5bSDimitry Andric bool CodeGenModule::lookupRepresentativeDecl(StringRef MangledName,
325359d1ed5bSDimitry Andric                                              GlobalDecl &Result) const {
325459d1ed5bSDimitry Andric   auto Res = Manglings.find(MangledName);
325559d1ed5bSDimitry Andric   if (Res == Manglings.end())
325659d1ed5bSDimitry Andric     return false;
325759d1ed5bSDimitry Andric   Result = Res->getValue();
325859d1ed5bSDimitry Andric   return true;
325959d1ed5bSDimitry Andric }
326059d1ed5bSDimitry Andric 
3261ffd1746dSEd Schouten /// Emits metadata nodes associating all the global values in the
3262ffd1746dSEd Schouten /// current module with the Decls they came from.  This is useful for
3263ffd1746dSEd Schouten /// projects using IR gen as a subroutine.
3264ffd1746dSEd Schouten ///
3265ffd1746dSEd Schouten /// Since there's currently no way to associate an MDNode directly
3266ffd1746dSEd Schouten /// with an llvm::GlobalValue, we create a global named metadata
3267ffd1746dSEd Schouten /// with the name 'clang.global.decl.ptrs'.
3268ffd1746dSEd Schouten void CodeGenModule::EmitDeclMetadata() {
326959d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3270ffd1746dSEd Schouten 
3271ffd1746dSEd Schouten   // StaticLocalDeclMap
327259d1ed5bSDimitry Andric   for (auto &I : MangledDeclNames) {
327359d1ed5bSDimitry Andric     llvm::GlobalValue *Addr = getModule().getNamedValue(I.second);
327459d1ed5bSDimitry Andric     EmitGlobalDeclMetadata(*this, GlobalMetadata, I.first, Addr);
3275ffd1746dSEd Schouten   }
3276ffd1746dSEd Schouten }
3277ffd1746dSEd Schouten 
3278ffd1746dSEd Schouten /// Emits metadata nodes for all the local variables in the current
3279ffd1746dSEd Schouten /// function.
3280ffd1746dSEd Schouten void CodeGenFunction::EmitDeclMetadata() {
3281ffd1746dSEd Schouten   if (LocalDeclMap.empty()) return;
3282ffd1746dSEd Schouten 
3283ffd1746dSEd Schouten   llvm::LLVMContext &Context = getLLVMContext();
3284ffd1746dSEd Schouten 
3285ffd1746dSEd Schouten   // Find the unique metadata ID for this name.
3286ffd1746dSEd Schouten   unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr");
3287ffd1746dSEd Schouten 
328859d1ed5bSDimitry Andric   llvm::NamedMDNode *GlobalMetadata = nullptr;
3289ffd1746dSEd Schouten 
329059d1ed5bSDimitry Andric   for (auto &I : LocalDeclMap) {
329159d1ed5bSDimitry Andric     const Decl *D = I.first;
329259d1ed5bSDimitry Andric     llvm::Value *Addr = I.second;
329359d1ed5bSDimitry Andric     if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
3294ffd1746dSEd Schouten       llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D);
32953b0f4066SDimitry Andric       Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr));
329659d1ed5bSDimitry Andric     } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
3297ffd1746dSEd Schouten       GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
3298ffd1746dSEd Schouten       EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
3299ffd1746dSEd Schouten     }
3300ffd1746dSEd Schouten   }
3301ffd1746dSEd Schouten }
3302e580952dSDimitry Andric 
3303f785676fSDimitry Andric void CodeGenModule::EmitVersionIdentMetadata() {
3304f785676fSDimitry Andric   llvm::NamedMDNode *IdentMetadata =
3305f785676fSDimitry Andric     TheModule.getOrInsertNamedMetadata("llvm.ident");
3306f785676fSDimitry Andric   std::string Version = getClangFullVersion();
3307f785676fSDimitry Andric   llvm::LLVMContext &Ctx = TheModule.getContext();
3308f785676fSDimitry Andric 
3309f785676fSDimitry Andric   llvm::Value *IdentNode[] = {
3310f785676fSDimitry Andric     llvm::MDString::get(Ctx, Version)
3311f785676fSDimitry Andric   };
3312f785676fSDimitry Andric   IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
3313f785676fSDimitry Andric }
3314f785676fSDimitry Andric 
331559d1ed5bSDimitry Andric void CodeGenModule::EmitTargetMetadata() {
331659d1ed5bSDimitry Andric   for (auto &I : MangledDeclNames) {
331759d1ed5bSDimitry Andric     const Decl *D = I.first.getDecl()->getMostRecentDecl();
331859d1ed5bSDimitry Andric     llvm::GlobalValue *GV = GetGlobalValue(I.second);
331959d1ed5bSDimitry Andric     getTargetCodeGenInfo().emitTargetMD(D, GV, *this);
332059d1ed5bSDimitry Andric   }
332159d1ed5bSDimitry Andric }
332259d1ed5bSDimitry Andric 
3323bd5abe19SDimitry Andric void CodeGenModule::EmitCoverageFile() {
3324bd5abe19SDimitry Andric   if (!getCodeGenOpts().CoverageFile.empty()) {
3325bd5abe19SDimitry Andric     if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
3326bd5abe19SDimitry Andric       llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov");
3327bd5abe19SDimitry Andric       llvm::LLVMContext &Ctx = TheModule.getContext();
3328bd5abe19SDimitry Andric       llvm::MDString *CoverageFile =
3329bd5abe19SDimitry Andric           llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile);
3330bd5abe19SDimitry Andric       for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
3331bd5abe19SDimitry Andric         llvm::MDNode *CU = CUNode->getOperand(i);
3332bd5abe19SDimitry Andric         llvm::Value *node[] = { CoverageFile, CU };
3333bd5abe19SDimitry Andric         llvm::MDNode *N = llvm::MDNode::get(Ctx, node);
3334bd5abe19SDimitry Andric         GCov->addOperand(N);
3335bd5abe19SDimitry Andric       }
3336bd5abe19SDimitry Andric     }
3337bd5abe19SDimitry Andric   }
3338bd5abe19SDimitry Andric }
33393861d79fSDimitry Andric 
33403861d79fSDimitry Andric llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid,
33413861d79fSDimitry Andric                                                      QualType GuidType) {
33423861d79fSDimitry Andric   // Sema has checked that all uuid strings are of the form
33433861d79fSDimitry Andric   // "12345678-1234-1234-1234-1234567890ab".
33443861d79fSDimitry Andric   assert(Uuid.size() == 36);
3345f785676fSDimitry Andric   for (unsigned i = 0; i < 36; ++i) {
3346f785676fSDimitry Andric     if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-');
3347f785676fSDimitry Andric     else                                         assert(isHexDigit(Uuid[i]));
33483861d79fSDimitry Andric   }
33493861d79fSDimitry Andric 
3350f785676fSDimitry Andric   const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 };
33513861d79fSDimitry Andric 
3352f785676fSDimitry Andric   llvm::Constant *Field3[8];
3353f785676fSDimitry Andric   for (unsigned Idx = 0; Idx < 8; ++Idx)
3354f785676fSDimitry Andric     Field3[Idx] = llvm::ConstantInt::get(
3355f785676fSDimitry Andric         Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16);
33563861d79fSDimitry Andric 
3357f785676fSDimitry Andric   llvm::Constant *Fields[4] = {
3358f785676fSDimitry Andric     llvm::ConstantInt::get(Int32Ty, Uuid.substr(0,  8), 16),
3359f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(9,  4), 16),
3360f785676fSDimitry Andric     llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16),
3361f785676fSDimitry Andric     llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3)
3362f785676fSDimitry Andric   };
3363f785676fSDimitry Andric 
3364f785676fSDimitry Andric   return llvm::ConstantStruct::getAnon(Fields);
33653861d79fSDimitry Andric }
336659d1ed5bSDimitry Andric 
336759d1ed5bSDimitry Andric llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty,
336859d1ed5bSDimitry Andric                                                        bool ForEH) {
336959d1ed5bSDimitry Andric   // Return a bogus pointer if RTTI is disabled, unless it's for EH.
337059d1ed5bSDimitry Andric   // FIXME: should we even be calling this method if RTTI is disabled
337159d1ed5bSDimitry Andric   // and it's not for EH?
337259d1ed5bSDimitry Andric   if (!ForEH && !getLangOpts().RTTI)
337359d1ed5bSDimitry Andric     return llvm::Constant::getNullValue(Int8PtrTy);
337459d1ed5bSDimitry Andric 
337559d1ed5bSDimitry Andric   if (ForEH && Ty->isObjCObjectPointerType() &&
337659d1ed5bSDimitry Andric       LangOpts.ObjCRuntime.isGNUFamily())
337759d1ed5bSDimitry Andric     return ObjCRuntime->GetEHType(Ty);
337859d1ed5bSDimitry Andric 
337959d1ed5bSDimitry Andric   return getCXXABI().getAddrOfRTTIDescriptor(Ty);
338059d1ed5bSDimitry Andric }
338159d1ed5bSDimitry Andric 
3382