mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 12:26:08 +00:00

This flag causes the compiler to emit bit set entries for functions as well as runtime bitset checks at indirect call sites. Depends on the new function bitset mechanism. Differential Revision: http://reviews.llvm.org/D11857 llvm-svn: 247238
36 lines
1.0 KiB
C++
36 lines
1.0 KiB
C++
// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-nvcall -emit-llvm -o - %s | FileCheck %s
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-nvcall,cfi-cast-strict -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-STRICT %s
|
|
|
|
struct A {
|
|
virtual void f();
|
|
};
|
|
|
|
struct B : A {
|
|
int i;
|
|
void g();
|
|
};
|
|
|
|
struct C : A {
|
|
void g();
|
|
};
|
|
|
|
// CHECK-LABEL: @bg
|
|
// CHECK-STRICT-LABEL: @bg
|
|
extern "C" void bg(B *b) {
|
|
// CHECK: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B")
|
|
// CHECK-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B")
|
|
b->g();
|
|
}
|
|
|
|
// CHECK-LABEL: @cg
|
|
// CHECK-STRICT-LABEL: @cg
|
|
extern "C" void cg(C *c) {
|
|
// http://clang.llvm.org/docs/ControlFlowIntegrity.html#strictness
|
|
// In this case C's layout is the same as its base class, so we allow
|
|
// c to be of type A in non-strict mode.
|
|
|
|
// CHECK: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A")
|
|
// CHECK-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C")
|
|
c->g();
|
|
}
|