xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGCXXABI.cpp (revision e64bea71c21eb42e97aa615188ba91f6cce0d36d)
1 //===----- CGCXXABI.cpp - Interface to C++ ABIs ---------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This provides an abstract class for C++ code generation. Concrete subclasses
10 // of this implement code generation for specific C++ ABIs.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "CGCXXABI.h"
15 #include "CGCleanup.h"
16 #include "clang/AST/Attr.h"
17 
18 using namespace clang;
19 using namespace CodeGen;
20 
21 CGCXXABI::~CGCXXABI() { }
22 
23 Address CGCXXABI::getThisAddress(CodeGenFunction &CGF) {
24   return CGF.makeNaturalAddressForPointer(
25       CGF.CXXABIThisValue, CGF.CXXABIThisDecl->getType()->getPointeeType(),
26       CGF.CXXABIThisAlignment);
27 }
28 
29 void CGCXXABI::ErrorUnsupportedABI(CodeGenFunction &CGF, StringRef S) {
30   DiagnosticsEngine &Diags = CGF.CGM.getDiags();
31   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
32                                           "cannot yet compile %0 in this ABI");
33   Diags.Report(CGF.getContext().getFullLoc(CGF.CurCodeDecl->getLocation()),
34                DiagID)
35     << S;
36 }
37 
38 llvm::Constant *CGCXXABI::GetBogusMemberPointer(QualType T) {
39   return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T));
40 }
41 
42 llvm::Type *
43 CGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
44   return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
45 }
46 
47 CGCallee CGCXXABI::EmitLoadOfMemberFunctionPointer(
48     CodeGenFunction &CGF, const Expr *E, Address This,
49     llvm::Value *&ThisPtrForCall,
50     llvm::Value *MemPtr, const MemberPointerType *MPT) {
51   ErrorUnsupportedABI(CGF, "calls through member pointers");
52 
53   const auto *RD = MPT->getMostRecentCXXRecordDecl();
54   ThisPtrForCall =
55       CGF.getAsNaturalPointerTo(This, CGF.getContext().getRecordType(RD));
56   const FunctionProtoType *FPT =
57       MPT->getPointeeType()->getAs<FunctionProtoType>();
58   llvm::Constant *FnPtr = llvm::Constant::getNullValue(
59       llvm::PointerType::getUnqual(CGM.getLLVMContext()));
60   return CGCallee::forDirect(FnPtr, FPT);
61 }
62 
63 llvm::Value *CGCXXABI::EmitMemberDataPointerAddress(
64     CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
65     const MemberPointerType *MPT, bool IsInBounds) {
66   ErrorUnsupportedABI(CGF, "loads of member pointers");
67   llvm::Type *Ty =
68       llvm::PointerType::get(CGF.getLLVMContext(), Base.getAddressSpace());
69   return llvm::Constant::getNullValue(Ty);
70 }
71 
72 llvm::Value *CGCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
73                                                    const CastExpr *E,
74                                                    llvm::Value *Src) {
75   ErrorUnsupportedABI(CGF, "member function pointer conversions");
76   return GetBogusMemberPointer(E->getType());
77 }
78 
79 llvm::Constant *CGCXXABI::EmitMemberPointerConversion(const CastExpr *E,
80                                                       llvm::Constant *Src) {
81   return GetBogusMemberPointer(E->getType());
82 }
83 
84 llvm::Value *
85 CGCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
86                                       llvm::Value *L,
87                                       llvm::Value *R,
88                                       const MemberPointerType *MPT,
89                                       bool Inequality) {
90   ErrorUnsupportedABI(CGF, "member function pointer comparison");
91   return CGF.Builder.getFalse();
92 }
93 
94 llvm::Value *
95 CGCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
96                                      llvm::Value *MemPtr,
97                                      const MemberPointerType *MPT) {
98   ErrorUnsupportedABI(CGF, "member function pointer null testing");
99   return CGF.Builder.getFalse();
100 }
101 
102 llvm::Constant *
103 CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
104   return GetBogusMemberPointer(QualType(MPT, 0));
105 }
106 
107 llvm::Constant *CGCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
108   return GetBogusMemberPointer(CGM.getContext().getMemberPointerType(
109       MD->getType(), /*Qualifier=*/nullptr, MD->getParent()));
110 }
111 
112 llvm::Constant *CGCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
113                                                 CharUnits offset) {
114   return GetBogusMemberPointer(QualType(MPT, 0));
115 }
116 
117 llvm::Constant *CGCXXABI::EmitMemberPointer(const APValue &MP, QualType MPT) {
118   return GetBogusMemberPointer(MPT);
119 }
120 
121 bool CGCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
122   // Fake answer.
123   return true;
124 }
125 
126 void CGCXXABI::buildThisParam(CodeGenFunction &CGF, FunctionArgList &params) {
127   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
128 
129   // FIXME: I'm not entirely sure I like using a fake decl just for code
130   // generation. Maybe we can come up with a better way?
131   auto *ThisDecl =
132       ImplicitParamDecl::Create(CGM.getContext(), nullptr, MD->getLocation(),
133                                 &CGM.getContext().Idents.get("this"),
134                                 MD->getThisType(), ImplicitParamKind::CXXThis);
135   params.push_back(ThisDecl);
136   CGF.CXXABIThisDecl = ThisDecl;
137 
138   // Compute the presumed alignment of 'this', which basically comes
139   // down to whether we know it's a complete object or not.
140   auto &Layout = CGF.getContext().getASTRecordLayout(MD->getParent());
141   if (MD->getParent()->getNumVBases() == 0 || // avoid vcall in common case
142       MD->getParent()->isEffectivelyFinal() ||
143       isThisCompleteObject(CGF.CurGD)) {
144     CGF.CXXABIThisAlignment = Layout.getAlignment();
145   } else {
146     CGF.CXXABIThisAlignment = Layout.getNonVirtualAlignment();
147   }
148 }
149 
150 llvm::Value *CGCXXABI::loadIncomingCXXThis(CodeGenFunction &CGF) {
151   return CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(getThisDecl(CGF)),
152                                 "this");
153 }
154 
155 void CGCXXABI::setCXXABIThisValue(CodeGenFunction &CGF, llvm::Value *ThisPtr) {
156   /// Initialize the 'this' slot.
157   assert(getThisDecl(CGF) && "no 'this' variable for function");
158   CGF.CXXABIThisValue = ThisPtr;
159 }
160 
161 bool CGCXXABI::mayNeedDestruction(const VarDecl *VD) const {
162   if (VD->needsDestruction(getContext()))
163     return true;
164 
165   // If the variable has an incomplete class type (or array thereof), it
166   // might need destruction.
167   const Type *T = VD->getType()->getBaseElementTypeUnsafe();
168   if (T->getAs<RecordType>() && T->isIncompleteType())
169     return true;
170 
171   return false;
172 }
173 
174 bool CGCXXABI::isEmittedWithConstantInitializer(
175     const VarDecl *VD, bool InspectInitForWeakDef) const {
176   VD = VD->getMostRecentDecl();
177   if (VD->hasAttr<ConstInitAttr>())
178     return true;
179 
180   // All later checks examine the initializer specified on the variable. If
181   // the variable is weak, such examination would not be correct.
182   if (!InspectInitForWeakDef && (VD->isWeak() || VD->hasAttr<SelectAnyAttr>()))
183     return false;
184 
185   const VarDecl *InitDecl = VD->getInitializingDeclaration();
186   if (!InitDecl)
187     return false;
188 
189   // If there's no initializer to run, this is constant initialization.
190   if (!InitDecl->hasInit())
191     return true;
192 
193   // If we have the only definition, we don't need a thread wrapper if we
194   // will emit the value as a constant.
195   if (isUniqueGVALinkage(getContext().GetGVALinkageForVariable(VD)))
196     return !mayNeedDestruction(VD) && InitDecl->evaluateValue();
197 
198   // Otherwise, we need a thread wrapper unless we know that every
199   // translation unit will emit the value as a constant. We rely on the
200   // variable being constant-initialized in every translation unit if it's
201   // constant-initialized in any translation unit, which isn't actually
202   // guaranteed by the standard but is necessary for sanity.
203   return InitDecl->hasConstantInitialization();
204 }
205 
206 void CGCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
207                                    RValue RV, QualType ResultType) {
208   assert(!CGF.hasAggregateEvaluationKind(ResultType) &&
209          "cannot handle aggregates");
210   CGF.EmitReturnOfRValue(RV, ResultType);
211 }
212 
213 CharUnits CGCXXABI::GetArrayCookieSize(const CXXNewExpr *expr) {
214   if (!requiresArrayCookie(expr))
215     return CharUnits::Zero();
216   return getArrayCookieSizeImpl(expr->getAllocatedType());
217 }
218 
219 CharUnits CGCXXABI::getArrayCookieSizeImpl(QualType elementType) {
220   // BOGUS
221   return CharUnits::Zero();
222 }
223 
224 Address CGCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
225                                         Address NewPtr,
226                                         llvm::Value *NumElements,
227                                         const CXXNewExpr *expr,
228                                         QualType ElementType) {
229   // Should never be called.
230   ErrorUnsupportedABI(CGF, "array cookie initialization");
231   return Address::invalid();
232 }
233 
234 bool CGCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
235                                    QualType elementType) {
236   // If the class's usual deallocation function takes two arguments,
237   // it needs a cookie.
238   if (expr->doesUsualArrayDeleteWantSize())
239     return true;
240 
241   return elementType.isDestructedType();
242 }
243 
244 bool CGCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
245   // If the class's usual deallocation function takes two arguments,
246   // it needs a cookie.
247   if (expr->doesUsualArrayDeleteWantSize())
248     return true;
249 
250   return expr->getAllocatedType().isDestructedType();
251 }
252 
253 void CGCXXABI::ReadArrayCookie(CodeGenFunction &CGF, Address ptr,
254                                const CXXDeleteExpr *expr, QualType eltTy,
255                                llvm::Value *&numElements,
256                                llvm::Value *&allocPtr, CharUnits &cookieSize) {
257   // Derive a char* in the same address space as the pointer.
258   ptr = ptr.withElementType(CGF.Int8Ty);
259 
260   // If we don't need an array cookie, bail out early.
261   if (!requiresArrayCookie(expr, eltTy)) {
262     allocPtr = ptr.emitRawPointer(CGF);
263     numElements = nullptr;
264     cookieSize = CharUnits::Zero();
265     return;
266   }
267 
268   cookieSize = getArrayCookieSizeImpl(eltTy);
269   Address allocAddr = CGF.Builder.CreateConstInBoundsByteGEP(ptr, -cookieSize);
270   allocPtr = allocAddr.emitRawPointer(CGF);
271   numElements = readArrayCookieImpl(CGF, allocAddr, cookieSize);
272 }
273 
274 llvm::Value *CGCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
275                                            Address ptr,
276                                            CharUnits cookieSize) {
277   ErrorUnsupportedABI(CGF, "reading a new[] cookie");
278   return llvm::ConstantInt::get(CGF.SizeTy, 0);
279 }
280 
281 /// Returns the adjustment, in bytes, required for the given
282 /// member-pointer operation.  Returns null if no adjustment is
283 /// required.
284 llvm::Constant *CGCXXABI::getMemberPointerAdjustment(const CastExpr *E) {
285   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
286          E->getCastKind() == CK_BaseToDerivedMemberPointer);
287 
288   QualType derivedType;
289   if (E->getCastKind() == CK_DerivedToBaseMemberPointer)
290     derivedType = E->getSubExpr()->getType();
291   else
292     derivedType = E->getType();
293 
294   const CXXRecordDecl *derivedClass =
295       derivedType->castAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
296 
297   return CGM.GetNonVirtualBaseClassOffset(derivedClass,
298                                           E->path_begin(),
299                                           E->path_end());
300 }
301 
302 llvm::BasicBlock *
303 CGCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
304                                         const CXXRecordDecl *RD) {
305   if (CGM.getTarget().getCXXABI().hasConstructorVariants())
306     llvm_unreachable("shouldn't be called in this ABI");
307 
308   ErrorUnsupportedABI(CGF, "complete object detection in ctor");
309   return nullptr;
310 }
311 
312 void CGCXXABI::setCXXDestructorDLLStorage(llvm::GlobalValue *GV,
313                                           const CXXDestructorDecl *Dtor,
314                                           CXXDtorType DT) const {
315   // Assume the base C++ ABI has no special rules for destructor variants.
316   CGM.setDLLImportDLLExport(GV, Dtor);
317 }
318 
319 llvm::GlobalValue::LinkageTypes CGCXXABI::getCXXDestructorLinkage(
320     GVALinkage Linkage, const CXXDestructorDecl *Dtor, CXXDtorType DT) const {
321   // Delegate back to CGM by default.
322   return CGM.getLLVMLinkageForDeclarator(Dtor, Linkage);
323 }
324 
325 bool CGCXXABI::NeedsVTTParameter(GlobalDecl GD) {
326   return false;
327 }
328 
329 llvm::CallInst *
330 CGCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
331                                               llvm::Value *Exn) {
332   // Just call std::terminate and ignore the violating exception.
333   return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
334 }
335 
336 CatchTypeInfo CGCXXABI::getCatchAllTypeInfo() {
337   return CatchTypeInfo{nullptr, 0};
338 }
339 
340 std::vector<CharUnits> CGCXXABI::getVBPtrOffsets(const CXXRecordDecl *RD) {
341   return std::vector<CharUnits>();
342 }
343 
344 CGCXXABI::AddedStructorArgCounts CGCXXABI::addImplicitConstructorArgs(
345     CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
346     bool ForVirtualBase, bool Delegating, CallArgList &Args) {
347   AddedStructorArgs AddedArgs =
348       getImplicitConstructorArgs(CGF, D, Type, ForVirtualBase, Delegating);
349   for (size_t i = 0; i < AddedArgs.Prefix.size(); ++i) {
350     Args.insert(Args.begin() + 1 + i,
351                 CallArg(RValue::get(AddedArgs.Prefix[i].Value),
352                         AddedArgs.Prefix[i].Type));
353   }
354   for (const auto &arg : AddedArgs.Suffix) {
355     Args.add(RValue::get(arg.Value), arg.Type);
356   }
357   return AddedStructorArgCounts(AddedArgs.Prefix.size(),
358                                 AddedArgs.Suffix.size());
359 }
360