https://github.com/JonPsson1 updated https://github.com/llvm/llvm-project/pull/232847
>From c9b3be1cff1c62210b0bb3c20729fbca642febc1 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson <[email protected]> Date: Fri, 16 Oct 2026 18:48:34 +0200 Subject: [PATCH 1/2] Extensions for -ftrapv-handler call. --- clang/lib/CodeGen/CGExprScalar.cpp | 10 ++++++++++ clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index db2b7a4ad1fce2..e5c1ada3df5eb2 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -36,6 +36,7 @@ #include "clang/CodeGenUtils/ExprUtils.h" #include "llvm/ADT/APFixedPoint.h" #include "llvm/ADT/ScopeExit.h" +#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Argument.h" #include "llvm/IR/CFG.h" @@ -4487,6 +4488,15 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) { llvm::FunctionType::get(CGF.Int64Ty, argTypes, true); llvm::FunctionCallee handler = CGF.CGM.CreateRuntimeFunction(handlerTy, *handlerName); + // Extend the two unsigned i8 arguments (operation code and operand + // bit-width) if required by target. + llvm::Attribute::AttrKind I8ExtAttr = + llvm::TargetLibraryInfo::getExtAttrForI8Param(/*Signed=*/false); + if (I8ExtAttr != llvm::Attribute::AttrKind::None) + if (llvm::Function *F = dyn_cast<llvm::Function>(handler.getCallee())) { + F->addParamAttr(2, I8ExtAttr); + F->addParamAttr(3, I8ExtAttr); + } // Sign extend the args to 64-bit, so that we can use the same handler for // all types of overflow. diff --git a/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c b/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c new file mode 100644 index 00000000000000..e8e2e712998e07 --- /dev/null +++ b/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple s390x-linux-gnu -emit-llvm -o - -ftrapv \ +// RUN: -ftrapv-handler myhandler %s | FileCheck %s +// +// Check that the two i8 arguments of the -ftrapv-handler function (operation +// code and operand bit-width) carry zeroext. +// +// CHECK: declare i64 @myhandler(i64, i64, i8 zeroext, i8 zeroext, ...) + +void test(int a, int b) { + (void)(a + b); +} >From 70415ee87c024e70e582d5f2ec3a0b8b864cf326 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson <[email protected]> Date: Fri, 16 Oct 2026 19:48:42 +0200 Subject: [PATCH 2/2] Let CreateRuntimeFunction() do the work. --- clang/lib/CodeGen/CGExprScalar.cpp | 19 ++++--------------- .../CodeGen/SystemZ/ftrapv-handler-argext.c | 2 +- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index e5c1ada3df5eb2..f1394fc5246459 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -36,7 +36,6 @@ #include "clang/CodeGenUtils/ExprUtils.h" #include "llvm/ADT/APFixedPoint.h" #include "llvm/ADT/ScopeExit.h" -#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Argument.h" #include "llvm/IR/CFG.h" @@ -4482,21 +4481,11 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) { Builder.SetInsertPoint(overflowBB); // Get the overflow handler. - llvm::Type *Int8Ty = CGF.Int8Ty; - llvm::Type *argTypes[] = { CGF.Int64Ty, CGF.Int64Ty, Int8Ty, Int8Ty }; - llvm::FunctionType *handlerTy = - llvm::FunctionType::get(CGF.Int64Ty, argTypes, true); + ASTContext &Ctx = CGF.getContext(); + QualType ArgTys[] = {Ctx.LongLongTy, Ctx.LongLongTy, Ctx.UnsignedCharTy, + Ctx.UnsignedCharTy}; llvm::FunctionCallee handler = - CGF.CGM.CreateRuntimeFunction(handlerTy, *handlerName); - // Extend the two unsigned i8 arguments (operation code and operand - // bit-width) if required by target. - llvm::Attribute::AttrKind I8ExtAttr = - llvm::TargetLibraryInfo::getExtAttrForI8Param(/*Signed=*/false); - if (I8ExtAttr != llvm::Attribute::AttrKind::None) - if (llvm::Function *F = dyn_cast<llvm::Function>(handler.getCallee())) { - F->addParamAttr(2, I8ExtAttr); - F->addParamAttr(3, I8ExtAttr); - } + CGF.CGM.CreateRuntimeFunction(Ctx.LongLongTy, ArgTys, *handlerName); // Sign extend the args to 64-bit, so that we can use the same handler for // all types of overflow. diff --git a/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c b/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c index e8e2e712998e07..4b640c0459056d 100644 --- a/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c +++ b/clang/test/CodeGen/SystemZ/ftrapv-handler-argext.c @@ -4,7 +4,7 @@ // Check that the two i8 arguments of the -ftrapv-handler function (operation // code and operand bit-width) carry zeroext. // -// CHECK: declare i64 @myhandler(i64, i64, i8 zeroext, i8 zeroext, ...) +// CHECK: declare i64 @myhandler(i64 noundef, i64 noundef, i8 noundef zeroext, i8 noundef zeroext) void test(int a, int b) { (void)(a + b); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
