================ @@ -1510,41 +1519,41 @@ CallExpr *CallExpr::Create(const ASTContext &Ctx, Expr *Fn, unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs); unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects( /*NumPreArgs=*/0, NumArgs, FPFeatures.requiresTrailingStorage()); - void *Mem = - Ctx.Allocate(sizeof(CallExpr) + SizeOfTrailingObjects, alignof(CallExpr)); - return new (Mem) CallExpr(CallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK, - RParenLoc, FPFeatures, MinNumArgs, UsesADL); + void *Mem = Ctx.Allocate( + sizeToAllocateForCallExprSubclass<CallExpr>(SizeOfTrailingObjects), + alignof(CallExpr)); + CallExpr *E = + new (Mem) CallExpr(CallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK, + RParenLoc, FPFeatures, MinNumArgs, UsesADL); + E->updateTrailingSourceLoc(); + return E; } CallExpr *CallExpr::CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty) { unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs, HasFPFeatures); - void *Mem = - Ctx.Allocate(sizeof(CallExpr) + SizeOfTrailingObjects, alignof(CallExpr)); + void *Mem = Ctx.Allocate( + sizeToAllocateForCallExprSubclass<CallExpr>(SizeOfTrailingObjects), + alignof(CallExpr)); return new (Mem) CallExpr(CallExprClass, /*NumPreArgs=*/0, NumArgs, HasFPFeatures, Empty); } -unsigned CallExpr::offsetToTrailingObjects(StmtClass SC) { - switch (SC) { - case CallExprClass: - return sizeof(CallExpr); - case CXXOperatorCallExprClass: - return sizeof(CXXOperatorCallExpr); - case CXXMemberCallExprClass: - return sizeof(CXXMemberCallExpr); - case UserDefinedLiteralClass: - return sizeof(UserDefinedLiteral); - case CUDAKernelCallExprClass: - return sizeof(CUDAKernelCallExpr); - default: - llvm_unreachable("unexpected class deriving from CallExpr!"); - } -} - Decl *Expr::getReferencedDeclOfCallee() { - Expr *CEE = IgnoreParenImpCasts(); + + // Optimize for the common case first + // (simple function or member function call) + // then try more exotic possibilities + Expr *CEE = IgnoreImpCasts(); + + if (auto *DRE = dyn_cast<DeclRefExpr>(CEE)) ---------------- erichkeane wrote:
I find myself wondering if this function would benefit SEVERELY from a `llvm::typeSwitch`. https://github.com/llvm/llvm-project/pull/141058 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits