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