@@ -4070,18 +4070,18 @@ bool Compiler<Emitter>::visitAPValueInitializer(const APValue &Val,
40704070}
40714071
40724072template <class Emitter >
4073- bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) {
4073+ bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E,
4074+ unsigned BuiltinID) {
40744075 const Function *Func = getFunction (E->getDirectCallee ());
40754076 if (!Func)
40764077 return false ;
40774078
40784079 // For these, we're expected to ultimately return an APValue pointing
40794080 // to the CallExpr. This is needed to get the correct codegen.
4080- unsigned Builtin = E->getBuiltinCallee ();
4081- if (Builtin == Builtin::BI__builtin___CFStringMakeConstantString ||
4082- Builtin == Builtin::BI__builtin___NSStringMakeConstantString ||
4083- Builtin == Builtin::BI__builtin_ptrauth_sign_constant ||
4084- Builtin == Builtin::BI__builtin_function_start) {
4081+ if (BuiltinID == Builtin::BI__builtin___CFStringMakeConstantString ||
4082+ BuiltinID == Builtin::BI__builtin___NSStringMakeConstantString ||
4083+ BuiltinID == Builtin::BI__builtin_ptrauth_sign_constant ||
4084+ BuiltinID == Builtin::BI__builtin_function_start) {
40854085 if (std::optional<unsigned > GlobalOffset = P.createGlobal (E)) {
40864086 if (!this ->emitGetPtrGlobal (*GlobalOffset, E))
40874087 return false ;
@@ -4113,7 +4113,7 @@ bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) {
41134113 }
41144114 }
41154115
4116- if (!this ->emitCallBI (Func, E, E))
4116+ if (!this ->emitCallBI (Func, E, BuiltinID, E))
41174117 return false ;
41184118
41194119 if (DiscardResult && !ReturnType->isVoidType ()) {
@@ -4126,13 +4126,24 @@ bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) {
41264126
41274127template <class Emitter >
41284128bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) {
4129- if (E->getBuiltinCallee ())
4130- return VisitBuiltinCallExpr (E);
4129+ if (unsigned BuiltinID = E->getBuiltinCallee ())
4130+ return VisitBuiltinCallExpr (E, BuiltinID);
4131+
4132+ const FunctionDecl *FuncDecl = E->getDirectCallee ();
4133+ // Calls to replaceable operator new/operator delete.
4134+ if (FuncDecl && FuncDecl->isReplaceableGlobalAllocationFunction ()) {
4135+ if (FuncDecl->getDeclName ().getCXXOverloadedOperator () == OO_New ||
4136+ FuncDecl->getDeclName ().getCXXOverloadedOperator () == OO_Array_New) {
4137+ return VisitBuiltinCallExpr (E, Builtin::BI__builtin_operator_new);
4138+ } else {
4139+ assert (FuncDecl->getDeclName ().getCXXOverloadedOperator () == OO_Delete);
4140+ return VisitBuiltinCallExpr (E, Builtin::BI__builtin_operator_delete);
4141+ }
4142+ }
41314143
41324144 QualType ReturnType = E->getCallReturnType (Ctx.getASTContext ());
41334145 std::optional<PrimType> T = classify (ReturnType);
41344146 bool HasRVO = !ReturnType->isVoidType () && !T;
4135- const FunctionDecl *FuncDecl = E->getDirectCallee ();
41364147
41374148 if (HasRVO) {
41384149 if (DiscardResult) {
0 commit comments