1 //===------- ItaniumCXXABI.cpp - Emit LLVM Code from ASTs for a Module ----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This provides C++ code generation targeting the Itanium C++ ABI.  The class
11 // in this file generates structures that follow the Itanium C++ ABI, which is
12 // documented at:
13 //  http://www.codesourcery.com/public/cxx-abi/abi.html
14 //  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
15 //
16 // It also supports the closely-related ARM ABI, documented at:
17 // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf
18 //
19 //===----------------------------------------------------------------------===//
20 
21 #include "CGCXXABI.h"
22 #include "CGRecordLayout.h"
23 #include "CodeGenFunction.h"
24 #include "CodeGenModule.h"
25 #include <clang/AST/Mangle.h>
26 #include <clang/AST/Type.h>
27 #include <llvm/Intrinsics.h>
28 #include <llvm/Target/TargetData.h>
29 #include <llvm/Value.h>
30 
31 using namespace clang;
32 using namespace CodeGen;
33 
34 namespace {
35 class ItaniumCXXABI : public CodeGen::CGCXXABI {
36 private:
37   llvm::IntegerType *PtrDiffTy;
38 protected:
39   bool IsARM;
40 
41   // It's a little silly for us to cache this.
42   llvm::IntegerType *getPtrDiffTy() {
43     if (!PtrDiffTy) {
44       QualType T = getContext().getPointerDiffType();
45       llvm::Type *Ty = CGM.getTypes().ConvertType(T);
46       PtrDiffTy = cast<llvm::IntegerType>(Ty);
47     }
48     return PtrDiffTy;
49   }
50 
51   bool NeedsArrayCookie(const CXXNewExpr *expr);
52   bool NeedsArrayCookie(const CXXDeleteExpr *expr,
53                         QualType elementType);
54 
55 public:
56   ItaniumCXXABI(CodeGen::CodeGenModule &CGM, bool IsARM = false) :
57     CGCXXABI(CGM), PtrDiffTy(0), IsARM(IsARM) { }
58 
59   bool isZeroInitializable(const MemberPointerType *MPT);
60 
61   llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
62 
63   llvm::Value *EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
64                                                llvm::Value *&This,
65                                                llvm::Value *MemFnPtr,
66                                                const MemberPointerType *MPT);
67 
68   llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF,
69                                             llvm::Value *Base,
70                                             llvm::Value *MemPtr,
71                                             const MemberPointerType *MPT);
72 
73   llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
74                                            const CastExpr *E,
75                                            llvm::Value *Src);
76 
77   llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
78 
79   llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
80   llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
81                                         CharUnits offset);
82   llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT);
83   llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
84                                      CharUnits ThisAdjustment);
85 
86   llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
87                                            llvm::Value *L,
88                                            llvm::Value *R,
89                                            const MemberPointerType *MPT,
90                                            bool Inequality);
91 
92   llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
93                                           llvm::Value *Addr,
94                                           const MemberPointerType *MPT);
95 
96   void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
97                                  CXXCtorType T,
98                                  CanQualType &ResTy,
99                                  SmallVectorImpl<CanQualType> &ArgTys);
100 
101   void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
102                                 CXXDtorType T,
103                                 CanQualType &ResTy,
104                                 SmallVectorImpl<CanQualType> &ArgTys);
105 
106   void BuildInstanceFunctionParams(CodeGenFunction &CGF,
107                                    QualType &ResTy,
108                                    FunctionArgList &Params);
109 
110   void EmitInstanceFunctionProlog(CodeGenFunction &CGF);
111 
112   CharUnits GetArrayCookieSize(const CXXNewExpr *expr);
113   llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
114                                      llvm::Value *NewPtr,
115                                      llvm::Value *NumElements,
116                                      const CXXNewExpr *expr,
117                                      QualType ElementType);
118   void ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
119                        const CXXDeleteExpr *expr,
120                        QualType ElementType, llvm::Value *&NumElements,
121                        llvm::Value *&AllocPtr, CharUnits &CookieSize);
122 
123   void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
124                        llvm::GlobalVariable *DeclPtr);
125 };
126 
127 class ARMCXXABI : public ItaniumCXXABI {
128 public:
129   ARMCXXABI(CodeGen::CodeGenModule &CGM) : ItaniumCXXABI(CGM, /*ARM*/ true) {}
130 
131   void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
132                                  CXXCtorType T,
133                                  CanQualType &ResTy,
134                                  SmallVectorImpl<CanQualType> &ArgTys);
135 
136   void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
137                                 CXXDtorType T,
138                                 CanQualType &ResTy,
139                                 SmallVectorImpl<CanQualType> &ArgTys);
140 
141   void BuildInstanceFunctionParams(CodeGenFunction &CGF,
142                                    QualType &ResTy,
143                                    FunctionArgList &Params);
144 
145   void EmitInstanceFunctionProlog(CodeGenFunction &CGF);
146 
147   void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV, QualType ResTy);
148 
149   CharUnits GetArrayCookieSize(const CXXNewExpr *expr);
150   llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
151                                      llvm::Value *NewPtr,
152                                      llvm::Value *NumElements,
153                                      const CXXNewExpr *expr,
154                                      QualType ElementType);
155   void ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
156                        const CXXDeleteExpr *expr,
157                        QualType ElementType, llvm::Value *&NumElements,
158                        llvm::Value *&AllocPtr, CharUnits &CookieSize);
159 
160 private:
161   /// \brief Returns true if the given instance method is one of the
162   /// kinds that the ARM ABI says returns 'this'.
163   static bool HasThisReturn(GlobalDecl GD) {
164     const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
165     return ((isa<CXXDestructorDecl>(MD) && GD.getDtorType() != Dtor_Deleting) ||
166             (isa<CXXConstructorDecl>(MD)));
167   }
168 };
169 }
170 
171 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
172   return new ItaniumCXXABI(CGM);
173 }
174 
175 CodeGen::CGCXXABI *CodeGen::CreateARMCXXABI(CodeGenModule &CGM) {
176   return new ARMCXXABI(CGM);
177 }
178 
179 llvm::Type *
180 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
181   if (MPT->isMemberDataPointer())
182     return getPtrDiffTy();
183   return llvm::StructType::get(getPtrDiffTy(), getPtrDiffTy(), NULL);
184 }
185 
186 /// In the Itanium and ARM ABIs, method pointers have the form:
187 ///   struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
188 ///
189 /// In the Itanium ABI:
190 ///  - method pointers are virtual if (memptr.ptr & 1) is nonzero
191 ///  - the this-adjustment is (memptr.adj)
192 ///  - the virtual offset is (memptr.ptr - 1)
193 ///
194 /// In the ARM ABI:
195 ///  - method pointers are virtual if (memptr.adj & 1) is nonzero
196 ///  - the this-adjustment is (memptr.adj >> 1)
197 ///  - the virtual offset is (memptr.ptr)
198 /// ARM uses 'adj' for the virtual flag because Thumb functions
199 /// may be only single-byte aligned.
200 ///
201 /// If the member is virtual, the adjusted 'this' pointer points
202 /// to a vtable pointer from which the virtual offset is applied.
203 ///
204 /// If the member is non-virtual, memptr.ptr is the address of
205 /// the function to call.
206 llvm::Value *
207 ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
208                                                llvm::Value *&This,
209                                                llvm::Value *MemFnPtr,
210                                                const MemberPointerType *MPT) {
211   CGBuilderTy &Builder = CGF.Builder;
212 
213   const FunctionProtoType *FPT =
214     MPT->getPointeeType()->getAs<FunctionProtoType>();
215   const CXXRecordDecl *RD =
216     cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
217 
218   llvm::FunctionType *FTy =
219     CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT),
220                                    FPT->isVariadic());
221 
222   llvm::IntegerType *ptrdiff = getPtrDiffTy();
223   llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(ptrdiff, 1);
224 
225   llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
226   llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
227   llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
228 
229   // Extract memptr.adj, which is in the second field.
230   llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
231 
232   // Compute the true adjustment.
233   llvm::Value *Adj = RawAdj;
234   if (IsARM)
235     Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
236 
237   // Apply the adjustment and cast back to the original struct type
238   // for consistency.
239   llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
240   Ptr = Builder.CreateInBoundsGEP(Ptr, Adj);
241   This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
242 
243   // Load the function pointer.
244   llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
245 
246   // If the LSB in the function pointer is 1, the function pointer points to
247   // a virtual function.
248   llvm::Value *IsVirtual;
249   if (IsARM)
250     IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
251   else
252     IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
253   IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
254   Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
255 
256   // In the virtual path, the adjustment left 'This' pointing to the
257   // vtable of the correct base subobject.  The "function pointer" is an
258   // offset within the vtable (+1 for the virtual flag on non-ARM).
259   CGF.EmitBlock(FnVirtual);
260 
261   // Cast the adjusted this to a pointer to vtable pointer and load.
262   llvm::Type *VTableTy = Builder.getInt8PtrTy();
263   llvm::Value *VTable = Builder.CreateBitCast(This, VTableTy->getPointerTo());
264   VTable = Builder.CreateLoad(VTable, "memptr.vtable");
265 
266   // Apply the offset.
267   llvm::Value *VTableOffset = FnAsInt;
268   if (!IsARM) VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
269   VTable = Builder.CreateGEP(VTable, VTableOffset);
270 
271   // Load the virtual function to call.
272   VTable = Builder.CreateBitCast(VTable, FTy->getPointerTo()->getPointerTo());
273   llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "memptr.virtualfn");
274   CGF.EmitBranch(FnEnd);
275 
276   // In the non-virtual path, the function pointer is actually a
277   // function pointer.
278   CGF.EmitBlock(FnNonVirtual);
279   llvm::Value *NonVirtualFn =
280     Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
281 
282   // We're done.
283   CGF.EmitBlock(FnEnd);
284   llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo(), 2);
285   Callee->addIncoming(VirtualFn, FnVirtual);
286   Callee->addIncoming(NonVirtualFn, FnNonVirtual);
287   return Callee;
288 }
289 
290 /// Compute an l-value by applying the given pointer-to-member to a
291 /// base object.
292 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
293                                                          llvm::Value *Base,
294                                                          llvm::Value *MemPtr,
295                                            const MemberPointerType *MPT) {
296   assert(MemPtr->getType() == getPtrDiffTy());
297 
298   CGBuilderTy &Builder = CGF.Builder;
299 
300   unsigned AS = cast<llvm::PointerType>(Base->getType())->getAddressSpace();
301 
302   // Cast to char*.
303   Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
304 
305   // Apply the offset, which we assume is non-null.
306   llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, MemPtr, "memptr.offset");
307 
308   // Cast the address to the appropriate pointer type, adopting the
309   // address space of the base pointer.
310   llvm::Type *PType
311     = CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
312   return Builder.CreateBitCast(Addr, PType);
313 }
314 
315 /// Perform a derived-to-base or base-to-derived member pointer conversion.
316 ///
317 /// Obligatory offset/adjustment diagram:
318 ///         <-- offset -->          <-- adjustment -->
319 ///   |--------------------------|----------------------|--------------------|
320 ///   ^Derived address point     ^Base address point    ^Member address point
321 ///
322 /// So when converting a base member pointer to a derived member pointer,
323 /// we add the offset to the adjustment because the address point has
324 /// decreased;  and conversely, when converting a derived MP to a base MP
325 /// we subtract the offset from the adjustment because the address point
326 /// has increased.
327 ///
328 /// The standard forbids (at compile time) conversion to and from
329 /// virtual bases, which is why we don't have to consider them here.
330 ///
331 /// The standard forbids (at run time) casting a derived MP to a base
332 /// MP when the derived MP does not point to a member of the base.
333 /// This is why -1 is a reasonable choice for null data member
334 /// pointers.
335 llvm::Value *
336 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
337                                            const CastExpr *E,
338                                            llvm::Value *Src) {
339   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
340          E->getCastKind() == CK_BaseToDerivedMemberPointer);
341 
342   CGBuilderTy &Builder = CGF.Builder;
343 
344   const MemberPointerType *SrcTy =
345     E->getSubExpr()->getType()->getAs<MemberPointerType>();
346   const MemberPointerType *DestTy = E->getType()->getAs<MemberPointerType>();
347 
348   const CXXRecordDecl *SrcDecl = SrcTy->getClass()->getAsCXXRecordDecl();
349   const CXXRecordDecl *DestDecl = DestTy->getClass()->getAsCXXRecordDecl();
350 
351   bool DerivedToBase =
352     E->getCastKind() == CK_DerivedToBaseMemberPointer;
353 
354   const CXXRecordDecl *DerivedDecl;
355   if (DerivedToBase)
356     DerivedDecl = SrcDecl;
357   else
358     DerivedDecl = DestDecl;
359 
360   llvm::Constant *Adj =
361     CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl,
362                                          E->path_begin(),
363                                          E->path_end());
364   if (!Adj) return Src;
365 
366   // For member data pointers, this is just a matter of adding the
367   // offset if the source is non-null.
368   if (SrcTy->isMemberDataPointer()) {
369     llvm::Value *Dst;
370     if (DerivedToBase)
371       Dst = Builder.CreateNSWSub(Src, Adj, "adj");
372     else
373       Dst = Builder.CreateNSWAdd(Src, Adj, "adj");
374 
375     // Null check.
376     llvm::Value *Null = llvm::Constant::getAllOnesValue(Src->getType());
377     llvm::Value *IsNull = Builder.CreateICmpEQ(Src, Null, "memptr.isnull");
378     return Builder.CreateSelect(IsNull, Src, Dst);
379   }
380 
381   // The this-adjustment is left-shifted by 1 on ARM.
382   if (IsARM) {
383     uint64_t Offset = cast<llvm::ConstantInt>(Adj)->getZExtValue();
384     Offset <<= 1;
385     Adj = llvm::ConstantInt::get(Adj->getType(), Offset);
386   }
387 
388   llvm::Value *SrcAdj = Builder.CreateExtractValue(Src, 1, "src.adj");
389   llvm::Value *DstAdj;
390   if (DerivedToBase)
391     DstAdj = Builder.CreateNSWSub(SrcAdj, Adj, "adj");
392   else
393     DstAdj = Builder.CreateNSWAdd(SrcAdj, Adj, "adj");
394 
395   return Builder.CreateInsertValue(Src, DstAdj, 1);
396 }
397 
398 llvm::Constant *
399 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
400   llvm::Type *ptrdiff_t = getPtrDiffTy();
401 
402   // Itanium C++ ABI 2.3:
403   //   A NULL pointer is represented as -1.
404   if (MPT->isMemberDataPointer())
405     return llvm::ConstantInt::get(ptrdiff_t, -1ULL, /*isSigned=*/true);
406 
407   llvm::Constant *Zero = llvm::ConstantInt::get(ptrdiff_t, 0);
408   llvm::Constant *Values[2] = { Zero, Zero };
409   return llvm::ConstantStruct::getAnon(Values);
410 }
411 
412 llvm::Constant *
413 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
414                                      CharUnits offset) {
415   // Itanium C++ ABI 2.3:
416   //   A pointer to data member is an offset from the base address of
417   //   the class object containing it, represented as a ptrdiff_t
418   return llvm::ConstantInt::get(getPtrDiffTy(), offset.getQuantity());
419 }
420 
421 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
422   return BuildMemberPointer(MD, CharUnits::Zero());
423 }
424 
425 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
426                                                   CharUnits ThisAdjustment) {
427   assert(MD->isInstance() && "Member function must not be static!");
428   MD = MD->getCanonicalDecl();
429 
430   CodeGenTypes &Types = CGM.getTypes();
431   llvm::Type *ptrdiff_t = getPtrDiffTy();
432 
433   // Get the function pointer (or index if this is a virtual function).
434   llvm::Constant *MemPtr[2];
435   if (MD->isVirtual()) {
436     uint64_t Index = CGM.getVTableContext().getMethodVTableIndex(MD);
437 
438     const ASTContext &Context = getContext();
439     CharUnits PointerWidth =
440       Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
441     uint64_t VTableOffset = (Index * PointerWidth.getQuantity());
442 
443     if (IsARM) {
444       // ARM C++ ABI 3.2.1:
445       //   This ABI specifies that adj contains twice the this
446       //   adjustment, plus 1 if the member function is virtual. The
447       //   least significant bit of adj then makes exactly the same
448       //   discrimination as the least significant bit of ptr does for
449       //   Itanium.
450       MemPtr[0] = llvm::ConstantInt::get(ptrdiff_t, VTableOffset);
451       MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t,
452                                          2 * ThisAdjustment.getQuantity() + 1);
453     } else {
454       // Itanium C++ ABI 2.3:
455       //   For a virtual function, [the pointer field] is 1 plus the
456       //   virtual table offset (in bytes) of the function,
457       //   represented as a ptrdiff_t.
458       MemPtr[0] = llvm::ConstantInt::get(ptrdiff_t, VTableOffset + 1);
459       MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t,
460                                          ThisAdjustment.getQuantity());
461     }
462   } else {
463     const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
464     llvm::Type *Ty;
465     // Check whether the function has a computable LLVM signature.
466     if (Types.isFuncTypeConvertible(FPT)) {
467       // The function has a computable LLVM signature; use the correct type.
468       Ty = Types.GetFunctionType(Types.getFunctionInfo(MD),
469                                  FPT->isVariadic());
470     } else {
471       // Use an arbitrary non-function type to tell GetAddrOfFunction that the
472       // function type is incomplete.
473       Ty = ptrdiff_t;
474     }
475     llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
476 
477     MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, ptrdiff_t);
478     MemPtr[1] = llvm::ConstantInt::get(ptrdiff_t, (IsARM ? 2 : 1) *
479                                        ThisAdjustment.getQuantity());
480   }
481 
482   return llvm::ConstantStruct::getAnon(MemPtr);
483 }
484 
485 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
486                                                  QualType MPType) {
487   const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
488   const ValueDecl *MPD = MP.getMemberPointerDecl();
489   if (!MPD)
490     return EmitNullMemberPointer(MPT);
491 
492   // Compute the this-adjustment.
493   CharUnits ThisAdjustment = CharUnits::Zero();
494   ArrayRef<const CXXRecordDecl*> Path = MP.getMemberPointerPath();
495   bool DerivedMember = MP.isMemberPointerToDerivedMember();
496   const CXXRecordDecl *RD = cast<CXXRecordDecl>(MPD->getDeclContext());
497   for (unsigned I = 0, N = Path.size(); I != N; ++I) {
498     const CXXRecordDecl *Base = RD;
499     const CXXRecordDecl *Derived = Path[I];
500     if (DerivedMember)
501       std::swap(Base, Derived);
502     ThisAdjustment +=
503       getContext().getASTRecordLayout(Derived).getBaseClassOffset(Base);
504     RD = Path[I];
505   }
506   if (DerivedMember)
507     ThisAdjustment = -ThisAdjustment;
508 
509   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
510     return BuildMemberPointer(MD, ThisAdjustment);
511 
512   CharUnits FieldOffset =
513     getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
514   return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
515 }
516 
517 /// The comparison algorithm is pretty easy: the member pointers are
518 /// the same if they're either bitwise identical *or* both null.
519 ///
520 /// ARM is different here only because null-ness is more complicated.
521 llvm::Value *
522 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
523                                            llvm::Value *L,
524                                            llvm::Value *R,
525                                            const MemberPointerType *MPT,
526                                            bool Inequality) {
527   CGBuilderTy &Builder = CGF.Builder;
528 
529   llvm::ICmpInst::Predicate Eq;
530   llvm::Instruction::BinaryOps And, Or;
531   if (Inequality) {
532     Eq = llvm::ICmpInst::ICMP_NE;
533     And = llvm::Instruction::Or;
534     Or = llvm::Instruction::And;
535   } else {
536     Eq = llvm::ICmpInst::ICMP_EQ;
537     And = llvm::Instruction::And;
538     Or = llvm::Instruction::Or;
539   }
540 
541   // Member data pointers are easy because there's a unique null
542   // value, so it just comes down to bitwise equality.
543   if (MPT->isMemberDataPointer())
544     return Builder.CreateICmp(Eq, L, R);
545 
546   // For member function pointers, the tautologies are more complex.
547   // The Itanium tautology is:
548   //   (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
549   // The ARM tautology is:
550   //   (L == R) <==> (L.ptr == R.ptr &&
551   //                  (L.adj == R.adj ||
552   //                   (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
553   // The inequality tautologies have exactly the same structure, except
554   // applying De Morgan's laws.
555 
556   llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
557   llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
558 
559   // This condition tests whether L.ptr == R.ptr.  This must always be
560   // true for equality to hold.
561   llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
562 
563   // This condition, together with the assumption that L.ptr == R.ptr,
564   // tests whether the pointers are both null.  ARM imposes an extra
565   // condition.
566   llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
567   llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
568 
569   // This condition tests whether L.adj == R.adj.  If this isn't
570   // true, the pointers are unequal unless they're both null.
571   llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
572   llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
573   llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
574 
575   // Null member function pointers on ARM clear the low bit of Adj,
576   // so the zero condition has to check that neither low bit is set.
577   if (IsARM) {
578     llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
579 
580     // Compute (l.adj | r.adj) & 1 and test it against zero.
581     llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
582     llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
583     llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
584                                                       "cmp.or.adj");
585     EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
586   }
587 
588   // Tie together all our conditions.
589   llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
590   Result = Builder.CreateBinOp(And, PtrEq, Result,
591                                Inequality ? "memptr.ne" : "memptr.eq");
592   return Result;
593 }
594 
595 llvm::Value *
596 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
597                                           llvm::Value *MemPtr,
598                                           const MemberPointerType *MPT) {
599   CGBuilderTy &Builder = CGF.Builder;
600 
601   /// For member data pointers, this is just a check against -1.
602   if (MPT->isMemberDataPointer()) {
603     assert(MemPtr->getType() == getPtrDiffTy());
604     llvm::Value *NegativeOne =
605       llvm::Constant::getAllOnesValue(MemPtr->getType());
606     return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
607   }
608 
609   // In Itanium, a member function pointer is not null if 'ptr' is not null.
610   llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
611 
612   llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
613   llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
614 
615   // On ARM, a member function pointer is also non-null if the low bit of 'adj'
616   // (the virtual bit) is set.
617   if (IsARM) {
618     llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
619     llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
620     llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
621     llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
622                                                   "memptr.isvirtual");
623     Result = Builder.CreateOr(Result, IsVirtual);
624   }
625 
626   return Result;
627 }
628 
629 /// The Itanium ABI requires non-zero initialization only for data
630 /// member pointers, for which '0' is a valid offset.
631 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
632   return MPT->getPointeeType()->isFunctionType();
633 }
634 
635 /// The generic ABI passes 'this', plus a VTT if it's initializing a
636 /// base subobject.
637 void ItaniumCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
638                                               CXXCtorType Type,
639                                               CanQualType &ResTy,
640                                 SmallVectorImpl<CanQualType> &ArgTys) {
641   ASTContext &Context = getContext();
642 
643   // 'this' is already there.
644 
645   // Check if we need to add a VTT parameter (which has type void **).
646   if (Type == Ctor_Base && Ctor->getParent()->getNumVBases() != 0)
647     ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
648 }
649 
650 /// The ARM ABI does the same as the Itanium ABI, but returns 'this'.
651 void ARMCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
652                                           CXXCtorType Type,
653                                           CanQualType &ResTy,
654                                 SmallVectorImpl<CanQualType> &ArgTys) {
655   ItaniumCXXABI::BuildConstructorSignature(Ctor, Type, ResTy, ArgTys);
656   ResTy = ArgTys[0];
657 }
658 
659 /// The generic ABI passes 'this', plus a VTT if it's destroying a
660 /// base subobject.
661 void ItaniumCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
662                                              CXXDtorType Type,
663                                              CanQualType &ResTy,
664                                 SmallVectorImpl<CanQualType> &ArgTys) {
665   ASTContext &Context = getContext();
666 
667   // 'this' is already there.
668 
669   // Check if we need to add a VTT parameter (which has type void **).
670   if (Type == Dtor_Base && Dtor->getParent()->getNumVBases() != 0)
671     ArgTys.push_back(Context.getPointerType(Context.VoidPtrTy));
672 }
673 
674 /// The ARM ABI does the same as the Itanium ABI, but returns 'this'
675 /// for non-deleting destructors.
676 void ARMCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
677                                          CXXDtorType Type,
678                                          CanQualType &ResTy,
679                                 SmallVectorImpl<CanQualType> &ArgTys) {
680   ItaniumCXXABI::BuildDestructorSignature(Dtor, Type, ResTy, ArgTys);
681 
682   if (Type != Dtor_Deleting)
683     ResTy = ArgTys[0];
684 }
685 
686 void ItaniumCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF,
687                                                 QualType &ResTy,
688                                                 FunctionArgList &Params) {
689   /// Create the 'this' variable.
690   BuildThisParam(CGF, Params);
691 
692   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
693   assert(MD->isInstance());
694 
695   // Check if we need a VTT parameter as well.
696   if (CodeGenVTables::needsVTTParameter(CGF.CurGD)) {
697     ASTContext &Context = getContext();
698 
699     // FIXME: avoid the fake decl
700     QualType T = Context.getPointerType(Context.VoidPtrTy);
701     ImplicitParamDecl *VTTDecl
702       = ImplicitParamDecl::Create(Context, 0, MD->getLocation(),
703                                   &Context.Idents.get("vtt"), T);
704     Params.push_back(VTTDecl);
705     getVTTDecl(CGF) = VTTDecl;
706   }
707 }
708 
709 void ARMCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF,
710                                             QualType &ResTy,
711                                             FunctionArgList &Params) {
712   ItaniumCXXABI::BuildInstanceFunctionParams(CGF, ResTy, Params);
713 
714   // Return 'this' from certain constructors and destructors.
715   if (HasThisReturn(CGF.CurGD))
716     ResTy = Params[0]->getType();
717 }
718 
719 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
720   /// Initialize the 'this' slot.
721   EmitThisParam(CGF);
722 
723   /// Initialize the 'vtt' slot if needed.
724   if (getVTTDecl(CGF)) {
725     getVTTValue(CGF)
726       = CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(getVTTDecl(CGF)),
727                                "vtt");
728   }
729 }
730 
731 void ARMCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
732   ItaniumCXXABI::EmitInstanceFunctionProlog(CGF);
733 
734   /// Initialize the return slot to 'this' at the start of the
735   /// function.
736   if (HasThisReturn(CGF.CurGD))
737     CGF.Builder.CreateStore(CGF.LoadCXXThis(), CGF.ReturnValue);
738 }
739 
740 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
741                                     RValue RV, QualType ResultType) {
742   if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
743     return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
744 
745   // Destructor thunks in the ARM ABI have indeterminate results.
746   llvm::Type *T =
747     cast<llvm::PointerType>(CGF.ReturnValue->getType())->getElementType();
748   RValue Undef = RValue::get(llvm::UndefValue::get(T));
749   return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
750 }
751 
752 /************************** Array allocation cookies **************************/
753 
754 bool ItaniumCXXABI::NeedsArrayCookie(const CXXNewExpr *expr) {
755   // If the class's usual deallocation function takes two arguments,
756   // it needs a cookie.
757   if (expr->doesUsualArrayDeleteWantSize())
758     return true;
759 
760   // Automatic Reference Counting:
761   //   We need an array cookie for pointers with strong or weak lifetime.
762   QualType AllocatedType = expr->getAllocatedType();
763   if (getContext().getLangOptions().ObjCAutoRefCount &&
764       AllocatedType->isObjCLifetimeType()) {
765     switch (AllocatedType.getObjCLifetime()) {
766     case Qualifiers::OCL_None:
767     case Qualifiers::OCL_ExplicitNone:
768     case Qualifiers::OCL_Autoreleasing:
769       return false;
770 
771     case Qualifiers::OCL_Strong:
772     case Qualifiers::OCL_Weak:
773       return true;
774     }
775   }
776 
777   // Otherwise, if the class has a non-trivial destructor, it always
778   // needs a cookie.
779   const CXXRecordDecl *record =
780     AllocatedType->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
781   return (record && !record->hasTrivialDestructor());
782 }
783 
784 bool ItaniumCXXABI::NeedsArrayCookie(const CXXDeleteExpr *expr,
785                                      QualType elementType) {
786   // If the class's usual deallocation function takes two arguments,
787   // it needs a cookie.
788   if (expr->doesUsualArrayDeleteWantSize())
789     return true;
790 
791   return elementType.isDestructedType();
792 }
793 
794 CharUnits ItaniumCXXABI::GetArrayCookieSize(const CXXNewExpr *expr) {
795   if (!NeedsArrayCookie(expr))
796     return CharUnits::Zero();
797 
798   // Padding is the maximum of sizeof(size_t) and alignof(elementType)
799   ASTContext &Ctx = getContext();
800   return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
801                   Ctx.getTypeAlignInChars(expr->getAllocatedType()));
802 }
803 
804 llvm::Value *ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
805                                                   llvm::Value *NewPtr,
806                                                   llvm::Value *NumElements,
807                                                   const CXXNewExpr *expr,
808                                                   QualType ElementType) {
809   assert(NeedsArrayCookie(expr));
810 
811   unsigned AS = cast<llvm::PointerType>(NewPtr->getType())->getAddressSpace();
812 
813   ASTContext &Ctx = getContext();
814   QualType SizeTy = Ctx.getSizeType();
815   CharUnits SizeSize = Ctx.getTypeSizeInChars(SizeTy);
816 
817   // The size of the cookie.
818   CharUnits CookieSize =
819     std::max(SizeSize, Ctx.getTypeAlignInChars(ElementType));
820 
821   // Compute an offset to the cookie.
822   llvm::Value *CookiePtr = NewPtr;
823   CharUnits CookieOffset = CookieSize - SizeSize;
824   if (!CookieOffset.isZero())
825     CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_64(CookiePtr,
826                                                  CookieOffset.getQuantity());
827 
828   // Write the number of elements into the appropriate slot.
829   llvm::Value *NumElementsPtr
830     = CGF.Builder.CreateBitCast(CookiePtr,
831                                 CGF.ConvertType(SizeTy)->getPointerTo(AS));
832   CGF.Builder.CreateStore(NumElements, NumElementsPtr);
833 
834   // Finally, compute a pointer to the actual data buffer by skipping
835   // over the cookie completely.
836   return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
837                                                 CookieSize.getQuantity());
838 }
839 
840 void ItaniumCXXABI::ReadArrayCookie(CodeGenFunction &CGF,
841                                     llvm::Value *Ptr,
842                                     const CXXDeleteExpr *expr,
843                                     QualType ElementType,
844                                     llvm::Value *&NumElements,
845                                     llvm::Value *&AllocPtr,
846                                     CharUnits &CookieSize) {
847   // Derive a char* in the same address space as the pointer.
848   unsigned AS = cast<llvm::PointerType>(Ptr->getType())->getAddressSpace();
849   llvm::Type *CharPtrTy = CGF.Builder.getInt8Ty()->getPointerTo(AS);
850 
851   // If we don't need an array cookie, bail out early.
852   if (!NeedsArrayCookie(expr, ElementType)) {
853     AllocPtr = CGF.Builder.CreateBitCast(Ptr, CharPtrTy);
854     NumElements = 0;
855     CookieSize = CharUnits::Zero();
856     return;
857   }
858 
859   QualType SizeTy = getContext().getSizeType();
860   CharUnits SizeSize = getContext().getTypeSizeInChars(SizeTy);
861   llvm::Type *SizeLTy = CGF.ConvertType(SizeTy);
862 
863   CookieSize
864     = std::max(SizeSize, getContext().getTypeAlignInChars(ElementType));
865 
866   CharUnits NumElementsOffset = CookieSize - SizeSize;
867 
868   // Compute the allocated pointer.
869   AllocPtr = CGF.Builder.CreateBitCast(Ptr, CharPtrTy);
870   AllocPtr = CGF.Builder.CreateConstInBoundsGEP1_64(AllocPtr,
871                                                     -CookieSize.getQuantity());
872 
873   llvm::Value *NumElementsPtr = AllocPtr;
874   if (!NumElementsOffset.isZero())
875     NumElementsPtr =
876       CGF.Builder.CreateConstInBoundsGEP1_64(NumElementsPtr,
877                                              NumElementsOffset.getQuantity());
878   NumElementsPtr =
879     CGF.Builder.CreateBitCast(NumElementsPtr, SizeLTy->getPointerTo(AS));
880   NumElements = CGF.Builder.CreateLoad(NumElementsPtr);
881 }
882 
883 CharUnits ARMCXXABI::GetArrayCookieSize(const CXXNewExpr *expr) {
884   if (!NeedsArrayCookie(expr))
885     return CharUnits::Zero();
886 
887   // On ARM, the cookie is always:
888   //   struct array_cookie {
889   //     std::size_t element_size; // element_size != 0
890   //     std::size_t element_count;
891   //   };
892   // TODO: what should we do if the allocated type actually wants
893   // greater alignment?
894   return getContext().getTypeSizeInChars(getContext().getSizeType()) * 2;
895 }
896 
897 llvm::Value *ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
898                                               llvm::Value *NewPtr,
899                                               llvm::Value *NumElements,
900                                               const CXXNewExpr *expr,
901                                               QualType ElementType) {
902   assert(NeedsArrayCookie(expr));
903 
904   // NewPtr is a char*.
905 
906   unsigned AS = cast<llvm::PointerType>(NewPtr->getType())->getAddressSpace();
907 
908   ASTContext &Ctx = getContext();
909   CharUnits SizeSize = Ctx.getTypeSizeInChars(Ctx.getSizeType());
910   llvm::IntegerType *SizeTy =
911     cast<llvm::IntegerType>(CGF.ConvertType(Ctx.getSizeType()));
912 
913   // The cookie is always at the start of the buffer.
914   llvm::Value *CookiePtr = NewPtr;
915 
916   // The first element is the element size.
917   CookiePtr = CGF.Builder.CreateBitCast(CookiePtr, SizeTy->getPointerTo(AS));
918   llvm::Value *ElementSize = llvm::ConstantInt::get(SizeTy,
919                           Ctx.getTypeSizeInChars(ElementType).getQuantity());
920   CGF.Builder.CreateStore(ElementSize, CookiePtr);
921 
922   // The second element is the element count.
923   CookiePtr = CGF.Builder.CreateConstInBoundsGEP1_32(CookiePtr, 1);
924   CGF.Builder.CreateStore(NumElements, CookiePtr);
925 
926   // Finally, compute a pointer to the actual data buffer by skipping
927   // over the cookie completely.
928   CharUnits CookieSize = 2 * SizeSize;
929   return CGF.Builder.CreateConstInBoundsGEP1_64(NewPtr,
930                                                 CookieSize.getQuantity());
931 }
932 
933 void ARMCXXABI::ReadArrayCookie(CodeGenFunction &CGF,
934                                 llvm::Value *Ptr,
935                                 const CXXDeleteExpr *expr,
936                                 QualType ElementType,
937                                 llvm::Value *&NumElements,
938                                 llvm::Value *&AllocPtr,
939                                 CharUnits &CookieSize) {
940   // Derive a char* in the same address space as the pointer.
941   unsigned AS = cast<llvm::PointerType>(Ptr->getType())->getAddressSpace();
942   llvm::Type *CharPtrTy = CGF.Builder.getInt8Ty()->getPointerTo(AS);
943 
944   // If we don't need an array cookie, bail out early.
945   if (!NeedsArrayCookie(expr, ElementType)) {
946     AllocPtr = CGF.Builder.CreateBitCast(Ptr, CharPtrTy);
947     NumElements = 0;
948     CookieSize = CharUnits::Zero();
949     return;
950   }
951 
952   QualType SizeTy = getContext().getSizeType();
953   CharUnits SizeSize = getContext().getTypeSizeInChars(SizeTy);
954   llvm::Type *SizeLTy = CGF.ConvertType(SizeTy);
955 
956   // The cookie size is always 2 * sizeof(size_t).
957   CookieSize = 2 * SizeSize;
958 
959   // The allocated pointer is the input ptr, minus that amount.
960   AllocPtr = CGF.Builder.CreateBitCast(Ptr, CharPtrTy);
961   AllocPtr = CGF.Builder.CreateConstInBoundsGEP1_64(AllocPtr,
962                                                -CookieSize.getQuantity());
963 
964   // The number of elements is at offset sizeof(size_t) relative to that.
965   llvm::Value *NumElementsPtr
966     = CGF.Builder.CreateConstInBoundsGEP1_64(AllocPtr,
967                                              SizeSize.getQuantity());
968   NumElementsPtr =
969     CGF.Builder.CreateBitCast(NumElementsPtr, SizeLTy->getPointerTo(AS));
970   NumElements = CGF.Builder.CreateLoad(NumElementsPtr);
971 }
972 
973 /*********************** Static local initialization **************************/
974 
975 static llvm::Constant *getGuardAcquireFn(CodeGenModule &CGM,
976                                          llvm::PointerType *GuardPtrTy) {
977   // int __cxa_guard_acquire(__guard *guard_object);
978   llvm::FunctionType *FTy =
979     llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
980                             GuardPtrTy, /*isVarArg=*/false);
981 
982   return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_acquire");
983 }
984 
985 static llvm::Constant *getGuardReleaseFn(CodeGenModule &CGM,
986                                          llvm::PointerType *GuardPtrTy) {
987   // void __cxa_guard_release(__guard *guard_object);
988   llvm::FunctionType *FTy =
989     llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
990                             GuardPtrTy, /*isVarArg=*/false);
991 
992   return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_release");
993 }
994 
995 static llvm::Constant *getGuardAbortFn(CodeGenModule &CGM,
996                                        llvm::PointerType *GuardPtrTy) {
997   // void __cxa_guard_abort(__guard *guard_object);
998   llvm::FunctionType *FTy =
999     llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
1000                             GuardPtrTy, /*isVarArg=*/false);
1001 
1002   return CGM.CreateRuntimeFunction(FTy, "__cxa_guard_abort");
1003 }
1004 
1005 namespace {
1006   struct CallGuardAbort : EHScopeStack::Cleanup {
1007     llvm::GlobalVariable *Guard;
1008     CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
1009 
1010     void Emit(CodeGenFunction &CGF, Flags flags) {
1011       CGF.Builder.CreateCall(getGuardAbortFn(CGF.CGM, Guard->getType()), Guard)
1012         ->setDoesNotThrow();
1013     }
1014   };
1015 }
1016 
1017 /// The ARM code here follows the Itanium code closely enough that we
1018 /// just special-case it at particular places.
1019 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
1020                                     const VarDecl &D,
1021                                     llvm::GlobalVariable *GV) {
1022   CGBuilderTy &Builder = CGF.Builder;
1023 
1024   // We only need to use thread-safe statics for local variables;
1025   // global initialization is always single-threaded.
1026   bool threadsafe =
1027     (getContext().getLangOptions().ThreadsafeStatics && D.isLocalVarDecl());
1028 
1029   llvm::IntegerType *GuardTy;
1030 
1031   // If we have a global variable with internal linkage and thread-safe statics
1032   // are disabled, we can just let the guard variable be of type i8.
1033   bool useInt8GuardVariable = !threadsafe && GV->hasInternalLinkage();
1034   if (useInt8GuardVariable) {
1035     GuardTy = CGF.Int8Ty;
1036   } else {
1037     // Guard variables are 64 bits in the generic ABI and 32 bits on ARM.
1038     GuardTy = (IsARM ? CGF.Int32Ty : CGF.Int64Ty);
1039   }
1040   llvm::PointerType *GuardPtrTy = GuardTy->getPointerTo();
1041 
1042   // Create the guard variable.
1043   llvm::SmallString<256> GuardVName;
1044   llvm::raw_svector_ostream Out(GuardVName);
1045   getMangleContext().mangleItaniumGuardVariable(&D, Out);
1046   Out.flush();
1047 
1048   // Just absorb linkage and visibility from the variable.
1049   llvm::GlobalVariable *GuardVariable =
1050     new llvm::GlobalVariable(CGM.getModule(), GuardTy,
1051                              false, GV->getLinkage(),
1052                              llvm::ConstantInt::get(GuardTy, 0),
1053                              GuardVName.str());
1054   GuardVariable->setVisibility(GV->getVisibility());
1055 
1056   // Test whether the variable has completed initialization.
1057   llvm::Value *IsInitialized;
1058 
1059   // ARM C++ ABI 3.2.3.1:
1060   //   To support the potential use of initialization guard variables
1061   //   as semaphores that are the target of ARM SWP and LDREX/STREX
1062   //   synchronizing instructions we define a static initialization
1063   //   guard variable to be a 4-byte aligned, 4- byte word with the
1064   //   following inline access protocol.
1065   //     #define INITIALIZED 1
1066   //     if ((obj_guard & INITIALIZED) != INITIALIZED) {
1067   //       if (__cxa_guard_acquire(&obj_guard))
1068   //         ...
1069   //     }
1070   if (IsARM && !useInt8GuardVariable) {
1071     llvm::Value *V = Builder.CreateLoad(GuardVariable);
1072     V = Builder.CreateAnd(V, Builder.getInt32(1));
1073     IsInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
1074 
1075   // Itanium C++ ABI 3.3.2:
1076   //   The following is pseudo-code showing how these functions can be used:
1077   //     if (obj_guard.first_byte == 0) {
1078   //       if ( __cxa_guard_acquire (&obj_guard) ) {
1079   //         try {
1080   //           ... initialize the object ...;
1081   //         } catch (...) {
1082   //            __cxa_guard_abort (&obj_guard);
1083   //            throw;
1084   //         }
1085   //         ... queue object destructor with __cxa_atexit() ...;
1086   //         __cxa_guard_release (&obj_guard);
1087   //       }
1088   //     }
1089   } else {
1090     // Load the first byte of the guard variable.
1091     llvm::Type *PtrTy = Builder.getInt8PtrTy();
1092     llvm::LoadInst *LI =
1093       Builder.CreateLoad(Builder.CreateBitCast(GuardVariable, PtrTy));
1094     LI->setAlignment(1);
1095 
1096     // Itanium ABI:
1097     //   An implementation supporting thread-safety on multiprocessor
1098     //   systems must also guarantee that references to the initialized
1099     //   object do not occur before the load of the initialization flag.
1100     //
1101     // In LLVM, we do this by marking the load Acquire.
1102     if (threadsafe)
1103       LI->setAtomic(llvm::Acquire);
1104 
1105     IsInitialized = Builder.CreateIsNull(LI, "guard.uninitialized");
1106   }
1107 
1108   llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
1109   llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1110 
1111   // Check if the first byte of the guard variable is zero.
1112   Builder.CreateCondBr(IsInitialized, InitCheckBlock, EndBlock);
1113 
1114   CGF.EmitBlock(InitCheckBlock);
1115 
1116   // Variables used when coping with thread-safe statics and exceptions.
1117   if (threadsafe) {
1118     // Call __cxa_guard_acquire.
1119     llvm::Value *V
1120       = Builder.CreateCall(getGuardAcquireFn(CGM, GuardPtrTy), GuardVariable);
1121 
1122     llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1123 
1124     Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
1125                          InitBlock, EndBlock);
1126 
1127     // Call __cxa_guard_abort along the exceptional edge.
1128     CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, GuardVariable);
1129 
1130     CGF.EmitBlock(InitBlock);
1131   }
1132 
1133   // Emit the initializer and add a global destructor if appropriate.
1134   CGF.EmitCXXGlobalVarDeclInit(D, GV);
1135 
1136   if (threadsafe) {
1137     // Pop the guard-abort cleanup if we pushed one.
1138     CGF.PopCleanupBlock();
1139 
1140     // Call __cxa_guard_release.  This cannot throw.
1141     Builder.CreateCall(getGuardReleaseFn(CGM, GuardPtrTy), GuardVariable);
1142   } else {
1143     Builder.CreateStore(llvm::ConstantInt::get(GuardTy, 1), GuardVariable);
1144   }
1145 
1146   CGF.EmitBlock(EndBlock);
1147 }
1148