This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG18ccca4da8de: [UBSan] Consider zero input to __builtin_clz/ctz to be undefined independent of… (authored by craig.topper).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152023/new/ https://reviews.llvm.org/D152023 Files: clang/lib/CodeGen/CGBuiltin.cpp clang/test/CodeGen/ubsan-builtin-checks.c Index: clang/test/CodeGen/ubsan-builtin-checks.c =================================================================== --- clang/test/CodeGen/ubsan-builtin-checks.c +++ clang/test/CodeGen/ubsan-builtin-checks.c @@ -1,7 +1,8 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s -// RUN: %clang_cc1 -triple arm64-none-linux-gnu -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefix=NOT-UB +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefixes=CHECK,POISON +// RUN: %clang_cc1 -triple arm64-none-linux-gnu -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefixes=CHECK,NOPOISON -// NOT-UB-NOT: __ubsan_handle_invalid_builtin +// A zero input to __bultin_ctz/clz is considered UB even if the target does not +// want to optimize based on zero input being undefined. // CHECK: define{{.*}} void @check_ctz void check_ctz(int n) { @@ -13,7 +14,8 @@ // CHECK-NEXT: unreachable // // Continuation block: - // CHECK: call i32 @llvm.cttz.i32(i32 [[N]], i1 true) + // POISON: call i32 @llvm.cttz.i32(i32 [[N]], i1 true) + // NOPOISON: call i32 @llvm.cttz.i32(i32 [[N]], i1 false) __builtin_ctz(n); // CHECK: call void @__ubsan_handle_invalid_builtin @@ -33,7 +35,8 @@ // CHECK-NEXT: unreachable // // Continuation block: - // CHECK: call i32 @llvm.ctlz.i32(i32 [[N]], i1 true) + // POISON: call i32 @llvm.ctlz.i32(i32 [[N]], i1 true) + // NOPOISON: call i32 @llvm.ctlz.i32(i32 [[N]], i1 false) __builtin_clz(n); // CHECK: call void @__ubsan_handle_invalid_builtin Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -1741,7 +1741,7 @@ && "Unsupported builtin check kind"); Value *ArgValue = EmitScalarExpr(E); - if (!SanOpts.has(SanitizerKind::Builtin) || !getTarget().isCLZForZeroUndef()) + if (!SanOpts.has(SanitizerKind::Builtin)) return ArgValue; SanitizerScope SanScope(this);
Index: clang/test/CodeGen/ubsan-builtin-checks.c =================================================================== --- clang/test/CodeGen/ubsan-builtin-checks.c +++ clang/test/CodeGen/ubsan-builtin-checks.c @@ -1,7 +1,8 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s -// RUN: %clang_cc1 -triple arm64-none-linux-gnu -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefix=NOT-UB +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefixes=CHECK,POISON +// RUN: %clang_cc1 -triple arm64-none-linux-gnu -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefixes=CHECK,NOPOISON -// NOT-UB-NOT: __ubsan_handle_invalid_builtin +// A zero input to __bultin_ctz/clz is considered UB even if the target does not +// want to optimize based on zero input being undefined. // CHECK: define{{.*}} void @check_ctz void check_ctz(int n) { @@ -13,7 +14,8 @@ // CHECK-NEXT: unreachable // // Continuation block: - // CHECK: call i32 @llvm.cttz.i32(i32 [[N]], i1 true) + // POISON: call i32 @llvm.cttz.i32(i32 [[N]], i1 true) + // NOPOISON: call i32 @llvm.cttz.i32(i32 [[N]], i1 false) __builtin_ctz(n); // CHECK: call void @__ubsan_handle_invalid_builtin @@ -33,7 +35,8 @@ // CHECK-NEXT: unreachable // // Continuation block: - // CHECK: call i32 @llvm.ctlz.i32(i32 [[N]], i1 true) + // POISON: call i32 @llvm.ctlz.i32(i32 [[N]], i1 true) + // NOPOISON: call i32 @llvm.ctlz.i32(i32 [[N]], i1 false) __builtin_clz(n); // CHECK: call void @__ubsan_handle_invalid_builtin Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -1741,7 +1741,7 @@ && "Unsupported builtin check kind"); Value *ArgValue = EmitScalarExpr(E); - if (!SanOpts.has(SanitizerKind::Builtin) || !getTarget().isCLZForZeroUndef()) + if (!SanOpts.has(SanitizerKind::Builtin)) return ArgValue; SanitizerScope SanScope(this);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits