blob: f5fdfdb64948ff425a21afa9f1ad80b32b477eb5 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- CodeGenModule.cpp - Emit LLVM Code from ASTs for a Module --------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This coordinates the per-module state used while generating code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenModule.h"
Peter Collingbourne6c0aa5f2011-10-06 18:29:37 +000015#include "CGCUDARuntime.h"
John McCall4c40d982010-08-31 07:33:07 +000016#include "CGCXXABI.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000017#include "CGCall.h"
18#include "CGDebugInfo.h"
Daniel Dunbaraf2f62c2008-08-13 00:59:25 +000019#include "CGObjCRuntime.h"
Peter Collingbourne8c25fc52011-09-19 21:14:35 +000020#include "CGOpenCLRuntime.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000021#include "CodeGenFunction.h"
22#include "CodeGenTBAA.h"
Anton Korobeynikov82d0a412010-01-10 12:58:08 +000023#include "TargetInfo.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000024#include "clang/AST/ASTContext.h"
Ken Dyck687cc4a2010-01-26 13:48:07 +000025#include "clang/AST/CharUnits.h"
Chris Lattner21ef7ae2008-11-04 16:51:42 +000026#include "clang/AST/DeclCXX.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000027#include "clang/AST/DeclObjC.h"
Douglas Gregoraf896892010-06-21 18:41:26 +000028#include "clang/AST/DeclTemplate.h"
Peter Collingbourne14110472011-01-13 18:57:25 +000029#include "clang/AST/Mangle.h"
Anders Carlsson1a5e0d72009-11-30 23:41:22 +000030#include "clang/AST/RecordLayout.h"
Rafael Espindolaa411d2f2011-10-26 20:41:06 +000031#include "clang/AST/RecursiveASTVisitor.h"
Rafael Espindolabcf6b982011-12-19 14:41:01 +000032#include "clang/Basic/Builtins.h"
Jordan Rose3f6f51e2013-02-08 22:30:41 +000033#include "clang/Basic/CharInfo.h"
Chris Lattner2c8569d2007-12-02 07:19:18 +000034#include "clang/Basic/Diagnostic.h"
Douglas Gregorb6cbe512013-01-14 17:21:00 +000035#include "clang/Basic/Module.h"
Nate Begeman8bd4afe2008-04-19 04:17:09 +000036#include "clang/Basic/SourceManager.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000037#include "clang/Basic/TargetInfo.h"
Rafael Espindola9686f122013-10-16 19:28:50 +000038#include "clang/Basic/Version.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000039#include "clang/Frontend/CodeGenOptions.h"
Rafael Espindolad2054982013-10-22 19:26:13 +000040#include "clang/Sema/SemaDiagnostic.h"
Sebastian Redl19b1a6e2012-02-25 20:51:20 +000041#include "llvm/ADT/APSInt.h"
John McCall6374c332010-03-06 00:35:14 +000042#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000043#include "llvm/IR/CallingConv.h"
44#include "llvm/IR/DataLayout.h"
45#include "llvm/IR/Intrinsics.h"
46#include "llvm/IR/LLVMContext.h"
47#include "llvm/IR/Module.h"
Gabor Greif6ba728d2010-04-10 02:56:12 +000048#include "llvm/Support/CallSite.h"
Dmitri Gribenkocb5620c2013-01-30 12:06:08 +000049#include "llvm/Support/ConvertUTF.h"
Chris Lattner78f7ece2009-11-07 09:22:46 +000050#include "llvm/Support/ErrorHandling.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000051#include "llvm/Target/Mangler.h"
Dmitri Gribenkocb5620c2013-01-30 12:06:08 +000052
Reid Spencer5f016e22007-07-11 17:01:13 +000053using namespace clang;
54using namespace CodeGen;
55
Julien Lerouge77f68bb2011-09-09 22:41:49 +000056static const char AnnotationSection[] = "llvm.metadata";
57
John McCallf16aa102010-08-22 21:01:12 +000058static CGCXXABI &createCXXABI(CodeGenModule &CGM) {
John McCall64aa4b32013-04-16 22:48:15 +000059 switch (CGM.getTarget().getCXXABI().getKind()) {
Tim Northoverc264e162013-01-31 12:13:10 +000060 case TargetCXXABI::GenericAArch64:
John McCall96fcde02013-01-25 23:36:14 +000061 case TargetCXXABI::GenericARM:
62 case TargetCXXABI::iOS:
63 case TargetCXXABI::GenericItanium:
64 return *CreateItaniumCXXABI(CGM);
65 case TargetCXXABI::Microsoft:
66 return *CreateMicrosoftCXXABI(CGM);
John McCallf16aa102010-08-22 21:01:12 +000067 }
68
69 llvm_unreachable("invalid C++ ABI kind");
John McCallf16aa102010-08-22 21:01:12 +000070}
71
Chandler Carruth2811ccf2009-11-12 17:24:48 +000072CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
John McCall3abae092013-04-16 22:48:20 +000073 llvm::Module &M, const llvm::DataLayout &TD,
David Blaikied6471f72011-09-25 23:23:43 +000074 DiagnosticsEngine &diags)
Alexey Samsonov6a4c5dc2013-08-12 11:48:05 +000075 : Context(C), LangOpts(C.getLangOpts()), CodeGenOpts(CGO), TheModule(M),
76 Diags(diags), TheDataLayout(TD), Target(C.getTargetInfo()),
77 ABI(createCXXABI(*this)), VMContext(M.getContext()), TBAA(0),
78 TheTargetCodeGenInfo(0), Types(*this), VTables(*this), ObjCRuntime(0),
79 OpenCLRuntime(0), CUDARuntime(0), DebugInfo(0), ARCData(0),
80 NoObjCARCExceptionsMetadata(0), RRData(0), CFConstantStringClassRef(0),
81 ConstantStringClassRef(0), NSConstantStringType(0),
82 NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), BlockObjectAssign(0),
83 BlockObjectDispose(0), BlockDescriptorType(0), GenericBlockLiteralType(0),
84 LifetimeStartFn(0), LifetimeEndFn(0),
85 SanitizerBlacklist(
86 llvm::SpecialCaseList::createOrDie(CGO.SanitizerBlacklistFile)),
87 SanOpts(SanitizerBlacklist->isIn(M) ? SanitizerOptions::Disabled
88 : LangOpts.Sanitize) {
Will Dietz4f45bc02013-01-18 11:30:38 +000089
Chris Lattner8b418682012-02-07 00:39:47 +000090 // Initialize the type cache.
91 llvm::LLVMContext &LLVMContext = M.getContext();
92 VoidTy = llvm::Type::getVoidTy(LLVMContext);
93 Int8Ty = llvm::Type::getInt8Ty(LLVMContext);
94 Int16Ty = llvm::Type::getInt16Ty(LLVMContext);
95 Int32Ty = llvm::Type::getInt32Ty(LLVMContext);
96 Int64Ty = llvm::Type::getInt64Ty(LLVMContext);
97 FloatTy = llvm::Type::getFloatTy(LLVMContext);
98 DoubleTy = llvm::Type::getDoubleTy(LLVMContext);
99 PointerWidthInBits = C.getTargetInfo().getPointerWidth(0);
100 PointerAlignInBytes =
101 C.toCharUnitsFromBits(C.getTargetInfo().getPointerAlign(0)).getQuantity();
102 IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth());
103 IntPtrTy = llvm::IntegerType::get(LLVMContext, PointerWidthInBits);
104 Int8PtrTy = Int8Ty->getPointerTo(0);
105 Int8PtrPtrTy = Int8PtrTy->getPointerTo(0);
106
John McCallbd7370a2013-02-28 19:01:20 +0000107 RuntimeCC = getTargetCodeGenInfo().getABIInfo().getRuntimeCC();
108
David Blaikie4e4d0842012-03-11 07:00:24 +0000109 if (LangOpts.ObjC1)
Peter Collingbourne8c25fc52011-09-19 21:14:35 +0000110 createObjCRuntime();
David Blaikie4e4d0842012-03-11 07:00:24 +0000111 if (LangOpts.OpenCL)
Peter Collingbourne8c25fc52011-09-19 21:14:35 +0000112 createOpenCLRuntime();
David Blaikie4e4d0842012-03-11 07:00:24 +0000113 if (LangOpts.CUDA)
Peter Collingbourne6c0aa5f2011-10-06 18:29:37 +0000114 createCUDARuntime();
Sanjiv Guptae8b9f5b2008-05-08 08:54:20 +0000115
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +0000116 // Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0.
Will Dietz4f45bc02013-01-18 11:30:38 +0000117 if (SanOpts.Thread ||
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +0000118 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
119 TBAA = new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(),
Dan Gohman0b5c4fc2010-10-15 20:23:12 +0000120 ABI.getMangleContext());
Dan Gohman3d5aff52010-10-14 23:06:10 +0000121
Nick Lewyckye8ba8d72011-04-21 23:44:07 +0000122 // If debug info or coverage generation is enabled, create the CGDebugInfo
123 // object.
Douglas Gregor4cdad312012-10-23 20:05:01 +0000124 if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo ||
Alexey Samsonov3a70cd62012-04-27 07:24:20 +0000125 CodeGenOpts.EmitGcovArcs ||
Nick Lewyckye8ba8d72011-04-21 23:44:07 +0000126 CodeGenOpts.EmitGcovNotes)
127 DebugInfo = new CGDebugInfo(*this);
John McCalld16c2cf2011-02-08 08:22:06 +0000128
129 Block.GlobalUniqueCount = 0;
John McCall5936e332011-02-15 09:22:45 +0000130
David Blaikie4e4d0842012-03-11 07:00:24 +0000131 if (C.getLangOpts().ObjCAutoRefCount)
John McCallf85e1932011-06-15 23:02:42 +0000132 ARCData = new ARCEntrypoints();
133 RRData = new RREntrypoints();
Chris Lattner2b94fe32008-03-01 08:45:05 +0000134}
135
136CodeGenModule::~CodeGenModule() {
Peter Collingbournee9265232011-07-27 20:29:46 +0000137 delete ObjCRuntime;
Peter Collingbourne8c25fc52011-09-19 21:14:35 +0000138 delete OpenCLRuntime;
Peter Collingbourne6c0aa5f2011-10-06 18:29:37 +0000139 delete CUDARuntime;
Ted Kremenek0628b722011-10-08 05:28:26 +0000140 delete TheTargetCodeGenInfo;
John McCallf16aa102010-08-22 21:01:12 +0000141 delete &ABI;
Dan Gohman4376c852010-10-15 18:04:46 +0000142 delete TBAA;
Ted Kremenek815c78f2008-08-05 18:50:11 +0000143 delete DebugInfo;
John McCallf85e1932011-06-15 23:02:42 +0000144 delete ARCData;
145 delete RRData;
Ted Kremenek815c78f2008-08-05 18:50:11 +0000146}
147
David Chisnall0d13f6f2010-01-23 02:40:42 +0000148void CodeGenModule::createObjCRuntime() {
John McCall260611a2012-06-20 06:18:46 +0000149 // This is just isGNUFamily(), but we want to force implementors of
150 // new ABIs to decide how best to do this.
151 switch (LangOpts.ObjCRuntime.getKind()) {
David Chisnall11d3f4c2012-07-03 20:49:52 +0000152 case ObjCRuntime::GNUstep:
153 case ObjCRuntime::GCC:
John McCallf7226fb2012-07-12 02:07:58 +0000154 case ObjCRuntime::ObjFW:
Peter Collingbournee9265232011-07-27 20:29:46 +0000155 ObjCRuntime = CreateGNUObjCRuntime(*this);
John McCall260611a2012-06-20 06:18:46 +0000156 return;
157
158 case ObjCRuntime::FragileMacOSX:
159 case ObjCRuntime::MacOSX:
160 case ObjCRuntime::iOS:
Peter Collingbournee9265232011-07-27 20:29:46 +0000161 ObjCRuntime = CreateMacObjCRuntime(*this);
John McCall260611a2012-06-20 06:18:46 +0000162 return;
163 }
164 llvm_unreachable("bad runtime kind");
David Chisnall0d13f6f2010-01-23 02:40:42 +0000165}
166
Peter Collingbourne8c25fc52011-09-19 21:14:35 +0000167void CodeGenModule::createOpenCLRuntime() {
168 OpenCLRuntime = new CGOpenCLRuntime(*this);
169}
170
Peter Collingbourne6c0aa5f2011-10-06 18:29:37 +0000171void CodeGenModule::createCUDARuntime() {
172 CUDARuntime = CreateNVCUDARuntime(*this);
173}
174
Rafael Espindola61a0a752013-11-05 21:37:29 +0000175void CodeGenModule::applyReplacements() {
176 for (ReplacementsTy::iterator I = Replacements.begin(),
177 E = Replacements.end();
178 I != E; ++I) {
179 StringRef MangledName = I->first();
180 llvm::Constant *Replacement = I->second;
181 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
182 if (!Entry)
183 continue;
Rafael Espindola081c2152013-11-12 04:53:19 +0000184 llvm::Function *OldF = cast<llvm::Function>(Entry);
185 llvm::Function *NewF = dyn_cast<llvm::Function>(Replacement);
186 if (!NewF) {
187 llvm::ConstantExpr *CE = cast<llvm::ConstantExpr>(Replacement);
188 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
189 CE->getOpcode() == llvm::Instruction::GetElementPtr);
190 NewF = dyn_cast<llvm::Function>(CE->getOperand(0));
191 }
192
193 // Replace old with new, but keep the old order.
194 OldF->replaceAllUsesWith(Replacement);
195 if (NewF) {
196 NewF->removeFromParent();
197 OldF->getParent()->getFunctionList().insertAfter(OldF, NewF);
198 }
199 OldF->eraseFromParent();
Rafael Espindola61a0a752013-11-05 21:37:29 +0000200 }
201}
202
Rafael Espindolad2054982013-10-22 19:26:13 +0000203void CodeGenModule::checkAliases() {
204 bool Error = false;
205 for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
206 E = Aliases.end(); I != E; ++I) {
207 const GlobalDecl &GD = *I;
208 const ValueDecl *D = cast<ValueDecl>(GD.getDecl());
209 const AliasAttr *AA = D->getAttr<AliasAttr>();
210 StringRef MangledName = getMangledName(GD);
211 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
212 llvm::GlobalAlias *Alias = cast<llvm::GlobalAlias>(Entry);
213 llvm::GlobalValue *GV = Alias->getAliasedGlobal();
214 if (GV->isDeclaration()) {
215 Error = true;
216 getDiags().Report(AA->getLocation(), diag::err_alias_to_undefined);
217 } else if (!Alias->resolveAliasedGlobal(/*stopOnWeak*/ false)) {
218 Error = true;
219 getDiags().Report(AA->getLocation(), diag::err_cyclic_alias);
220 }
221 }
222 if (!Error)
223 return;
224
225 for (std::vector<GlobalDecl>::iterator I = Aliases.begin(),
226 E = Aliases.end(); I != E; ++I) {
227 const GlobalDecl &GD = *I;
228 StringRef MangledName = getMangledName(GD);
229 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
230 llvm::GlobalAlias *Alias = cast<llvm::GlobalAlias>(Entry);
231 Alias->replaceAllUsesWith(llvm::UndefValue::get(Alias->getType()));
232 Alias->eraseFromParent();
233 }
234}
235
Ted Kremenek815c78f2008-08-05 18:50:11 +0000236void CodeGenModule::Release() {
Chris Lattner82227ff2009-03-22 21:21:57 +0000237 EmitDeferred();
Rafael Espindola61a0a752013-11-05 21:37:29 +0000238 applyReplacements();
Rafael Espindolad2054982013-10-22 19:26:13 +0000239 checkAliases();
Eli Friedman6c6bda32010-01-08 00:50:11 +0000240 EmitCXXGlobalInitFunc();
Daniel Dunbarefb0fa92010-03-20 04:15:41 +0000241 EmitCXXGlobalDtorFunc();
Richard Smithb80a16e2013-04-19 16:42:07 +0000242 EmitCXXThreadLocalInitFunc();
Peter Collingbournee9265232011-07-27 20:29:46 +0000243 if (ObjCRuntime)
244 if (llvm::Function *ObjCInitFunction = ObjCRuntime->ModuleInitFunction())
Daniel Dunbar208ff5e2008-08-11 18:12:00 +0000245 AddGlobalCtor(ObjCInitFunction);
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000246 EmitCtorList(GlobalCtors, "llvm.global_ctors");
247 EmitCtorList(GlobalDtors, "llvm.global_dtors");
Julien Lerouge77f68bb2011-09-09 22:41:49 +0000248 EmitGlobalAnnotations();
Richard Smith00249372013-04-06 05:00:46 +0000249 EmitStaticExternCAliases();
Daniel Dunbar02698712009-02-13 20:29:50 +0000250 EmitLLVMUsed();
Douglas Gregorf43b7212013-01-16 01:23:41 +0000251
Reid Kleckner3190ca92013-05-08 13:44:39 +0000252 if (CodeGenOpts.Autolink &&
253 (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
Douglas Gregorf43b7212013-01-16 01:23:41 +0000254 EmitModuleLinkOptions();
255 }
Manman Renfc0f91c2013-06-19 01:46:49 +0000256 if (CodeGenOpts.DwarfVersion)
257 // We actually want the latest version when there are conflicts.
258 // We can change from Warning to Latest if such mode is supported.
259 getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
260 CodeGenOpts.DwarfVersion);
Douglas Gregor5d75ea72013-01-14 18:28:43 +0000261
John McCallb2593832010-09-16 06:16:50 +0000262 SimplifyPersonality();
263
John McCall744016d2010-07-06 23:57:41 +0000264 if (getCodeGenOpts().EmitDeclMetadata)
265 EmitDeclMetadata();
Nick Lewycky5ea4f442011-05-04 20:46:58 +0000266
267 if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
Nick Lewycky3dc05412011-05-05 00:08:20 +0000268 EmitCoverageFile();
Devang Patelf391dbe2011-08-16 20:58:22 +0000269
270 if (DebugInfo)
271 DebugInfo->finalize();
Rafael Espindola9686f122013-10-16 19:28:50 +0000272
273 EmitVersionIdentMetadata();
Daniel Dunbarf1968f22008-10-01 00:49:24 +0000274}
275
Devang Patele80d5672011-03-23 16:29:39 +0000276void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
277 // Make sure that this type is translated.
278 Types.UpdateCompletedType(TD);
Devang Patele80d5672011-03-23 16:29:39 +0000279}
280
Dan Gohman3d5aff52010-10-14 23:06:10 +0000281llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
282 if (!TBAA)
283 return 0;
284 return TBAA->getTBAAInfo(QTy);
285}
286
Kostya Serebryany8cb4a072012-03-26 17:03:51 +0000287llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
288 if (!TBAA)
289 return 0;
290 return TBAA->getTBAAInfoForVTablePtr();
291}
292
Dan Gohmanb22c7dc2012-09-28 21:58:29 +0000293llvm::MDNode *CodeGenModule::getTBAAStructInfo(QualType QTy) {
294 if (!TBAA)
295 return 0;
296 return TBAA->getTBAAStructInfo(QTy);
297}
298
Manman Renb37a73d2013-04-04 21:53:22 +0000299llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
300 if (!TBAA)
301 return 0;
302 return TBAA->getTBAAStructTypeInfo(QTy);
303}
304
305llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
306 llvm::MDNode *AccessN,
307 uint64_t O) {
308 if (!TBAA)
309 return 0;
310 return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
311}
312
Manman Renfeba9f22013-10-08 00:08:49 +0000313/// Decorate the instruction with a TBAA tag. For both scalar TBAA
314/// and struct-path aware TBAA, the tag has the same format:
315/// base type, access type and offset.
Manman Renca835182013-04-11 23:02:56 +0000316/// When ConvertTypeToTag is true, we create a tag based on the scalar type.
Dan Gohman3d5aff52010-10-14 23:06:10 +0000317void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
Manman Renca835182013-04-11 23:02:56 +0000318 llvm::MDNode *TBAAInfo,
319 bool ConvertTypeToTag) {
Manman Renfeba9f22013-10-08 00:08:49 +0000320 if (ConvertTypeToTag && TBAA)
Manman Renca835182013-04-11 23:02:56 +0000321 Inst->setMetadata(llvm::LLVMContext::MD_tbaa,
322 TBAA->getTBAAScalarTagInfo(TBAAInfo));
323 else
324 Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
Dan Gohman3d5aff52010-10-14 23:06:10 +0000325}
326
Chandler Carruth0f30a122012-03-30 19:44:53 +0000327void CodeGenModule::Error(SourceLocation loc, StringRef error) {
328 unsigned diagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, error);
John McCall32096692011-03-18 02:56:14 +0000329 getDiags().Report(Context.getFullLoc(loc), diagID);
330}
331
Daniel Dunbar488e9932008-08-16 00:56:44 +0000332/// ErrorUnsupported - Print out an error that codegen doesn't support the
Chris Lattner2c8569d2007-12-02 07:19:18 +0000333/// specified stmt yet.
David Blaikie0a1c8622013-08-19 21:02:26 +0000334void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
David Blaikied6471f72011-09-25 23:23:43 +0000335 unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
Daniel Dunbar56b80012009-02-06 19:18:03 +0000336 "cannot compile this %0 yet");
Chris Lattner2c8569d2007-12-02 07:19:18 +0000337 std::string Msg = Type;
Chris Lattner0a14eee2008-11-18 07:04:44 +0000338 getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID)
339 << Msg << S->getSourceRange();
Chris Lattner2c8569d2007-12-02 07:19:18 +0000340}
Chris Lattner58c3f9e2007-12-02 06:27:33 +0000341
Daniel Dunbar488e9932008-08-16 00:56:44 +0000342/// ErrorUnsupported - Print out an error that codegen doesn't support the
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000343/// specified decl yet.
David Blaikie0a1c8622013-08-19 21:02:26 +0000344void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
David Blaikied6471f72011-09-25 23:23:43 +0000345 unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
Daniel Dunbar56b80012009-02-06 19:18:03 +0000346 "cannot compile this %0 yet");
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000347 std::string Msg = Type;
Chris Lattner0a14eee2008-11-18 07:04:44 +0000348 getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
Chris Lattnerc6fdc342008-01-12 07:05:38 +0000349}
350
John McCallbc8d40d2011-06-24 21:55:10 +0000351llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
352 return llvm::ConstantInt::get(SizeTy, size.getQuantity());
353}
354
Mike Stump1eb44332009-09-09 15:08:12 +0000355void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
Anders Carlsson0ffeaad2011-01-29 19:39:23 +0000356 const NamedDecl *D) const {
Daniel Dunbar04d40782009-04-14 06:00:08 +0000357 // Internal definitions always have default visibility.
Chris Lattnerdf102fc2009-04-14 05:27:13 +0000358 if (GV->hasLocalLinkage()) {
Daniel Dunbar7e714cd2009-04-10 20:26:50 +0000359 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
Daniel Dunbar6ab187a2009-04-07 05:48:37 +0000360 return;
Daniel Dunbar7e714cd2009-04-10 20:26:50 +0000361 }
Daniel Dunbar6ab187a2009-04-07 05:48:37 +0000362
John McCallaf146032010-10-30 11:50:40 +0000363 // Set visibility for definitions.
Rafael Espindola2beda122013-02-27 02:15:29 +0000364 LinkageInfo LV = D->getLinkageAndVisibility();
Rafael Espindolaf127eb82013-02-27 02:56:45 +0000365 if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
366 GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
Dan Gohman4f8d1232008-05-22 00:50:06 +0000367}
368
Hans Wennborgde981f32012-06-28 08:01:44 +0000369static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) {
370 return llvm::StringSwitch<llvm::GlobalVariable::ThreadLocalMode>(S)
371 .Case("global-dynamic", llvm::GlobalVariable::GeneralDynamicTLSModel)
372 .Case("local-dynamic", llvm::GlobalVariable::LocalDynamicTLSModel)
373 .Case("initial-exec", llvm::GlobalVariable::InitialExecTLSModel)
374 .Case("local-exec", llvm::GlobalVariable::LocalExecTLSModel);
375}
376
377static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(
378 CodeGenOptions::TLSModel M) {
379 switch (M) {
380 case CodeGenOptions::GeneralDynamicTLSModel:
381 return llvm::GlobalVariable::GeneralDynamicTLSModel;
382 case CodeGenOptions::LocalDynamicTLSModel:
383 return llvm::GlobalVariable::LocalDynamicTLSModel;
384 case CodeGenOptions::InitialExecTLSModel:
385 return llvm::GlobalVariable::InitialExecTLSModel;
386 case CodeGenOptions::LocalExecTLSModel:
387 return llvm::GlobalVariable::LocalExecTLSModel;
388 }
389 llvm_unreachable("Invalid TLS model!");
390}
391
392void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV,
393 const VarDecl &D) const {
Richard Smith38afbc72013-04-13 02:43:54 +0000394 assert(D.getTLSKind() && "setting TLS mode on non-TLS var!");
Hans Wennborgde981f32012-06-28 08:01:44 +0000395
396 llvm::GlobalVariable::ThreadLocalMode TLM;
Douglas Gregor4cdad312012-10-23 20:05:01 +0000397 TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
Hans Wennborgde981f32012-06-28 08:01:44 +0000398
399 // Override the TLS model if it is explicitly specified.
400 if (D.hasAttr<TLSModelAttr>()) {
401 const TLSModelAttr *Attr = D.getAttr<TLSModelAttr>();
402 TLM = GetLLVMTLSModel(Attr->getModel());
403 }
404
405 GV->setThreadLocalMode(TLM);
406}
407
John McCallcbfe5022010-08-04 08:34:44 +0000408/// Set the symbol visibility of type information (vtable and RTTI)
409/// associated with the given type.
410void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV,
411 const CXXRecordDecl *RD,
Anders Carlssonfa2e99f2011-01-29 20:24:48 +0000412 TypeVisibilityKind TVK) const {
Anders Carlsson0ffeaad2011-01-29 19:39:23 +0000413 setGlobalVisibility(GV, RD);
John McCallcbfe5022010-08-04 08:34:44 +0000414
John McCall279b5eb2010-08-12 23:36:15 +0000415 if (!CodeGenOpts.HiddenWeakVTables)
416 return;
417
Anders Carlsson9a86a132011-01-29 20:36:11 +0000418 // We never want to drop the visibility for RTTI names.
419 if (TVK == TVK_ForRTTIName)
420 return;
421
John McCallcbfe5022010-08-04 08:34:44 +0000422 // We want to drop the visibility to hidden for weak type symbols.
423 // This isn't possible if there might be unresolved references
424 // elsewhere that rely on this symbol being visible.
425
John McCall7a536902010-08-05 20:39:18 +0000426 // This should be kept roughly in sync with setThunkVisibility
427 // in CGVTables.cpp.
428
John McCallcbfe5022010-08-04 08:34:44 +0000429 // Preconditions.
Anders Carlssonf502d932011-01-24 00:46:19 +0000430 if (GV->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage ||
John McCallcbfe5022010-08-04 08:34:44 +0000431 GV->getVisibility() != llvm::GlobalVariable::DefaultVisibility)
432 return;
433
434 // Don't override an explicit visibility attribute.
John McCalld4c3d662013-02-20 01:54:26 +0000435 if (RD->getExplicitVisibility(NamedDecl::VisibilityForType))
John McCallcbfe5022010-08-04 08:34:44 +0000436 return;
437
438 switch (RD->getTemplateSpecializationKind()) {
439 // We have to disable the optimization if this is an EI definition
440 // because there might be EI declarations in other shared objects.
441 case TSK_ExplicitInstantiationDefinition:
442 case TSK_ExplicitInstantiationDeclaration:
443 return;
444
John McCall7a536902010-08-05 20:39:18 +0000445 // Every use of a non-template class's type information has to emit it.
John McCallcbfe5022010-08-04 08:34:44 +0000446 case TSK_Undeclared:
447 break;
448
John McCall7a536902010-08-05 20:39:18 +0000449 // In theory, implicit instantiations can ignore the possibility of
450 // an explicit instantiation declaration because there necessarily
451 // must be an EI definition somewhere with default visibility. In
452 // practice, it's possible to have an explicit instantiation for
453 // an arbitrary template class, and linkers aren't necessarily able
454 // to deal with mixed-visibility symbols.
455 case TSK_ExplicitSpecialization:
John McCallcbfe5022010-08-04 08:34:44 +0000456 case TSK_ImplicitInstantiation:
Douglas Gregoraafd1112012-10-24 14:11:55 +0000457 return;
John McCallcbfe5022010-08-04 08:34:44 +0000458 }
459
460 // If there's a key function, there may be translation units
461 // that don't have the key function's definition. But ignore
462 // this if we're emitting RTTI under -fno-rtti.
David Blaikie4e4d0842012-03-11 07:00:24 +0000463 if (!(TVK != TVK_ForRTTI) || LangOpts.RTTI) {
John McCalld5617ee2013-01-25 22:31:03 +0000464 // FIXME: what should we do if we "lose" the key function during
465 // the emission of the file?
466 if (Context.getCurrentKeyFunction(RD))
John McCallcbfe5022010-08-04 08:34:44 +0000467 return;
Anders Carlssonfa2e99f2011-01-29 20:24:48 +0000468 }
John McCallcbfe5022010-08-04 08:34:44 +0000469
470 // Otherwise, drop the visibility to hidden.
471 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
Rafael Espindolab1c65ff2011-01-11 21:44:37 +0000472 GV->setUnnamedAddr(true);
John McCallcbfe5022010-08-04 08:34:44 +0000473}
474
Chris Lattner5f9e2722011-07-23 10:55:15 +0000475StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
Anders Carlsson793a9902010-06-22 16:05:32 +0000476 const NamedDecl *ND = cast<NamedDecl>(GD.getDecl());
477
Chris Lattner5f9e2722011-07-23 10:55:15 +0000478 StringRef &Str = MangledDeclNames[GD.getCanonicalDecl()];
Anders Carlsson793a9902010-06-22 16:05:32 +0000479 if (!Str.empty())
480 return Str;
481
John McCall4c40d982010-08-31 07:33:07 +0000482 if (!getCXXABI().getMangleContext().shouldMangleDeclName(ND)) {
Anders Carlsson793a9902010-06-22 16:05:32 +0000483 IdentifierInfo *II = ND->getIdentifier();
484 assert(II && "Attempt to mangle unnamed decl.");
485
486 Str = II->getName();
487 return Str;
488 }
489
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000490 SmallString<256> Buffer;
Rafael Espindolac4850c22011-02-10 23:59:36 +0000491 llvm::raw_svector_ostream Out(Buffer);
Anders Carlsson793a9902010-06-22 16:05:32 +0000492 if (const CXXConstructorDecl *D = dyn_cast<CXXConstructorDecl>(ND))
Rafael Espindolac4850c22011-02-10 23:59:36 +0000493 getCXXABI().getMangleContext().mangleCXXCtor(D, GD.getCtorType(), Out);
Anders Carlsson793a9902010-06-22 16:05:32 +0000494 else if (const CXXDestructorDecl *D = dyn_cast<CXXDestructorDecl>(ND))
Rafael Espindolac4850c22011-02-10 23:59:36 +0000495 getCXXABI().getMangleContext().mangleCXXDtor(D, GD.getDtorType(), Out);
Anders Carlsson793a9902010-06-22 16:05:32 +0000496 else
Rafael Espindolac4850c22011-02-10 23:59:36 +0000497 getCXXABI().getMangleContext().mangleName(ND, Out);
Anders Carlsson793a9902010-06-22 16:05:32 +0000498
499 // Allocate space for the mangled name.
Rafael Espindolac4850c22011-02-10 23:59:36 +0000500 Out.flush();
Anders Carlsson793a9902010-06-22 16:05:32 +0000501 size_t Length = Buffer.size();
502 char *Name = MangledNamesAllocator.Allocate<char>(Length);
503 std::copy(Buffer.begin(), Buffer.end(), Name);
504
Chris Lattner5f9e2722011-07-23 10:55:15 +0000505 Str = StringRef(Name, Length);
Anders Carlsson793a9902010-06-22 16:05:32 +0000506
507 return Str;
508}
509
Peter Collingbourne14110472011-01-13 18:57:25 +0000510void CodeGenModule::getBlockMangledName(GlobalDecl GD, MangleBuffer &Buffer,
511 const BlockDecl *BD) {
512 MangleContext &MangleCtx = getCXXABI().getMangleContext();
513 const Decl *D = GD.getDecl();
Rafael Espindolac4850c22011-02-10 23:59:36 +0000514 llvm::raw_svector_ostream Out(Buffer.getBuffer());
Peter Collingbourne14110472011-01-13 18:57:25 +0000515 if (D == 0)
Fariborz Jahanian4904bf42012-06-26 16:06:38 +0000516 MangleCtx.mangleGlobalBlock(BD,
517 dyn_cast_or_null<VarDecl>(initializedGlobalDecl.getDecl()), Out);
Peter Collingbourne14110472011-01-13 18:57:25 +0000518 else if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D))
Rafael Espindolac4850c22011-02-10 23:59:36 +0000519 MangleCtx.mangleCtorBlock(CD, GD.getCtorType(), BD, Out);
Peter Collingbourne14110472011-01-13 18:57:25 +0000520 else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D))
Rafael Espindolac4850c22011-02-10 23:59:36 +0000521 MangleCtx.mangleDtorBlock(DD, GD.getDtorType(), BD, Out);
Peter Collingbourne14110472011-01-13 18:57:25 +0000522 else
Rafael Espindolac4850c22011-02-10 23:59:36 +0000523 MangleCtx.mangleBlock(cast<DeclContext>(D), BD, Out);
Anders Carlsson9a8822b2010-06-09 02:36:32 +0000524}
525
Chris Lattner5f9e2722011-07-23 10:55:15 +0000526llvm::GlobalValue *CodeGenModule::GetGlobalValue(StringRef Name) {
John McCallf746aa62010-03-19 23:29:14 +0000527 return getModule().getNamedValue(Name);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000528}
529
Chris Lattner6d397602008-03-14 17:18:18 +0000530/// AddGlobalCtor - Add a function to the list that will be called before
531/// main() runs.
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000532void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor, int Priority) {
Daniel Dunbar49988882009-01-13 02:25:00 +0000533 // FIXME: Type coercion of void()* types.
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000534 GlobalCtors.push_back(std::make_pair(Ctor, Priority));
Chris Lattner6d397602008-03-14 17:18:18 +0000535}
536
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000537/// AddGlobalDtor - Add a function to the list that will be called
538/// when the module is unloaded.
539void CodeGenModule::AddGlobalDtor(llvm::Function * Dtor, int Priority) {
Daniel Dunbar49988882009-01-13 02:25:00 +0000540 // FIXME: Type coercion of void()* types.
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000541 GlobalDtors.push_back(std::make_pair(Dtor, Priority));
542}
543
544void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
545 // Ctor function type is void()*.
John McCall0774cb82011-05-15 01:53:33 +0000546 llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
Owen Anderson96e0fc72009-07-29 22:16:19 +0000547 llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000548
549 // Get the type of a ctor entry, { i32, void ()* }.
Chris Lattnerc5cbb902011-06-20 04:01:35 +0000550 llvm::StructType *CtorStructTy =
Chris Lattner8b418682012-02-07 00:39:47 +0000551 llvm::StructType::get(Int32Ty, llvm::PointerType::getUnqual(CtorFTy), NULL);
Chris Lattner6d397602008-03-14 17:18:18 +0000552
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000553 // Construct the constructor and destructor arrays.
Chris Lattner0b239712012-02-06 22:16:34 +0000554 SmallVector<llvm::Constant*, 8> Ctors;
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000555 for (CtorList::const_iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) {
Chris Lattner0b239712012-02-06 22:16:34 +0000556 llvm::Constant *S[] = {
557 llvm::ConstantInt::get(Int32Ty, I->second, false),
558 llvm::ConstantExpr::getBitCast(I->first, CtorPFTy)
559 };
Owen Anderson08e25242009-07-27 22:29:56 +0000560 Ctors.push_back(llvm::ConstantStruct::get(CtorStructTy, S));
Chris Lattner6d397602008-03-14 17:18:18 +0000561 }
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000562
563 if (!Ctors.empty()) {
Owen Anderson96e0fc72009-07-29 22:16:19 +0000564 llvm::ArrayType *AT = llvm::ArrayType::get(CtorStructTy, Ctors.size());
Owen Anderson1c431b32009-07-08 19:05:04 +0000565 new llvm::GlobalVariable(TheModule, AT, false,
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000566 llvm::GlobalValue::AppendingLinkage,
Owen Anderson7db6d832009-07-28 18:33:04 +0000567 llvm::ConstantArray::get(AT, Ctors),
Owen Anderson1c431b32009-07-08 19:05:04 +0000568 GlobalName);
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +0000569 }
Chris Lattner6d397602008-03-14 17:18:18 +0000570}
571
John McCalld46f9852010-02-19 01:32:20 +0000572llvm::GlobalValue::LinkageTypes
Peter Collingbourne144a31f2013-06-05 17:49:37 +0000573CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
Eli Friedman7a36a592013-07-01 20:53:07 +0000574 const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl());
Reid Klecknera4130ba2013-07-22 13:51:44 +0000575
576 if (isa<CXXDestructorDecl>(D) &&
577 getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
578 GD.getDtorType()))
579 return llvm::Function::LinkOnceODRLinkage;
580
Argyrios Kyrtzidis90e99a82010-07-29 18:15:58 +0000581 GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000582
Chris Lattnerf81530652010-06-30 16:58:07 +0000583 if (Linkage == GVA_Internal)
John McCalld46f9852010-02-19 01:32:20 +0000584 return llvm::Function::InternalLinkage;
Chris Lattnerf81530652010-06-30 16:58:07 +0000585
586 if (D->hasAttr<DLLExportAttr>())
John McCalld46f9852010-02-19 01:32:20 +0000587 return llvm::Function::DLLExportLinkage;
Chris Lattnerf81530652010-06-30 16:58:07 +0000588
589 if (D->hasAttr<WeakAttr>())
John McCalld46f9852010-02-19 01:32:20 +0000590 return llvm::Function::WeakAnyLinkage;
Chris Lattnerf81530652010-06-30 16:58:07 +0000591
592 // In C99 mode, 'inline' functions are guaranteed to have a strong
593 // definition somewhere else, so we can use available_externally linkage.
594 if (Linkage == GVA_C99Inline)
Fariborz Jahanianfd0f89d2011-02-04 00:08:13 +0000595 return llvm::Function::AvailableExternallyLinkage;
John McCall5584d912011-09-19 18:05:26 +0000596
597 // Note that Apple's kernel linker doesn't support symbol
598 // coalescing, so we need to avoid linkonce and weak linkages there.
599 // Normally, this means we just map to internal, but for explicit
600 // instantiations we'll map to external.
601
Chris Lattnerf81530652010-06-30 16:58:07 +0000602 // In C++, the compiler has to emit a definition in every translation unit
603 // that references the function. We should use linkonce_odr because
604 // a) if all references in this translation unit are optimized away, we
605 // don't need to codegen it. b) if the function persists, it needs to be
606 // merged with other definitions. c) C++ has the ODR, so we know the
607 // definition is dependable.
608 if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation)
David Blaikie4e4d0842012-03-11 07:00:24 +0000609 return !Context.getLangOpts().AppleKext
Fariborz Jahanian142f9e92011-02-04 00:01:24 +0000610 ? llvm::Function::LinkOnceODRLinkage
611 : llvm::Function::InternalLinkage;
Chris Lattnerf81530652010-06-30 16:58:07 +0000612
613 // An explicit instantiation of a template has weak linkage, since
614 // explicit instantiations can occur in multiple translation units
615 // and must all be equivalent. However, we are not allowed to
616 // throw away these explicit instantiations.
617 if (Linkage == GVA_ExplicitTemplateInstantiation)
David Blaikie4e4d0842012-03-11 07:00:24 +0000618 return !Context.getLangOpts().AppleKext
Fariborz Jahanian142f9e92011-02-04 00:01:24 +0000619 ? llvm::Function::WeakODRLinkage
John McCall5584d912011-09-19 18:05:26 +0000620 : llvm::Function::ExternalLinkage;
Chris Lattnerf81530652010-06-30 16:58:07 +0000621
622 // Otherwise, we have strong external linkage.
623 assert(Linkage == GVA_StrongExternal);
624 return llvm::Function::ExternalLinkage;
John McCalld46f9852010-02-19 01:32:20 +0000625}
Nuno Lopesd4cbda62008-06-08 15:45:52 +0000626
John McCalld46f9852010-02-19 01:32:20 +0000627
628/// SetFunctionDefinitionAttributes - Set attributes for a global.
629///
630/// FIXME: This is currently only done for aliases and functions, but not for
631/// variables (these details are set in EmitGlobalVarDefinition for variables).
632void CodeGenModule::SetFunctionDefinitionAttributes(const FunctionDecl *D,
633 llvm::GlobalValue *GV) {
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000634 SetCommonAttributes(D, GV);
Nuno Lopesd4cbda62008-06-08 15:45:52 +0000635}
636
Daniel Dunbar7dbd8192009-04-14 07:08:30 +0000637void CodeGenModule::SetLLVMFunctionAttributes(const Decl *D,
Mike Stump1eb44332009-09-09 15:08:12 +0000638 const CGFunctionInfo &Info,
Daniel Dunbar7dbd8192009-04-14 07:08:30 +0000639 llvm::Function *F) {
Daniel Dunbarca6408c2009-09-12 00:59:20 +0000640 unsigned CallingConv;
Devang Patel761d7f72008-09-25 21:02:23 +0000641 AttributeListType AttributeList;
Bill Wendling94236e72013-02-22 00:13:35 +0000642 ConstructAttributeList(Info, D, AttributeList, CallingConv, false);
Bill Wendling785b7782012-12-07 23:17:26 +0000643 F->setAttributes(llvm::AttributeSet::get(getLLVMContext(), AttributeList));
Daniel Dunbarca6408c2009-09-12 00:59:20 +0000644 F->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
Daniel Dunbarf80519b2008-09-04 23:41:35 +0000645}
646
John McCalld1e40d52011-10-02 01:16:38 +0000647/// Determines whether the language options require us to model
648/// unwind exceptions. We treat -fexceptions as mandating this
649/// except under the fragile ObjC ABI with only ObjC exceptions
650/// enabled. This means, for example, that C with -fexceptions
651/// enables this.
David Blaikie4e4d0842012-03-11 07:00:24 +0000652static bool hasUnwindExceptions(const LangOptions &LangOpts) {
John McCalld1e40d52011-10-02 01:16:38 +0000653 // If exceptions are completely disabled, obviously this is false.
David Blaikie4e4d0842012-03-11 07:00:24 +0000654 if (!LangOpts.Exceptions) return false;
John McCalld1e40d52011-10-02 01:16:38 +0000655
656 // If C++ exceptions are enabled, this is true.
David Blaikie4e4d0842012-03-11 07:00:24 +0000657 if (LangOpts.CXXExceptions) return true;
John McCalld1e40d52011-10-02 01:16:38 +0000658
659 // If ObjC exceptions are enabled, this depends on the ABI.
David Blaikie4e4d0842012-03-11 07:00:24 +0000660 if (LangOpts.ObjCExceptions) {
David Chisnall11d3f4c2012-07-03 20:49:52 +0000661 return LangOpts.ObjCRuntime.hasUnwindExceptions();
John McCalld1e40d52011-10-02 01:16:38 +0000662 }
663
664 return true;
665}
666
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000667void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
668 llvm::Function *F) {
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000669 llvm::AttrBuilder B;
670
Rafael Espindolaabca5a12011-05-25 03:44:55 +0000671 if (CodeGenOpts.UnwindTables)
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000672 B.addAttribute(llvm::Attribute::UWTable);
Rafael Espindolaabca5a12011-05-25 03:44:55 +0000673
David Blaikie4e4d0842012-03-11 07:00:24 +0000674 if (!hasUnwindExceptions(LangOpts))
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000675 B.addAttribute(llvm::Attribute::NoUnwind);
Daniel Dunbaraf668b02008-10-28 00:17:57 +0000676
Eli Friedman2873aee2011-08-22 23:55:33 +0000677 if (D->hasAttr<NakedAttr>()) {
678 // Naked implies noinline: we should not be inlining such functions.
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000679 B.addAttribute(llvm::Attribute::Naked);
680 B.addAttribute(llvm::Attribute::NoInline);
681 } else if (D->hasAttr<NoInlineAttr>()) {
682 B.addAttribute(llvm::Attribute::NoInline);
683 } else if ((D->hasAttr<AlwaysInlineAttr>() ||
684 D->hasAttr<ForceInlineAttr>()) &&
685 !F->getAttributes().hasAttribute(llvm::AttributeSet::FunctionIndex,
686 llvm::Attribute::NoInline)) {
687 // (noinline wins over always_inline, and we can't specify both in IR)
688 B.addAttribute(llvm::Attribute::AlwaysInline);
Eli Friedman2873aee2011-08-22 23:55:33 +0000689 }
Daniel Dunbardd0cb222010-09-29 18:20:25 +0000690
Diego Novillod27e5cb2013-05-24 20:18:15 +0000691 if (D->hasAttr<ColdAttr>()) {
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000692 B.addAttribute(llvm::Attribute::OptimizeForSize);
Diego Novillod27e5cb2013-05-24 20:18:15 +0000693 B.addAttribute(llvm::Attribute::Cold);
694 }
Benjamin Krameree409a92012-05-12 21:10:52 +0000695
Quentin Colombetaee56fa2012-11-01 23:55:47 +0000696 if (D->hasAttr<MinSizeAttr>())
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000697 B.addAttribute(llvm::Attribute::MinSize);
Richard Smithef4d5ce2012-09-28 22:46:07 +0000698
David Blaikie4e4d0842012-03-11 07:00:24 +0000699 if (LangOpts.getStackProtector() == LangOptions::SSPOn)
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000700 B.addAttribute(llvm::Attribute::StackProtect);
David Blaikie4e4d0842012-03-11 07:00:24 +0000701 else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000702 B.addAttribute(llvm::Attribute::StackProtectReq);
Will Dietz4f45bc02013-01-18 11:30:38 +0000703
Alexey Samsonov7e73f942013-03-06 10:54:18 +0000704 // Add sanitizer attributes if function is not blacklisted.
Alexey Samsonov6a4c5dc2013-08-12 11:48:05 +0000705 if (!SanitizerBlacklist->isIn(*F)) {
Alexey Samsonov7e73f942013-03-06 10:54:18 +0000706 // When AddressSanitizer is enabled, set SanitizeAddress attribute
707 // unless __attribute__((no_sanitize_address)) is used.
708 if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>())
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000709 B.addAttribute(llvm::Attribute::SanitizeAddress);
Alexey Samsonov7e73f942013-03-06 10:54:18 +0000710 // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
711 if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) {
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000712 B.addAttribute(llvm::Attribute::SanitizeThread);
Alexey Samsonov7e73f942013-03-06 10:54:18 +0000713 }
714 // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
715 if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>())
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000716 B.addAttribute(llvm::Attribute::SanitizeMemory);
Alexey Samsonov7e73f942013-03-06 10:54:18 +0000717 }
Alexander Potapenko89651ea2012-02-02 11:49:28 +0000718
Benjamin Kramer06a9d042013-05-11 12:45:37 +0000719 F->addAttributes(llvm::AttributeSet::FunctionIndex,
720 llvm::AttributeSet::get(
721 F->getContext(), llvm::AttributeSet::FunctionIndex, B));
722
723 if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))
724 F->setUnnamedAddr(true);
725 else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D))
726 if (MD->isVirtual())
727 F->setUnnamedAddr(true);
728
Sean Huntcf807c42010-08-18 23:23:40 +0000729 unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
730 if (alignment)
731 F->setAlignment(alignment);
732
Mike Stumpfb51ddf2009-10-05 22:49:20 +0000733 // C++ ABI requires 2-byte alignment for member functions.
Mike Stumpbd6dbd12009-10-05 23:08:21 +0000734 if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D))
735 F->setAlignment(2);
Daniel Dunbarf80519b2008-09-04 23:41:35 +0000736}
737
Mike Stump1eb44332009-09-09 15:08:12 +0000738void CodeGenModule::SetCommonAttributes(const Decl *D,
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000739 llvm::GlobalValue *GV) {
Anders Carlsson934176f2011-01-29 19:41:00 +0000740 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
741 setGlobalVisibility(GV, ND);
John McCall1fb0caa2010-10-22 21:05:15 +0000742 else
743 GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000744
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +0000745 if (D->hasAttr<UsedAttr>())
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000746 AddUsedGlobal(GV);
747
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +0000748 if (const SectionAttr *SA = D->getAttr<SectionAttr>())
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000749 GV->setSection(SA->getName());
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000750
Rafael Espindola9a2f5d72013-03-19 15:03:47 +0000751 // Alias cannot have attributes. Filter them here.
752 if (!isa<llvm::GlobalAlias>(GV))
753 getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this);
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000754}
755
Daniel Dunbar0e4f40e2009-04-17 00:48:04 +0000756void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
757 llvm::Function *F,
758 const CGFunctionInfo &FI) {
759 SetLLVMFunctionAttributes(D, FI, F);
760 SetLLVMFunctionAttributesForDefinition(D, F);
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000761
762 F->setLinkage(llvm::Function::InternalLinkage);
763
Daniel Dunbar0e4f40e2009-04-17 00:48:04 +0000764 SetCommonAttributes(D, F);
Daniel Dunbarf80519b2008-09-04 23:41:35 +0000765}
766
Anders Carlssonb2bcf1c2010-02-06 02:44:09 +0000767void CodeGenModule::SetFunctionAttributes(GlobalDecl GD,
Eli Friedmanc6c14d12009-05-26 01:22:57 +0000768 llvm::Function *F,
769 bool IsIncompleteFunction) {
Peter Collingbourne0ac2cf42011-04-06 12:29:04 +0000770 if (unsigned IID = F->getIntrinsicID()) {
771 // If this is an intrinsic function, set the function's attributes
772 // to the intrinsic's attributes.
Bill Wendling50e6b182012-10-15 04:47:45 +0000773 F->setAttributes(llvm::Intrinsic::getAttributes(getLLVMContext(),
774 (llvm::Intrinsic::ID)IID));
Peter Collingbourne0ac2cf42011-04-06 12:29:04 +0000775 return;
776 }
777
Anders Carlssonb2bcf1c2010-02-06 02:44:09 +0000778 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
779
Eli Friedmanc6c14d12009-05-26 01:22:57 +0000780 if (!IsIncompleteFunction)
John McCallde5d3c72012-02-17 03:33:10 +0000781 SetLLVMFunctionAttributes(FD, getTypes().arrangeGlobalDeclaration(GD), F);
Mike Stump1eb44332009-09-09 15:08:12 +0000782
Stephen Lin3b50e8d2013-06-30 20:40:16 +0000783 if (getCXXABI().HasThisReturn(GD)) {
784 assert(!F->arg_empty() &&
785 F->arg_begin()->getType()
786 ->canLosslesslyBitCastTo(F->getReturnType()) &&
787 "unexpected this return");
788 F->addAttribute(1, llvm::Attribute::Returned);
789 }
790
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000791 // Only a few attributes are set on declarations; these may later be
792 // overridden by a definition.
Mike Stump1eb44332009-09-09 15:08:12 +0000793
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +0000794 if (FD->hasAttr<DLLImportAttr>()) {
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000795 F->setLinkage(llvm::Function::DLLImportLinkage);
Mike Stump1eb44332009-09-09 15:08:12 +0000796 } else if (FD->hasAttr<WeakAttr>() ||
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000797 FD->isWeakImported()) {
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000798 // "extern_weak" is overloaded in LLVM; we probably should have
Mike Stump1eb44332009-09-09 15:08:12 +0000799 // separate linkage types for this.
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000800 F->setLinkage(llvm::Function::ExternalWeakLinkage);
801 } else {
Mike Stump1eb44332009-09-09 15:08:12 +0000802 F->setLinkage(llvm::Function::ExternalLinkage);
John McCallaf146032010-10-30 11:50:40 +0000803
Rafael Espindola2beda122013-02-27 02:15:29 +0000804 LinkageInfo LV = FD->getLinkageAndVisibility();
Rafael Espindolaf127eb82013-02-27 02:56:45 +0000805 if (LV.getLinkage() == ExternalLinkage && LV.isVisibilityExplicit()) {
806 F->setVisibility(GetLLVMVisibility(LV.getVisibility()));
John McCallaf146032010-10-30 11:50:40 +0000807 }
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000808 }
809
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +0000810 if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
Daniel Dunbar7c65e992009-04-14 08:05:55 +0000811 F->setSection(SA->getName());
Richard Smithddcff1b2013-07-21 23:12:18 +0000812
813 // A replaceable global allocation function does not act like a builtin by
814 // default, only if it is invoked by a new-expression or delete-expression.
815 if (FD->isReplaceableGlobalAllocationFunction())
816 F->addAttribute(llvm::AttributeSet::FunctionIndex,
817 llvm::Attribute::NoBuiltin);
Daniel Dunbar219df662008-09-08 23:44:31 +0000818}
819
Daniel Dunbar02698712009-02-13 20:29:50 +0000820void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) {
Mike Stump1eb44332009-09-09 15:08:12 +0000821 assert(!GV->isDeclaration() &&
Daniel Dunbar02698712009-02-13 20:29:50 +0000822 "Only globals with definition can force usage.");
Chris Lattner35f38a22009-03-31 22:37:52 +0000823 LLVMUsed.push_back(GV);
Daniel Dunbar02698712009-02-13 20:29:50 +0000824}
825
826void CodeGenModule::EmitLLVMUsed() {
827 // Don't create llvm.used if there is no need.
Chris Lattnerad64e022009-07-17 23:57:13 +0000828 if (LLVMUsed.empty())
Daniel Dunbar02698712009-02-13 20:29:50 +0000829 return;
830
Chris Lattner35f38a22009-03-31 22:37:52 +0000831 // Convert LLVMUsed to what ConstantArray needs.
Chris Lattner0b239712012-02-06 22:16:34 +0000832 SmallVector<llvm::Constant*, 8> UsedArray;
Chris Lattner35f38a22009-03-31 22:37:52 +0000833 UsedArray.resize(LLVMUsed.size());
834 for (unsigned i = 0, e = LLVMUsed.size(); i != e; ++i) {
Mike Stump1eb44332009-09-09 15:08:12 +0000835 UsedArray[i] =
836 llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]),
Chris Lattner0b239712012-02-06 22:16:34 +0000837 Int8PtrTy);
Chris Lattner35f38a22009-03-31 22:37:52 +0000838 }
Mike Stump1eb44332009-09-09 15:08:12 +0000839
Fariborz Jahanianc38e9af2009-06-23 21:47:46 +0000840 if (UsedArray.empty())
841 return;
Chris Lattner0b239712012-02-06 22:16:34 +0000842 llvm::ArrayType *ATy = llvm::ArrayType::get(Int8PtrTy, UsedArray.size());
Mike Stump1eb44332009-09-09 15:08:12 +0000843
844 llvm::GlobalVariable *GV =
845 new llvm::GlobalVariable(getModule(), ATy, false,
Daniel Dunbar02698712009-02-13 20:29:50 +0000846 llvm::GlobalValue::AppendingLinkage,
Owen Anderson7db6d832009-07-28 18:33:04 +0000847 llvm::ConstantArray::get(ATy, UsedArray),
Owen Anderson1c431b32009-07-08 19:05:04 +0000848 "llvm.used");
Daniel Dunbar02698712009-02-13 20:29:50 +0000849
850 GV->setSection("llvm.metadata");
851}
852
Reid Kleckner3190ca92013-05-08 13:44:39 +0000853void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
854 llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
855 LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
856}
857
Aaron Ballmana7ff62f2013-06-04 02:07:14 +0000858void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef Value) {
859 llvm::SmallString<32> Opt;
860 getTargetCodeGenInfo().getDetectMismatchOption(Name, Value, Opt);
861 llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
862 LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
863}
864
Reid Kleckner3190ca92013-05-08 13:44:39 +0000865void CodeGenModule::AddDependentLib(StringRef Lib) {
866 llvm::SmallString<24> Opt;
867 getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
868 llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
869 LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(), MDOpts));
870}
871
Douglas Gregor858afb32013-01-14 20:53:57 +0000872/// \brief Add link options implied by the given module, including modules
873/// it depends on, using a postorder walk.
Reid Kleckner3190ca92013-05-08 13:44:39 +0000874static void addLinkOptionsPostorder(CodeGenModule &CGM,
Douglas Gregor858afb32013-01-14 20:53:57 +0000875 Module *Mod,
Daniel Dunbarf9d03c12013-01-17 01:35:06 +0000876 SmallVectorImpl<llvm::Value *> &Metadata,
Douglas Gregor858afb32013-01-14 20:53:57 +0000877 llvm::SmallPtrSet<Module *, 16> &Visited) {
878 // Import this module's parent.
879 if (Mod->Parent && Visited.insert(Mod->Parent)) {
Reid Kleckner3190ca92013-05-08 13:44:39 +0000880 addLinkOptionsPostorder(CGM, Mod->Parent, Metadata, Visited);
Douglas Gregor858afb32013-01-14 20:53:57 +0000881 }
882
883 // Import this module's dependencies.
884 for (unsigned I = Mod->Imports.size(); I > 0; --I) {
885 if (Visited.insert(Mod->Imports[I-1]))
Reid Kleckner3190ca92013-05-08 13:44:39 +0000886 addLinkOptionsPostorder(CGM, Mod->Imports[I-1], Metadata, Visited);
Douglas Gregor858afb32013-01-14 20:53:57 +0000887 }
888
889 // Add linker options to link against the libraries/frameworks
890 // described by this module.
Reid Kleckner3190ca92013-05-08 13:44:39 +0000891 llvm::LLVMContext &Context = CGM.getLLVMContext();
Douglas Gregor858afb32013-01-14 20:53:57 +0000892 for (unsigned I = Mod->LinkLibraries.size(); I > 0; --I) {
Reid Kleckner3190ca92013-05-08 13:44:39 +0000893 // Link against a framework. Frameworks are currently Darwin only, so we
894 // don't to ask TargetCodeGenInfo for the spelling of the linker option.
Douglas Gregor858afb32013-01-14 20:53:57 +0000895 if (Mod->LinkLibraries[I-1].IsFramework) {
896 llvm::Value *Args[2] = {
897 llvm::MDString::get(Context, "-framework"),
898 llvm::MDString::get(Context, Mod->LinkLibraries[I-1].Library)
899 };
900
901 Metadata.push_back(llvm::MDNode::get(Context, Args));
902 continue;
903 }
904
905 // Link against a library.
Reid Kleckner3190ca92013-05-08 13:44:39 +0000906 llvm::SmallString<24> Opt;
907 CGM.getTargetCodeGenInfo().getDependentLibraryOption(
908 Mod->LinkLibraries[I-1].Library, Opt);
909 llvm::Value *OptString = llvm::MDString::get(Context, Opt);
Douglas Gregor858afb32013-01-14 20:53:57 +0000910 Metadata.push_back(llvm::MDNode::get(Context, OptString));
911 }
912}
913
914void CodeGenModule::EmitModuleLinkOptions() {
915 // Collect the set of all of the modules we want to visit to emit link
916 // options, which is essentially the imported modules and all of their
917 // non-explicit child modules.
918 llvm::SetVector<clang::Module *> LinkModules;
919 llvm::SmallPtrSet<clang::Module *, 16> Visited;
920 SmallVector<clang::Module *, 16> Stack;
921
922 // Seed the stack with imported modules.
923 for (llvm::SetVector<clang::Module *>::iterator M = ImportedModules.begin(),
924 MEnd = ImportedModules.end();
925 M != MEnd; ++M) {
926 if (Visited.insert(*M))
927 Stack.push_back(*M);
928 }
929
930 // Find all of the modules to import, making a little effort to prune
931 // non-leaf modules.
932 while (!Stack.empty()) {
Robert Wilhelm344472e2013-08-23 16:11:15 +0000933 clang::Module *Mod = Stack.pop_back_val();
Douglas Gregor858afb32013-01-14 20:53:57 +0000934
935 bool AnyChildren = false;
936
937 // Visit the submodules of this module.
938 for (clang::Module::submodule_iterator Sub = Mod->submodule_begin(),
939 SubEnd = Mod->submodule_end();
940 Sub != SubEnd; ++Sub) {
941 // Skip explicit children; they need to be explicitly imported to be
942 // linked against.
943 if ((*Sub)->IsExplicit)
944 continue;
945
946 if (Visited.insert(*Sub)) {
947 Stack.push_back(*Sub);
948 AnyChildren = true;
949 }
950 }
951
952 // We didn't find any children, so add this module to the list of
953 // modules to link against.
954 if (!AnyChildren) {
955 LinkModules.insert(Mod);
956 }
957 }
958
959 // Add link options for all of the imported modules in reverse topological
Reid Kleckner3190ca92013-05-08 13:44:39 +0000960 // order. We don't do anything to try to order import link flags with respect
961 // to linker options inserted by things like #pragma comment().
Daniel Dunbarf9d03c12013-01-17 01:35:06 +0000962 SmallVector<llvm::Value *, 16> MetadataArgs;
Douglas Gregor858afb32013-01-14 20:53:57 +0000963 Visited.clear();
964 for (llvm::SetVector<clang::Module *>::iterator M = LinkModules.begin(),
965 MEnd = LinkModules.end();
966 M != MEnd; ++M) {
967 if (Visited.insert(*M))
Reid Kleckner3190ca92013-05-08 13:44:39 +0000968 addLinkOptionsPostorder(*this, *M, MetadataArgs, Visited);
Douglas Gregor858afb32013-01-14 20:53:57 +0000969 }
Daniel Dunbarf9d03c12013-01-17 01:35:06 +0000970 std::reverse(MetadataArgs.begin(), MetadataArgs.end());
Reid Kleckner3190ca92013-05-08 13:44:39 +0000971 LinkerOptionsMetadata.append(MetadataArgs.begin(), MetadataArgs.end());
Douglas Gregor858afb32013-01-14 20:53:57 +0000972
Daniel Dunbarf9d03c12013-01-17 01:35:06 +0000973 // Add the linker options metadata flag.
974 getModule().addModuleFlag(llvm::Module::AppendUnique, "Linker Options",
Reid Kleckner3190ca92013-05-08 13:44:39 +0000975 llvm::MDNode::get(getLLVMContext(),
976 LinkerOptionsMetadata));
Douglas Gregor858afb32013-01-14 20:53:57 +0000977}
978
Daniel Dunbar02698712009-02-13 20:29:50 +0000979void CodeGenModule::EmitDeferred() {
Chris Lattner67b00522009-03-21 09:44:56 +0000980 // Emit code for any potentially referenced deferred decls. Since a
981 // previously unused static decl may become used during the generation of code
Nick Lewyckydce67a72011-07-18 05:26:13 +0000982 // for a static function, iterate until no changes are made.
Rafael Espindolabbf58bb2010-03-10 02:19:29 +0000983
John McCalld5617ee2013-01-25 22:31:03 +0000984 while (true) {
Anders Carlsson046c2942010-04-17 20:15:18 +0000985 if (!DeferredVTables.empty()) {
John McCalld5617ee2013-01-25 22:31:03 +0000986 EmitDeferredVTables();
987
988 // Emitting a v-table doesn't directly cause more v-tables to
989 // become deferred, although it can cause functions to be
990 // emitted that then need those v-tables.
991 assert(DeferredVTables.empty());
Rafael Espindolabbf58bb2010-03-10 02:19:29 +0000992 }
993
John McCalld5617ee2013-01-25 22:31:03 +0000994 // Stop if we're out of both deferred v-tables and deferred declarations.
995 if (DeferredDeclsToEmit.empty()) break;
996
Anders Carlsson2a131fb2009-05-05 04:44:02 +0000997 GlobalDecl D = DeferredDeclsToEmit.back();
Chris Lattner67b00522009-03-21 09:44:56 +0000998 DeferredDeclsToEmit.pop_back();
999
John McCallc76702c2010-05-27 01:45:30 +00001000 // Check to see if we've already emitted this. This is necessary
1001 // for a couple of reasons: first, decls can end up in the
1002 // deferred-decls queue multiple times, and second, decls can end
1003 // up with definitions in unusual ways (e.g. by an extern inline
1004 // function acquiring a strong function redefinition). Just
1005 // ignore these cases.
1006 //
1007 // TODO: That said, looking this up multiple times is very wasteful.
Chris Lattner5f9e2722011-07-23 10:55:15 +00001008 StringRef Name = getMangledName(D);
John McCallf746aa62010-03-19 23:29:14 +00001009 llvm::GlobalValue *CGRef = GetGlobalValue(Name);
Chris Lattner67b00522009-03-21 09:44:56 +00001010 assert(CGRef && "Deferred decl wasn't referenced?");
Mike Stump1eb44332009-09-09 15:08:12 +00001011
Chris Lattner67b00522009-03-21 09:44:56 +00001012 if (!CGRef->isDeclaration())
1013 continue;
Mike Stump1eb44332009-09-09 15:08:12 +00001014
John McCallc76702c2010-05-27 01:45:30 +00001015 // GlobalAlias::isDeclaration() defers to the aliasee, but for our
1016 // purposes an alias counts as a definition.
1017 if (isa<llvm::GlobalAlias>(CGRef))
1018 continue;
1019
Chris Lattner67b00522009-03-21 09:44:56 +00001020 // Otherwise, emit the definition and move on to the next one.
1021 EmitGlobalDefinition(D);
1022 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001023}
1024
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001025void CodeGenModule::EmitGlobalAnnotations() {
1026 if (Annotations.empty())
1027 return;
1028
1029 // Create a new global variable for the ConstantStruct in the Module.
1030 llvm::Constant *Array = llvm::ConstantArray::get(llvm::ArrayType::get(
1031 Annotations[0]->getType(), Annotations.size()), Annotations);
1032 llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(),
1033 Array->getType(), false, llvm::GlobalValue::AppendingLinkage, Array,
1034 "llvm.global.annotations");
1035 gv->setSection(AnnotationSection);
1036}
1037
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001038llvm::Constant *CodeGenModule::EmitAnnotationString(StringRef Str) {
Benjamin Kramer471b52a2013-11-10 16:55:11 +00001039 llvm::Constant *&AStr = AnnotationStrings[Str];
1040 if (AStr)
1041 return AStr;
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001042
1043 // Not found yet, create a new global.
Chris Lattner94010692012-02-05 02:30:40 +00001044 llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001045 llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), s->getType(),
1046 true, llvm::GlobalValue::PrivateLinkage, s, ".str");
1047 gv->setSection(AnnotationSection);
1048 gv->setUnnamedAddr(true);
Benjamin Kramer471b52a2013-11-10 16:55:11 +00001049 AStr = gv;
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001050 return gv;
1051}
1052
1053llvm::Constant *CodeGenModule::EmitAnnotationUnit(SourceLocation Loc) {
1054 SourceManager &SM = getContext().getSourceManager();
1055 PresumedLoc PLoc = SM.getPresumedLoc(Loc);
1056 if (PLoc.isValid())
1057 return EmitAnnotationString(PLoc.getFilename());
1058 return EmitAnnotationString(SM.getBufferName(Loc));
1059}
1060
1061llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) {
1062 SourceManager &SM = getContext().getSourceManager();
1063 PresumedLoc PLoc = SM.getPresumedLoc(L);
1064 unsigned LineNo = PLoc.isValid() ? PLoc.getLine() :
1065 SM.getExpansionLineNumber(L);
1066 return llvm::ConstantInt::get(Int32Ty, LineNo);
1067}
1068
Mike Stump1eb44332009-09-09 15:08:12 +00001069llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001070 const AnnotateAttr *AA,
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001071 SourceLocation L) {
1072 // Get the globals for file name, annotation, and the line number.
1073 llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()),
1074 *UnitGV = EmitAnnotationUnit(L),
1075 *LineNoCst = EmitAnnotationLineNo(L);
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001076
Daniel Dunbar57d5cee2009-04-14 22:41:13 +00001077 // Create the ConstantStruct for the global annotation.
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001078 llvm::Constant *Fields[4] = {
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001079 llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
1080 llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
1081 llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
1082 LineNoCst
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001083 };
Chris Lattnerc5cbb902011-06-20 04:01:35 +00001084 return llvm::ConstantStruct::getAnon(Fields);
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001085}
1086
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001087void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
1088 llvm::GlobalValue *GV) {
1089 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
1090 // Get the struct elements for these annotations.
1091 for (specific_attr_iterator<AnnotateAttr>
1092 ai = D->specific_attr_begin<AnnotateAttr>(),
1093 ae = D->specific_attr_end<AnnotateAttr>(); ai != ae; ++ai)
1094 Annotations.push_back(EmitAnnotateAttr(GV, *ai, D->getLocation()));
1095}
1096
Argyrios Kyrtzidisa6d6af32010-07-27 22:37:14 +00001097bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
Argyrios Kyrtzidis90e99a82010-07-29 18:15:58 +00001098 // Never defer when EmitAllDecls is specified.
David Blaikie4e4d0842012-03-11 07:00:24 +00001099 if (LangOpts.EmitAllDecls)
Daniel Dunbar73241df2009-02-13 21:18:01 +00001100 return false;
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001101
Argyrios Kyrtzidis4ac7c0b2010-07-29 20:08:05 +00001102 return !getContext().DeclMustBeEmitted(Global);
Daniel Dunbar73241df2009-02-13 21:18:01 +00001103}
1104
Nico Weberc5f80462012-10-11 10:13:44 +00001105llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
1106 const CXXUuidofExpr* E) {
1107 // Sema has verified that IIDSource has a __declspec(uuid()), and that its
1108 // well-formed.
David Majnemerc80eb462013-08-13 06:32:20 +00001109 StringRef Uuid = E->getUuidAsStringRef(Context);
David Majnemerc8fe0112013-08-09 08:35:59 +00001110 std::string Name = "_GUID_" + Uuid.lower();
1111 std::replace(Name.begin(), Name.end(), '-', '_');
Nico Weberc5f80462012-10-11 10:13:44 +00001112
1113 // Look for an existing global.
1114 if (llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name))
1115 return GV;
1116
1117 llvm::Constant *Init = EmitUuidofInitializer(Uuid, E->getType());
1118 assert(Init && "failed to initialize as constant");
1119
David Majnemer8effeda2013-08-15 19:59:14 +00001120 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
1121 getModule(), Init->getType(),
Reid Klecknerdc1ac5e2013-09-03 21:49:32 +00001122 /*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
Nico Weberc5f80462012-10-11 10:13:44 +00001123 return GV;
1124}
1125
Rafael Espindola6a836702010-03-04 18:17:24 +00001126llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
1127 const AliasAttr *AA = VD->getAttr<AliasAttr>();
1128 assert(AA && "No alias?");
1129
Chris Lattner2acc6e32011-07-18 04:24:23 +00001130 llvm::Type *DeclTy = getTypes().ConvertTypeForMem(VD->getType());
Rafael Espindola6a836702010-03-04 18:17:24 +00001131
Rafael Espindola6a836702010-03-04 18:17:24 +00001132 // See if there is already something with the target's name in the module.
John McCallf746aa62010-03-19 23:29:14 +00001133 llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
Joerg Sonnenberger4695f912012-10-16 17:45:27 +00001134 if (Entry) {
1135 unsigned AS = getContext().getTargetAddressSpace(VD->getType());
1136 return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
1137 }
Rafael Espindola6a836702010-03-04 18:17:24 +00001138
1139 llvm::Constant *Aliasee;
1140 if (isa<llvm::FunctionType>(DeclTy))
Alex Rosenbergc857ce82012-10-05 23:12:53 +00001141 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy,
1142 GlobalDecl(cast<FunctionDecl>(VD)),
Anders Carlsson1faa89f2011-02-05 04:35:53 +00001143 /*ForVTable=*/false);
Rafael Espindola6a836702010-03-04 18:17:24 +00001144 else
John McCallf746aa62010-03-19 23:29:14 +00001145 Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
Rafael Espindola6a836702010-03-04 18:17:24 +00001146 llvm::PointerType::getUnqual(DeclTy), 0);
Joerg Sonnenberger4695f912012-10-16 17:45:27 +00001147
1148 llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee);
1149 F->setLinkage(llvm::Function::ExternalWeakLinkage);
1150 WeakRefReferences.insert(F);
Rafael Espindola6a836702010-03-04 18:17:24 +00001151
1152 return Aliasee;
1153}
1154
Chris Lattnerb4880ba2009-05-12 21:21:08 +00001155void CodeGenModule::EmitGlobal(GlobalDecl GD) {
Anders Carlsson4a6835e2009-09-10 23:38:47 +00001156 const ValueDecl *Global = cast<ValueDecl>(GD.getDecl());
Mike Stump1eb44332009-09-09 15:08:12 +00001157
Rafael Espindola6a836702010-03-04 18:17:24 +00001158 // Weak references don't produce any output by themselves.
1159 if (Global->hasAttr<WeakRefAttr>())
1160 return;
1161
Chris Lattnerbd532712009-03-22 21:47:11 +00001162 // If this is an alias definition (which otherwise looks like a declaration)
1163 // emit it now.
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +00001164 if (Global->hasAttr<AliasAttr>())
Rafael Espindola87017a72013-10-22 14:23:09 +00001165 return EmitAliasDefinition(GD);
Daniel Dunbar219df662008-09-08 23:44:31 +00001166
Peter Collingbourned51e43a2011-10-06 18:29:46 +00001167 // If this is CUDA, be selective about which declarations we emit.
David Blaikie4e4d0842012-03-11 07:00:24 +00001168 if (LangOpts.CUDA) {
Peter Collingbourned51e43a2011-10-06 18:29:46 +00001169 if (CodeGenOpts.CUDAIsDevice) {
1170 if (!Global->hasAttr<CUDADeviceAttr>() &&
1171 !Global->hasAttr<CUDAGlobalAttr>() &&
1172 !Global->hasAttr<CUDAConstantAttr>() &&
1173 !Global->hasAttr<CUDASharedAttr>())
1174 return;
1175 } else {
1176 if (!Global->hasAttr<CUDAHostAttr>() && (
1177 Global->hasAttr<CUDADeviceAttr>() ||
1178 Global->hasAttr<CUDAConstantAttr>() ||
1179 Global->hasAttr<CUDASharedAttr>()))
1180 return;
1181 }
1182 }
1183
Chris Lattner67b00522009-03-21 09:44:56 +00001184 // Ignore declarations, they will be emitted on their first use.
Daniel Dunbar5e1e1f92009-03-19 08:27:24 +00001185 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
Daniel Dunbar73241df2009-02-13 21:18:01 +00001186 // Forward declarations are emitted lazily on first use.
Nick Lewyckydce67a72011-07-18 05:26:13 +00001187 if (!FD->doesThisDeclarationHaveABody()) {
1188 if (!FD->doesDeclarationForceExternallyVisibleDefinition())
1189 return;
1190
1191 const FunctionDecl *InlineDefinition = 0;
1192 FD->getBody(InlineDefinition);
1193
Chris Lattner5f9e2722011-07-23 10:55:15 +00001194 StringRef MangledName = getMangledName(GD);
Benjamin Kramer7e423922012-03-24 18:22:12 +00001195 DeferredDecls.erase(MangledName);
Nick Lewyckydce67a72011-07-18 05:26:13 +00001196 EmitGlobalDefinition(InlineDefinition);
Daniel Dunbar73241df2009-02-13 21:18:01 +00001197 return;
Nick Lewyckydce67a72011-07-18 05:26:13 +00001198 }
Daniel Dunbar02698712009-02-13 20:29:50 +00001199 } else {
1200 const VarDecl *VD = cast<VarDecl>(Global);
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001201 assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
1202
Douglas Gregora9a55c02010-02-06 05:15:45 +00001203 if (VD->isThisDeclarationADefinition() != VarDecl::Definition)
Douglas Gregorb6c8c8b2009-04-21 17:11:58 +00001204 return;
Nate Begeman4c13b7a2008-04-20 06:29:50 +00001205 }
1206
Chris Lattner67b00522009-03-21 09:44:56 +00001207 // Defer code generation when possible if this is a static definition, inline
1208 // function etc. These we only want to emit if they are used.
Chris Lattner4357a822010-04-13 17:39:09 +00001209 if (!MayDeferGeneration(Global)) {
1210 // Emit the definition if it can't be deferred.
1211 EmitGlobalDefinition(GD);
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001212 return;
1213 }
John McCallbf40cb52010-07-15 23:40:35 +00001214
1215 // If we're deferring emission of a C++ variable with an
1216 // initializer, remember the order in which it appeared in the file.
David Blaikie4e4d0842012-03-11 07:00:24 +00001217 if (getLangOpts().CPlusPlus && isa<VarDecl>(Global) &&
John McCallbf40cb52010-07-15 23:40:35 +00001218 cast<VarDecl>(Global)->hasInit()) {
1219 DelayedCXXInitPosition[Global] = CXXGlobalInits.size();
1220 CXXGlobalInits.push_back(0);
1221 }
Chris Lattner4357a822010-04-13 17:39:09 +00001222
1223 // If the value has already been used, add it directly to the
1224 // DeferredDeclsToEmit list.
Chris Lattner5f9e2722011-07-23 10:55:15 +00001225 StringRef MangledName = getMangledName(GD);
Chris Lattner4357a822010-04-13 17:39:09 +00001226 if (GetGlobalValue(MangledName))
1227 DeferredDeclsToEmit.push_back(GD);
1228 else {
1229 // Otherwise, remember that we saw a deferred decl with this name. The
1230 // first use of the mangled name will cause it to move into
1231 // DeferredDeclsToEmit.
1232 DeferredDecls[MangledName] = GD;
1233 }
Nate Begeman4c13b7a2008-04-20 06:29:50 +00001234}
1235
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001236namespace {
1237 struct FunctionIsDirectlyRecursive :
1238 public RecursiveASTVisitor<FunctionIsDirectlyRecursive> {
1239 const StringRef Name;
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001240 const Builtin::Context &BI;
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001241 bool Result;
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001242 FunctionIsDirectlyRecursive(StringRef N, const Builtin::Context &C) :
1243 Name(N), BI(C), Result(false) {
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001244 }
1245 typedef RecursiveASTVisitor<FunctionIsDirectlyRecursive> Base;
1246
1247 bool TraverseCallExpr(CallExpr *E) {
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001248 const FunctionDecl *FD = E->getDirectCallee();
1249 if (!FD)
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001250 return true;
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001251 AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1252 if (Attr && Name == Attr->getLabel()) {
1253 Result = true;
1254 return false;
1255 }
1256 unsigned BuiltinID = FD->getBuiltinID();
1257 if (!BuiltinID)
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001258 return true;
Nick Lewyckyf6b56372012-01-18 03:41:19 +00001259 StringRef BuiltinName = BI.GetName(BuiltinID);
1260 if (BuiltinName.startswith("__builtin_") &&
1261 Name == BuiltinName.slice(strlen("__builtin_"), StringRef::npos)) {
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001262 Result = true;
1263 return false;
1264 }
1265 return true;
1266 }
1267 };
1268}
1269
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001270// isTriviallyRecursive - Check if this function calls another
1271// decl that, because of the asm attribute or the other decl being a builtin,
1272// ends up pointing to itself.
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001273bool
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001274CodeGenModule::isTriviallyRecursive(const FunctionDecl *FD) {
1275 StringRef Name;
1276 if (getCXXABI().getMangleContext().shouldMangleDeclName(FD)) {
Nick Lewycky22afacc2012-01-18 01:50:13 +00001277 // asm labels are a special kind of mangling we have to support.
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001278 AsmLabelAttr *Attr = FD->getAttr<AsmLabelAttr>();
1279 if (!Attr)
1280 return false;
1281 Name = Attr->getLabel();
1282 } else {
1283 Name = FD->getName();
1284 }
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001285
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001286 FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
1287 Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001288 return Walker.Result;
1289}
1290
1291bool
Peter Collingbourne144a31f2013-06-05 17:49:37 +00001292CodeGenModule::shouldEmitFunction(GlobalDecl GD) {
1293 if (getFunctionLinkage(GD) != llvm::Function::AvailableExternallyLinkage)
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001294 return true;
Peter Collingbourne144a31f2013-06-05 17:49:37 +00001295 const FunctionDecl *F = cast<FunctionDecl>(GD.getDecl());
Rafael Espindolacc4889f2011-10-28 20:43:56 +00001296 if (CodeGenOpts.OptimizationLevel == 0 &&
Michael J. Spenceradc6cbf2012-06-18 07:00:48 +00001297 !F->hasAttr<AlwaysInlineAttr>() && !F->hasAttr<ForceInlineAttr>())
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001298 return false;
1299 // PR9614. Avoid cases where the source code is lying to us. An available
1300 // externally function should have an equivalent function somewhere else,
1301 // but a function that calls itself is clearly not equivalent to the real
1302 // implementation.
1303 // This happens in glibc's btowc and in some configure checks.
Rafael Espindolabcf6b982011-12-19 14:41:01 +00001304 return !isTriviallyRecursive(F);
Rafael Espindolaa411d2f2011-10-26 20:41:06 +00001305}
1306
Adrian Prantl0a050f72013-05-09 23:16:27 +00001307/// If the type for the method's class was generated by
1308/// CGDebugInfo::createContextChain(), the cache contains only a
1309/// limited DIType without any declarations. Since EmitFunctionStart()
1310/// needs to find the canonical declaration for each method, we need
1311/// to construct the complete type prior to emitting the method.
1312void CodeGenModule::CompleteDIClassType(const CXXMethodDecl* D) {
1313 if (!D->isInstance())
1314 return;
1315
1316 if (CGDebugInfo *DI = getModuleDebugInfo())
1317 if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
1318 const PointerType *ThisPtr =
1319 cast<PointerType>(D->getThisType(getContext()));
1320 DI->getOrCreateRecordType(ThisPtr->getPointeeType(), D->getLocation());
1321 }
1322}
1323
Chris Lattnerb4880ba2009-05-12 21:21:08 +00001324void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
Anders Carlsson4a6835e2009-09-10 23:38:47 +00001325 const ValueDecl *D = cast<ValueDecl>(GD.getDecl());
Mike Stump1eb44332009-09-09 15:08:12 +00001326
Dan Gohmancb421fa2010-04-19 16:39:44 +00001327 PrettyStackTraceDecl CrashInfo(const_cast<ValueDecl *>(D), D->getLocation(),
Anders Carlsson8e2efcc2009-10-27 14:32:27 +00001328 Context.getSourceManager(),
1329 "Generating code for declaration");
1330
Peter Collingbourne144a31f2013-06-05 17:49:37 +00001331 if (isa<FunctionDecl>(D)) {
Douglas Gregor44eac332010-07-13 06:02:28 +00001332 // At -O0, don't generate IR for functions with available_externally
1333 // linkage.
Peter Collingbourne144a31f2013-06-05 17:49:37 +00001334 if (!shouldEmitFunction(GD))
Douglas Gregor44eac332010-07-13 06:02:28 +00001335 return;
Anders Carlsson7270ee42010-03-23 04:31:31 +00001336
Douglas Gregor44eac332010-07-13 06:02:28 +00001337 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
Adrian Prantl0a050f72013-05-09 23:16:27 +00001338 CompleteDIClassType(Method);
Eli Friedman7dcdf5b2011-05-06 17:27:27 +00001339 // Make sure to emit the definition(s) before we emit the thunks.
1340 // This is necessary for the generation of certain thunks.
1341 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(Method))
1342 EmitCXXConstructor(CD, GD.getCtorType());
1343 else if (const CXXDestructorDecl *DD =dyn_cast<CXXDestructorDecl>(Method))
1344 EmitCXXDestructor(DD, GD.getDtorType());
1345 else
1346 EmitGlobalFunctionDefinition(GD);
1347
Douglas Gregor44eac332010-07-13 06:02:28 +00001348 if (Method->isVirtual())
1349 getVTables().EmitThunks(GD);
1350
Eli Friedman7dcdf5b2011-05-06 17:27:27 +00001351 return;
Douglas Gregor44eac332010-07-13 06:02:28 +00001352 }
Chris Lattnerb5e81562010-04-13 17:57:11 +00001353
Chris Lattnerb5e81562010-04-13 17:57:11 +00001354 return EmitGlobalFunctionDefinition(GD);
Douglas Gregor44eac332010-07-13 06:02:28 +00001355 }
Chris Lattnerb5e81562010-04-13 17:57:11 +00001356
1357 if (const VarDecl *VD = dyn_cast<VarDecl>(D))
1358 return EmitGlobalVarDefinition(VD);
Chris Lattner4357a822010-04-13 17:39:09 +00001359
David Blaikieb219cfc2011-09-23 05:06:16 +00001360 llvm_unreachable("Invalid argument to EmitGlobalDefinition()");
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001361}
1362
Chris Lattner74391b42009-03-22 21:03:39 +00001363/// GetOrCreateLLVMFunction - If the specified mangled name is not in the
1364/// module, create and return an llvm Function with the specified type. If there
1365/// is something in the module with the specified name, return it potentially
1366/// bitcasted to the right type.
1367///
1368/// If D is non-null, it specifies a decl that correspond to this. This is used
1369/// to set the attributes on the function when it is first created.
John McCallf746aa62010-03-19 23:29:14 +00001370llvm::Constant *
Chris Lattner5f9e2722011-07-23 10:55:15 +00001371CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
Chris Lattner2acc6e32011-07-18 04:24:23 +00001372 llvm::Type *Ty,
Reid Kleckner73701ea2013-07-22 13:07:10 +00001373 GlobalDecl GD, bool ForVTable,
Bill Wendlingc4c62fd2013-01-31 00:30:05 +00001374 llvm::AttributeSet ExtraAttrs) {
Reid Kleckner73701ea2013-07-22 13:07:10 +00001375 const Decl *D = GD.getDecl();
1376
Chris Lattner0558e792009-03-21 09:25:43 +00001377 // Lookup the entry, lazily creating it if necessary.
John McCallf746aa62010-03-19 23:29:14 +00001378 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
Chris Lattner0558e792009-03-21 09:25:43 +00001379 if (Entry) {
Benjamin Kramerd48bcb22012-08-22 15:37:55 +00001380 if (WeakRefReferences.erase(Entry)) {
Reid Kleckner73701ea2013-07-22 13:07:10 +00001381 const FunctionDecl *FD = cast_or_null<FunctionDecl>(D);
Rafael Espindola6a836702010-03-04 18:17:24 +00001382 if (FD && !FD->hasAttr<WeakAttr>())
Anders Carlsson7270ee42010-03-23 04:31:31 +00001383 Entry->setLinkage(llvm::Function::ExternalLinkage);
Rafael Espindola6a836702010-03-04 18:17:24 +00001384 }
1385
Chris Lattner0558e792009-03-21 09:25:43 +00001386 if (Entry->getType()->getElementType() == Ty)
1387 return Entry;
Mike Stump1eb44332009-09-09 15:08:12 +00001388
Chris Lattner0558e792009-03-21 09:25:43 +00001389 // Make sure the result is of the correct type.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001390 return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
Chris Lattner0558e792009-03-21 09:25:43 +00001391 }
Mike Stump1eb44332009-09-09 15:08:12 +00001392
Reid Klecknera4130ba2013-07-22 13:51:44 +00001393 // All MSVC dtors other than the base dtor are linkonce_odr and delegate to
1394 // each other bottoming out with the base dtor. Therefore we emit non-base
1395 // dtors on usage, even if there is no dtor definition in the TU.
1396 if (D && isa<CXXDestructorDecl>(D) &&
1397 getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
1398 GD.getDtorType()))
1399 DeferredDeclsToEmit.push_back(GD);
1400
Eli Friedman654ad402009-11-09 05:07:37 +00001401 // This function doesn't have a complete type (for example, the return
1402 // type is an incomplete struct). Use a fake type instead, and make
1403 // sure not to try to set attributes.
1404 bool IsIncompleteFunction = false;
John McCall784f2112010-04-28 00:00:30 +00001405
Chris Lattner2acc6e32011-07-18 04:24:23 +00001406 llvm::FunctionType *FTy;
John McCall784f2112010-04-28 00:00:30 +00001407 if (isa<llvm::FunctionType>(Ty)) {
1408 FTy = cast<llvm::FunctionType>(Ty);
1409 } else {
John McCall0774cb82011-05-15 01:53:33 +00001410 FTy = llvm::FunctionType::get(VoidTy, false);
Eli Friedman654ad402009-11-09 05:07:37 +00001411 IsIncompleteFunction = true;
1412 }
Chris Lattnerbcaedae2010-06-30 19:14:05 +00001413
John McCall784f2112010-04-28 00:00:30 +00001414 llvm::Function *F = llvm::Function::Create(FTy,
Eli Friedman654ad402009-11-09 05:07:37 +00001415 llvm::Function::ExternalLinkage,
John McCallf746aa62010-03-19 23:29:14 +00001416 MangledName, &getModule());
1417 assert(F->getName() == MangledName && "name was uniqued!");
Reid Kleckner73701ea2013-07-22 13:07:10 +00001418 if (D)
1419 SetFunctionAttributes(GD, F, IsIncompleteFunction);
Bill Wendlingc4c62fd2013-01-31 00:30:05 +00001420 if (ExtraAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex)) {
1421 llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeSet::FunctionIndex);
Bill Wendling909b6de2013-01-23 00:21:06 +00001422 F->addAttributes(llvm::AttributeSet::FunctionIndex,
1423 llvm::AttributeSet::get(VMContext,
1424 llvm::AttributeSet::FunctionIndex,
1425 B));
1426 }
Eli Friedman654ad402009-11-09 05:07:37 +00001427
Chris Lattner67b00522009-03-21 09:44:56 +00001428 // This is the first use or definition of a mangled name. If there is a
1429 // deferred decl with this name, remember that we need to emit it at the end
1430 // of the file.
John McCallf746aa62010-03-19 23:29:14 +00001431 llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName);
Chris Lattner67b00522009-03-21 09:44:56 +00001432 if (DDI != DeferredDecls.end()) {
1433 // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
1434 // list, and remove it from DeferredDecls (since we don't need it anymore).
1435 DeferredDeclsToEmit.push_back(DDI->second);
1436 DeferredDecls.erase(DDI);
John McCallbfdcdc82010-12-15 04:00:32 +00001437
Richard Smith3cebc732013-11-05 09:12:18 +00001438 // Otherwise, if this is a sized deallocation function, emit a weak definition
1439 // for it at the end of the translation unit.
1440 } else if (D && cast<FunctionDecl>(D)
1441 ->getCorrespondingUnsizedGlobalDeallocationFunction()) {
1442 DeferredDeclsToEmit.push_back(GD);
1443
John McCallbfdcdc82010-12-15 04:00:32 +00001444 // Otherwise, there are cases we have to worry about where we're
1445 // using a declaration for which we must emit a definition but where
1446 // we might not find a top-level definition:
1447 // - member functions defined inline in their classes
1448 // - friend functions defined inline in some class
1449 // - special member functions with implicit definitions
1450 // If we ever change our AST traversal to walk into class methods,
1451 // this will be unnecessary.
Anders Carlsson1faa89f2011-02-05 04:35:53 +00001452 //
1453 // We also don't emit a definition for a function if it's going to be an entry
1454 // in a vtable, unless it's already marked as used.
Reid Kleckner73701ea2013-07-22 13:07:10 +00001455 } else if (getLangOpts().CPlusPlus && D) {
John McCallbfdcdc82010-12-15 04:00:32 +00001456 // Look for a declaration that's lexically in a record.
Reid Kleckner73701ea2013-07-22 13:07:10 +00001457 const FunctionDecl *FD = cast<FunctionDecl>(D);
Eli Friedmanb135f0f2012-07-02 21:05:30 +00001458 FD = FD->getMostRecentDecl();
John McCallbfdcdc82010-12-15 04:00:32 +00001459 do {
1460 if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
Anders Carlsson1faa89f2011-02-05 04:35:53 +00001461 if (FD->isImplicit() && !ForVTable) {
John McCallbfdcdc82010-12-15 04:00:32 +00001462 assert(FD->isUsed() && "Sema didn't mark implicit function as used!");
Reid Kleckner73701ea2013-07-22 13:07:10 +00001463 DeferredDeclsToEmit.push_back(GD.getWithDecl(FD));
John McCallbfdcdc82010-12-15 04:00:32 +00001464 break;
Sean Hunt10620eb2011-05-06 20:44:56 +00001465 } else if (FD->doesThisDeclarationHaveABody()) {
Reid Kleckner73701ea2013-07-22 13:07:10 +00001466 DeferredDeclsToEmit.push_back(GD.getWithDecl(FD));
John McCallbfdcdc82010-12-15 04:00:32 +00001467 break;
1468 }
Rafael Espindola7b9a5aa2010-03-02 21:28:26 +00001469 }
Douglas Gregoref96ee02012-01-14 16:38:05 +00001470 FD = FD->getPreviousDecl();
John McCallbfdcdc82010-12-15 04:00:32 +00001471 } while (FD);
Chris Lattner67b00522009-03-21 09:44:56 +00001472 }
Mike Stump1eb44332009-09-09 15:08:12 +00001473
John McCall784f2112010-04-28 00:00:30 +00001474 // Make sure the result is of the requested type.
1475 if (!IsIncompleteFunction) {
1476 assert(F->getType()->getElementType() == Ty);
1477 return F;
1478 }
1479
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001480 llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
John McCall784f2112010-04-28 00:00:30 +00001481 return llvm::ConstantExpr::getBitCast(F, PTy);
Chris Lattner0558e792009-03-21 09:25:43 +00001482}
1483
Chris Lattner74391b42009-03-22 21:03:39 +00001484/// GetAddrOfFunction - Return the address of the given function. If Ty is
1485/// non-null, then this function will use the specified type if it has to
1486/// create it (this occurs when we see a definition of the function).
Chris Lattnerb4880ba2009-05-12 21:21:08 +00001487llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
Chris Lattner2acc6e32011-07-18 04:24:23 +00001488 llvm::Type *Ty,
Anders Carlsson1faa89f2011-02-05 04:35:53 +00001489 bool ForVTable) {
Chris Lattner74391b42009-03-22 21:03:39 +00001490 // If there was no specific requested type, just convert it now.
1491 if (!Ty)
Anders Carlsson4a6835e2009-09-10 23:38:47 +00001492 Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
Chris Lattnerbcaedae2010-06-30 19:14:05 +00001493
Chris Lattner5f9e2722011-07-23 10:55:15 +00001494 StringRef MangledName = getMangledName(GD);
Anders Carlsson1faa89f2011-02-05 04:35:53 +00001495 return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable);
Chris Lattner74391b42009-03-22 21:03:39 +00001496}
Eli Friedman77ba7082008-05-30 19:50:47 +00001497
Chris Lattner74391b42009-03-22 21:03:39 +00001498/// CreateRuntimeFunction - Create a new runtime function with the specified
1499/// type and name.
1500llvm::Constant *
Chris Lattner2acc6e32011-07-18 04:24:23 +00001501CodeGenModule::CreateRuntimeFunction(llvm::FunctionType *FTy,
Chris Lattner5f9e2722011-07-23 10:55:15 +00001502 StringRef Name,
Bill Wendlingc4c62fd2013-01-31 00:30:05 +00001503 llvm::AttributeSet ExtraAttrs) {
John McCallbd7370a2013-02-28 19:01:20 +00001504 llvm::Constant *C
1505 = GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
1506 ExtraAttrs);
1507 if (llvm::Function *F = dyn_cast<llvm::Function>(C))
1508 if (F->empty())
1509 F->setCallingConv(getRuntimeCC());
1510 return C;
Chris Lattner74391b42009-03-22 21:03:39 +00001511}
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001512
Richard Smitha9b21d22012-02-17 06:48:11 +00001513/// isTypeConstant - Determine whether an object of this type can be emitted
1514/// as a constant.
1515///
1516/// If ExcludeCtor is true, the duration when the object's constructor runs
1517/// will not be considered. The caller will need to verify that the object is
1518/// not written to during its construction.
1519bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) {
1520 if (!Ty.isConstant(Context) && !Ty->isReferenceType())
Eli Friedman20e098b2009-12-11 21:23:03 +00001521 return false;
Richard Smitha9b21d22012-02-17 06:48:11 +00001522
David Blaikie4e4d0842012-03-11 07:00:24 +00001523 if (Context.getLangOpts().CPlusPlus) {
Richard Smitha9b21d22012-02-17 06:48:11 +00001524 if (const CXXRecordDecl *Record
1525 = Context.getBaseElementType(Ty)->getAsCXXRecordDecl())
1526 return ExcludeCtor && !Record->hasMutableFields() &&
1527 Record->hasTrivialDestructor();
Eli Friedman20e098b2009-12-11 21:23:03 +00001528 }
Richard Smitha9b21d22012-02-17 06:48:11 +00001529
Eli Friedman20e098b2009-12-11 21:23:03 +00001530 return true;
1531}
1532
Chris Lattner74391b42009-03-22 21:03:39 +00001533/// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module,
1534/// create and return an llvm GlobalVariable with the specified type. If there
1535/// is something in the module with the specified name, return it potentially
1536/// bitcasted to the right type.
1537///
1538/// If D is non-null, it specifies a decl that correspond to this. This is used
1539/// to set the attributes on the global when it is first created.
John McCallf746aa62010-03-19 23:29:14 +00001540llvm::Constant *
Chris Lattner5f9e2722011-07-23 10:55:15 +00001541CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
Chris Lattner2acc6e32011-07-18 04:24:23 +00001542 llvm::PointerType *Ty,
Rafael Espindolac532b502011-01-18 21:07:57 +00001543 const VarDecl *D,
1544 bool UnnamedAddr) {
Daniel Dunbar3c827a72008-08-05 23:31:02 +00001545 // Lookup the entry, lazily creating it if necessary.
John McCallf746aa62010-03-19 23:29:14 +00001546 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
Chris Lattner99b53612009-03-21 08:03:33 +00001547 if (Entry) {
Benjamin Kramerd48bcb22012-08-22 15:37:55 +00001548 if (WeakRefReferences.erase(Entry)) {
Rafael Espindola6a836702010-03-04 18:17:24 +00001549 if (D && !D->hasAttr<WeakAttr>())
Anders Carlsson7270ee42010-03-23 04:31:31 +00001550 Entry->setLinkage(llvm::Function::ExternalLinkage);
Rafael Espindola6a836702010-03-04 18:17:24 +00001551 }
1552
Rafael Espindolac532b502011-01-18 21:07:57 +00001553 if (UnnamedAddr)
1554 Entry->setUnnamedAddr(true);
1555
Chris Lattner74391b42009-03-22 21:03:39 +00001556 if (Entry->getType() == Ty)
Chris Lattner570585c2009-03-21 09:16:30 +00001557 return Entry;
Mike Stump1eb44332009-09-09 15:08:12 +00001558
Chris Lattner99b53612009-03-21 08:03:33 +00001559 // Make sure the result is of the correct type.
Matt Arsenault54307da2013-11-15 02:19:52 +00001560 if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace())
1561 return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty);
1562
Owen Anderson3c4972d2009-07-29 18:54:39 +00001563 return llvm::ConstantExpr::getBitCast(Entry, Ty);
Daniel Dunbar49988882009-01-13 02:25:00 +00001564 }
Mike Stump1eb44332009-09-09 15:08:12 +00001565
Chris Lattner67b00522009-03-21 09:44:56 +00001566 // This is the first use or definition of a mangled name. If there is a
1567 // deferred decl with this name, remember that we need to emit it at the end
1568 // of the file.
John McCallf746aa62010-03-19 23:29:14 +00001569 llvm::StringMap<GlobalDecl>::iterator DDI = DeferredDecls.find(MangledName);
Chris Lattner67b00522009-03-21 09:44:56 +00001570 if (DDI != DeferredDecls.end()) {
1571 // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
1572 // list, and remove it from DeferredDecls (since we don't need it anymore).
1573 DeferredDeclsToEmit.push_back(DDI->second);
1574 DeferredDecls.erase(DDI);
1575 }
Mike Stump1eb44332009-09-09 15:08:12 +00001576
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00001577 unsigned AddrSpace = GetGlobalVarAddressSpace(D, Ty->getAddressSpace());
Mike Stump1eb44332009-09-09 15:08:12 +00001578 llvm::GlobalVariable *GV =
1579 new llvm::GlobalVariable(getModule(), Ty->getElementType(), false,
Chris Lattner99b53612009-03-21 08:03:33 +00001580 llvm::GlobalValue::ExternalLinkage,
John McCallf746aa62010-03-19 23:29:14 +00001581 0, MangledName, 0,
Hans Wennborg5e2d5de2012-06-23 11:51:46 +00001582 llvm::GlobalVariable::NotThreadLocal, AddrSpace);
Chris Lattner99b53612009-03-21 08:03:33 +00001583
1584 // Handle things which are present even on external declarations.
Chris Lattner74391b42009-03-22 21:03:39 +00001585 if (D) {
Mike Stumpf5408fe2009-05-16 07:57:57 +00001586 // FIXME: This code is overly simple and should be merged with other global
1587 // handling.
Richard Smitha9b21d22012-02-17 06:48:11 +00001588 GV->setConstant(isTypeConstant(D->getType(), false));
Chris Lattner99b53612009-03-21 08:03:33 +00001589
John McCall110e8e52010-10-29 22:22:43 +00001590 // Set linkage and visibility in case we never see a definition.
Rafael Espindola2beda122013-02-27 02:15:29 +00001591 LinkageInfo LV = D->getLinkageAndVisibility();
Rafael Espindolaf127eb82013-02-27 02:56:45 +00001592 if (LV.getLinkage() != ExternalLinkage) {
John McCall15e310a2011-02-19 02:53:41 +00001593 // Don't set internal linkage on declarations.
John McCall110e8e52010-10-29 22:22:43 +00001594 } else {
1595 if (D->hasAttr<DLLImportAttr>())
1596 GV->setLinkage(llvm::GlobalValue::DLLImportLinkage);
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00001597 else if (D->hasAttr<WeakAttr>() || D->isWeakImported())
John McCall110e8e52010-10-29 22:22:43 +00001598 GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
Chris Lattner99b53612009-03-21 08:03:33 +00001599
John McCallaf146032010-10-30 11:50:40 +00001600 // Set visibility on a declaration only if it's explicit.
Rafael Espindolaf127eb82013-02-27 02:56:45 +00001601 if (LV.isVisibilityExplicit())
1602 GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
John McCall110e8e52010-10-29 22:22:43 +00001603 }
Eli Friedman56ebe502009-04-19 21:05:03 +00001604
Richard Smithb80a16e2013-04-19 16:42:07 +00001605 if (D->getTLSKind()) {
Richard Smithdb4f61f2013-04-22 08:06:17 +00001606 if (D->getTLSKind() == VarDecl::TLS_Dynamic)
1607 CXXThreadLocals.push_back(std::make_pair(D, GV));
Hans Wennborgde981f32012-06-28 08:01:44 +00001608 setTLSMode(GV, *D);
Richard Smithb80a16e2013-04-19 16:42:07 +00001609 }
Chris Lattner74391b42009-03-22 21:03:39 +00001610 }
Mike Stump1eb44332009-09-09 15:08:12 +00001611
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00001612 if (AddrSpace != Ty->getAddressSpace())
Matt Arsenault54307da2013-11-15 02:19:52 +00001613 return llvm::ConstantExpr::getAddrSpaceCast(GV, Ty);
1614
1615 return GV;
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001616}
1617
Chris Lattner74391b42009-03-22 21:03:39 +00001618
Anders Carlsson3bd62022011-01-29 18:20:20 +00001619llvm::GlobalVariable *
Chris Lattner5f9e2722011-07-23 10:55:15 +00001620CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
Chris Lattner2acc6e32011-07-18 04:24:23 +00001621 llvm::Type *Ty,
Anders Carlsson3bd62022011-01-29 18:20:20 +00001622 llvm::GlobalValue::LinkageTypes Linkage) {
1623 llvm::GlobalVariable *GV = getModule().getNamedGlobal(Name);
1624 llvm::GlobalVariable *OldGV = 0;
1625
1626
1627 if (GV) {
1628 // Check if the variable has the right type.
1629 if (GV->getType()->getElementType() == Ty)
1630 return GV;
1631
1632 // Because C++ name mangling, the only way we can end up with an already
1633 // existing global with the same name is if it has been declared extern "C".
Nico Weberc5f80462012-10-11 10:13:44 +00001634 assert(GV->isDeclaration() && "Declaration has wrong type!");
Anders Carlsson3bd62022011-01-29 18:20:20 +00001635 OldGV = GV;
1636 }
1637
1638 // Create a new variable.
1639 GV = new llvm::GlobalVariable(getModule(), Ty, /*isConstant=*/true,
1640 Linkage, 0, Name);
1641
1642 if (OldGV) {
1643 // Replace occurrences of the old variable if needed.
1644 GV->takeName(OldGV);
1645
1646 if (!OldGV->use_empty()) {
1647 llvm::Constant *NewPtrForOldDecl =
1648 llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
1649 OldGV->replaceAllUsesWith(NewPtrForOldDecl);
1650 }
1651
1652 OldGV->eraseFromParent();
1653 }
1654
1655 return GV;
1656}
1657
Chris Lattner74391b42009-03-22 21:03:39 +00001658/// GetAddrOfGlobalVar - Return the llvm::Constant for the address of the
1659/// given global variable. If Ty is non-null and if the global doesn't exist,
Eric Christopher0ff258b2012-04-16 23:55:04 +00001660/// then it will be created with the specified type instead of whatever the
Chris Lattner74391b42009-03-22 21:03:39 +00001661/// normal requested type would be.
1662llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
Chris Lattner2acc6e32011-07-18 04:24:23 +00001663 llvm::Type *Ty) {
Chris Lattner74391b42009-03-22 21:03:39 +00001664 assert(D->hasGlobalStorage() && "Not a global variable");
1665 QualType ASTTy = D->getType();
1666 if (Ty == 0)
1667 Ty = getTypes().ConvertTypeForMem(ASTTy);
Mike Stump1eb44332009-09-09 15:08:12 +00001668
Chris Lattner2acc6e32011-07-18 04:24:23 +00001669 llvm::PointerType *PTy =
Peter Collingbourne207f4d82011-03-18 22:38:29 +00001670 llvm::PointerType::get(Ty, getContext().getTargetAddressSpace(ASTTy));
John McCallf746aa62010-03-19 23:29:14 +00001671
Chris Lattner5f9e2722011-07-23 10:55:15 +00001672 StringRef MangledName = getMangledName(D);
John McCallf746aa62010-03-19 23:29:14 +00001673 return GetOrCreateLLVMGlobal(MangledName, PTy, D);
Chris Lattner74391b42009-03-22 21:03:39 +00001674}
1675
1676/// CreateRuntimeVariable - Create a new runtime global variable with the
1677/// specified type and name.
1678llvm::Constant *
Chris Lattner2acc6e32011-07-18 04:24:23 +00001679CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty,
Chris Lattner5f9e2722011-07-23 10:55:15 +00001680 StringRef Name) {
John McCall1de4d4e2011-04-07 08:22:57 +00001681 return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), 0,
Rafael Espindolac532b502011-01-18 21:07:57 +00001682 true);
Chris Lattner74391b42009-03-22 21:03:39 +00001683}
1684
Daniel Dunbar03f5ad92009-04-15 22:08:45 +00001685void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) {
1686 assert(!D->getInit() && "Cannot emit definite definitions here!");
1687
Douglas Gregor7520bd12009-04-21 19:28:58 +00001688 if (MayDeferGeneration(D)) {
1689 // If we have not seen a reference to this variable yet, place it
1690 // into the deferred declarations table to be emitted if needed
1691 // later.
Chris Lattner5f9e2722011-07-23 10:55:15 +00001692 StringRef MangledName = getMangledName(D);
John McCallf746aa62010-03-19 23:29:14 +00001693 if (!GetGlobalValue(MangledName)) {
Anders Carlsson555b4bb2009-09-10 23:43:36 +00001694 DeferredDecls[MangledName] = D;
Daniel Dunbar03f5ad92009-04-15 22:08:45 +00001695 return;
Douglas Gregor7520bd12009-04-21 19:28:58 +00001696 }
1697 }
1698
1699 // The tentative definition is the only definition.
Daniel Dunbar03f5ad92009-04-15 22:08:45 +00001700 EmitGlobalVarDefinition(D);
1701}
1702
Chris Lattner2acc6e32011-07-18 04:24:23 +00001703CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) const {
Ken Dyck06f486e2011-01-18 02:01:14 +00001704 return Context.toCharUnitsFromBits(
Micah Villmow25a6a842012-10-08 16:25:52 +00001705 TheDataLayout.getTypeStoreSizeInBits(Ty));
Ken Dyck687cc4a2010-01-26 13:48:07 +00001706}
1707
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00001708unsigned CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D,
1709 unsigned AddrSpace) {
1710 if (LangOpts.CUDA && CodeGenOpts.CUDAIsDevice) {
1711 if (D->hasAttr<CUDAConstantAttr>())
1712 AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_constant);
1713 else if (D->hasAttr<CUDASharedAttr>())
1714 AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_shared);
1715 else
1716 AddrSpace = getContext().getTargetAddressSpace(LangAS::cuda_device);
1717 }
1718
1719 return AddrSpace;
1720}
1721
Richard Smith00249372013-04-06 05:00:46 +00001722template<typename SomeDecl>
1723void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
1724 llvm::GlobalValue *GV) {
1725 if (!getLangOpts().CPlusPlus)
1726 return;
1727
1728 // Must have 'used' attribute, or else inline assembly can't rely on
1729 // the name existing.
1730 if (!D->template hasAttr<UsedAttr>())
1731 return;
1732
1733 // Must have internal linkage and an ordinary name.
Rafael Espindola181e3ec2013-05-13 00:12:11 +00001734 if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage)
Richard Smith00249372013-04-06 05:00:46 +00001735 return;
1736
1737 // Must be in an extern "C" context. Entities declared directly within
1738 // a record are not extern "C" even if the record is in such a context.
Rafael Espindolabc650912013-10-17 15:37:26 +00001739 const SomeDecl *First = D->getFirstDecl();
Rafael Espindolad8ffd0b2013-05-05 20:15:21 +00001740 if (First->getDeclContext()->isRecord() || !First->isInExternCContext())
Richard Smith00249372013-04-06 05:00:46 +00001741 return;
1742
1743 // OK, this is an internal linkage entity inside an extern "C" linkage
1744 // specification. Make a note of that so we can give it the "expected"
1745 // mangled name if nothing else is using that name.
Richard Smith67972042013-04-06 07:07:44 +00001746 std::pair<StaticExternCMap::iterator, bool> R =
1747 StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
Richard Smith00249372013-04-06 05:00:46 +00001748
1749 // If we have multiple internal linkage entities with the same name
1750 // in extern "C" regions, none of them gets that name.
Richard Smith67972042013-04-06 07:07:44 +00001751 if (!R.second)
1752 R.first->second = 0;
Richard Smith00249372013-04-06 05:00:46 +00001753}
1754
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00001755void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
Chris Lattner8f32f712007-07-14 00:23:28 +00001756 llvm::Constant *Init = 0;
Eli Friedman77ba7082008-05-30 19:50:47 +00001757 QualType ASTTy = D->getType();
Richard Smith7ca48502012-02-13 22:16:19 +00001758 CXXRecordDecl *RD = ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1759 bool NeedsGlobalCtor = false;
1760 bool NeedsGlobalDtor = RD && !RD->hasTrivialDestructor();
Mike Stump1eb44332009-09-09 15:08:12 +00001761
Richard Smith2d6a5672012-01-14 04:30:29 +00001762 const VarDecl *InitDecl;
1763 const Expr *InitExpr = D->getAnyInitializer(InitDecl);
Sebastian Redl19b1a6e2012-02-25 20:51:20 +00001764
Anders Carlsson3bb92692010-01-26 17:43:42 +00001765 if (!InitExpr) {
Eli Friedmancd5f4aa2008-05-30 20:39:54 +00001766 // This is a tentative definition; tentative definitions are
Daniel Dunbar03f5ad92009-04-15 22:08:45 +00001767 // implicitly initialized with { 0 }.
1768 //
1769 // Note that tentative definitions are only emitted at the end of
1770 // a translation unit, so they should never have incomplete
1771 // type. In addition, EmitTentativeDefinition makes sure that we
1772 // never attempt to emit a tentative definition if a real one
1773 // exists. A use may still exists, however, so we still may need
1774 // to do a RAUW.
1775 assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
Anders Carlssonb0d0ea02009-08-02 21:18:22 +00001776 Init = EmitNullConstant(D->getType());
Eli Friedman77ba7082008-05-30 19:50:47 +00001777 } else {
Richard Smith7c3e6152013-06-12 22:31:48 +00001778 initializedGlobalDecl = GlobalDecl(D);
1779 Init = EmitConstantInit(*InitDecl);
Sebastian Redl19b1a6e2012-02-25 20:51:20 +00001780
Fariborz Jahanian4904bf42012-06-26 16:06:38 +00001781 if (!Init) {
Anders Carlsson3bb92692010-01-26 17:43:42 +00001782 QualType T = InitExpr->getType();
Douglas Gregorc446d182010-05-05 20:15:55 +00001783 if (D->getType()->isReferenceType())
1784 T = D->getType();
Richard Smith2d6a5672012-01-14 04:30:29 +00001785
David Blaikie4e4d0842012-03-11 07:00:24 +00001786 if (getLangOpts().CPlusPlus) {
Anders Carlsson89ed31d2009-08-08 23:24:23 +00001787 Init = EmitNullConstant(T);
Richard Smith7ca48502012-02-13 22:16:19 +00001788 NeedsGlobalCtor = true;
Anders Carlsson89ed31d2009-08-08 23:24:23 +00001789 } else {
1790 ErrorUnsupported(D, "static initializer");
1791 Init = llvm::UndefValue::get(getTypes().ConvertType(T));
1792 }
John McCallbf40cb52010-07-15 23:40:35 +00001793 } else {
1794 // We don't need an initializer, so remove the entry for the delayed
Richard Smith7ca48502012-02-13 22:16:19 +00001795 // initializer position (just in case this entry was delayed) if we
1796 // also don't need to register a destructor.
David Blaikie4e4d0842012-03-11 07:00:24 +00001797 if (getLangOpts().CPlusPlus && !NeedsGlobalDtor)
John McCallbf40cb52010-07-15 23:40:35 +00001798 DelayedCXXInitPosition.erase(D);
Eli Friedman6e656f42009-02-20 01:18:21 +00001799 }
Eli Friedman77ba7082008-05-30 19:50:47 +00001800 }
Eli Friedman77ba7082008-05-30 19:50:47 +00001801
Chris Lattner2acc6e32011-07-18 04:24:23 +00001802 llvm::Type* InitType = Init->getType();
Chris Lattner570585c2009-03-21 09:16:30 +00001803 llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType);
Mike Stump1eb44332009-09-09 15:08:12 +00001804
Chris Lattner570585c2009-03-21 09:16:30 +00001805 // Strip off a bitcast if we got one back.
1806 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
Chris Lattner9d4a15f2009-07-16 16:48:25 +00001807 assert(CE->getOpcode() == llvm::Instruction::BitCast ||
Matt Arsenault54307da2013-11-15 02:19:52 +00001808 CE->getOpcode() == llvm::Instruction::AddrSpaceCast ||
1809 // All zero index gep.
Chris Lattner9d4a15f2009-07-16 16:48:25 +00001810 CE->getOpcode() == llvm::Instruction::GetElementPtr);
Chris Lattner570585c2009-03-21 09:16:30 +00001811 Entry = CE->getOperand(0);
1812 }
Mike Stump1eb44332009-09-09 15:08:12 +00001813
Chris Lattner570585c2009-03-21 09:16:30 +00001814 // Entry is now either a Function or GlobalVariable.
1815 llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(Entry);
Mike Stump1eb44332009-09-09 15:08:12 +00001816
Chris Lattner570585c2009-03-21 09:16:30 +00001817 // We have a definition after a declaration with the wrong type.
1818 // We must make a new GlobalVariable* and update everything that used OldGV
1819 // (a declaration or tentative definition) with the new GlobalVariable*
1820 // (which will be a definition).
1821 //
1822 // This happens if there is a prototype for a global (e.g.
1823 // "extern int x[];") and then a definition of a different type (e.g.
1824 // "int x[10];"). This also happens when an initializer has a different type
1825 // from the type of the global (this happens with unions).
Chris Lattner570585c2009-03-21 09:16:30 +00001826 if (GV == 0 ||
1827 GV->getType()->getElementType() != InitType ||
Peter Collingbourne207f4d82011-03-18 22:38:29 +00001828 GV->getType()->getAddressSpace() !=
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00001829 GetGlobalVarAddressSpace(D, getContext().getTargetAddressSpace(ASTTy))) {
Mike Stump1eb44332009-09-09 15:08:12 +00001830
John McCallf746aa62010-03-19 23:29:14 +00001831 // Move the old entry aside so that we'll create a new one.
Chris Lattner5f9e2722011-07-23 10:55:15 +00001832 Entry->setName(StringRef());
Daniel Dunbar232350d2009-02-19 05:36:41 +00001833
Chris Lattner570585c2009-03-21 09:16:30 +00001834 // Make a new global with the correct type, this is now guaranteed to work.
1835 GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, InitType));
Chris Lattner0558e792009-03-21 09:25:43 +00001836
Eli Friedman77ba7082008-05-30 19:50:47 +00001837 // Replace all uses of the old global with the new global
Mike Stump1eb44332009-09-09 15:08:12 +00001838 llvm::Constant *NewPtrForOldDecl =
Owen Anderson3c4972d2009-07-29 18:54:39 +00001839 llvm::ConstantExpr::getBitCast(GV, Entry->getType());
Chris Lattner570585c2009-03-21 09:16:30 +00001840 Entry->replaceAllUsesWith(NewPtrForOldDecl);
Eli Friedman77ba7082008-05-30 19:50:47 +00001841
1842 // Erase the old global, since it is no longer used.
Chris Lattner570585c2009-03-21 09:16:30 +00001843 cast<llvm::GlobalValue>(Entry)->eraseFromParent();
Chris Lattner8f32f712007-07-14 00:23:28 +00001844 }
Devang Patel8e53e722007-10-26 16:31:40 +00001845
Richard Smith00249372013-04-06 05:00:46 +00001846 MaybeHandleStaticInExternC(D, GV);
1847
Julien Lerouge77f68bb2011-09-09 22:41:49 +00001848 if (D->hasAttr<AnnotateAttr>())
1849 AddGlobalAnnotations(D, GV);
Nate Begeman8bd4afe2008-04-19 04:17:09 +00001850
Chris Lattner88a69ad2007-07-13 05:13:43 +00001851 GV->setInitializer(Init);
Chris Lattnere78b86f2009-08-05 05:20:29 +00001852
1853 // If it is safe to mark the global 'constant', do so now.
Richard Smitha9b21d22012-02-17 06:48:11 +00001854 GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
1855 isTypeConstant(D->getType(), true));
Mike Stump1eb44332009-09-09 15:08:12 +00001856
Ken Dyck8b752f12010-01-27 17:10:57 +00001857 GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
Richard Smitha9b21d22012-02-17 06:48:11 +00001858
Chris Lattner88a69ad2007-07-13 05:13:43 +00001859 // Set the llvm linkage type as appropriate.
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001860 llvm::GlobalValue::LinkageTypes Linkage =
Eli Friedman07369dd2013-07-01 20:22:57 +00001861 GetLLVMLinkageVarDefinition(D, GV->isConstant());
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001862 GV->setLinkage(Linkage);
1863 if (Linkage == llvm::GlobalVariable::CommonLinkage)
Chris Lattnere78b86f2009-08-05 05:20:29 +00001864 // common vars aren't constant even if declared const.
1865 GV->setConstant(false);
Daniel Dunbar7e714cd2009-04-10 20:26:50 +00001866
Daniel Dunbar7c65e992009-04-14 08:05:55 +00001867 SetCommonAttributes(D, GV);
Daniel Dunbar04d40782009-04-14 06:00:08 +00001868
John McCall3030eb82010-11-06 09:44:32 +00001869 // Emit the initializer function if necessary.
Richard Smith7ca48502012-02-13 22:16:19 +00001870 if (NeedsGlobalCtor || NeedsGlobalDtor)
1871 EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
John McCall3030eb82010-11-06 09:44:32 +00001872
Kostya Serebryany05c5ebc2012-08-21 06:53:28 +00001873 // If we are compiling with ASan, add metadata indicating dynamically
1874 // initialized globals.
Will Dietz4f45bc02013-01-18 11:30:38 +00001875 if (SanOpts.Address && NeedsGlobalCtor) {
Kostya Serebryany05c5ebc2012-08-21 06:53:28 +00001876 llvm::Module &M = getModule();
1877
1878 llvm::NamedMDNode *DynamicInitializers =
1879 M.getOrInsertNamedMetadata("llvm.asan.dynamically_initialized_globals");
1880 llvm::Value *GlobalToAdd[] = { GV };
1881 llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext, GlobalToAdd);
1882 DynamicInitializers->addOperand(ThisGlobal);
1883 }
1884
Sanjiv Gupta686226b2008-06-05 08:59:10 +00001885 // Emit global variable debug information.
Eric Christopher73fb3502011-10-13 21:45:18 +00001886 if (CGDebugInfo *DI = getModuleDebugInfo())
Douglas Gregor4cdad312012-10-23 20:05:01 +00001887 if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
Alexey Samsonovfd00eec2012-05-04 07:39:27 +00001888 DI->EmitGlobalVariable(GV, D);
Chris Lattner88a69ad2007-07-13 05:13:43 +00001889}
Reid Spencer5f016e22007-07-11 17:01:13 +00001890
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001891llvm::GlobalValue::LinkageTypes
Eli Friedman07369dd2013-07-01 20:22:57 +00001892CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, bool isConstant) {
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001893 GVALinkage Linkage = getContext().GetGVALinkageForVariable(D);
1894 if (Linkage == GVA_Internal)
1895 return llvm::Function::InternalLinkage;
1896 else if (D->hasAttr<DLLImportAttr>())
1897 return llvm::Function::DLLImportLinkage;
1898 else if (D->hasAttr<DLLExportAttr>())
1899 return llvm::Function::DLLExportLinkage;
Reid Klecknera7225342013-05-20 14:02:37 +00001900 else if (D->hasAttr<SelectAnyAttr>()) {
1901 // selectany symbols are externally visible, so use weak instead of
1902 // linkonce. MSVC optimizes away references to const selectany globals, so
1903 // all definitions should be the same and ODR linkage should be used.
1904 // http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx
1905 return llvm::GlobalVariable::WeakODRLinkage;
1906 } else if (D->hasAttr<WeakAttr>()) {
Eli Friedman07369dd2013-07-01 20:22:57 +00001907 if (isConstant)
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001908 return llvm::GlobalVariable::WeakODRLinkage;
1909 else
1910 return llvm::GlobalVariable::WeakAnyLinkage;
1911 } else if (Linkage == GVA_TemplateInstantiation ||
1912 Linkage == GVA_ExplicitTemplateInstantiation)
John McCall99ace162011-04-12 01:46:54 +00001913 return llvm::GlobalVariable::WeakODRLinkage;
David Blaikie4e4d0842012-03-11 07:00:24 +00001914 else if (!getLangOpts().CPlusPlus &&
Eric Christophera6cf1e72010-12-02 02:45:55 +00001915 ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) ||
1916 D->getAttr<CommonAttr>()) &&
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001917 !D->hasExternalStorage() && !D->getInit() &&
Richard Smith38afbc72013-04-13 02:43:54 +00001918 !D->getAttr<SectionAttr>() && !D->getTLSKind() &&
Fariborz Jahanianab27d6e2011-06-20 17:50:03 +00001919 !D->getAttr<WeakImportAttr>()) {
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001920 // Thread local vars aren't considered common linkage.
1921 return llvm::GlobalVariable::CommonLinkage;
Bill Wendling4e3b54b2013-05-02 19:18:03 +00001922 } else if (D->getTLSKind() == VarDecl::TLS_Dynamic &&
1923 getTarget().getTriple().isMacOSX())
1924 // On Darwin, the backing variable for a C++11 thread_local variable always
1925 // has internal linkage; all accesses should just be calls to the
1926 // Itanium-specified entry point, which has the normal linkage of the
1927 // variable.
1928 return llvm::GlobalValue::InternalLinkage;
Fariborz Jahanian354e7122010-10-27 16:21:54 +00001929 return llvm::GlobalVariable::ExternalLinkage;
1930}
1931
John McCalla923c972012-12-12 22:21:47 +00001932/// Replace the uses of a function that was declared with a non-proto type.
1933/// We want to silently drop extra arguments from call sites
1934static void replaceUsesOfNonProtoConstant(llvm::Constant *old,
1935 llvm::Function *newFn) {
1936 // Fast path.
1937 if (old->use_empty()) return;
1938
1939 llvm::Type *newRetTy = newFn->getReturnType();
1940 SmallVector<llvm::Value*, 4> newArgs;
1941
1942 for (llvm::Value::use_iterator ui = old->use_begin(), ue = old->use_end();
1943 ui != ue; ) {
1944 llvm::Value::use_iterator use = ui++; // Increment before the use is erased.
1945 llvm::User *user = *use;
1946
1947 // Recognize and replace uses of bitcasts. Most calls to
1948 // unprototyped functions will use bitcasts.
1949 if (llvm::ConstantExpr *bitcast = dyn_cast<llvm::ConstantExpr>(user)) {
1950 if (bitcast->getOpcode() == llvm::Instruction::BitCast)
1951 replaceUsesOfNonProtoConstant(bitcast, newFn);
1952 continue;
1953 }
1954
1955 // Recognize calls to the function.
1956 llvm::CallSite callSite(user);
1957 if (!callSite) continue;
1958 if (!callSite.isCallee(use)) continue;
1959
1960 // If the return types don't match exactly, then we can't
1961 // transform this call unless it's dead.
1962 if (callSite->getType() != newRetTy && !callSite->use_empty())
1963 continue;
1964
1965 // Get the call site's attribute list.
Bill Wendlingb263bdf2013-01-27 02:46:53 +00001966 SmallVector<llvm::AttributeSet, 8> newAttrs;
John McCalla923c972012-12-12 22:21:47 +00001967 llvm::AttributeSet oldAttrs = callSite.getAttributes();
1968
1969 // Collect any return attributes from the call.
Bill Wendlinga37ce612013-01-21 21:57:40 +00001970 if (oldAttrs.hasAttributes(llvm::AttributeSet::ReturnIndex))
Bill Wendlinged01f842013-01-21 22:45:00 +00001971 newAttrs.push_back(
Bill Wendlingb263bdf2013-01-27 02:46:53 +00001972 llvm::AttributeSet::get(newFn->getContext(),
1973 oldAttrs.getRetAttributes()));
John McCalla923c972012-12-12 22:21:47 +00001974
1975 // If the function was passed too few arguments, don't transform.
1976 unsigned newNumArgs = newFn->arg_size();
1977 if (callSite.arg_size() < newNumArgs) continue;
1978
1979 // If extra arguments were passed, we silently drop them.
1980 // If any of the types mismatch, we don't transform.
1981 unsigned argNo = 0;
1982 bool dontTransform = false;
1983 for (llvm::Function::arg_iterator ai = newFn->arg_begin(),
1984 ae = newFn->arg_end(); ai != ae; ++ai, ++argNo) {
1985 if (callSite.getArgument(argNo)->getType() != ai->getType()) {
1986 dontTransform = true;
1987 break;
1988 }
1989
1990 // Add any parameter attributes.
Bill Wendling89530e42013-01-23 06:15:10 +00001991 if (oldAttrs.hasAttributes(argNo + 1))
1992 newAttrs.
Bill Wendlingb263bdf2013-01-27 02:46:53 +00001993 push_back(llvm::
1994 AttributeSet::get(newFn->getContext(),
1995 oldAttrs.getParamAttributes(argNo + 1)));
John McCalla923c972012-12-12 22:21:47 +00001996 }
1997 if (dontTransform)
1998 continue;
1999
Bill Wendlinge67e4c92013-01-18 21:26:07 +00002000 if (oldAttrs.hasAttributes(llvm::AttributeSet::FunctionIndex))
Bill Wendlingb263bdf2013-01-27 02:46:53 +00002001 newAttrs.push_back(llvm::AttributeSet::get(newFn->getContext(),
2002 oldAttrs.getFnAttributes()));
John McCalla923c972012-12-12 22:21:47 +00002003
2004 // Okay, we can transform this. Create the new call instruction and copy
2005 // over the required information.
2006 newArgs.append(callSite.arg_begin(), callSite.arg_begin() + argNo);
2007
2008 llvm::CallSite newCall;
2009 if (callSite.isCall()) {
2010 newCall = llvm::CallInst::Create(newFn, newArgs, "",
2011 callSite.getInstruction());
2012 } else {
2013 llvm::InvokeInst *oldInvoke =
2014 cast<llvm::InvokeInst>(callSite.getInstruction());
2015 newCall = llvm::InvokeInst::Create(newFn,
2016 oldInvoke->getNormalDest(),
2017 oldInvoke->getUnwindDest(),
2018 newArgs, "",
2019 callSite.getInstruction());
2020 }
2021 newArgs.clear(); // for the next iteration
2022
2023 if (!newCall->getType()->isVoidTy())
2024 newCall->takeName(callSite.getInstruction());
2025 newCall.setAttributes(
2026 llvm::AttributeSet::get(newFn->getContext(), newAttrs));
2027 newCall.setCallingConv(callSite.getCallingConv());
2028
2029 // Finally, remove the old call, replacing any uses with the new one.
2030 if (!callSite->use_empty())
2031 callSite->replaceAllUsesWith(newCall.getInstruction());
2032
2033 // Copy debug location attached to CI.
2034 if (!callSite->getDebugLoc().isUnknown())
2035 newCall->setDebugLoc(callSite->getDebugLoc());
2036 callSite->eraseFromParent();
2037 }
2038}
2039
Chris Lattnerbdb01322009-05-05 06:16:31 +00002040/// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we
2041/// implement a function with no prototype, e.g. "int foo() {}". If there are
2042/// existing call uses of the old function in the module, this adjusts them to
2043/// call the new function directly.
2044///
2045/// This is not just a cleanup: the always_inline pass requires direct calls to
2046/// functions to be able to inline them. If there is a bitcast in the way, it
2047/// won't inline them. Instcombine normally deletes these calls, but it isn't
2048/// run at -O0.
2049static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
2050 llvm::Function *NewFn) {
2051 // If we're redefining a global as a function, don't transform it.
John McCalla923c972012-12-12 22:21:47 +00002052 if (!isa<llvm::Function>(Old)) return;
Mike Stump1eb44332009-09-09 15:08:12 +00002053
John McCalla923c972012-12-12 22:21:47 +00002054 replaceUsesOfNonProtoConstant(Old, NewFn);
Chris Lattnerbdb01322009-05-05 06:16:31 +00002055}
2056
Rafael Espindola02503932012-03-08 15:51:03 +00002057void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2058 TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
2059 // If we have a definition, this might be a deferred decl. If the
2060 // instantiation is explicit, make sure we emit it at the end.
2061 if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
2062 GetAddrOfGlobalVar(VD);
Argyrios Kyrtzidisafda9052013-02-24 00:05:01 +00002063
2064 EmitTopLevelDecl(VD);
Rafael Espindola234fe652012-03-05 10:54:55 +00002065}
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00002066
Chris Lattnerb4880ba2009-05-12 21:21:08 +00002067void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) {
Chris Lattnerb4880ba2009-05-12 21:21:08 +00002068 const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl());
John McCalld26bc762011-03-09 04:27:21 +00002069
John McCall1f6f9612011-03-09 08:12:35 +00002070 // Compute the function info and LLVM type.
John McCallde5d3c72012-02-17 03:33:10 +00002071 const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
2072 llvm::FunctionType *Ty = getTypes().GetFunctionType(FI);
John McCalld26bc762011-03-09 04:27:21 +00002073
Chris Lattner9fa959d2009-05-12 20:58:15 +00002074 // Get or create the prototype for the function.
Chris Lattnerb4880ba2009-05-12 21:21:08 +00002075 llvm::Constant *Entry = GetAddrOfFunction(GD, Ty);
Mike Stump1eb44332009-09-09 15:08:12 +00002076
Chris Lattner0558e792009-03-21 09:25:43 +00002077 // Strip off a bitcast if we got one back.
2078 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
2079 assert(CE->getOpcode() == llvm::Instruction::BitCast);
2080 Entry = CE->getOperand(0);
2081 }
Mike Stump1eb44332009-09-09 15:08:12 +00002082
2083
Chris Lattner0558e792009-03-21 09:25:43 +00002084 if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() != Ty) {
Chris Lattnerbdb01322009-05-05 06:16:31 +00002085 llvm::GlobalValue *OldFn = cast<llvm::GlobalValue>(Entry);
Mike Stump1eb44332009-09-09 15:08:12 +00002086
Daniel Dunbar42745812009-03-09 23:53:08 +00002087 // If the types mismatch then we have to rewrite the definition.
Chris Lattnerbdb01322009-05-05 06:16:31 +00002088 assert(OldFn->isDeclaration() &&
Chris Lattner0558e792009-03-21 09:25:43 +00002089 "Shouldn't replace non-declaration");
Chris Lattner34809502009-03-21 08:53:37 +00002090
Chris Lattner62b33ea2009-03-21 08:38:50 +00002091 // F is the Function* for the one with the wrong type, we must make a new
2092 // Function* and update everything that used F (a declaration) with the new
2093 // Function* (which will be a definition).
2094 //
2095 // This happens if there is a prototype for a function
2096 // (e.g. "int f()") and then a definition of a different type
John McCallf746aa62010-03-19 23:29:14 +00002097 // (e.g. "int f(int x)"). Move the old function aside so that it
2098 // doesn't interfere with GetAddrOfFunction.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002099 OldFn->setName(StringRef());
Chris Lattnerb4880ba2009-05-12 21:21:08 +00002100 llvm::Function *NewFn = cast<llvm::Function>(GetAddrOfFunction(GD, Ty));
Mike Stump1eb44332009-09-09 15:08:12 +00002101
John McCalla923c972012-12-12 22:21:47 +00002102 // This might be an implementation of a function without a
2103 // prototype, in which case, try to do special replacement of
2104 // calls which match the new prototype. The really key thing here
2105 // is that we also potentially drop arguments from the call site
2106 // so as to make a direct call, which makes the inliner happier
2107 // and suppresses a number of optimizer warnings (!) about
2108 // dropping arguments.
2109 if (!OldFn->use_empty()) {
Chris Lattnerbdb01322009-05-05 06:16:31 +00002110 ReplaceUsesOfNonProtoTypeWithRealFunction(OldFn, NewFn);
Chris Lattner9fa959d2009-05-12 20:58:15 +00002111 OldFn->removeDeadConstantUsers();
2112 }
Mike Stump1eb44332009-09-09 15:08:12 +00002113
Chris Lattner62b33ea2009-03-21 08:38:50 +00002114 // Replace uses of F with the Function we will endow with a body.
Chris Lattnerbdb01322009-05-05 06:16:31 +00002115 if (!Entry->use_empty()) {
Mike Stump1eb44332009-09-09 15:08:12 +00002116 llvm::Constant *NewPtrForOldDecl =
Owen Anderson3c4972d2009-07-29 18:54:39 +00002117 llvm::ConstantExpr::getBitCast(NewFn, Entry->getType());
Chris Lattnerbdb01322009-05-05 06:16:31 +00002118 Entry->replaceAllUsesWith(NewPtrForOldDecl);
2119 }
Mike Stump1eb44332009-09-09 15:08:12 +00002120
Chris Lattner62b33ea2009-03-21 08:38:50 +00002121 // Ok, delete the old function now, which is dead.
Chris Lattnerbdb01322009-05-05 06:16:31 +00002122 OldFn->eraseFromParent();
Mike Stump1eb44332009-09-09 15:08:12 +00002123
Chris Lattner0558e792009-03-21 09:25:43 +00002124 Entry = NewFn;
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00002125 }
Mike Stump1eb44332009-09-09 15:08:12 +00002126
John McCall112c9672010-11-02 21:04:24 +00002127 // We need to set linkage and visibility on the function before
2128 // generating code for it because various parts of IR generation
2129 // want to propagate this information down (e.g. to local static
2130 // declarations).
Chris Lattner0558e792009-03-21 09:25:43 +00002131 llvm::Function *Fn = cast<llvm::Function>(Entry);
Peter Collingbourne144a31f2013-06-05 17:49:37 +00002132 setFunctionLinkage(GD, Fn);
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00002133
John McCall112c9672010-11-02 21:04:24 +00002134 // FIXME: this is redundant with part of SetFunctionDefinitionAttributes
Anders Carlsson0ffeaad2011-01-29 19:39:23 +00002135 setGlobalVisibility(Fn, D);
John McCall112c9672010-11-02 21:04:24 +00002136
Richard Smith00249372013-04-06 05:00:46 +00002137 MaybeHandleStaticInExternC(D, Fn);
2138
John McCalld26bc762011-03-09 04:27:21 +00002139 CodeGenFunction(*this).GenerateCode(D, Fn, FI);
Daniel Dunbar6bfed7e2008-08-01 00:01:51 +00002140
Daniel Dunbar7c65e992009-04-14 08:05:55 +00002141 SetFunctionDefinitionAttributes(D, Fn);
2142 SetLLVMFunctionAttributesForDefinition(D, Fn);
Mike Stump1eb44332009-09-09 15:08:12 +00002143
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +00002144 if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>())
Daniel Dunbar219df662008-09-08 23:44:31 +00002145 AddGlobalCtor(Fn, CA->getPriority());
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +00002146 if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
Daniel Dunbar219df662008-09-08 23:44:31 +00002147 AddGlobalDtor(Fn, DA->getPriority());
Julien Lerouge77f68bb2011-09-09 22:41:49 +00002148 if (D->hasAttr<AnnotateAttr>())
2149 AddGlobalAnnotations(D, Fn);
Daniel Dunbarbd012ff2008-07-29 23:18:29 +00002150}
2151
John McCallf746aa62010-03-19 23:29:14 +00002152void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
2153 const ValueDecl *D = cast<ValueDecl>(GD.getDecl());
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +00002154 const AliasAttr *AA = D->getAttr<AliasAttr>();
Chris Lattnerbd532712009-03-22 21:47:11 +00002155 assert(AA && "Not an alias?");
2156
Chris Lattner5f9e2722011-07-23 10:55:15 +00002157 StringRef MangledName = getMangledName(GD);
Mike Stump1eb44332009-09-09 15:08:12 +00002158
John McCallf746aa62010-03-19 23:29:14 +00002159 // If there is a definition in the module, then it wins over the alias.
2160 // This is dubious, but allow it to be safe. Just ignore the alias.
2161 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2162 if (Entry && !Entry->isDeclaration())
2163 return;
2164
Rafael Espindolad2054982013-10-22 19:26:13 +00002165 Aliases.push_back(GD);
2166
Chris Lattner2acc6e32011-07-18 04:24:23 +00002167 llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType());
Chris Lattnerbd532712009-03-22 21:47:11 +00002168
2169 // Create a reference to the named value. This ensures that it is emitted
2170 // if a deferred decl.
2171 llvm::Constant *Aliasee;
2172 if (isa<llvm::FunctionType>(DeclTy))
Alex Rosenbergc857ce82012-10-05 23:12:53 +00002173 Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD,
Anders Carlsson1faa89f2011-02-05 04:35:53 +00002174 /*ForVTable=*/false);
Chris Lattnerbd532712009-03-22 21:47:11 +00002175 else
John McCallf746aa62010-03-19 23:29:14 +00002176 Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
Owen Anderson96e0fc72009-07-29 22:16:19 +00002177 llvm::PointerType::getUnqual(DeclTy), 0);
Chris Lattnerbd532712009-03-22 21:47:11 +00002178
2179 // Create the new alias itself, but don't set a name yet.
Mike Stump1eb44332009-09-09 15:08:12 +00002180 llvm::GlobalValue *GA =
Chris Lattnerbd532712009-03-22 21:47:11 +00002181 new llvm::GlobalAlias(Aliasee->getType(),
2182 llvm::Function::ExternalLinkage,
2183 "", Aliasee, &getModule());
Mike Stump1eb44332009-09-09 15:08:12 +00002184
Chris Lattnerbd532712009-03-22 21:47:11 +00002185 if (Entry) {
John McCallf746aa62010-03-19 23:29:14 +00002186 assert(Entry->isDeclaration());
2187
Chris Lattnerbd532712009-03-22 21:47:11 +00002188 // If there is a declaration in the module, then we had an extern followed
2189 // by the alias, as in:
2190 // extern int test6();
2191 // ...
2192 // int test6() __attribute__((alias("test7")));
2193 //
2194 // Remove it and replace uses of it with the alias.
John McCallf746aa62010-03-19 23:29:14 +00002195 GA->takeName(Entry);
Mike Stump1eb44332009-09-09 15:08:12 +00002196
Owen Anderson3c4972d2009-07-29 18:54:39 +00002197 Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA,
Chris Lattnerbd532712009-03-22 21:47:11 +00002198 Entry->getType()));
Chris Lattnerbd532712009-03-22 21:47:11 +00002199 Entry->eraseFromParent();
John McCallf746aa62010-03-19 23:29:14 +00002200 } else {
Anders Carlsson9a20d552010-06-22 16:16:50 +00002201 GA->setName(MangledName);
Chris Lattnerbd532712009-03-22 21:47:11 +00002202 }
Mike Stump1eb44332009-09-09 15:08:12 +00002203
Daniel Dunbar7c65e992009-04-14 08:05:55 +00002204 // Set attributes which are particular to an alias; this is a
2205 // specialization of the attributes which may be set on a global
2206 // variable/function.
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +00002207 if (D->hasAttr<DLLExportAttr>()) {
Daniel Dunbar7c65e992009-04-14 08:05:55 +00002208 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2209 // The dllexport attribute is ignored for undefined symbols.
Argyrios Kyrtzidis06a54a32010-07-07 11:31:19 +00002210 if (FD->hasBody())
Daniel Dunbar7c65e992009-04-14 08:05:55 +00002211 GA->setLinkage(llvm::Function::DLLExportLinkage);
2212 } else {
2213 GA->setLinkage(llvm::Function::DLLExportLinkage);
2214 }
Mike Stump1eb44332009-09-09 15:08:12 +00002215 } else if (D->hasAttr<WeakAttr>() ||
Rafael Espindola11e8ce72010-02-23 22:00:30 +00002216 D->hasAttr<WeakRefAttr>() ||
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002217 D->isWeakImported()) {
Daniel Dunbar7c65e992009-04-14 08:05:55 +00002218 GA->setLinkage(llvm::Function::WeakAnyLinkage);
2219 }
2220
2221 SetCommonAttributes(D, GA);
Chris Lattnerbd532712009-03-22 21:47:11 +00002222}
2223
Benjamin Kramer8dd55a32011-07-14 17:45:50 +00002224llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,
Chris Lattner2d3ba4f2011-07-23 17:14:25 +00002225 ArrayRef<llvm::Type*> Tys) {
Jay Foaddf983a82011-07-12 14:06:48 +00002226 return llvm::Intrinsic::getDeclaration(&getModule(), (llvm::Intrinsic::ID)IID,
Benjamin Kramer8dd55a32011-07-14 17:45:50 +00002227 Tys);
Chris Lattner7acda7c2007-12-18 00:25:38 +00002228}
Chris Lattnerbef20ac2007-08-31 04:31:45 +00002229
Daniel Dunbar1d552912009-07-23 22:52:48 +00002230static llvm::StringMapEntry<llvm::Constant*> &
2231GetConstantCFStringEntry(llvm::StringMap<llvm::Constant*> &Map,
2232 const StringLiteral *Literal,
Daniel Dunbar70ee9752009-07-23 23:41:22 +00002233 bool TargetIsLSB,
Daniel Dunbar1d552912009-07-23 22:52:48 +00002234 bool &IsUTF16,
2235 unsigned &StringLength) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002236 StringRef String = Literal->getString();
Benjamin Kramer2f4eaef2010-08-17 12:54:38 +00002237 unsigned NumBytes = String.size();
Daniel Dunbar1d552912009-07-23 22:52:48 +00002238
Daniel Dunbarf015b032009-09-22 10:03:52 +00002239 // Check for simple case.
2240 if (!Literal->containsNonAsciiOrNull()) {
2241 StringLength = NumBytes;
Benjamin Kramer2f4eaef2010-08-17 12:54:38 +00002242 return Map.GetOrCreateValue(String);
Daniel Dunbarf015b032009-09-22 10:03:52 +00002243 }
2244
Bill Wendling84392d02012-03-30 00:26:17 +00002245 // Otherwise, convert the UTF8 literals into a string of shorts.
2246 IsUTF16 = true;
2247
2248 SmallVector<UTF16, 128> ToBuf(NumBytes + 1); // +1 for ending nulls.
Roman Divacky31ba6132012-09-06 15:59:27 +00002249 const UTF8 *FromPtr = (const UTF8 *)String.data();
Daniel Dunbar1d552912009-07-23 22:52:48 +00002250 UTF16 *ToPtr = &ToBuf[0];
Mike Stump1eb44332009-09-09 15:08:12 +00002251
Fariborz Jahaniane7ddfb92010-09-07 19:57:04 +00002252 (void)ConvertUTF8toUTF16(&FromPtr, FromPtr + NumBytes,
2253 &ToPtr, ToPtr + NumBytes,
2254 strictConversion);
Mike Stump1eb44332009-09-09 15:08:12 +00002255
Daniel Dunbar70ee9752009-07-23 23:41:22 +00002256 // ConvertUTF8toUTF16 returns the length in ToPtr.
Daniel Dunbar1d552912009-07-23 22:52:48 +00002257 StringLength = ToPtr - &ToBuf[0];
Daniel Dunbar70ee9752009-07-23 23:41:22 +00002258
Bill Wendling84392d02012-03-30 00:26:17 +00002259 // Add an explicit null.
2260 *ToPtr = 0;
2261 return Map.
2262 GetOrCreateValue(StringRef(reinterpret_cast<const char *>(ToBuf.data()),
2263 (StringLength + 1) * 2));
Daniel Dunbar1d552912009-07-23 22:52:48 +00002264}
2265
Fariborz Jahaniancf8e1682011-05-13 18:13:10 +00002266static llvm::StringMapEntry<llvm::Constant*> &
2267GetConstantStringEntry(llvm::StringMap<llvm::Constant*> &Map,
Bill Wendling8322c232012-03-29 22:12:09 +00002268 const StringLiteral *Literal,
2269 unsigned &StringLength) {
2270 StringRef String = Literal->getString();
2271 StringLength = String.size();
2272 return Map.GetOrCreateValue(String);
Fariborz Jahaniancf8e1682011-05-13 18:13:10 +00002273}
2274
Daniel Dunbar1d552912009-07-23 22:52:48 +00002275llvm::Constant *
2276CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
2277 unsigned StringLength = 0;
2278 bool isUTF16 = false;
2279 llvm::StringMapEntry<llvm::Constant*> &Entry =
Mike Stump1eb44332009-09-09 15:08:12 +00002280 GetConstantCFStringEntry(CFConstantStringMap, Literal,
Micah Villmow25a6a842012-10-08 16:25:52 +00002281 getDataLayout().isLittleEndian(),
Daniel Dunbar70ee9752009-07-23 23:41:22 +00002282 isUTF16, StringLength);
Mike Stump1eb44332009-09-09 15:08:12 +00002283
Daniel Dunbar1d552912009-07-23 22:52:48 +00002284 if (llvm::Constant *C = Entry.getValue())
2285 return C;
Mike Stump1eb44332009-09-09 15:08:12 +00002286
Chris Lattner8b418682012-02-07 00:39:47 +00002287 llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
Daniel Dunbar3e9df992008-08-23 18:37:06 +00002288 llvm::Constant *Zeros[] = { Zero, Zero };
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002289 llvm::Value *V;
2290
Chris Lattner9d4a15f2009-07-16 16:48:25 +00002291 // If we don't already have it, get __CFConstantStringClassReference.
Anders Carlssonc9e20912007-08-21 00:21:21 +00002292 if (!CFConstantStringClassRef) {
Chris Lattner2acc6e32011-07-18 04:24:23 +00002293 llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
Owen Anderson96e0fc72009-07-29 22:16:19 +00002294 Ty = llvm::ArrayType::get(Ty, 0);
Mike Stump1eb44332009-09-09 15:08:12 +00002295 llvm::Constant *GV = CreateRuntimeVariable(Ty,
Chris Lattner9d4a15f2009-07-16 16:48:25 +00002296 "__CFConstantStringClassReference");
Daniel Dunbar3e9df992008-08-23 18:37:06 +00002297 // Decay array -> ptr
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002298 V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2299 CFConstantStringClassRef = V;
Anders Carlssonc9e20912007-08-21 00:21:21 +00002300 }
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002301 else
2302 V = CFConstantStringClassRef;
Mike Stump1eb44332009-09-09 15:08:12 +00002303
Anders Carlssone3daa762008-11-15 18:54:24 +00002304 QualType CFTy = getContext().getCFConstantStringType();
Daniel Dunbar3e9df992008-08-23 18:37:06 +00002305
Chris Lattner2acc6e32011-07-18 04:24:23 +00002306 llvm::StructType *STy =
Anders Carlssone3daa762008-11-15 18:54:24 +00002307 cast<llvm::StructType>(getTypes().ConvertType(CFTy));
2308
Benjamin Kramer1d236ab2011-10-15 12:20:02 +00002309 llvm::Constant *Fields[4];
Douglas Gregor44b43212008-12-11 16:49:14 +00002310
Anders Carlssonc9e20912007-08-21 00:21:21 +00002311 // Class pointer.
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002312 Fields[0] = cast<llvm::ConstantExpr>(V);
Mike Stump1eb44332009-09-09 15:08:12 +00002313
Anders Carlssonc9e20912007-08-21 00:21:21 +00002314 // Flags.
Chris Lattner2acc6e32011-07-18 04:24:23 +00002315 llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
Mike Stump1eb44332009-09-09 15:08:12 +00002316 Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0) :
Anders Carlsson5add6832009-08-16 05:55:31 +00002317 llvm::ConstantInt::get(Ty, 0x07C8);
2318
Anders Carlssonc9e20912007-08-21 00:21:21 +00002319 // String pointer.
Bill Wendling84392d02012-03-30 00:26:17 +00002320 llvm::Constant *C = 0;
2321 if (isUTF16) {
2322 ArrayRef<uint16_t> Arr =
David Greene5ba58a12013-01-15 22:09:41 +00002323 llvm::makeArrayRef<uint16_t>(reinterpret_cast<uint16_t*>(
2324 const_cast<char *>(Entry.getKey().data())),
Bill Wendling84392d02012-03-30 00:26:17 +00002325 Entry.getKey().size() / 2);
2326 C = llvm::ConstantDataArray::get(VMContext, Arr);
2327 } else {
2328 C = llvm::ConstantDataArray::getString(VMContext, Entry.getKey());
2329 }
Daniel Dunbara9668e02009-04-03 00:57:44 +00002330
Chris Lattner95b851e2009-07-16 05:03:48 +00002331 llvm::GlobalValue::LinkageTypes Linkage;
Bill Wendling1bf7a3f2012-01-10 08:46:39 +00002332 if (isUTF16)
Chris Lattner278b9f02009-10-14 05:55:45 +00002333 // FIXME: why do utf strings get "_" labels instead of "L" labels?
Chris Lattner95b851e2009-07-16 05:03:48 +00002334 Linkage = llvm::GlobalValue::InternalLinkage;
Bill Wendling1bf7a3f2012-01-10 08:46:39 +00002335 else
Rafael Espindola584acf22011-03-14 17:55:00 +00002336 // FIXME: With OS X ld 123.2 (xcode 4) and LTO we would get a linker error
2337 // when using private linkage. It is not clear if this is a bug in ld
2338 // or a reasonable new restriction.
Rafael Espindoladc0f1372011-03-14 21:08:19 +00002339 Linkage = llvm::GlobalValue::LinkerPrivateLinkage;
Chris Lattner278b9f02009-10-14 05:55:45 +00002340
Bill Wendling1bf7a3f2012-01-10 08:46:39 +00002341 // Note: -fwritable-strings doesn't make the backing store strings of
2342 // CFStrings writable. (See <rdar://problem/10657500>)
Mike Stump1eb44332009-09-09 15:08:12 +00002343 llvm::GlobalVariable *GV =
Bill Wendling1bf7a3f2012-01-10 08:46:39 +00002344 new llvm::GlobalVariable(getModule(), C->getType(), /*isConstant=*/true,
2345 Linkage, C, ".str");
Rafael Espindolab266a1f2011-01-17 16:31:00 +00002346 GV->setUnnamedAddr(true);
Ulrich Weigand6b203512013-05-06 16:23:57 +00002347 // Don't enforce the target's minimum global alignment, since the only use
2348 // of the string is via this class initializer.
Daniel Dunbara9668e02009-04-03 00:57:44 +00002349 if (isUTF16) {
Ken Dyck4da244c2010-01-26 18:46:23 +00002350 CharUnits Align = getContext().getTypeAlignInChars(getContext().ShortTy);
2351 GV->setAlignment(Align.getQuantity());
Daniel Dunbarf7e903d2011-04-12 23:30:52 +00002352 } else {
2353 CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
2354 GV->setAlignment(Align.getQuantity());
Daniel Dunbara9668e02009-04-03 00:57:44 +00002355 }
Bill Wendling84392d02012-03-30 00:26:17 +00002356
2357 // String.
Jay Foada5c04342011-07-21 14:31:17 +00002358 Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
Anders Carlsson5add6832009-08-16 05:55:31 +00002359
Bill Wendling84392d02012-03-30 00:26:17 +00002360 if (isUTF16)
2361 // Cast the UTF16 string to the correct type.
2362 Fields[2] = llvm::ConstantExpr::getBitCast(Fields[2], Int8PtrTy);
2363
Anders Carlssonc9e20912007-08-21 00:21:21 +00002364 // String length.
2365 Ty = getTypes().ConvertType(getContext().LongTy);
Anders Carlsson5add6832009-08-16 05:55:31 +00002366 Fields[3] = llvm::ConstantInt::get(Ty, StringLength);
Mike Stump1eb44332009-09-09 15:08:12 +00002367
Anders Carlssonc9e20912007-08-21 00:21:21 +00002368 // The struct.
Owen Anderson08e25242009-07-27 22:29:56 +00002369 C = llvm::ConstantStruct::get(STy, Fields);
Mike Stump1eb44332009-09-09 15:08:12 +00002370 GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2371 llvm::GlobalVariable::PrivateLinkage, C,
Chris Lattner95b851e2009-07-16 05:03:48 +00002372 "_unnamed_cfstring_");
John McCall64aa4b32013-04-16 22:48:15 +00002373 if (const char *Sect = getTarget().getCFStringSection())
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +00002374 GV->setSection(Sect);
Daniel Dunbar1d552912009-07-23 22:52:48 +00002375 Entry.setValue(GV);
Mike Stump1eb44332009-09-09 15:08:12 +00002376
Anders Carlsson0c678292007-11-01 00:41:52 +00002377 return GV;
Anders Carlssonc9e20912007-08-21 00:21:21 +00002378}
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002379
Douglas Gregor45c4ea72011-08-09 15:54:21 +00002380static RecordDecl *
2381CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK,
2382 DeclContext *DC, IdentifierInfo *Id) {
2383 SourceLocation Loc;
David Blaikie4e4d0842012-03-11 07:00:24 +00002384 if (Ctx.getLangOpts().CPlusPlus)
Douglas Gregor45c4ea72011-08-09 15:54:21 +00002385 return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
2386 else
2387 return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
2388}
2389
Fariborz Jahanian33e982b2010-04-22 20:26:39 +00002390llvm::Constant *
Fariborz Jahanian4c733072010-10-19 17:19:29 +00002391CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002392 unsigned StringLength = 0;
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002393 llvm::StringMapEntry<llvm::Constant*> &Entry =
Fariborz Jahaniancf8e1682011-05-13 18:13:10 +00002394 GetConstantStringEntry(CFConstantStringMap, Literal, StringLength);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002395
2396 if (llvm::Constant *C = Entry.getValue())
2397 return C;
2398
Chris Lattner812234b2012-02-06 22:47:00 +00002399 llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002400 llvm::Constant *Zeros[] = { Zero, Zero };
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002401 llvm::Value *V;
Fariborz Jahanianec951e02010-04-23 22:33:39 +00002402 // If we don't already have it, get _NSConstantStringClassReference.
Fariborz Jahanian4c733072010-10-19 17:19:29 +00002403 if (!ConstantStringClassRef) {
David Blaikie4e4d0842012-03-11 07:00:24 +00002404 std::string StringClass(getLangOpts().ObjCConstantStringClass);
Chris Lattner2acc6e32011-07-18 04:24:23 +00002405 llvm::Type *Ty = getTypes().ConvertType(getContext().IntTy);
Fariborz Jahanian4c733072010-10-19 17:19:29 +00002406 llvm::Constant *GV;
John McCall260611a2012-06-20 06:18:46 +00002407 if (LangOpts.ObjCRuntime.isNonFragile()) {
Fariborz Jahanian25dba5d2011-05-17 22:46:11 +00002408 std::string str =
2409 StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
2410 : "OBJC_CLASS_$_" + StringClass;
Fariborz Jahanian6f40e222011-05-17 22:21:16 +00002411 GV = getObjCRuntime().GetClassGlobal(str);
2412 // Make sure the result is of the correct type.
Chris Lattner2acc6e32011-07-18 04:24:23 +00002413 llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002414 V = llvm::ConstantExpr::getBitCast(GV, PTy);
2415 ConstantStringClassRef = V;
Fariborz Jahanian6f40e222011-05-17 22:21:16 +00002416 } else {
Fariborz Jahanian25dba5d2011-05-17 22:46:11 +00002417 std::string str =
2418 StringClass.empty() ? "_NSConstantStringClassReference"
2419 : "_" + StringClass + "ClassReference";
Chris Lattner2acc6e32011-07-18 04:24:23 +00002420 llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
Fariborz Jahanian25dba5d2011-05-17 22:46:11 +00002421 GV = CreateRuntimeVariable(PTy, str);
Fariborz Jahanian6f40e222011-05-17 22:21:16 +00002422 // Decay array -> ptr
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002423 V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
2424 ConstantStringClassRef = V;
Fariborz Jahanian4c733072010-10-19 17:19:29 +00002425 }
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002426 }
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002427 else
2428 V = ConstantStringClassRef;
Douglas Gregor45c4ea72011-08-09 15:54:21 +00002429
2430 if (!NSConstantStringType) {
2431 // Construct the type for a constant NSString.
2432 RecordDecl *D = CreateRecordDecl(Context, TTK_Struct,
2433 Context.getTranslationUnitDecl(),
2434 &Context.Idents.get("__builtin_NSString"));
2435 D->startDefinition();
2436
2437 QualType FieldTypes[3];
2438
2439 // const int *isa;
2440 FieldTypes[0] = Context.getPointerType(Context.IntTy.withConst());
2441 // const char *str;
2442 FieldTypes[1] = Context.getPointerType(Context.CharTy.withConst());
2443 // unsigned int length;
2444 FieldTypes[2] = Context.UnsignedIntTy;
2445
2446 // Create fields
2447 for (unsigned i = 0; i < 3; ++i) {
2448 FieldDecl *Field = FieldDecl::Create(Context, D,
2449 SourceLocation(),
2450 SourceLocation(), 0,
2451 FieldTypes[i], /*TInfo=*/0,
2452 /*BitWidth=*/0,
2453 /*Mutable=*/false,
Richard Smithca523302012-06-10 03:12:00 +00002454 ICIS_NoInit);
Douglas Gregor45c4ea72011-08-09 15:54:21 +00002455 Field->setAccess(AS_public);
2456 D->addDecl(Field);
2457 }
2458
2459 D->completeDefinition();
2460 QualType NSTy = Context.getTagDeclType(D);
2461 NSConstantStringType = cast<llvm::StructType>(getTypes().ConvertType(NSTy));
2462 }
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002463
Benjamin Kramer1d236ab2011-10-15 12:20:02 +00002464 llvm::Constant *Fields[3];
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002465
2466 // Class pointer.
Fariborz Jahanian428edb72013-04-16 15:25:39 +00002467 Fields[0] = cast<llvm::ConstantExpr>(V);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002468
2469 // String pointer.
Chris Lattner94010692012-02-05 02:30:40 +00002470 llvm::Constant *C =
2471 llvm::ConstantDataArray::getString(VMContext, Entry.getKey());
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002472
2473 llvm::GlobalValue::LinkageTypes Linkage;
2474 bool isConstant;
Fariborz Jahaniancf8e1682011-05-13 18:13:10 +00002475 Linkage = llvm::GlobalValue::PrivateLinkage;
David Blaikie4e4d0842012-03-11 07:00:24 +00002476 isConstant = !LangOpts.WritableStrings;
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002477
2478 llvm::GlobalVariable *GV =
2479 new llvm::GlobalVariable(getModule(), C->getType(), isConstant, Linkage, C,
2480 ".str");
Rafael Espindola803d3072011-01-17 22:11:21 +00002481 GV->setUnnamedAddr(true);
Ulrich Weigand6b203512013-05-06 16:23:57 +00002482 // Don't enforce the target's minimum global alignment, since the only use
2483 // of the string is via this class initializer.
Fariborz Jahaniancf8e1682011-05-13 18:13:10 +00002484 CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
2485 GV->setAlignment(Align.getQuantity());
Jay Foada5c04342011-07-21 14:31:17 +00002486 Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002487
2488 // String length.
Chris Lattner2acc6e32011-07-18 04:24:23 +00002489 llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002490 Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
2491
2492 // The struct.
Douglas Gregor45c4ea72011-08-09 15:54:21 +00002493 C = llvm::ConstantStruct::get(NSConstantStringType, Fields);
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002494 GV = new llvm::GlobalVariable(getModule(), C->getType(), true,
2495 llvm::GlobalVariable::PrivateLinkage, C,
2496 "_unnamed_nsstring_");
2497 // FIXME. Fix section.
Fariborz Jahanianec951e02010-04-23 22:33:39 +00002498 if (const char *Sect =
John McCall260611a2012-06-20 06:18:46 +00002499 LangOpts.ObjCRuntime.isNonFragile()
John McCall64aa4b32013-04-16 22:48:15 +00002500 ? getTarget().getNSStringNonFragileABISection()
2501 : getTarget().getNSStringSection())
Fariborz Jahanian2bb5dda2010-04-23 17:41:07 +00002502 GV->setSection(Sect);
2503 Entry.setValue(GV);
2504
2505 return GV;
Fariborz Jahanian33e982b2010-04-22 20:26:39 +00002506}
2507
Douglas Gregor0815b572011-08-09 17:23:49 +00002508QualType CodeGenModule::getObjCFastEnumerationStateType() {
2509 if (ObjCFastEnumerationStateType.isNull()) {
2510 RecordDecl *D = CreateRecordDecl(Context, TTK_Struct,
2511 Context.getTranslationUnitDecl(),
2512 &Context.Idents.get("__objcFastEnumerationState"));
2513 D->startDefinition();
2514
2515 QualType FieldTypes[] = {
2516 Context.UnsignedLongTy,
2517 Context.getPointerType(Context.getObjCIdType()),
2518 Context.getPointerType(Context.UnsignedLongTy),
2519 Context.getConstantArrayType(Context.UnsignedLongTy,
2520 llvm::APInt(32, 5), ArrayType::Normal, 0)
2521 };
2522
2523 for (size_t i = 0; i < 4; ++i) {
2524 FieldDecl *Field = FieldDecl::Create(Context,
2525 D,
2526 SourceLocation(),
2527 SourceLocation(), 0,
2528 FieldTypes[i], /*TInfo=*/0,
2529 /*BitWidth=*/0,
2530 /*Mutable=*/false,
Richard Smithca523302012-06-10 03:12:00 +00002531 ICIS_NoInit);
Douglas Gregor0815b572011-08-09 17:23:49 +00002532 Field->setAccess(AS_public);
2533 D->addDecl(Field);
2534 }
2535
2536 D->completeDefinition();
2537 ObjCFastEnumerationStateType = Context.getTagDeclType(D);
2538 }
2539
2540 return ObjCFastEnumerationStateType;
2541}
2542
Eli Friedman64f45a22011-11-01 02:23:42 +00002543llvm::Constant *
2544CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
2545 assert(!E->getType()->isPointerType() && "Strings are always arrays");
2546
2547 // Don't emit it as the address of the string, emit the string data itself
2548 // as an inline array.
Chris Lattner812234b2012-02-06 22:47:00 +00002549 if (E->getCharByteWidth() == 1) {
2550 SmallString<64> Str(E->getString());
2551
2552 // Resize the string to the right size, which is indicated by its type.
2553 const ConstantArrayType *CAT = Context.getAsConstantArrayType(E->getType());
2554 Str.resize(CAT->getSize().getZExtValue());
2555 return llvm::ConstantDataArray::getString(VMContext, Str, false);
2556 }
Chris Lattner94010692012-02-05 02:30:40 +00002557
2558 llvm::ArrayType *AType =
2559 cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
2560 llvm::Type *ElemTy = AType->getElementType();
2561 unsigned NumElements = AType->getNumElements();
Chris Lattnerd79ed432012-02-06 22:52:04 +00002562
2563 // Wide strings have either 2-byte or 4-byte elements.
2564 if (ElemTy->getPrimitiveSizeInBits() == 16) {
2565 SmallVector<uint16_t, 32> Elements;
2566 Elements.reserve(NumElements);
2567
2568 for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2569 Elements.push_back(E->getCodeUnit(i));
2570 Elements.resize(NumElements);
2571 return llvm::ConstantDataArray::get(VMContext, Elements);
Chris Lattner94010692012-02-05 02:30:40 +00002572 }
2573
Chris Lattnerd79ed432012-02-06 22:52:04 +00002574 assert(ElemTy->getPrimitiveSizeInBits() == 32);
2575 SmallVector<uint32_t, 32> Elements;
2576 Elements.reserve(NumElements);
2577
2578 for(unsigned i = 0, e = E->getLength(); i != e; ++i)
2579 Elements.push_back(E->getCodeUnit(i));
2580 Elements.resize(NumElements);
2581 return llvm::ConstantDataArray::get(VMContext, Elements);
Eli Friedman64f45a22011-11-01 02:23:42 +00002582}
2583
Daniel Dunbar61432932008-08-13 23:20:05 +00002584/// GetAddrOfConstantStringFromLiteral - Return a pointer to a
2585/// constant array for the given string literal.
2586llvm::Constant *
2587CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) {
Ulrich Weigand6b203512013-05-06 16:23:57 +00002588 CharUnits Align = getContext().getAlignOfGlobalVarInChars(S->getType());
Eli Friedman64f45a22011-11-01 02:23:42 +00002589 if (S->isAscii() || S->isUTF8()) {
Chris Lattner812234b2012-02-06 22:47:00 +00002590 SmallString<64> Str(S->getString());
2591
2592 // Resize the string to the right size, which is indicated by its type.
2593 const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType());
2594 Str.resize(CAT->getSize().getZExtValue());
2595 return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity());
Eli Friedman7eb79c12009-11-16 05:55:46 +00002596 }
Eli Friedman64f45a22011-11-01 02:23:42 +00002597
Chris Lattner812234b2012-02-06 22:47:00 +00002598 // FIXME: the following does not memoize wide strings.
Eli Friedman64f45a22011-11-01 02:23:42 +00002599 llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
2600 llvm::GlobalVariable *GV =
2601 new llvm::GlobalVariable(getModule(),C->getType(),
David Blaikie4e4d0842012-03-11 07:00:24 +00002602 !LangOpts.WritableStrings,
Eli Friedman64f45a22011-11-01 02:23:42 +00002603 llvm::GlobalValue::PrivateLinkage,
2604 C,".str");
Seth Cantrell7d6a7c02012-01-18 12:11:32 +00002605
Eli Friedman64f45a22011-11-01 02:23:42 +00002606 GV->setAlignment(Align.getQuantity());
2607 GV->setUnnamedAddr(true);
Eli Friedman64f45a22011-11-01 02:23:42 +00002608 return GV;
Daniel Dunbar61432932008-08-13 23:20:05 +00002609}
2610
Chris Lattnereaf2bb82009-02-24 22:18:39 +00002611/// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant
2612/// array for the given ObjCEncodeExpr node.
2613llvm::Constant *
2614CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) {
2615 std::string Str;
2616 getContext().getObjCEncodingForType(E->getEncodedType(), Str);
Eli Friedmana210f352009-03-07 20:17:55 +00002617
2618 return GetAddrOfConstantCString(Str);
Chris Lattnereaf2bb82009-02-24 22:18:39 +00002619}
2620
2621
Chris Lattnera7ad98f2008-02-11 00:02:17 +00002622/// GenerateWritableString -- Creates storage for a string literal.
John McCalla5e19c62011-08-04 01:03:22 +00002623static llvm::GlobalVariable *GenerateStringLiteral(StringRef str,
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002624 bool constant,
Daniel Dunbar5fabf9d2008-10-17 21:56:50 +00002625 CodeGenModule &CGM,
John McCalla5e19c62011-08-04 01:03:22 +00002626 const char *GlobalName,
2627 unsigned Alignment) {
Daniel Dunbar61432932008-08-13 23:20:05 +00002628 // Create Constant for this string literal. Don't add a '\0'.
Owen Anderson0032b272009-08-13 21:57:51 +00002629 llvm::Constant *C =
Chris Lattner94010692012-02-05 02:30:40 +00002630 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false);
Mike Stump1eb44332009-09-09 15:08:12 +00002631
Joey Gouly758c4d82013-11-14 18:26:10 +00002632 // OpenCL v1.1 s6.5.3: a string literal is in the constant address space.
2633 unsigned AddrSpace = 0;
2634 if (CGM.getLangOpts().OpenCL)
2635 AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
2636
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002637 // Create a global variable for this string
Joey Gouly758c4d82013-11-14 18:26:10 +00002638 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
2639 CGM.getModule(), C->getType(), constant,
2640 llvm::GlobalValue::PrivateLinkage, C, GlobalName, 0,
2641 llvm::GlobalVariable::NotThreadLocal, AddrSpace);
John McCalla5e19c62011-08-04 01:03:22 +00002642 GV->setAlignment(Alignment);
Rafael Espindola1257bc62011-01-10 22:34:03 +00002643 GV->setUnnamedAddr(true);
2644 return GV;
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002645}
2646
Daniel Dunbar61432932008-08-13 23:20:05 +00002647/// GetAddrOfConstantString - Returns a pointer to a character array
2648/// containing the literal. This contents are exactly that of the
2649/// given string, i.e. it will not be null terminated automatically;
2650/// see GetAddrOfConstantCString. Note that whether the result is
2651/// actually a pointer to an LLVM constant depends on
2652/// Feature.WriteableStrings.
2653///
2654/// The result has pointer to array type.
Chris Lattner5f9e2722011-07-23 10:55:15 +00002655llvm::Constant *CodeGenModule::GetAddrOfConstantString(StringRef Str,
John McCalla5e19c62011-08-04 01:03:22 +00002656 const char *GlobalName,
2657 unsigned Alignment) {
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +00002658 // Get the default prefix if a name wasn't specified.
2659 if (!GlobalName)
Chris Lattner95b851e2009-07-16 05:03:48 +00002660 GlobalName = ".str";
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +00002661
Ulrich Weigand6b203512013-05-06 16:23:57 +00002662 if (Alignment == 0)
2663 Alignment = getContext().getAlignOfGlobalVarInChars(getContext().CharTy)
2664 .getQuantity();
2665
Daniel Dunbar8e5c2b82009-03-31 23:42:16 +00002666 // Don't share any string literals if strings aren't constant.
David Blaikie4e4d0842012-03-11 07:00:24 +00002667 if (LangOpts.WritableStrings)
John McCalla5e19c62011-08-04 01:03:22 +00002668 return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment);
Mike Stump1eb44332009-09-09 15:08:12 +00002669
John McCalla5e19c62011-08-04 01:03:22 +00002670 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
Benjamin Kramer9de43422011-03-05 13:45:23 +00002671 ConstantStringMap.GetOrCreateValue(Str);
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002672
John McCalla5e19c62011-08-04 01:03:22 +00002673 if (llvm::GlobalVariable *GV = Entry.getValue()) {
2674 if (Alignment > GV->getAlignment()) {
2675 GV->setAlignment(Alignment);
2676 }
2677 return GV;
2678 }
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002679
2680 // Create a global variable for this.
Chris Lattner812234b2012-02-06 22:47:00 +00002681 llvm::GlobalVariable *GV = GenerateStringLiteral(Str, true, *this, GlobalName,
2682 Alignment);
John McCalla5e19c62011-08-04 01:03:22 +00002683 Entry.setValue(GV);
2684 return GV;
Chris Lattner45e8cbd2007-11-28 05:34:05 +00002685}
Daniel Dunbar61432932008-08-13 23:20:05 +00002686
2687/// GetAddrOfConstantCString - Returns a pointer to a character
Benjamin Kramer9de43422011-03-05 13:45:23 +00002688/// array containing the literal and a terminating '\0'
Daniel Dunbar61432932008-08-13 23:20:05 +00002689/// character. The result has pointer to array type.
Benjamin Kramer9de43422011-03-05 13:45:23 +00002690llvm::Constant *CodeGenModule::GetAddrOfConstantCString(const std::string &Str,
John McCalla5e19c62011-08-04 01:03:22 +00002691 const char *GlobalName,
2692 unsigned Alignment) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00002693 StringRef StrWithNull(Str.c_str(), Str.size() + 1);
John McCalla5e19c62011-08-04 01:03:22 +00002694 return GetAddrOfConstantString(StrWithNull, GlobalName, Alignment);
Daniel Dunbar61432932008-08-13 23:20:05 +00002695}
Daniel Dunbar41071de2008-08-15 23:26:23 +00002696
Richard Smith211c8dd2013-06-05 00:46:14 +00002697llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
Richard Smith3282b842013-06-14 03:07:01 +00002698 const MaterializeTemporaryExpr *E, const Expr *Init) {
Richard Smith211c8dd2013-06-05 00:46:14 +00002699 assert((E->getStorageDuration() == SD_Static ||
2700 E->getStorageDuration() == SD_Thread) && "not a global temporary");
2701 const VarDecl *VD = cast<VarDecl>(E->getExtendingDecl());
2702
2703 // If we're not materializing a subobject of the temporary, keep the
2704 // cv-qualifiers from the type of the MaterializeTemporaryExpr.
Richard Smith3282b842013-06-14 03:07:01 +00002705 QualType MaterializedType = Init->getType();
2706 if (Init == E->GetTemporaryExpr())
2707 MaterializedType = E->getType();
Richard Smith211c8dd2013-06-05 00:46:14 +00002708
2709 llvm::Constant *&Slot = MaterializedGlobalTemporaryMap[E];
2710 if (Slot)
2711 return Slot;
2712
2713 // FIXME: If an externally-visible declaration extends multiple temporaries,
2714 // we need to give each temporary the same name in every translation unit (and
2715 // we also need to make the temporaries externally-visible).
2716 SmallString<256> Name;
2717 llvm::raw_svector_ostream Out(Name);
2718 getCXXABI().getMangleContext().mangleReferenceTemporary(VD, Out);
2719 Out.flush();
2720
Richard Smith211c8dd2013-06-05 00:46:14 +00002721 APValue *Value = 0;
2722 if (E->getStorageDuration() == SD_Static) {
Richard Smith3282b842013-06-14 03:07:01 +00002723 // We might have a cached constant initializer for this temporary. Note
2724 // that this might have a different value from the value computed by
2725 // evaluating the initializer if the surrounding constant expression
2726 // modifies the temporary.
Richard Smith211c8dd2013-06-05 00:46:14 +00002727 Value = getContext().getMaterializedTemporaryValue(E, false);
2728 if (Value && Value->isUninit())
2729 Value = 0;
2730 }
2731
Richard Smith3282b842013-06-14 03:07:01 +00002732 // Try evaluating it now, it might have a constant initializer.
2733 Expr::EvalResult EvalResult;
2734 if (!Value && Init->EvaluateAsRValue(EvalResult, getContext()) &&
2735 !EvalResult.hasSideEffects())
2736 Value = &EvalResult.Val;
2737
2738 llvm::Constant *InitialValue = 0;
2739 bool Constant = false;
2740 llvm::Type *Type;
Richard Smith211c8dd2013-06-05 00:46:14 +00002741 if (Value) {
2742 // The temporary has a constant initializer, use it.
Richard Smith3282b842013-06-14 03:07:01 +00002743 InitialValue = EmitConstantValue(*Value, MaterializedType, 0);
2744 Constant = isTypeConstant(MaterializedType, /*ExcludeCtor*/Value);
2745 Type = InitialValue->getType();
Richard Smith211c8dd2013-06-05 00:46:14 +00002746 } else {
Richard Smith3282b842013-06-14 03:07:01 +00002747 // No initializer, the initialization will be provided when we
Richard Smith211c8dd2013-06-05 00:46:14 +00002748 // initialize the declaration which performed lifetime extension.
Richard Smith3282b842013-06-14 03:07:01 +00002749 Type = getTypes().ConvertTypeForMem(MaterializedType);
Richard Smith211c8dd2013-06-05 00:46:14 +00002750 }
2751
2752 // Create a global variable for this lifetime-extended temporary.
2753 llvm::GlobalVariable *GV =
Richard Smith3282b842013-06-14 03:07:01 +00002754 new llvm::GlobalVariable(getModule(), Type, Constant,
2755 llvm::GlobalValue::PrivateLinkage,
2756 InitialValue, Name.c_str());
Richard Smith211c8dd2013-06-05 00:46:14 +00002757 GV->setAlignment(
Richard Smith3282b842013-06-14 03:07:01 +00002758 getContext().getTypeAlignInChars(MaterializedType).getQuantity());
Richard Smith211c8dd2013-06-05 00:46:14 +00002759 if (VD->getTLSKind())
2760 setTLSMode(GV, *VD);
2761 Slot = GV;
2762 return GV;
2763}
2764
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002765/// EmitObjCPropertyImplementations - Emit information for synthesized
2766/// properties for an implementation.
Mike Stump1eb44332009-09-09 15:08:12 +00002767void CodeGenModule::EmitObjCPropertyImplementations(const
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002768 ObjCImplementationDecl *D) {
Mike Stump1eb44332009-09-09 15:08:12 +00002769 for (ObjCImplementationDecl::propimpl_iterator
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00002770 i = D->propimpl_begin(), e = D->propimpl_end(); i != e; ++i) {
David Blaikie581deb32012-06-06 20:45:41 +00002771 ObjCPropertyImplDecl *PID = *i;
Mike Stump1eb44332009-09-09 15:08:12 +00002772
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002773 // Dynamic is just for type-checking.
2774 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
2775 ObjCPropertyDecl *PD = PID->getPropertyDecl();
2776
2777 // Determine which methods need to be implemented, some may have
Jordan Rose1e4691b2012-10-10 16:42:25 +00002778 // been overridden. Note that ::isPropertyAccessor is not the method
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002779 // we want, that just indicates if the decl came from a
2780 // property. What we want to know is if the method is defined in
2781 // this implementation.
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00002782 if (!D->getInstanceMethod(PD->getGetterName()))
Fariborz Jahanianfef30b52008-12-09 20:23:04 +00002783 CodeGenFunction(*this).GenerateObjCGetter(
2784 const_cast<ObjCImplementationDecl *>(D), PID);
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002785 if (!PD->isReadOnly() &&
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00002786 !D->getInstanceMethod(PD->getSetterName()))
Fariborz Jahanianfef30b52008-12-09 20:23:04 +00002787 CodeGenFunction(*this).GenerateObjCSetter(
2788 const_cast<ObjCImplementationDecl *>(D), PID);
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002789 }
2790 }
2791}
2792
John McCalle81ac692011-03-22 07:05:39 +00002793static bool needsDestructMethod(ObjCImplementationDecl *impl) {
Jordy Rosedb8264e2011-07-22 02:08:32 +00002794 const ObjCInterfaceDecl *iface = impl->getClassInterface();
2795 for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
John McCalle81ac692011-03-22 07:05:39 +00002796 ivar; ivar = ivar->getNextIvar())
2797 if (ivar->getType().isDestructedType())
2798 return true;
2799
2800 return false;
2801}
2802
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002803/// EmitObjCIvarInitializations - Emit information for ivar initialization
2804/// for an implementation.
2805void CodeGenModule::EmitObjCIvarInitializations(ObjCImplementationDecl *D) {
John McCalle81ac692011-03-22 07:05:39 +00002806 // We might need a .cxx_destruct even if we don't have any ivar initializers.
2807 if (needsDestructMethod(D)) {
2808 IdentifierInfo *II = &getContext().Idents.get(".cxx_destruct");
2809 Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
2810 ObjCMethodDecl *DTORMethod =
2811 ObjCMethodDecl::Create(getContext(), D->getLocation(), D->getLocation(),
Argyrios Kyrtzidis75cf3e82011-08-17 19:25:08 +00002812 cxxSelector, getContext().VoidTy, 0, D,
2813 /*isInstance=*/true, /*isVariadic=*/false,
Jordan Rose1e4691b2012-10-10 16:42:25 +00002814 /*isPropertyAccessor=*/true, /*isImplicitlyDeclared=*/true,
Argyrios Kyrtzidis75cf3e82011-08-17 19:25:08 +00002815 /*isDefined=*/false, ObjCMethodDecl::Required);
John McCalle81ac692011-03-22 07:05:39 +00002816 D->addInstanceMethod(DTORMethod);
2817 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, DTORMethod, false);
John McCallb03527a2012-10-17 04:53:31 +00002818 D->setHasDestructors(true);
John McCalle81ac692011-03-22 07:05:39 +00002819 }
2820
2821 // If the implementation doesn't have any ivar initializers, we don't need
2822 // a .cxx_construct.
David Chisnall827bbcc2011-03-17 14:19:08 +00002823 if (D->getNumIvarInitializers() == 0)
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002824 return;
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002825
John McCalle81ac692011-03-22 07:05:39 +00002826 IdentifierInfo *II = &getContext().Idents.get(".cxx_construct");
2827 Selector cxxSelector = getContext().Selectors.getSelector(0, &II);
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002828 // The constructor returns 'self'.
2829 ObjCMethodDecl *CTORMethod = ObjCMethodDecl::Create(getContext(),
2830 D->getLocation(),
Argyrios Kyrtzidis11d77162011-10-03 06:36:36 +00002831 D->getLocation(),
Argyrios Kyrtzidis11d77162011-10-03 06:36:36 +00002832 cxxSelector,
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002833 getContext().getObjCIdType(), 0,
Argyrios Kyrtzidis75cf3e82011-08-17 19:25:08 +00002834 D, /*isInstance=*/true,
2835 /*isVariadic=*/false,
Jordan Rose1e4691b2012-10-10 16:42:25 +00002836 /*isPropertyAccessor=*/true,
Argyrios Kyrtzidis75cf3e82011-08-17 19:25:08 +00002837 /*isImplicitlyDeclared=*/true,
2838 /*isDefined=*/false,
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002839 ObjCMethodDecl::Required);
2840 D->addInstanceMethod(CTORMethod);
2841 CodeGenFunction(*this).GenerateObjCCtorDtorMethod(D, CTORMethod, true);
John McCallb03527a2012-10-17 04:53:31 +00002842 D->setHasNonZeroConstructors(true);
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002843}
2844
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002845/// EmitNamespace - Emit all declarations in a namespace.
Anders Carlsson984e0682009-04-01 00:58:25 +00002846void CodeGenModule::EmitNamespace(const NamespaceDecl *ND) {
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00002847 for (RecordDecl::decl_iterator I = ND->decls_begin(), E = ND->decls_end();
David Blaikie0d520f72013-09-04 21:07:37 +00002848 I != E; ++I) {
2849 if (const VarDecl *VD = dyn_cast<VarDecl>(*I))
2850 if (VD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
2851 VD->getTemplateSpecializationKind() != TSK_Undeclared)
2852 continue;
Anders Carlsson984e0682009-04-01 00:58:25 +00002853 EmitTopLevelDecl(*I);
David Blaikie0d520f72013-09-04 21:07:37 +00002854 }
Anders Carlsson984e0682009-04-01 00:58:25 +00002855}
2856
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002857// EmitLinkageSpec - Emit all declarations in a linkage spec.
2858void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) {
Eli Friedmanf976be82009-08-01 20:48:04 +00002859 if (LSD->getLanguage() != LinkageSpecDecl::lang_c &&
2860 LSD->getLanguage() != LinkageSpecDecl::lang_cxx) {
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002861 ErrorUnsupported(LSD, "linkage spec");
2862 return;
2863 }
2864
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00002865 for (RecordDecl::decl_iterator I = LSD->decls_begin(), E = LSD->decls_end();
Fariborz Jahanianc1868e52012-10-26 20:22:11 +00002866 I != E; ++I) {
Fariborz Jahanian107dae42012-10-26 22:20:25 +00002867 // Meta-data for ObjC class includes references to implemented methods.
2868 // Generate class's method definitions first.
Fariborz Jahanianc1868e52012-10-26 20:22:11 +00002869 if (ObjCImplDecl *OID = dyn_cast<ObjCImplDecl>(*I)) {
2870 for (ObjCContainerDecl::method_iterator M = OID->meth_begin(),
2871 MEnd = OID->meth_end();
2872 M != MEnd; ++M)
2873 EmitTopLevelDecl(*M);
2874 }
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002875 EmitTopLevelDecl(*I);
Fariborz Jahanianc1868e52012-10-26 20:22:11 +00002876 }
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002877}
2878
Daniel Dunbar41071de2008-08-15 23:26:23 +00002879/// EmitTopLevelDecl - Emit code for a single top level declaration.
2880void CodeGenModule::EmitTopLevelDecl(Decl *D) {
Douglas Gregor16e8be22009-06-29 17:30:29 +00002881 // Ignore dependent declarations.
2882 if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
2883 return;
Mike Stump1eb44332009-09-09 15:08:12 +00002884
Daniel Dunbar41071de2008-08-15 23:26:23 +00002885 switch (D->getKind()) {
Anders Carlsson293361a2009-08-25 13:14:46 +00002886 case Decl::CXXConversion:
Anders Carlsson2b77ba82009-04-04 20:47:02 +00002887 case Decl::CXXMethod:
Daniel Dunbar41071de2008-08-15 23:26:23 +00002888 case Decl::Function:
Douglas Gregor16e8be22009-06-29 17:30:29 +00002889 // Skip function templates
Francois Pichet8387e2a2011-04-22 22:18:13 +00002890 if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
2891 cast<FunctionDecl>(D)->isLateTemplateParsed())
Douglas Gregor16e8be22009-06-29 17:30:29 +00002892 return;
Mike Stump1eb44332009-09-09 15:08:12 +00002893
Anders Carlsson555b4bb2009-09-10 23:43:36 +00002894 EmitGlobal(cast<FunctionDecl>(D));
2895 break;
Larisse Voufoef4579c2013-08-06 01:03:05 +00002896
Daniel Dunbar41071de2008-08-15 23:26:23 +00002897 case Decl::Var:
Larisse Voufoef4579c2013-08-06 01:03:05 +00002898 // Skip variable templates
2899 if (cast<VarDecl>(D)->getDescribedVarTemplate())
2900 return;
2901 case Decl::VarTemplateSpecialization:
Anders Carlsson555b4bb2009-09-10 23:43:36 +00002902 EmitGlobal(cast<VarDecl>(D));
Daniel Dunbar41071de2008-08-15 23:26:23 +00002903 break;
2904
John McCall26fbc722011-04-12 01:01:22 +00002905 // Indirect fields from global anonymous structs and unions can be
2906 // ignored; only the actual variable requires IR gen support.
2907 case Decl::IndirectField:
2908 break;
2909
Anders Carlsson95d4e5d2009-04-15 15:55:24 +00002910 // C++ Decls
Daniel Dunbar41071de2008-08-15 23:26:23 +00002911 case Decl::Namespace:
Anders Carlsson984e0682009-04-01 00:58:25 +00002912 EmitNamespace(cast<NamespaceDecl>(D));
Daniel Dunbar41071de2008-08-15 23:26:23 +00002913 break;
Douglas Gregor9cfbe482009-06-20 00:51:54 +00002914 // No code generation needed.
John McCall9d0c6612009-11-17 09:33:40 +00002915 case Decl::UsingShadow:
Douglas Gregor9cfbe482009-06-20 00:51:54 +00002916 case Decl::Using:
Douglas Gregor127102b2009-06-29 20:59:39 +00002917 case Decl::ClassTemplate:
Larisse Voufoef4579c2013-08-06 01:03:05 +00002918 case Decl::VarTemplate:
2919 case Decl::VarTemplatePartialSpecialization:
Douglas Gregor127102b2009-06-29 20:59:39 +00002920 case Decl::FunctionTemplate:
Richard Smith3e4c6c42011-05-05 21:57:07 +00002921 case Decl::TypeAliasTemplate:
Douglas Gregor6a576ab2011-06-05 05:04:23 +00002922 case Decl::Block:
Michael Han684aa732013-02-22 17:15:32 +00002923 case Decl::Empty:
Douglas Gregor9cfbe482009-06-20 00:51:54 +00002924 break;
David Blaikiefc46ebc2013-05-20 22:50:41 +00002925 case Decl::NamespaceAlias:
2926 if (CGDebugInfo *DI = getModuleDebugInfo())
2927 DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(*D));
2928 return;
David Blaikie1601a4a2013-04-26 05:41:06 +00002929 case Decl::UsingDirective: // using namespace X; [C++]
2930 if (CGDebugInfo *DI = getModuleDebugInfo())
2931 DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D));
2932 return;
Anders Carlsson95d4e5d2009-04-15 15:55:24 +00002933 case Decl::CXXConstructor:
Anders Carlsson1fe598c2009-11-24 05:16:24 +00002934 // Skip function templates
Francois Pichet8387e2a2011-04-22 22:18:13 +00002935 if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() ||
2936 cast<FunctionDecl>(D)->isLateTemplateParsed())
Anders Carlsson1fe598c2009-11-24 05:16:24 +00002937 return;
2938
Timur Iskhodzhanovbb1b7972013-08-04 17:30:04 +00002939 getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D));
Anders Carlsson95d4e5d2009-04-15 15:55:24 +00002940 break;
Anders Carlsson27ae5362009-04-17 01:58:57 +00002941 case Decl::CXXDestructor:
Francois Pichet8387e2a2011-04-22 22:18:13 +00002942 if (cast<FunctionDecl>(D)->isLateTemplateParsed())
2943 return;
Reid Klecknera4130ba2013-07-22 13:51:44 +00002944 getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D));
Anders Carlsson27ae5362009-04-17 01:58:57 +00002945 break;
Anders Carlsson36674d22009-06-11 21:22:55 +00002946
2947 case Decl::StaticAssert:
2948 // Nothing to do.
2949 break;
2950
Anders Carlsson95d4e5d2009-04-15 15:55:24 +00002951 // Objective-C Decls
Mike Stump1eb44332009-09-09 15:08:12 +00002952
Fariborz Jahanian38e24c72009-03-18 22:33:24 +00002953 // Forward declarations, no (immediate) code generation.
Chris Lattner285d0db2009-04-01 02:36:43 +00002954 case Decl::ObjCInterface:
Eric Christopherffb0c3a2012-07-19 22:22:55 +00002955 case Decl::ObjCCategory:
Chris Lattner285d0db2009-04-01 02:36:43 +00002956 break;
2957
Douglas Gregorbd9482d2012-01-01 21:23:57 +00002958 case Decl::ObjCProtocol: {
2959 ObjCProtocolDecl *Proto = cast<ObjCProtocolDecl>(D);
2960 if (Proto->isThisDeclarationADefinition())
2961 ObjCRuntime->GenerateProtocol(Proto);
Daniel Dunbar41071de2008-08-15 23:26:23 +00002962 break;
Douglas Gregorbd9482d2012-01-01 21:23:57 +00002963 }
2964
Daniel Dunbar41071de2008-08-15 23:26:23 +00002965 case Decl::ObjCCategoryImpl:
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002966 // Categories have properties but don't support synthesize so we
2967 // can ignore them here.
Peter Collingbournee9265232011-07-27 20:29:46 +00002968 ObjCRuntime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
Daniel Dunbar41071de2008-08-15 23:26:23 +00002969 break;
2970
Daniel Dunbaraf05bb92008-08-26 08:29:31 +00002971 case Decl::ObjCImplementation: {
2972 ObjCImplementationDecl *OMD = cast<ObjCImplementationDecl>(D);
2973 EmitObjCPropertyImplementations(OMD);
Fariborz Jahanian109dfc62010-04-28 21:28:56 +00002974 EmitObjCIvarInitializations(OMD);
Peter Collingbournee9265232011-07-27 20:29:46 +00002975 ObjCRuntime->GenerateClass(OMD);
Eric Christopherbe6c6862012-04-11 05:56:05 +00002976 // Emit global variable debug information.
2977 if (CGDebugInfo *DI = getModuleDebugInfo())
Alexey Samsonov96a66392012-12-03 18:28:12 +00002978 if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
2979 DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
2980 OMD->getClassInterface()), OMD->getLocation());
Daniel Dunbar41071de2008-08-15 23:26:23 +00002981 break;
Mike Stump1eb44332009-09-09 15:08:12 +00002982 }
Daniel Dunbar41071de2008-08-15 23:26:23 +00002983 case Decl::ObjCMethod: {
2984 ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(D);
2985 // If this is not a prototype, emit the body.
Argyrios Kyrtzidis6fb0aee2009-06-30 02:35:26 +00002986 if (OMD->getBody())
Daniel Dunbar41071de2008-08-15 23:26:23 +00002987 CodeGenFunction(*this).GenerateObjCMethod(OMD);
2988 break;
2989 }
Mike Stump1eb44332009-09-09 15:08:12 +00002990 case Decl::ObjCCompatibleAlias:
David Chisnall29254f42012-01-31 18:59:20 +00002991 ObjCRuntime->RegisterAlias(cast<ObjCCompatibleAliasDecl>(D));
Daniel Dunbar41071de2008-08-15 23:26:23 +00002992 break;
2993
Anders Carlsson91e20dd2009-04-02 05:55:18 +00002994 case Decl::LinkageSpec:
2995 EmitLinkageSpec(cast<LinkageSpecDecl>(D));
Daniel Dunbar41071de2008-08-15 23:26:23 +00002996 break;
Daniel Dunbar41071de2008-08-15 23:26:23 +00002997
2998 case Decl::FileScopeAsm: {
2999 FileScopeAsmDecl *AD = cast<FileScopeAsmDecl>(D);
Chris Lattner5f9e2722011-07-23 10:55:15 +00003000 StringRef AsmString = AD->getAsmString()->getString();
Mike Stump1eb44332009-09-09 15:08:12 +00003001
Daniel Dunbar41071de2008-08-15 23:26:23 +00003002 const std::string &S = getModule().getModuleInlineAsm();
3003 if (S.empty())
3004 getModule().setModuleInlineAsm(AsmString);
Joerg Sonnenberger8ce9cca2012-08-10 10:57:52 +00003005 else if (S.end()[-1] == '\n')
Chris Lattner9f5bff02011-07-23 20:04:25 +00003006 getModule().setModuleInlineAsm(S + AsmString.str());
Daniel Dunbar41071de2008-08-15 23:26:23 +00003007 else
Benjamin Kramer8d042582009-12-11 13:33:18 +00003008 getModule().setModuleInlineAsm(S + '\n' + AsmString.str());
Daniel Dunbar41071de2008-08-15 23:26:23 +00003009 break;
3010 }
Mike Stump1eb44332009-09-09 15:08:12 +00003011
Douglas Gregorb6cbe512013-01-14 17:21:00 +00003012 case Decl::Import: {
3013 ImportDecl *Import = cast<ImportDecl>(D);
3014
3015 // Ignore import declarations that come from imported modules.
3016 if (clang::Module *Owner = Import->getOwningModule()) {
3017 if (getLangOpts().CurrentModule.empty() ||
3018 Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)
3019 break;
3020 }
3021
Douglas Gregor858afb32013-01-14 20:53:57 +00003022 ImportedModules.insert(Import->getImportedModule());
Douglas Gregorb6cbe512013-01-14 17:21:00 +00003023 break;
3024 }
3025
Mike Stump1eb44332009-09-09 15:08:12 +00003026 default:
Mike Stumpf5408fe2009-05-16 07:57:57 +00003027 // Make sure we handled everything we should, every other kind is a
3028 // non-top-level decl. FIXME: Would be nice to have an isTopLevelDeclKind
3029 // function. Need to recode Decl::Kind to do that easily.
Daniel Dunbar41071de2008-08-15 23:26:23 +00003030 assert(isa<TypeDecl>(D) && "Unsupported decl kind");
3031 }
3032}
John McCall744016d2010-07-06 23:57:41 +00003033
3034/// Turns the given pointer into a constant.
3035static llvm::Constant *GetPointerConstant(llvm::LLVMContext &Context,
3036 const void *Ptr) {
3037 uintptr_t PtrInt = reinterpret_cast<uintptr_t>(Ptr);
Chris Lattner2acc6e32011-07-18 04:24:23 +00003038 llvm::Type *i64 = llvm::Type::getInt64Ty(Context);
John McCall744016d2010-07-06 23:57:41 +00003039 return llvm::ConstantInt::get(i64, PtrInt);
3040}
3041
3042static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
3043 llvm::NamedMDNode *&GlobalMetadata,
3044 GlobalDecl D,
3045 llvm::GlobalValue *Addr) {
3046 if (!GlobalMetadata)
3047 GlobalMetadata =
3048 CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
3049
3050 // TODO: should we report variant information for ctors/dtors?
3051 llvm::Value *Ops[] = {
3052 Addr,
3053 GetPointerConstant(CGM.getLLVMContext(), D.getDecl())
3054 };
Jay Foad6f141652011-04-21 19:59:12 +00003055 GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
John McCall744016d2010-07-06 23:57:41 +00003056}
3057
Richard Smith00249372013-04-06 05:00:46 +00003058/// For each function which is declared within an extern "C" region and marked
3059/// as 'used', but has internal linkage, create an alias from the unmangled
3060/// name to the mangled name if possible. People expect to be able to refer
3061/// to such functions with an unmangled name from inline assembly within the
3062/// same translation unit.
3063void CodeGenModule::EmitStaticExternCAliases() {
Richard Smith84083b72013-04-13 01:28:18 +00003064 for (StaticExternCMap::iterator I = StaticExternCValues.begin(),
3065 E = StaticExternCValues.end();
3066 I != E; ++I) {
3067 IdentifierInfo *Name = I->first;
3068 llvm::GlobalValue *Val = I->second;
Richard Smith67972042013-04-06 07:07:44 +00003069 if (Val && !getModule().getNamedValue(Name->getName()))
3070 AddUsedGlobal(new llvm::GlobalAlias(Val->getType(), Val->getLinkage(),
3071 Name->getName(), Val, &getModule()));
3072 }
Richard Smith00249372013-04-06 05:00:46 +00003073}
3074
John McCall744016d2010-07-06 23:57:41 +00003075/// Emits metadata nodes associating all the global values in the
3076/// current module with the Decls they came from. This is useful for
3077/// projects using IR gen as a subroutine.
3078///
3079/// Since there's currently no way to associate an MDNode directly
3080/// with an llvm::GlobalValue, we create a global named metadata
3081/// with the name 'clang.global.decl.ptrs'.
3082void CodeGenModule::EmitDeclMetadata() {
3083 llvm::NamedMDNode *GlobalMetadata = 0;
3084
3085 // StaticLocalDeclMap
Chris Lattner5f9e2722011-07-23 10:55:15 +00003086 for (llvm::DenseMap<GlobalDecl,StringRef>::iterator
John McCall744016d2010-07-06 23:57:41 +00003087 I = MangledDeclNames.begin(), E = MangledDeclNames.end();
3088 I != E; ++I) {
3089 llvm::GlobalValue *Addr = getModule().getNamedValue(I->second);
3090 EmitGlobalDeclMetadata(*this, GlobalMetadata, I->first, Addr);
3091 }
3092}
3093
3094/// Emits metadata nodes for all the local variables in the current
3095/// function.
3096void CodeGenFunction::EmitDeclMetadata() {
3097 if (LocalDeclMap.empty()) return;
3098
3099 llvm::LLVMContext &Context = getLLVMContext();
3100
3101 // Find the unique metadata ID for this name.
3102 unsigned DeclPtrKind = Context.getMDKindID("clang.decl.ptr");
3103
3104 llvm::NamedMDNode *GlobalMetadata = 0;
3105
3106 for (llvm::DenseMap<const Decl*, llvm::Value*>::iterator
3107 I = LocalDeclMap.begin(), E = LocalDeclMap.end(); I != E; ++I) {
3108 const Decl *D = I->first;
3109 llvm::Value *Addr = I->second;
3110
3111 if (llvm::AllocaInst *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
3112 llvm::Value *DAddr = GetPointerConstant(getLLVMContext(), D);
Jay Foad6f141652011-04-21 19:59:12 +00003113 Alloca->setMetadata(DeclPtrKind, llvm::MDNode::get(Context, DAddr));
John McCall744016d2010-07-06 23:57:41 +00003114 } else if (llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
3115 GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
3116 EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
3117 }
3118 }
3119}
Daniel Dunbar673431a2010-07-16 00:00:15 +00003120
Rafael Espindola9686f122013-10-16 19:28:50 +00003121void CodeGenModule::EmitVersionIdentMetadata() {
3122 llvm::NamedMDNode *IdentMetadata =
3123 TheModule.getOrInsertNamedMetadata("llvm.ident");
3124 std::string Version = getClangFullVersion();
3125 llvm::LLVMContext &Ctx = TheModule.getContext();
3126
3127 llvm::Value *IdentNode[] = {
3128 llvm::MDString::get(Ctx, Version)
3129 };
3130 IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
3131}
3132
Nick Lewycky3dc05412011-05-05 00:08:20 +00003133void CodeGenModule::EmitCoverageFile() {
3134 if (!getCodeGenOpts().CoverageFile.empty()) {
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003135 if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
3136 llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov");
3137 llvm::LLVMContext &Ctx = TheModule.getContext();
Nick Lewycky3dc05412011-05-05 00:08:20 +00003138 llvm::MDString *CoverageFile =
3139 llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile);
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003140 for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
3141 llvm::MDNode *CU = CUNode->getOperand(i);
Nick Lewycky3dc05412011-05-05 00:08:20 +00003142 llvm::Value *node[] = { CoverageFile, CU };
Nick Lewycky5ea4f442011-05-04 20:46:58 +00003143 llvm::MDNode *N = llvm::MDNode::get(Ctx, node);
3144 GCov->addOperand(N);
3145 }
3146 }
3147 }
3148}
Nico Weberc5f80462012-10-11 10:13:44 +00003149
3150llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid,
3151 QualType GuidType) {
3152 // Sema has checked that all uuid strings are of the form
3153 // "12345678-1234-1234-1234-1234567890ab".
3154 assert(Uuid.size() == 36);
David Majnemer8effeda2013-08-15 19:59:14 +00003155 for (unsigned i = 0; i < 36; ++i) {
3156 if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuid[i] == '-');
3157 else assert(isHexDigit(Uuid[i]));
Nico Weberc5f80462012-10-11 10:13:44 +00003158 }
Nico Weberc5f80462012-10-11 10:13:44 +00003159
David Majnemer8effeda2013-08-15 19:59:14 +00003160 const unsigned Field3ValueOffsets[8] = { 19, 21, 24, 26, 28, 30, 32, 34 };
Nico Weberc5f80462012-10-11 10:13:44 +00003161
David Majnemer8effeda2013-08-15 19:59:14 +00003162 llvm::Constant *Field3[8];
3163 for (unsigned Idx = 0; Idx < 8; ++Idx)
3164 Field3[Idx] = llvm::ConstantInt::get(
3165 Int8Ty, Uuid.substr(Field3ValueOffsets[Idx], 2), 16);
3166
3167 llvm::Constant *Fields[4] = {
3168 llvm::ConstantInt::get(Int32Ty, Uuid.substr(0, 8), 16),
3169 llvm::ConstantInt::get(Int16Ty, Uuid.substr(9, 4), 16),
3170 llvm::ConstantInt::get(Int16Ty, Uuid.substr(14, 4), 16),
3171 llvm::ConstantArray::get(llvm::ArrayType::get(Int8Ty, 8), Field3)
3172 };
3173
3174 return llvm::ConstantStruct::getAnon(Fields);
Nico Weberc5f80462012-10-11 10:13:44 +00003175}