1111#endif
1212
1313#ifdef ORIG_ATTR_SYN
14- #define __cfi_salt __attribute__((cfi_salt("pepper")))
14+ #define __cfi_salt __attribute__((cfi_salt("pepper")))
15+ #define __cfi_salt_empty __attribute__((cfi_salt("")))
1516#else
16- #define __cfi_salt [[clang::cfi_salt("pepper")]]
17+ #define __cfi_salt [[clang::cfi_salt("pepper")]]
18+ #define __cfi_salt_empty [[clang::cfi_salt("")]]
1719#endif
1820
1921typedef int (* fn_t )(void );
2022typedef int (* __cfi_salt fn_salt_t )(void );
23+ typedef int (* __cfi_salt_empty fn_salt_empty_t )(void );
2124
2225typedef unsigned int (* ufn_t )(void );
2326typedef unsigned int (* __cfi_salt ufn_salt_t )(void );
@@ -49,9 +52,13 @@ static int f5_salt(void) __cfi_salt;
4952extern int f6 (void );
5053extern int f6_salt (void ) __cfi_salt ;
5154
55+ int f8 (void );
56+ int f8_salt_empty (void ) __cfi_salt_empty ;
57+
5258struct cfi_struct {
5359 fn_t __cfi_salt fptr ;
5460 fn_salt_t td_fptr ;
61+ fn_salt_empty_t td_empty_fptr ;
5562};
5663
5764int f7_salt (struct cfi_struct * ptr );
@@ -75,6 +82,7 @@ int __call(fn_t f) {
7582int call (fn_t f ) { return f (); }
7683int call_salt (fn_t __cfi_salt f ) { return f (); }
7784int call_salt_ty (fn_salt_t f ) { return f (); }
85+ int call_salt_empty_ty (fn_salt_empty_t f ) { return f (); }
7886
7987// CHECK-LABEL: @ucall
8088// CHECK: call{{.*}} i32 %{{.}}(){{.*}} [ "kcfi"(i32 [[#%d,LOW_SODIUM_UHASH:]]) ]
@@ -113,7 +121,10 @@ int test1(struct cfi_struct *ptr) {
113121 f6_salt () +
114122
115123 f7_salt (ptr ) +
116- f7_typedef_salt (ptr );
124+ f7_typedef_salt (ptr ) +
125+
126+ f8 () +
127+ f8_salt_empty ();
117128}
118129
119130// CHECK-LABEL: define dso_local{{.*}} i32 @f1(){{.*}} !kcfi_type
@@ -160,6 +171,13 @@ static int f5_salt(void) __cfi_salt { return 2; }
160171int f7_salt (struct cfi_struct * ptr ) { return ptr -> fptr (); }
161172int f7_typedef_salt (struct cfi_struct * ptr ) { return ptr -> td_fptr (); }
162173
174+ // CHECK-LABEL: define dso_local{{.*}} i32 @f8(){{.*}} !kcfi_type
175+ // CHECK-SAME: ![[#LOW_SODIUM_TYPE:]]
176+ // CHECK-LABEL: define dso_local{{.*}} i32 @f8_salt_empty(){{.*}} !kcfi_type
177+ // CHECK-SAME: ![[#LOW_SODIUM_TYPE:]]
178+ int f8 (void ) { return 0 ; }
179+ int f8_salt_empty (void ) __cfi_salt_empty { return 0 ; }
180+
163181// CHECK: ![[#]] = !{i32 4, !"kcfi", i32 1}
164182// OFFSET: ![[#]] = !{i32 4, !"kcfi-offset", i32 3}
165183//
0 commit comments