88#error Missing kcfi?
99#endif
1010
11- #define __kcfi_salt __attribute__((kcfi_salt ("pepper")))
11+ #define __cfi_salt __attribute__((cfi_salt ("pepper")))
1212
1313typedef int (* fn_t )(void );
14- typedef int __kcfi_salt (* fn_salt_t )(void );
14+ typedef int __cfi_salt (* fn_salt_t )(void );
1515
1616typedef unsigned int (* ufn_t )(void );
17- typedef unsigned int __kcfi_salt (* ufn_salt_t )(void );
17+ typedef unsigned int __cfi_salt (* ufn_salt_t )(void );
1818
1919/// Must emit __kcfi_typeid symbols for address-taken function declarations
2020// CHECK: module asm ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]"
@@ -26,25 +26,25 @@ typedef unsigned int __kcfi_salt (*ufn_salt_t)(void);
2626// CHECK-NOT: module asm ".weak __kcfi_typeid_{{f6|_Z2f6v}}"
2727
2828int f1 (void );
29- int f1_salt (void ) __kcfi_salt ;
29+ int f1_salt (void ) __cfi_salt ;
3030
3131unsigned int f2 (void );
32- unsigned int f2_salt (void ) __kcfi_salt ;
32+ unsigned int f2_salt (void ) __cfi_salt ;
3333
3434static int f3 (void );
35- static int f3_salt (void ) __kcfi_salt ;
35+ static int f3_salt (void ) __cfi_salt ;
3636
3737extern int f4 (void );
38- extern int f4_salt (void ) __kcfi_salt ;
38+ extern int f4_salt (void ) __cfi_salt ;
3939
4040static int f5 (void );
41- static int f5_salt (void ) __kcfi_salt ;
41+ static int f5_salt (void ) __cfi_salt ;
4242
4343extern int f6 (void );
44- extern int f6_salt (void ) __kcfi_salt ;
44+ extern int f6_salt (void ) __cfi_salt ;
4545
4646struct cfi_struct {
47- fn_t __kcfi_salt fptr ;
47+ fn_t __cfi_salt fptr ;
4848 fn_salt_t td_fptr ;
4949};
5050
@@ -66,7 +66,7 @@ int __call(fn_t f) __attribute__((__no_sanitize__("kcfi"))) {
6666// CHECK-LABEL: @{{call_salt_ty|_Z12call_salt_tyPFivE}}
6767// CHECK: call{{.*}} i32 %{{.}}(){{.*}} [ "kcfi"(i32 [[#SALTY_HASH]]) ]
6868int call (fn_t f ) { return f (); }
69- int call_salt (fn_t __kcfi_salt f ) { return f (); }
69+ int call_salt (fn_t __cfi_salt f ) { return f (); }
7070int call_salt_ty (fn_salt_t f ) { return f (); }
7171
7272// CHECK-LABEL: @{{ucall|_Z5ucallPFjvE}}
@@ -76,7 +76,7 @@ int call_salt_ty(fn_salt_t f) { return f(); }
7676// CHECK-LABEL: @{{ucall_salt_ty|_Z13ucall_salt_tyPFjvE}}
7777// CHECK: call{{.*}} i32 %{{.}}(){{.*}} [ "kcfi"(i32 [[#SALTY_UHASH]]) ]
7878unsigned int ucall (ufn_t f ) { return f (); }
79- unsigned int ucall_salt (ufn_t __kcfi_salt f ) { return f (); }
79+ unsigned int ucall_salt (ufn_t __cfi_salt f ) { return f (); }
8080unsigned int ucall_salt_ty (ufn_salt_t f ) { return f (); }
8181
8282int test1 (struct cfi_struct * ptr ) {
@@ -114,21 +114,21 @@ int test1(struct cfi_struct *ptr) {
114114// CHECK-LABEL: define dso_local{{.*}} i32 @{{f1_salt|_Z7f1_saltv}}(){{.*}} !kcfi_type
115115// CHECK-SAME: ![[#SALTY_TYPE:]]
116116int f1 (void ) { return 0 ; }
117- int f1_salt (void ) __kcfi_salt { return 0 ; }
117+ int f1_salt (void ) __cfi_salt { return 0 ; }
118118
119119// CHECK-LABEL: define dso_local{{.*}} i32 @{{f2|_Z2f2v}}(){{.*}} !kcfi_type
120120// CHECK-SAME: ![[#LOW_SODIUM_UTYPE:]]
121121// CHECK: define dso_local{{.*}} i32 @{{f2_salt|_Z7f2_saltv}}(){{.*}} !kcfi_type
122122// CHECK-SAME: ![[#SALTY_UTYPE:]]
123123unsigned int f2 (void ) { return 2 ; }
124- unsigned int f2_salt (void ) __kcfi_salt { return 2 ; }
124+ unsigned int f2_salt (void ) __cfi_salt { return 2 ; }
125125
126126// CHECK-LABEL: define internal{{.*}} i32 @{{f3|_ZL2f3v}}(){{.*}} !kcfi_type
127127// CHECK-SAME: ![[#LOW_SODIUM_TYPE]]
128128// CHECK-LABEL: define internal{{.*}} i32 @{{f3_salt|_ZL7f3_saltv}}(){{.*}} !kcfi_type
129129// CHECK-SAME: ![[#SALTY_TYPE]]
130130static int f3 (void ) { return 1 ; }
131- static int f3_salt (void ) __kcfi_salt { return 1 ; }
131+ static int f3_salt (void ) __cfi_salt { return 1 ; }
132132
133133// CHECK: declare !kcfi_type ![[#LOW_SODIUM_TYPE]]{{.*}} i32 @[[F4]]()
134134// CHECK: declare !kcfi_type ![[#SALTY_TYPE]]{{.*}} i32 @[[F4_SALT]]()
@@ -141,7 +141,7 @@ static int f3_salt(void) __kcfi_salt { return 1; }
141141// CHECK-NOT: !kcfi_type
142142// CHECK-SAME: {
143143static int f5 (void ) { return 2 ; }
144- static int f5_salt (void ) __kcfi_salt { return 2 ; }
144+ static int f5_salt (void ) __cfi_salt { return 2 ; }
145145
146146// CHECK: declare !kcfi_type ![[#LOW_SODIUM_TYPE]]{{.*}} i32 @{{f6|_Z2f6v}}()
147147// CHECK: declare !kcfi_type ![[#SALTY_TYPE]]{{.*}} i32 @{{f6_salt|_Z7f6_saltv}}()
@@ -153,6 +153,29 @@ static int f5_salt(void) __kcfi_salt { return 2; }
153153int f7_salt (struct cfi_struct * ptr ) { return ptr -> fptr (); }
154154int f7_typedef_salt (struct cfi_struct * ptr ) { return ptr -> td_fptr (); }
155155
156+ #ifdef __cplusplus
157+ // MEMBER-LABEL: define dso_local void @_Z16test_member_callv() #0 !kcfi_type
158+ // MEMBER: call void %[[#]](ptr{{.*}} [ "kcfi"(i32 [[#%d,MEMBER_LOW_SODIUM_HASH:]]) ]
159+ // MEMBER: call void %[[#]](ptr{{.*}} [ "kcfi"(i32 [[#%d,MEMBER_SALT_HASH:]]) ]
160+
161+ // MEMBER-LABEL: define{{.*}} void @_ZN1A1fEv(ptr{{.*}} %this){{.*}} !kcfi_type
162+ // MEMBER-SAME: [[#MEMBER_LOW_SODIUM_TYPE:]]
163+ // MEMBER-LABEL: define{{.*}} void @_ZN1A1gEv(ptr{{.*}} %this){{.*}} !kcfi_type
164+ // MEMBER-SAME: [[#MEMBER_SALT_TYPE:]]
165+ struct A {
166+ void f () {}
167+ void __cfi_salt g () {}
168+ };
169+
170+ void test_member_call (void ) {
171+ void (A ::* p )() = & A ::f ;
172+ (A ().* p )();
173+
174+ void __cfi_salt (A ::* q )() = & A ::g ;
175+ (A ().* q )();
176+ }
177+ #endif
178+
156179// CHECK: ![[#]] = !{i32 4, !"kcfi", i32 1}
157180// OFFSET: ![[#]] = !{i32 4, !"kcfi-offset", i32 3}
158181//
@@ -161,3 +184,6 @@ int f7_typedef_salt(struct cfi_struct *ptr) { return ptr->td_fptr(); }
161184//
162185// CHECK: ![[#LOW_SODIUM_UTYPE]] = !{i32 [[#LOW_SODIUM_UHASH]]}
163186// CHECK: ![[#SALTY_UTYPE]] = !{i32 [[#SALTY_UHASH]]}
187+ //
188+ // MEMBER: ![[#MEMBER_LOW_SODIUM_TYPE]] = !{i32 [[#MEMBER_LOW_SODIUM_HASH]]}
189+ // MEMBER: ![[#MEMBER_SALT_TYPE]] = !{i32 [[#MEMBER_SALT_HASH]]}
0 commit comments