Skip to content

Commit 757926a

Browse files
committed
[CodeGen][KCFI] Replace xxHash64 with FNV-1a
The KCFI type hash does not need to be cryptographically secure. To keep Clang KCFI hash-identical to GCC KCFI, switch to FNV-1a for hashing. This also removes the last user of xxHash64. Signed-off-by: Kees Cook <[email protected]>
1 parent 84398ee commit 757926a

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

clang/test/CodeGen/kcfi-generalize.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ int** f3(char *a, char **b) {
2121
}
2222

2323
void g(int** (*fp)(const char *, const char **)) {
24-
// UNGENERALIZED: call {{.*}} [ "kcfi"(i32 1296635908) ]
25-
// GENERALIZED: call {{.*}} [ "kcfi"(i32 -49168686) ]
24+
// UNGENERALIZED: call {{.*}} [ "kcfi"(i32 -1900814401) ]
25+
// GENERALIZED: call {{.*}} [ "kcfi"(i32 355875385) ]
2626
fp(0, 0);
2727
}
2828

@@ -33,16 +33,16 @@ union Union {
3333

3434
// CHECK: define{{.*}} void @uni({{.*}} !kcfi_type [[TYPE4:![0-9]+]]
3535
void uni(void (*fn)(union Union), union Union arg1) {
36-
// UNGENERALIZED: call {{.*}} [ "kcfi"(i32 -587217045) ]
37-
// GENERALIZED: call {{.*}} [ "kcfi"(i32 2139530422) ]
36+
// UNGENERALIZED: call {{.*}} [ "kcfi"(i32 514817671) ]
37+
// GENERALIZED: call {{.*}} [ "kcfi"(i32 1629153266) ]
3838
fn(arg1);
3939
}
4040

41-
// UNGENERALIZED: [[TYPE]] = !{i32 1296635908}
42-
// GENERALIZED: [[TYPE]] = !{i32 -49168686}
41+
// UNGENERALIZED: [[TYPE]] = !{i32 -1900814401}
42+
// GENERALIZED: [[TYPE]] = !{i32 355875385}
4343

44-
// UNGENERALIZED: [[TYPE3]] = !{i32 874141567}
45-
// GENERALIZED: [[TYPE3]] = !{i32 954385378}
44+
// UNGENERALIZED: [[TYPE3]] = !{i32 1089235487}
45+
// GENERALIZED: [[TYPE3]] = !{i32 1460151842}
4646

47-
// UNGENERALIZED: [[TYPE4]] = !{i32 -1619636625}
48-
// GENERALIZED: [[TYPE4]] = !{i32 -125078496}
47+
// UNGENERALIZED: [[TYPE4]] = !{i32 1937639136}
48+
// GENERALIZED: [[TYPE4]] = !{i32 734921772}

clang/test/CodeGen/kcfi-normalize.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@
1010
void foo(void (*fn)(int), int arg) {
1111
// CHECK-LABEL: define{{.*}}foo
1212
// CHECK-SAME: {{.*}}!kcfi_type ![[TYPE1:[0-9]+]]
13-
// CHECK: call void %0(i32 noundef %1){{.*}}[ "kcfi"(i32 1162514891) ]
13+
// CHECK: call void %0(i32 noundef %1){{.*}}[ "kcfi"(i32 -402462225) ]
1414
fn(arg);
1515
}
1616

1717
void bar(void (*fn)(int, int), int arg1, int arg2) {
1818
// CHECK-LABEL: define{{.*}}bar
1919
// CHECK-SAME: {{.*}}!kcfi_type ![[TYPE2:[0-9]+]]
20-
// CHECK: call void %0(i32 noundef %1, i32 noundef %2){{.*}}[ "kcfi"(i32 448046469) ]
20+
// CHECK: call void %0(i32 noundef %1, i32 noundef %2){{.*}}[ "kcfi"(i32 -972192795) ]
2121
fn(arg1, arg2);
2222
}
2323

2424
void baz(void (*fn)(int, int, int), int arg1, int arg2, int arg3) {
2525
// CHECK-LABEL: define{{.*}}baz
2626
// CHECK-SAME: {{.*}}!kcfi_type ![[TYPE3:[0-9]+]]
27-
// CHECK: call void %0(i32 noundef %1, i32 noundef %2, i32 noundef %3){{.*}}[ "kcfi"(i32 -2049681433) ]
27+
// CHECK: call void %0(i32 noundef %1, i32 noundef %2, i32 noundef %3){{.*}}[ "kcfi"(i32 -1376104717) ]
2828
fn(arg1, arg2, arg3);
2929
}
3030

@@ -36,14 +36,14 @@ union Union {
3636
void uni(void (*fn)(union Union), union Union arg1) {
3737
// CHECK-LABEL: define{{.*}}uni
3838
// CHECK-SAME: {{.*}}!kcfi_type ![[TYPE4:[0-9]+]]
39-
// C: call void %0(ptr %1) [ "kcfi"(i32 1819770848) ]
40-
// CPP: call void %0(ptr %1) [ "kcfi"(i32 -1430221633) ]
39+
// C: call void %0(ptr %1) [ "kcfi"(i32 641309179) ]
40+
// CPP: call void %0(ptr %1) [ "kcfi"(i32 15039153) ]
4141
fn(arg1);
4242
}
4343

4444
// CHECK: ![[#]] = !{i32 4, !"cfi-normalize-integers", i32 1}
45-
// CHECK: ![[TYPE1]] = !{i32 -1143117868}
46-
// CHECK: ![[TYPE2]] = !{i32 -460921415}
47-
// CHECK: ![[TYPE3]] = !{i32 -333839615}
48-
// C: ![[TYPE4]] = !{i32 -650530463}
49-
// CPP: ![[TYPE4]] = !{i32 1766237188}
45+
// CHECK: ![[TYPE1]] = !{i32 -1113907258}
46+
// CHECK: ![[TYPE2]] = !{i32 994987278}
47+
// CHECK: ![[TYPE3]] = !{i32 -886425042}
48+
// C: ![[TYPE4]] = !{i32 -1919128908}
49+
// CPP: ![[TYPE4]] = !{i32 1834954376}

llvm/lib/Transforms/Instrumentation/KCFI.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include "llvm/IR/Intrinsics.h"
2424
#include "llvm/IR/MDBuilder.h"
2525
#include "llvm/IR/Module.h"
26-
#include "llvm/Support/xxhash.h"
2726
#include "llvm/Target/TargetMachine.h"
2827
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
2928

@@ -34,7 +33,13 @@ using namespace llvm;
3433
STATISTIC(NumKCFIChecks, "Number of kcfi operands transformed into checks");
3534

3635
uint32_t llvm::getKCFITypeID(StringRef MangledTypeName) {
37-
return static_cast<uint32_t>(xxHash64(MangledTypeName));
36+
// FNV-1a hash (32-bit)
37+
uint32_t Hash = 2166136261u; // FNV offset basis
38+
for (unsigned char C : MangledTypeName) {
39+
Hash ^= C;
40+
Hash *= 16777619u; // FNV prime
41+
}
42+
return Hash;
3843
}
3944

4045
namespace {

0 commit comments

Comments
 (0)