Skip to content

Commit cec156a

Browse files
committed
Rename 'kcfi_salt' to 'cfi_salt' to indicate that it's not just for the kernel.
1 parent 0b13d3a commit cec156a

File tree

10 files changed

+64
-39
lines changed

10 files changed

+64
-39
lines changed

clang/include/clang/AST/Type.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4676,11 +4676,11 @@ class FunctionType : public Type {
46764676
/// \p AttributedType.
46774677
struct alignas(void *) FunctionTypeExtraAttributeInfo {
46784678
/// A CFI "salt" that differentiates functions with the same prototype.
4679-
StringRef KCFISalt;
4679+
StringRef CFISalt;
46804680

4681-
operator bool() const { return !KCFISalt.empty(); }
4681+
operator bool() const { return !CFISalt.empty(); }
46824682

4683-
void Profile(llvm::FoldingSetNodeID &ID) const { ID.AddString(KCFISalt); }
4683+
void Profile(llvm::FoldingSetNodeID &ID) const { ID.AddString(CFISalt); }
46844684
};
46854685

46864686
/// The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number

clang/include/clang/Basic/Attr.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3929,11 +3929,11 @@ def CFICanonicalJumpTable : InheritableAttr {
39293929
let SimpleHandler = 1;
39303930
}
39313931

3932-
def KCFISalt : DeclOrTypeAttr {
3933-
let Spellings = [Clang<"kcfi_salt">];
3932+
def CFISalt : DeclOrTypeAttr {
3933+
let Spellings = [Clang<"cfi_salt">];
39343934
let Args = [StringArgument<"Salt">];
39353935
let Subjects = SubjectList<[Function, Field, Var, TypedefName], ErrorDiag>;
3936-
let Documentation = [KCFISaltDocs];
3936+
let Documentation = [CFISaltDocs];
39373937
let LangOpts = [COnly];
39383938
}
39393939

clang/include/clang/Basic/AttrDocs.td

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3643,12 +3643,12 @@ make the function's CFI jump table canonical. See :ref:`the CFI documentation
36433643
}];
36443644
}
36453645

3646-
def KCFISaltDocs : Documentation {
3646+
def CFISaltDocs : Documentation {
36473647
let Category = DocCatFunction;
3648-
let Heading = "kcfi_salt";
3649-
let Label = "langext-kcfi_salt";
3648+
let Heading = "cfi_salt";
3649+
let Label = "langext-cfi_salt";
36503650
let Content = [{
3651-
Use ``__attribute__((kcfi_salt("<salt>")))`` on a function declaration, function
3651+
Use ``__attribute__((cfi_salt("<salt>")))`` on a function declaration, function
36523652
definition, or typedef to help distinguish CFI hashes between functions with
36533653
the same type signature.
36543654

@@ -3657,11 +3657,11 @@ Example use:
36573657
.. code-block:: c
36583658

36593659
// .h file:
3660-
#define __kcfi_salt __attribute__((kcfi_salt("pepper")))
3660+
#define __cfi_salt __attribute__((cfi_salt("pepper")))
36613661

36623662
// Convenient typedefs to avoid nested declarator syntax.
36633663
typedef int (*fptr_t)(void); // Non-salted function call.
3664-
typedef int (*fptr_salted_t)(void) __kcfi_salt;
3664+
typedef int (*fptr_salted_t)(void) __cfi_salt;
36653665

36663666
struct widget_generator {
36673667
fptr_t init;
@@ -3671,7 +3671,7 @@ Example use:
36713671

36723672
// 1st .c file:
36733673
static int internal_init(void) { /* ... */ }
3674-
static int internal_salted_exec(void) __kcfi_salt { /* ... */ }
3674+
static int internal_salted_exec(void) __cfi_salt { /* ... */ }
36753675
static int internal_teardown(void) { /* ... */ }
36763676

36773677
static struct widget_generator _generator = {

clang/lib/AST/Type.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3680,7 +3680,7 @@ FunctionProtoType::FunctionProtoType(QualType result, ArrayRef<QualType> params,
36803680
// Propagate any extra attribute information.
36813681
if (epi.requiresFunctionProtoTypeExtraAttributeInfo()) {
36823682
auto &ExtraAttrInfo = *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
3683-
ExtraAttrInfo.KCFISalt = epi.ExtraAttributeInfo.KCFISalt;
3683+
ExtraAttrInfo.CFISalt = epi.ExtraAttributeInfo.CFISalt;
36843684

36853685
// Also set the bit in FunctionTypeExtraBitfields.
36863686
auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();

clang/lib/AST/TypePrinter.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2129,9 +2129,8 @@ void TypePrinter::printAttributedAfter(const AttributedType *T,
21292129
case attr::ExtVectorType:
21302130
OS << "ext_vector_type";
21312131
break;
2132-
case attr::KCFISalt:
2133-
OS << "kcfi_salt(\"" << cast<KCFISaltAttr>(T->getAttr())->getSalt()
2134-
<< "\")";
2132+
case attr::CFISalt:
2133+
OS << "cfi_salt(\"" << cast<CFISaltAttr>(T->getAttr())->getSalt() << "\")";
21352134
break;
21362135
}
21372136
OS << "))";

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2912,7 +2912,7 @@ void CodeGenFunction::EmitKCFIOperandBundle(
29122912

29132913
StringRef Salt;
29142914
if (const auto &Info = FP->getExtraAttributeInfo())
2915-
Salt = Info.KCFISalt;
2915+
Salt = Info.CFISalt;
29162916

29172917
Bundles.emplace_back("kcfi", CGM.CreateKCFITypeId(FP->desugar(), Salt));
29182918
}

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3019,7 +3019,7 @@ void CodeGenModule::setKCFIType(const FunctionDecl *FD, llvm::Function *F) {
30193019

30203020
if (const auto *FP = FD->getType()->getAs<FunctionProtoType>())
30213021
if (const auto &Info = FP->getExtraAttributeInfo())
3022-
Salt = Info.KCFISalt;
3022+
Salt = Info.CFISalt;
30233023

30243024
F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
30253025
llvm::MDNode::get(Ctx, MDB.createConstant(CreateKCFITypeId(

clang/lib/Sema/SemaType.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ static void diagnoseBadTypeAttribute(Sema &S, const ParsedAttr &attr,
156156
case ParsedAttr::AT_Allocating: \
157157
case ParsedAttr::AT_Regparm: \
158158
case ParsedAttr::AT_CFIUncheckedCallee: \
159+
case ParsedAttr::AT_CFISalt: \
159160
case ParsedAttr::AT_CmseNSCall: \
160-
case ParsedAttr::AT_KCFISalt: \
161161
case ParsedAttr::AT_ArmStreaming: \
162162
case ParsedAttr::AT_ArmStreamingCompatible: \
163163
case ParsedAttr::AT_ArmPreserves: \
@@ -7942,14 +7942,14 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr,
79427942
return true;
79437943
}
79447944

7945-
if (attr.getKind() == ParsedAttr::AT_KCFISalt) {
7945+
if (attr.getKind() == ParsedAttr::AT_CFISalt) {
79467946
StringRef Argument;
79477947
if (!S.checkStringLiteralArgumentAttr(attr, 0, Argument))
79487948
return false;
79497949

79507950
const auto *FnTy = unwrapped.get()->getAs<FunctionProtoType>();
79517951
FunctionProtoType::ExtProtoInfo EPI = FnTy->getExtProtoInfo();
7952-
EPI.ExtraAttributeInfo.KCFISalt = Argument;
7952+
EPI.ExtraAttributeInfo.CFISalt = Argument;
79537953

79547954
QualType newtype = S.Context.getFunctionType(FnTy->getReturnType(),
79557955
FnTy->getParamTypes(), EPI);

clang/test/CodeGen/kcfi-salt.c renamed to clang/test/CodeGen/cfi-salt.c

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
#error Missing kcfi?
99
#endif
1010

11-
#define __kcfi_salt __attribute__((kcfi_salt("pepper")))
11+
#define __cfi_salt __attribute__((cfi_salt("pepper")))
1212

1313
typedef int (*fn_t)(void);
14-
typedef int __kcfi_salt (*fn_salt_t)(void);
14+
typedef int __cfi_salt (*fn_salt_t)(void);
1515

1616
typedef 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

2828
int f1(void);
29-
int f1_salt(void) __kcfi_salt;
29+
int f1_salt(void) __cfi_salt;
3030

3131
unsigned int f2(void);
32-
unsigned int f2_salt(void) __kcfi_salt;
32+
unsigned int f2_salt(void) __cfi_salt;
3333

3434
static int f3(void);
35-
static int f3_salt(void) __kcfi_salt;
35+
static int f3_salt(void) __cfi_salt;
3636

3737
extern int f4(void);
38-
extern int f4_salt(void) __kcfi_salt;
38+
extern int f4_salt(void) __cfi_salt;
3939

4040
static int f5(void);
41-
static int f5_salt(void) __kcfi_salt;
41+
static int f5_salt(void) __cfi_salt;
4242

4343
extern int f6(void);
44-
extern int f6_salt(void) __kcfi_salt;
44+
extern int f6_salt(void) __cfi_salt;
4545

4646
struct 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]]) ]
6868
int 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(); }
7070
int 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]]) ]
7878
unsigned 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(); }
8080
unsigned int ucall_salt_ty(ufn_salt_t f) { return f(); }
8181

8282
int 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:]]
116116
int 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:]]
123123
unsigned 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]]
130130
static 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: {
143143
static 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; }
153153
int f7_salt(struct cfi_struct *ptr) { return ptr->fptr(); }
154154
int 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]]}

clang/test/Misc/pragma-attribute-supported-attributes-list.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
// CHECK-NEXT: CFConsumed (SubjectMatchRule_variable_is_parameter)
3232
// CHECK-NEXT: CFGuard (SubjectMatchRule_function)
3333
// CHECK-NEXT: CFICanonicalJumpTable (SubjectMatchRule_function)
34+
// CHECK-NEXT: CFISalt (SubjectMatchRule_function, SubjectMatchRule_field, SubjectMatchRule_variable, SubjectMatchRule_type_alias)
3435
// CHECK-NEXT: CFUnknownTransfer (SubjectMatchRule_function)
3536
// CHECK-NEXT: CPUDispatch (SubjectMatchRule_function)
3637
// CHECK-NEXT: CPUSpecific (SubjectMatchRule_function)
@@ -92,7 +93,6 @@
9293
// CHECK-NEXT: IFunc (SubjectMatchRule_function)
9394
// CHECK-NEXT: InitPriority (SubjectMatchRule_variable)
9495
// CHECK-NEXT: InternalLinkage (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record)
95-
// CHECK-NEXT: KCFISalt (SubjectMatchRule_function, SubjectMatchRule_field, SubjectMatchRule_variable, SubjectMatchRule_type_alias)
9696
// CHECK-NEXT: LTOVisibilityPublic (SubjectMatchRule_record)
9797
// CHECK-NEXT: Leaf (SubjectMatchRule_function)
9898
// CHECK-NEXT: LoaderUninitialized (SubjectMatchRule_variable_is_global)

0 commit comments

Comments
 (0)