filcab created this revision.
filcab added reviewers: kcc, samsonov, rsmith.
filcab added a subscriber: cfe-commits.
This patch introduces a simple way to bump of all the handlers in UBSan.
This way, we can easily break backwards compatibility without it being
confusing for users (a bit like the ASan
__asan_version_mismatch_check_vX symbol), since they'll get undefined
references when linking, instead of random checks providing invalid
information.
I chose to version all symbols at once (instead of just changing version
for one or two) since it avoids us needing to do lookups every time we
emit any check.
I haven't measured slowdown in a potential patch where we only rev the
checks we need, though.
This patch includes two commits: Adding an empty version string + bumping it to
_v2.
There's other alternatives of doing versions, but this one is simple,
efficient (enough), and will forcefully break with old object files (which is a
good thing). Bike-shed away anyway :-)
Before I land this diff, I want to redo D19667+D19668 on top of it. Then I can
commit them quickly so we're able to only rev up UBSan once, instead of having
an intermediary v2, and then bump to v3 immediately. If anyone would prefer a
more split up method I don't mind doing them separately, one at a time (they'll
always be different commits with both methods).
http://reviews.llvm.org/D21289
Files:
lib/CodeGen/CGExpr.cpp
test/CodeGen/catch-undef-behavior.c
test/CodeGen/cfi-check-fail.c
test/CodeGen/cfi-check-fail2.c
test/CodeGen/compound-assign-overflow.c
test/CodeGen/sanitize-recover.c
test/CodeGen/sanitize-trap.c
test/CodeGen/ubsan-strip-path-components.cpp
test/CodeGen/ubsan-type-blacklist.cpp
test/CodeGen/unsigned-overflow.c
test/CodeGen/unsigned-promotion.c
test/CodeGenCXX/bitsets.cpp
test/CodeGenCXX/catch-undef-behavior.cpp
Index: test/CodeGenCXX/catch-undef-behavior.cpp
===================================================================
--- test/CodeGenCXX/catch-undef-behavior.cpp
+++ test/CodeGenCXX/catch-undef-behavior.cpp
@@ -36,7 +36,7 @@
int &r = *p;
// A reference is not required to refer to an object within its lifetime.
- // CHECK-NOT: __ubsan_handle_dynamic_type_cache_miss
+ // CHECK-NOT: __ubsan_handle_dynamic_type_cache_miss_v2
S &r2 = *q;
}
@@ -86,7 +86,7 @@
// CHECK-NEXT: icmp eq i64 %[[CACHEVAL]], %[[HASH]]
// CHECK-NEXT: br i1
- // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %[[HASH]])
+ // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss_v2({{.*}}, i64 %{{.*}}, i64 %[[HASH]])
// CHECK-NOT: unreachable
// CHECK: {{.*}}:
@@ -121,7 +121,7 @@
// [...]
// CHECK: getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %
// CHECK: br i1
- // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %{{.*}})
+ // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss_v2({{.*}}, i64 %{{.*}}, i64 %{{.*}})
// CHECK-NOT: unreachable
// CHECK: {{.*}}:
@@ -149,25 +149,25 @@
// CHECK-NEXT: %[[VALID:.*]] = and i1 %[[RHS_INBOUNDS]], %[[VALID_BASE]]
// CHECK-NEXT: br i1 %[[VALID]]
- // CHECK: call void @__ubsan_handle_shift_out_of_bounds
- // CHECK-NOT: call void @__ubsan_handle_shift_out_of_bounds
+ // CHECK: call void @__ubsan_handle_shift_out_of_bounds_v2
+ // CHECK-NOT: call void @__ubsan_handle_shift_out_of_bounds_v2
// CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]]
// CHECK-NEXT: ret i32 %[[RET]]
return a << b;
}
// CHECK-LABEL: @_Z9no_return
int no_return() {
- // CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]]
+ // CHECK: call void @__ubsan_handle_missing_return_v2(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]]
// CHECK-NEXT: unreachable
}
// CHECK-LABEL: @_Z9sour_bool
bool sour_bool(bool *p) {
// CHECK: %[[OK:.*]] = icmp ule i8 {{.*}}, 1
// CHECK: br i1 %[[OK]]
- // CHECK: call void @__ubsan_handle_load_invalid_value(i8* bitcast ({{.*}}), i64 {{.*}})
+ // CHECK: call void @__ubsan_handle_load_invalid_value_v2(i8* bitcast ({{.*}}), i64 {{.*}})
return *p;
}
@@ -179,19 +179,19 @@
int bad_enum_value() {
// CHECK: %[[E1:.*]] = icmp ule i32 {{.*}}, 127
// CHECK: br i1 %[[E1]]
- // CHECK: call void @__ubsan_handle_load_invalid_value(
+ // CHECK: call void @__ubsan_handle_load_invalid_value_v2(
int a = e1;
// CHECK: %[[E2HI:.*]] = icmp sle i32 {{.*}}, 127
// CHECK: %[[E2LO:.*]] = icmp sge i32 {{.*}}, -128
// CHECK: %[[E2:.*]] = and i1 %[[E2HI]], %[[E2LO]]
// CHECK: br i1 %[[E2]]
- // CHECK: call void @__ubsan_handle_load_invalid_value(
+ // CHECK: call void @__ubsan_handle_load_invalid_value_v2(
int b = e2;
// CHECK: %[[E3:.*]] = icmp ule i32 {{.*}}, 2147483647
// CHECK: br i1 %[[E3]]
- // CHECK: call void @__ubsan_handle_load_invalid_value(
+ // CHECK: call void @__ubsan_handle_load_invalid_value_v2(
int c = e3;
return a + b + c;
}
@@ -213,12 +213,12 @@
// CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]]
// CHECK: br i1 %[[E12]],
- // CHECK: call void @__ubsan_handle_type_mismatch
+ // CHECK: call void @__ubsan_handle_type_mismatch_v2
// CHECK: br label
// CHECK: br i1 %{{.*}},
- // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss
+ // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss_v2
// CHECK: br label
(void) static_cast<T*>(p);
}
@@ -238,36 +238,36 @@
// CHECK: %[[E123:.*]] = and i1 %[[E12]], %[[E3]]
// CHECK: br i1 %[[E123]],
- // CHECK: call void @__ubsan_handle_type_mismatch
+ // CHECK: call void @__ubsan_handle_type_mismatch_v2
// CHECK: br label
// CHECK: br i1 %{{.*}},
- // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss
+ // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss_v2
// CHECK: br label
(void) static_cast<T&>(p);
}
// CHECK-LABEL: @_Z11array_index
int array_index(const int (&a)[4], int n) {
// CHECK: %[[K1_OK:.*]] = icmp ult i64 %{{.*}}, 4
// CHECK: br i1 %[[K1_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
int k1 = a[n];
// CHECK: %[[R1_OK:.*]] = icmp ule i64 %{{.*}}, 4
// CHECK: br i1 %[[R1_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
const int *r1 = &a[n];
// CHECK: %[[K2_OK:.*]] = icmp ult i64 %{{.*}}, 8
// CHECK: br i1 %[[K2_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
int k2 = ((const int(&)[8])a)[n];
// CHECK: %[[K3_OK:.*]] = icmp ult i64 %{{.*}}, 4
// CHECK: br i1 %[[K3_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
int k3 = n[a];
return k1 + *r1 + k2;
@@ -279,24 +279,24 @@
// CHECK: %[[IDX2_OK:.*]] = icmp ult i64 %{{.*}}, 6
// CHECK: br i1 %[[IDX2_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
// CHECK: %[[IDX1_OK:.*]] = icmp ult i64 %{{.*}}, 4
// CHECK: br i1 %[[IDX1_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
return arr[n][m];
}
// CHECK-LABEL: @_Z11array_arith
int array_arith(const int (&a)[4], int n) {
// CHECK: %[[K1_OK:.*]] = icmp ule i64 %{{.*}}, 4
// CHECK: br i1 %[[K1_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
const int *k1 = a + n;
// CHECK: %[[K2_OK:.*]] = icmp ule i64 %{{.*}}, 8
// CHECK: br i1 %[[K2_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
const int *k2 = (const int(&)[8])a + n;
return *k1 + *k2;
@@ -310,37 +310,37 @@
int struct_array_index(ArrayMembers *p, int n) {
// CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 5
// CHECK: br i1 %[[IDX_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
return p->a1[n];
}
// CHECK-LABEL: @_Z16flex_array_index
int flex_array_index(ArrayMembers *p, int n) {
- // CHECK-NOT: call void @__ubsan_handle_out_of_bounds(
+ // CHECK-NOT: call void @__ubsan_handle_out_of_bounds_v2(
return p->a2[n];
}
extern int incomplete[];
// CHECK-LABEL: @_Z22incomplete_array_index
int incomplete_array_index(int n) {
- // CHECK-NOT: call void @__ubsan_handle_out_of_bounds(
+ // CHECK-NOT: call void @__ubsan_handle_out_of_bounds_v2(
return incomplete[n];
}
typedef __attribute__((ext_vector_type(4))) int V4I;
// CHECK-LABEL: @_Z12vector_index
int vector_index(V4I v, int n) {
// CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 4
// CHECK: br i1 %[[IDX_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
return v[n];
}
// CHECK-LABEL: @_Z12string_index
char string_index(int n) {
// CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 6
// CHECK: br i1 %[[IDX_OK]]
- // CHECK: call void @__ubsan_handle_out_of_bounds(
+ // CHECK: call void @__ubsan_handle_out_of_bounds_v2(
return "Hello"[n];
}
@@ -430,7 +430,7 @@
// CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7
// CHECK: icmp eq i64 %[[MISALIGN]], 0
- // CHECK: call void @__ubsan_handle_type_mismatch
+ // CHECK: call void @__ubsan_handle_type_mismatch_v2
return t;
}
@@ -443,23 +443,23 @@
// CHECK-NOT: br i1
// CHECK: call i64 @llvm.objectsize
- // CHECK: call void @__ubsan_handle_type_mismatch
- // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss
+ // CHECK: call void @__ubsan_handle_type_mismatch_v2
+ // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss_v2
const S& s = getV();
}
}
namespace CopyValueRepresentation {
// CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S3aSERKS0_
- // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value
+ // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value_v2
// CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S4aSEOS0_
- // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value
+ // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value_v2
// CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S1C2ERKS0_
- // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value
+ // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value_v2
// CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S2C2ERKS0_
- // CHECK: __ubsan_handle_load_invalid_value
+ // CHECK: __ubsan_handle_load_invalid_value_v2
// CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S5C2ERKS0_
- // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value
+ // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value_v2
struct CustomCopy { CustomCopy(); CustomCopy(const CustomCopy&); };
struct S1 {
Index: test/CodeGenCXX/bitsets.cpp
===================================================================
--- test/CodeGenCXX/bitsets.cpp
+++ test/CodeGenCXX/bitsets.cpp
@@ -77,9 +77,9 @@
// NDIAG-NEXT: unreachable
// DIAG-NEXT: [[VTINT:%[^ ]*]] = ptrtoint i8* [[VT]] to i64
// DIAG-NEXT: [[VTVALID:%[^ ]*]] = zext i1 [[VTVALID0]] to i64
- // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]])
+ // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort_v2(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]])
// DIAG-ABORT-NEXT: unreachable
- // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]])
+ // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail_v2(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]])
// DIAG-RECOVER-NEXT: br label %[[CONTBB]]
// CFI: [[CONTBB]]
Index: test/CodeGen/unsigned-promotion.c
===================================================================
--- test/CodeGen/unsigned-promotion.c
+++ test/CodeGen/unsigned-promotion.c
@@ -20,7 +20,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_add_overflow
+ // CHECKS: call void @__ubsan_handle_add_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i16, i16* @sj
// CHECKU: [[T2:%.*]] = zext i16 [[T1]]
@@ -42,7 +42,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_sub_overflow
+ // CHECKS: call void @__ubsan_handle_sub_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i16, i16* @sj
// CHECKU: [[T2:%.*]] = zext i16 [[T1]]
@@ -64,7 +64,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_mul_overflow
+ // CHECKS: call void @__ubsan_handle_mul_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i16, i16* @sj
// CHECKU: [[T2:%.*]] = zext i16 [[T1]]
@@ -85,7 +85,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_add_overflow
+ // CHECKS: call void @__ubsan_handle_add_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i8, i8* @cj
// CHECKU: [[T2:%.*]] = zext i8 [[T1]]
@@ -107,7 +107,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_sub_overflow
+ // CHECKS: call void @__ubsan_handle_sub_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i8, i8* @cj
// CHECKU: [[T2:%.*]] = zext i8 [[T1]]
@@ -129,7 +129,7 @@
// CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
// CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
// CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
- // CHECKS: call void @__ubsan_handle_mul_overflow
+ // CHECKS: call void @__ubsan_handle_mul_overflow_abort_v2
//
// CHECKU: [[T1:%.*]] = load i8, i8* @cj
// CHECKU: [[T2:%.*]] = zext i8 [[T1]]
Index: test/CodeGen/unsigned-overflow.c
===================================================================
--- test/CodeGen/unsigned-overflow.c
+++ test/CodeGen/unsigned-overflow.c
@@ -16,7 +16,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
li = lj + lk;
}
@@ -28,7 +28,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[T1]], i64 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_sub_overflow
+ // CHECK: call void @__ubsan_handle_sub_overflow_abort_v2
li = lj - lk;
}
@@ -40,7 +40,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[T1]], i64 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_mul_overflow
+ // CHECK: call void @__ubsan_handle_mul_overflow_abort_v2
li = lj * lk;
}
@@ -52,7 +52,7 @@
// CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
// CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
}
// CHECK-LABEL: define void @testlongpreinc()
@@ -63,7 +63,7 @@
// CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
// CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
}
// CHECK-LABEL: define void @testintadd()
@@ -74,7 +74,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
ii = ij + ik;
}
@@ -86,7 +86,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[T1]], i32 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_sub_overflow
+ // CHECK: call void @__ubsan_handle_sub_overflow_abort_v2
ii = ij - ik;
}
@@ -98,7 +98,7 @@
// CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 [[T2]])
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
// CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
- // CHECK: call void @__ubsan_handle_mul_overflow
+ // CHECK: call void @__ubsan_handle_mul_overflow_abort_v2
ii = ij * ik;
}
@@ -110,7 +110,7 @@
// CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)
// CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
}
// CHECK-LABEL: define void @testintpreinc()
@@ -121,5 +121,5 @@
// CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)
// CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
// CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1
- // CHECK: call void @__ubsan_handle_add_overflow
+ // CHECK: call void @__ubsan_handle_add_overflow_abort_v2
}
Index: test/CodeGen/ubsan-type-blacklist.cpp
===================================================================
--- test/CodeGen/ubsan-type-blacklist.cpp
+++ test/CodeGen/ubsan-type-blacklist.cpp
@@ -14,8 +14,8 @@
// DEFAULT: @_Z7checkmev
// TYPE: @_Z7checkmev
void checkme() {
-// DEFAULT: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}} ({{.*}}* @bar to
-// TYPE-NOT: @__ubsan_handle_dynamic_type_cache_miss
+// DEFAULT: call void @__ubsan_handle_dynamic_type_cache_miss_v2({{.*}} ({{.*}}* @bar to
+// TYPE-NOT: @__ubsan_handle_dynamic_type_cache_miss_v2
Foo* foo = static_cast<Foo*>(&bar); // down-casting
// DEFAULT: ret void
// TYPE: ret void
Index: test/CodeGen/ubsan-strip-path-components.cpp
===================================================================
--- test/CodeGen/ubsan-strip-path-components.cpp
+++ test/CodeGen/ubsan-strip-path-components.cpp
@@ -24,6 +24,6 @@
void f() {
// CHECK-LABEL: @_Z1fv(
g(__FILE__);
- // CHECK: call void @__ubsan_handle_builtin_unreachable(i8* bitcast ({ { [{{.*}} x i8]*, i32, i32 } }* @[[STATIC_DATA]] to i8*)) {{.*}}, !nosanitize
+ // CHECK: call void @__ubsan_handle_builtin_unreachable_v2(i8* bitcast ({ { [{{.*}} x i8]*, i32, i32 } }* @[[STATIC_DATA]] to i8*)) {{.*}}, !nosanitize
__builtin_unreachable();
}
Index: test/CodeGen/sanitize-trap.c
===================================================================
--- test/CodeGen/sanitize-trap.c
+++ test/CodeGen/sanitize-trap.c
@@ -22,7 +22,7 @@
// CHECK: {{^|:}}[[L4]]
// CHECK-NEXT: zext
// CHECK-NEXT: zext
- // CHECK-NEXT: __ubsan_handle_divrem_overflow
+ // CHECK-NEXT: __ubsan_handle_divrem_overflow_abort_v2
// CHECK: {{^|:}}[[L3]]
// CHECK-NEXT: sdiv i32 %[[N]], %[[D]]
Index: test/CodeGen/sanitize-recover.c
===================================================================
--- test/CodeGen/sanitize-recover.c
+++ test/CodeGen/sanitize-recover.c
@@ -8,10 +8,10 @@
extern volatile unsigned x, y, z;
// RECOVER: uadd.with.overflow.i32
- // RECOVER: ubsan_handle_add_overflow(
+ // RECOVER: __ubsan_handle_add_overflow_v2(
// RECOVER-NOT: unreachable
// ABORT: uadd.with.overflow.i32
- // ABORT: ubsan_handle_add_overflow_abort(
+ // ABORT: __ubsan_handle_add_overflow_abort_v2(
// ABORT: unreachable
x = y + z;
}
@@ -33,7 +33,7 @@
// PARTIAL: br i1 %[[CHECK012]], {{.*}} !prof ![[WEIGHT_MD:.*]], !nosanitize
// PARTIAL: br i1 %[[CHECK02]], {{.*}}
- // PARTIAL: call void @__ubsan_handle_type_mismatch_abort(
+ // PARTIAL: call void @__ubsan_handle_type_mismatch_abort_v2(
// PARTIAL-NEXT: unreachable
- // PARTIAL: call void @__ubsan_handle_type_mismatch(
+ // PARTIAL: call void @__ubsan_handle_type_mismatch_v2(
}
Index: test/CodeGen/compound-assign-overflow.c
===================================================================
--- test/CodeGen/compound-assign-overflow.c
+++ test/CodeGen/compound-assign-overflow.c
@@ -15,21 +15,21 @@
void compaddsigned() {
#line 100
x += ((int32_t)1);
- // CHECK: @__ubsan_handle_add_overflow(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), {{.*}})
+ // CHECK: @__ubsan_handle_add_overflow_v2(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), {{.*}})
}
// CHECK: @compaddunsigned
void compaddunsigned() {
#line 200
x += ((uint32_t)1U);
- // CHECK: @__ubsan_handle_add_overflow(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), {{.*}})
+ // CHECK: @__ubsan_handle_add_overflow_v2(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), {{.*}})
}
int8_t a, b;
// CHECK: @compdiv
void compdiv() {
#line 300
a /= b;
- // CHECK: @__ubsan_handle_divrem_overflow(i8* bitcast ({{.*}} @[[LINE_300]] to i8*), {{.*}})
+ // CHECK: @__ubsan_handle_divrem_overflow_v2(i8* bitcast ({{.*}} @[[LINE_300]] to i8*), {{.*}})
}
Index: test/CodeGen/cfi-check-fail2.c
===================================================================
--- test/CodeGen/cfi-check-fail2.c
+++ test/CodeGen/cfi-check-fail2.c
@@ -31,7 +31,7 @@
// CHECK: [[HANDLE0]]:
// CHECK: %[[DATA0:.*]] = ptrtoint i8* %[[DATA]] to i64,
// CHECK: %[[ADDR0:.*]] = ptrtoint i8* %[[ADDR]] to i64,
-// CHECK: call void @__ubsan_handle_cfi_check_fail_abort(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]])
+// CHECK: call void @__ubsan_handle_cfi_check_fail_abort_v2(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]])
// CHECK: unreachable
// CHECK: [[CONT1]]:
Index: test/CodeGen/cfi-check-fail.c
===================================================================
--- test/CodeGen/cfi-check-fail.c
+++ test/CodeGen/cfi-check-fail.c
@@ -31,7 +31,7 @@
// CHECK: [[HANDLE0]]:
// CHECK: %[[DATA0:.*]] = ptrtoint i8* %[[DATA]] to i64,
// CHECK: %[[ADDR0:.*]] = ptrtoint i8* %[[ADDR]] to i64,
-// CHECK: call void @__ubsan_handle_cfi_check_fail(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]])
+// CHECK: call void @__ubsan_handle_cfi_check_fail_v2(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]])
// CHECK: br label %[[CONT1]]
// CHECK: [[CONT1]]:
@@ -49,7 +49,7 @@
// CHECK: [[HANDLE2]]:
// CHECK: %[[DATA2:.*]] = ptrtoint i8* %[[DATA]] to i64,
// CHECK: %[[ADDR2:.*]] = ptrtoint i8* %[[ADDR]] to i64,
-// CHECK: call void @__ubsan_handle_cfi_check_fail_abort(i64 %[[DATA2]], i64 %[[ADDR2]], i64 %[[VTVALID]])
+// CHECK: call void @__ubsan_handle_cfi_check_fail_abort_v2(i64 %[[DATA2]], i64 %[[ADDR2]], i64 %[[VTVALID]])
// CHECK: unreachable
// CHECK: [[CONT3]]:
@@ -59,7 +59,7 @@
// CHECK: [[HANDLE3]]:
// CHECK: %[[DATA3:.*]] = ptrtoint i8* %[[DATA]] to i64,
// CHECK: %[[ADDR3:.*]] = ptrtoint i8* %[[ADDR]] to i64,
-// CHECK: call void @__ubsan_handle_cfi_check_fail(i64 %[[DATA3]], i64 %[[ADDR3]], i64 %[[VTVALID]])
+// CHECK: call void @__ubsan_handle_cfi_check_fail_v2(i64 %[[DATA3]], i64 %[[ADDR3]], i64 %[[VTVALID]])
// CHECK: br label %[[CONT4]]
// CHECK: [[CONT4]]:
Index: test/CodeGen/catch-undef-behavior.c
===================================================================
--- test/CodeGen/catch-undef-behavior.c
+++ test/CodeGen/catch-undef-behavior.c
@@ -54,15 +54,15 @@
// CHECK-TRAP: br i1 %[[OK]], {{.*}}
// CHECK-UBSAN: %[[ARG:.*]] = ptrtoint {{.*}} %[[PTR]] to i64
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %[[ARG]])
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %[[ARG]])
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW:#[0-9]+]]
// CHECK-TRAP-NEXT: unreachable
// With -fsanitize=null, only perform the null check.
// CHECK-NULL: %[[NULL:.*]] = icmp ne {{.*}}, null
// CHECK-NULL: br i1 %[[NULL]]
- // CHECK-NULL: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %{{.*}})
+ // CHECK-NULL: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %{{.*}})
#line 100
u.i=1;
}
@@ -77,7 +77,7 @@
// CHECK-COMMON-NEXT: icmp eq i64 %[[MISALIGN]], 0
// CHECK-UBSAN: %[[ARG:.*]] = ptrtoint
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), i64 %[[ARG]])
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), i64 %[[ARG]])
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -112,8 +112,8 @@
// CHECK-UBSAN: %[[ARG1:.*]] = zext
// CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_300]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
- // CHECK-UBSAN-NOT: call void @__ubsan_handle_shift_out_of_bounds
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds_v2(i8* bitcast ({{.*}} @[[LINE_300]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
+ // CHECK-UBSAN-NOT: call void @__ubsan_handle_shift_out_of_bounds_v2
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP: unreachable
@@ -132,7 +132,7 @@
// CHECK-UBSAN: %[[ARG1:.*]] = zext
// CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_400]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds_v2(i8* bitcast ({{.*}} @[[LINE_400]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -145,7 +145,7 @@
// CHECK-COMMON-LABEL: @load
int load(int *p) {
- // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_500]] to i8*), i64 %{{.*}})
+ // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_500]] to i8*), i64 %{{.*}})
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -155,7 +155,7 @@
// CHECK-COMMON-LABEL: @store
void store(int *p, int q) {
- // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_600]] to i8*), i64 %{{.*}})
+ // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_600]] to i8*), i64 %{{.*}})
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -167,7 +167,7 @@
// CHECK-COMMON-LABEL: @member_access
int *member_access(struct S *p) {
- // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_700]] to i8*), i64 %{{.*}})
+ // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v2(i8* bitcast ({{.*}} @[[LINE_700]] to i8*), i64 %{{.*}})
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -179,7 +179,7 @@
int signed_overflow(int a, int b) {
// CHECK-UBSAN: %[[ARG1:.*]] = zext
// CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_add_overflow(i8* bitcast ({{.*}} @[[LINE_800]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_add_overflow_v2(i8* bitcast ({{.*}} @[[LINE_800]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -202,7 +202,7 @@
// CHECK-UBSAN: icmp sgt i32 %[[PARAM:.*]], 0
//
// CHECK-UBSAN: %[[ARG:.*]] = zext i32 %[[PARAM]] to i64
- // CHECK-UBSAN-NEXT: call void @__ubsan_handle_vla_bound_not_positive(i8* bitcast ({{.*}} @[[LINE_900]] to i8*), i64 %[[ARG]])
+ // CHECK-UBSAN-NEXT: call void @__ubsan_handle_vla_bound_not_positive_v2(i8* bitcast ({{.*}} @[[LINE_900]] to i8*), i64 %[[ARG]])
#line 900
int arr[n * 3];
}
@@ -219,7 +219,7 @@
// CHECK-COMMON: %[[INBOUNDS:.*]] = icmp ule i128 %{{.*}}, -20282409603651670423947251286016
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1000]] to i8*),
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1000]] to i8*),
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -234,7 +234,7 @@
// CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1100]] to i8*),
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1100]] to i8*),
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -251,7 +251,7 @@
// CHECK-UBSAN: %[[CAST:.*]] = bitcast float %[[F]] to i32
// CHECK-UBSAN: %[[ARG:.*]] = zext i32 %[[CAST]] to i64
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1200]] to i8*), i64 %[[ARG]]
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1200]] to i8*), i64 %[[ARG]]
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -270,7 +270,7 @@
// CHECK-UBSAN: store x86_fp80 %[[F]], x86_fp80* %[[ALLOCA:.*]], align 16, !nosanitize
// CHECK-UBSAN: %[[ARG:.*]] = ptrtoint x86_fp80* %[[ALLOCA]] to i64
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1300]] to i8*), i64 %[[ARG]]
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1300]] to i8*), i64 %[[ARG]]
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -285,7 +285,7 @@
// CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1400]] to i8*),
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1400]] to i8*),
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -300,7 +300,7 @@
// CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1500]] to i8*),
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1500]] to i8*),
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -317,7 +317,7 @@
// CHECK-COMMON: %[[INBOUNDS:.*]] = xor i1 %[[OUTOFBOUNDS]], true
// CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]
- // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(i8* bitcast ({{.*}} @[[LINE_1600]] to i8*),
+ // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow_v2(i8* bitcast ({{.*}} @[[LINE_1600]] to i8*),
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP-NEXT: unreachable
@@ -355,7 +355,7 @@
// CHECK-COMMON: %[[OK:.*]] = icmp ule i8 {{.*}}, 1
// CHECK-COMMON: br i1 %[[OK]]
- // CHECK-UBSAN: call void @__ubsan_handle_load_invalid_value(i8* bitcast ({{.*}}), i64 {{.*}})
+ // CHECK-UBSAN: call void @__ubsan_handle_load_invalid_value_v2(i8* bitcast ({{.*}}), i64 {{.*}})
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP: unreachable
@@ -368,7 +368,7 @@
// CHECK-COMMON: [[OK:%.*]] = icmp ne i32* {{.*}}, null
// CHECK-COMMON: br i1 [[OK]]
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_return
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_return_v2
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP: unreachable
@@ -381,7 +381,7 @@
// CHECK-COMMON: [[OK:%.*]] = icmp ne i32* {{.*}}, null
// CHECK-COMMON: br i1 [[OK]]
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
// CHECK-TRAP: unreachable
@@ -393,11 +393,11 @@
// CHECK-COMMON-LABEL: @call_memcpy_nonnull
void call_memcpy_nonnull(void *p, void *q, int sz) {
// CHECK-COMMON: icmp ne i8* {{.*}}, null
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
// CHECK-TRAP: call void @llvm.trap()
// CHECK-COMMON: icmp ne i8* {{.*}}, null
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
// CHECK-TRAP: call void @llvm.trap()
memcpy(p, q, sz);
}
@@ -407,11 +407,11 @@
// CHECK-COMMON-LABEL: @call_memmove_nonnull
void call_memmove_nonnull(void *p, void *q, int sz) {
// CHECK-COMMON: icmp ne i8* {{.*}}, null
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
// CHECK-TRAP: call void @llvm.trap()
// CHECK-COMMON: icmp ne i8* {{.*}}, null
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
// CHECK-TRAP: call void @llvm.trap()
memmove(p, q, sz);
}
@@ -422,8 +422,8 @@
// CHECK-COMMON: [[OK:%.*]] = icmp ne i32* {{.*}}, null
// CHECK-COMMON: br i1 [[OK]]
- // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg
- // CHECK-UBSAN-NOT: __ubsan_handle_nonnull_arg
+ // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg_v2
+ // CHECK-UBSAN-NOT: __ubsan_handle_nonnull_arg_v2
// CHECK-COMMON: call void (i32, ...) @nonnull_variadic
nonnull_variadic(a, b);
Index: lib/CodeGen/CGExpr.cpp
===================================================================
--- lib/CodeGen/CGExpr.cpp
+++ lib/CodeGen/CGExpr.cpp
@@ -2443,6 +2443,7 @@
}
}
+const char *VersionSuffix = "_v2";
static void emitCheckHandlerCall(CodeGenFunction &CGF,
llvm::FunctionType *FnType,
ArrayRef<llvm::Value *> FnArgs,
@@ -2453,7 +2454,8 @@
bool NeedsAbortSuffix =
IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
std::string FnName = ("__ubsan_handle_" + CheckName +
- (NeedsAbortSuffix ? "_abort" : "")).str();
+ (NeedsAbortSuffix ? "_abort" : "") + VersionSuffix)
+ .str();
bool MayReturn =
!IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits