forked from OSchip/llvm-project
CodeGen: Only emit CFI unrelated cast checks for bit casts.
We were previously emitting them for no-op casts (e.g. implicit casts to const). llvm-svn: 257738
This commit is contained in:
parent
a6b2c4f721
commit
574975efa9
|
@ -824,7 +824,8 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|||
getNaturalPointeeTypeAlignment(E->getType(), Source));
|
||||
}
|
||||
|
||||
if (SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
|
||||
if (SanOpts.has(SanitizerKind::CFIUnrelatedCast) &&
|
||||
CE->getCastKind() == CK_BitCast) {
|
||||
if (auto PT = E->getType()->getAs<PointerType>())
|
||||
EmitVTablePtrCheckForCast(PT->getPointeeType(), Addr.getPointer(),
|
||||
/*MayBeNull=*/true,
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
struct A {
|
||||
virtual void f();
|
||||
int i() const;
|
||||
};
|
||||
|
||||
struct B : A {
|
||||
|
@ -103,23 +104,31 @@ void vbrr(char &&r) {
|
|||
// CHECK-UCAST-LABEL: define void @_Z3vcpPv
|
||||
// CHECK-UCAST-STRICT-LABEL: define void @_Z3vcpPv
|
||||
void vcp(void *p) {
|
||||
// CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
// CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
static_cast<C*>(p);
|
||||
}
|
||||
|
||||
// CHECK-UCAST-LABEL: define void @_Z3bcpP1B
|
||||
// CHECK-UCAST-STRICT-LABEL: define void @_Z3bcpP1B
|
||||
void bcp(B *p) {
|
||||
// CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
// CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
(C *)p;
|
||||
}
|
||||
|
||||
// CHECK-UCAST-LABEL: define void @_Z8bcp_callP1B
|
||||
// CHECK-UCAST-STRICT-LABEL: define void @_Z8bcp_callP1B
|
||||
void bcp_call(B *p) {
|
||||
// CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
// CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
||||
// CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
||||
((C *)p)->f();
|
||||
}
|
||||
|
||||
// CHECK-UCAST-LABEL: define i32 @_Z6a_callP1A
|
||||
// CHECK-UCAST-STRICT-LABEL: define i32 @_Z6a_callP1A
|
||||
int a_call(A *a) {
|
||||
// CHECK-UCAST-NOT: @llvm.bitset.test
|
||||
// CHECK-UCAST-STRICT-NOT: @llvm.bitset.test
|
||||
return a->i();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue