From 6201fbc0edb2bca84d2b350ab16120da3c4c5bd6 Mon Sep 17 00:00:00 2001 From: Evgeny Leviant Date: Mon, 4 May 2026 18:47:42 +0200 Subject: [PATCH] [clang] Make signed integer overflow defined with -fms-kernel --- clang/lib/Frontend/CompilerInvocation.cpp | 3 +- clang/test/CodeGen/MSKernel/signed-overflow.c | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGen/MSKernel/signed-overflow.c diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index db7c791059a3..57d380e717ed 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4075,8 +4075,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, // Set the handler, if one is specified. Opts.OverflowHandler = std::string(Args.getLastArgValue(OPT_ftrapv_handler)); - } - else if (Args.hasArg(OPT_fwrapv)) + } else if (Args.hasArg(OPT_fwrapv) || Opts.Kernel) Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined); Opts.MSCompatibilityVersion = 0; diff --git a/clang/test/CodeGen/MSKernel/signed-overflow.c b/clang/test/CodeGen/MSKernel/signed-overflow.c new file mode 100644 index 000000000000..0286eb95c505 --- /dev/null +++ b/clang/test/CodeGen/MSKernel/signed-overflow.c @@ -0,0 +1,28 @@ +// REQUIRES: x86-registered-target +// RUN: %clang_cc1 -fms-kernel -triple x86_64-windows-msvc -O2 -emit-llvm %s -o - | FileCheck %s +// CHECK: define {{.*}} i32 @add2(i32 noundef %a, i32 noundef %b) +// CHECK-NEXT: entry: +// CHECK-NEXT: %add = add i32 %b, %a +// CHECK-NEXT: ret i32 %add + +// CHECK: define {{.*}} i32 @mul2(i32 noundef %a) +// CHECK-NEXT: entry: +// CHECK-NEXT: %mul = shl i32 %a, 1 +// CHECK-NEXT: ret i32 %mul + +// CHECK: define {{.*}} ptr @add_ptr(ptr noundef {{.*}} %base, i64 noundef %off) +// CHECK-NEXT: entry: +// CHECK-NEXT: %add.ptr = getelementptr i8, ptr %base, i64 %off +// CHECK-NEXT: ret ptr %add.ptr + +int add2(int a, int b) { + return a + b; +} + +int mul2(int a) { + return a*=2; +} + +char* add_ptr(char* base, long long off) { + return base + off; +}