https://github.com/MaskRay updated 
https://github.com/llvm/llvm-project/pull/196784

>From 4221477ec2409ccdcb2d133bf211de40e48135b8 Mon Sep 17 00:00:00 2001
From: Fangrui Song <[email protected]>
Date: Sat, 9 May 2026 23:58:08 -0700
Subject: [PATCH 1/2] Move KCFI type ID hash helpers out of LLVMSupport

PR #167254 inappropriately introduced llvm/Support/Hash.{h,cpp} for the
KCFI helpers. The name is misleading - it has nothing to do with the
generic hashing facility in llvm/ADT/Hashing.h. KCFI is a CodeGen/IR
feature that does not belong in the foundational LLVMSupport.

Move the files to llvm/lib/Transforms/Utils/KCFIHash.cpp, alongside
setKCFIType, which is the only existing KCFI helper in TransformUtils.
---
 clang/include/clang/Basic/CodeGenOptions.h             |  2 +-
 clang/lib/CodeGen/CodeGenModule.cpp                    |  2 +-
 .../{Support/Hash.h => Transforms/Utils/KCFIHash.h}    | 10 +++++-----
 llvm/lib/Support/CMakeLists.txt                        |  1 -
 llvm/lib/Transforms/Utils/CMakeLists.txt               |  1 +
 .../Hash.cpp => Transforms/Utils/KCFIHash.cpp}         |  8 ++------
 llvm/lib/Transforms/Utils/ModuleUtils.cpp              |  2 +-
 7 files changed, 11 insertions(+), 15 deletions(-)
 rename llvm/include/llvm/{Support/Hash.h => Transforms/Utils/KCFIHash.h} (78%)
 rename llvm/lib/{Support/Hash.cpp => Transforms/Utils/KCFIHash.cpp} (91%)

diff --git a/clang/include/clang/Basic/CodeGenOptions.h 
b/clang/include/clang/Basic/CodeGenOptions.h
index 3cbbf1a3074ac..e43112b4bb98b 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -22,10 +22,10 @@
 #include "llvm/Frontend/Driver/CodeGenOptions.h"
 #include "llvm/MC/MCTargetOptions.h"
 #include "llvm/Support/CodeGen.h"
-#include "llvm/Support/Hash.h"
 #include "llvm/Support/Regex.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
+#include "llvm/Transforms/Utils/KCFIHash.h"
 #include <map>
 #include <memory>
 #include <string>
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 106f1e63cd904..2d91b7eaa52dc 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -70,7 +70,6 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ConvertUTF.h"
 #include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/Hash.h"
 #include "llvm/Support/TimeProfiler.h"
 #include "llvm/TargetParser/AArch64TargetParser.h"
 #include "llvm/TargetParser/RISCVISAInfo.h"
@@ -78,6 +77,7 @@
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Instrumentation/KCFI.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include "llvm/Transforms/Utils/KCFIHash.h"
 #include <optional>
 #include <set>
 
diff --git a/llvm/include/llvm/Support/Hash.h 
b/llvm/include/llvm/Transforms/Utils/KCFIHash.h
similarity index 78%
rename from llvm/include/llvm/Support/Hash.h
rename to llvm/include/llvm/Transforms/Utils/KCFIHash.h
index 7a2cfb8774ae8..553c24d1289aa 100644
--- a/llvm/include/llvm/Support/Hash.h
+++ b/llvm/include/llvm/Transforms/Utils/KCFIHash.h
@@ -1,4 +1,4 @@
-//===- llvm/Support/Hash.h - Hash functions --------------------*- C++ -*-===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,12 +6,12 @@
 //
 
//===----------------------------------------------------------------------===//
 //
-// This file provides hash functions.
+// Helpers for computing the 32-bit KCFI type ID from a mangled type name.
 //
 
//===----------------------------------------------------------------------===//
 
-#ifndef LLVM_SUPPORT_HASH_H
-#define LLVM_SUPPORT_HASH_H
+#ifndef LLVM_TRANSFORMS_UTILS_KCFIHASH_H
+#define LLVM_TRANSFORMS_UTILS_KCFIHASH_H
 
 #include "llvm/ADT/StringRef.h"
 #include <cstdint>
@@ -34,4 +34,4 @@ LLVM_ABI uint32_t getKCFITypeID(StringRef MangledTypeName,
 
 } // end namespace llvm
 
-#endif // LLVM_SUPPORT_HASH_H
+#endif // LLVM_TRANSFORMS_UTILS_KCFIHASH_H
diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
index e8d505f218b69..100cfb567c348 100644
--- a/llvm/lib/Support/CMakeLists.txt
+++ b/llvm/lib/Support/CMakeLists.txt
@@ -204,7 +204,6 @@ add_llvm_component_library(LLVMSupport
   FormatVariadic.cpp
   GlobPattern.cpp
   GraphWriter.cpp
-  Hash.cpp
   HexagonAttributeParser.cpp
   HexagonAttributes.cpp
   InitLLVM.cpp
diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt 
b/llvm/lib/Transforms/Utils/CMakeLists.txt
index 82e9edf674866..933e204081ad2 100644
--- a/llvm/lib/Transforms/Utils/CMakeLists.txt
+++ b/llvm/lib/Transforms/Utils/CMakeLists.txt
@@ -40,6 +40,7 @@ add_llvm_component_library(LLVMTransformUtils
   Instrumentation.cpp
   IntegerDivision.cpp
   IRNormalizer.cpp
+  KCFIHash.cpp
   LCSSA.cpp
   LibCallsShrinkWrap.cpp
   Local.cpp
diff --git a/llvm/lib/Support/Hash.cpp b/llvm/lib/Transforms/Utils/KCFIHash.cpp
similarity index 91%
rename from llvm/lib/Support/Hash.cpp
rename to llvm/lib/Transforms/Utils/KCFIHash.cpp
index 6b5d000ee27c9..b02163e84ca78 100644
--- a/llvm/lib/Support/Hash.cpp
+++ b/llvm/lib/Transforms/Utils/KCFIHash.cpp
@@ -1,16 +1,12 @@
-//===- Hash.cpp - Hash functions ---------------------------------------===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 
//===----------------------------------------------------------------------===//
-//
-// This file implements hash functions.
-//
-//===----------------------------------------------------------------------===//
 
-#include "llvm/Support/Hash.h"
+#include "llvm/Transforms/Utils/KCFIHash.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/xxhash.h"
 
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp 
b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 63a234960a0ad..2976ebf46c9b7 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -19,9 +19,9 @@
 #include "llvm/IR/MDBuilder.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Support/Casting.h"
-#include "llvm/Support/Hash.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Transforms/Utils/KCFIHash.h"
 
 using namespace llvm;
 

>From e7c21fa05285cf01f49a5e1f7d9d1a990ee838d0 Mon Sep 17 00:00:00 2001
From: Fangrui Song <[email protected]>
Date: Sun, 10 May 2026 00:29:42 -0700
Subject: [PATCH 2/2] relocate xxHash64

---
 llvm/include/llvm/Support/xxhash.h     |  6 --
 llvm/lib/Support/xxhash.cpp            | 75 --------------------
 llvm/lib/Transforms/Utils/KCFIHash.cpp | 94 +++++++++++++++++++++++++-
 llvm/unittests/Support/xxhashTest.cpp  | 12 ----
 4 files changed, 93 insertions(+), 94 deletions(-)

diff --git a/llvm/include/llvm/Support/xxhash.h 
b/llvm/include/llvm/Support/xxhash.h
index 15c4f1bfd4563..b03aaa1e907b4 100644
--- a/llvm/include/llvm/Support/xxhash.h
+++ b/llvm/include/llvm/Support/xxhash.h
@@ -32,9 +32,6 @@
    - xxHash source repository : https://github.com/Cyan4973/xxHash
 */
 
-/* based on revision d2df04efcbef7d7f6886d345861e5dfda4edacc1 Removed
- * everything but a simple interface for computing XXh64. */
-
 #ifndef LLVM_SUPPORT_XXHASH_H
 #define LLVM_SUPPORT_XXHASH_H
 
@@ -44,9 +41,6 @@
 
 namespace llvm {
 
-// Deprecated pre-xxh3 64-bit hash.
-LLVM_ABI uint64_t xxHash64(const uint8_t *data, size_t len);
-
 /// XXH3's 64-bit variant. Inline ArrayRef and StringRef overloads live in
 /// llvm/ADT/ArrayRef.h and llvm/ADT/StringRef.h.
 LLVM_ABI uint64_t xxh3_64bits(const uint8_t *data, size_t len);
diff --git a/llvm/lib/Support/xxhash.cpp b/llvm/lib/Support/xxhash.cpp
index 6997fed7e8336..a1aee00b82637 100644
--- a/llvm/lib/Support/xxhash.cpp
+++ b/llvm/lib/Support/xxhash.cpp
@@ -32,9 +32,6 @@
  *  - xxHash source repository : https://github.com/Cyan4973/xxHash
  */
 
-// xxhash64 is based on commit d2df04efcbef7d7f6886d345861e5dfda4edacc1. 
Removed
-// everything but a simple interface for computing xxh64.
-
 // xxh3_64bits is based on commit d5891596637d21366b9b1dcf2c0007a3edb26a9e 
(July
 // 2023).
 
@@ -77,20 +74,6 @@ static const uint64_t PRIME64_3 = 1609587929392839161ULL;
 static const uint64_t PRIME64_4 = 9650029242287828579ULL;
 static const uint64_t PRIME64_5 = 2870177450012600261ULL;
 
-static uint64_t round(uint64_t Acc, uint64_t Input) {
-  Acc += Input * PRIME64_2;
-  Acc = rotl64(Acc, 31);
-  Acc *= PRIME64_1;
-  return Acc;
-}
-
-static uint64_t mergeRound(uint64_t Acc, uint64_t Val) {
-  Val = round(0, Val);
-  Acc ^= Val;
-  Acc = Acc * PRIME64_1 + PRIME64_4;
-  return Acc;
-}
-
 static uint64_t XXH64_avalanche(uint64_t hash) {
   hash ^= hash >> 33;
   hash *= PRIME64_2;
@@ -100,64 +83,6 @@ static uint64_t XXH64_avalanche(uint64_t hash) {
   return hash;
 }
 
-uint64_t llvm::xxHash64(const uint8_t *P, size_t Len) {
-  uint64_t Seed = 0;
-  const uint8_t *const BEnd = P + Len;
-  uint64_t H64;
-
-  if (Len >= 32) {
-    const unsigned char *const Limit = BEnd - 32;
-    uint64_t V1 = Seed + PRIME64_1 + PRIME64_2;
-    uint64_t V2 = Seed + PRIME64_2;
-    uint64_t V3 = Seed + 0;
-    uint64_t V4 = Seed - PRIME64_1;
-
-    do {
-      V1 = round(V1, endian::read64le(P));
-      P += 8;
-      V2 = round(V2, endian::read64le(P));
-      P += 8;
-      V3 = round(V3, endian::read64le(P));
-      P += 8;
-      V4 = round(V4, endian::read64le(P));
-      P += 8;
-    } while (P <= Limit);
-
-    H64 = rotl64(V1, 1) + rotl64(V2, 7) + rotl64(V3, 12) + rotl64(V4, 18);
-    H64 = mergeRound(H64, V1);
-    H64 = mergeRound(H64, V2);
-    H64 = mergeRound(H64, V3);
-    H64 = mergeRound(H64, V4);
-
-  } else {
-    H64 = Seed + PRIME64_5;
-  }
-
-  H64 += (uint64_t)Len;
-
-  while (reinterpret_cast<uintptr_t>(P) + 8 <=
-         reinterpret_cast<uintptr_t>(BEnd)) {
-    uint64_t const K1 = round(0, endian::read64le(P));
-    H64 ^= K1;
-    H64 = rotl64(H64, 27) * PRIME64_1 + PRIME64_4;
-    P += 8;
-  }
-
-  if (reinterpret_cast<uintptr_t>(P) + 4 <= reinterpret_cast<uintptr_t>(BEnd)) 
{
-    H64 ^= (uint64_t)(endian::read32le(P)) * PRIME64_1;
-    H64 = rotl64(H64, 23) * PRIME64_2 + PRIME64_3;
-    P += 4;
-  }
-
-  while (P < BEnd) {
-    H64 ^= (*P) * PRIME64_5;
-    H64 = rotl64(H64, 11) * PRIME64_1;
-    P++;
-  }
-
-  return XXH64_avalanche(H64);
-}
-
 constexpr size_t XXH3_SECRETSIZE_MIN = 136;
 constexpr size_t XXH_SECRET_DEFAULT_SIZE = 192;
 
diff --git a/llvm/lib/Transforms/Utils/KCFIHash.cpp 
b/llvm/lib/Transforms/Utils/KCFIHash.cpp
index b02163e84ca78..df65ed53b66b6 100644
--- a/llvm/lib/Transforms/Utils/KCFIHash.cpp
+++ b/llvm/lib/Transforms/Utils/KCFIHash.cpp
@@ -7,10 +7,102 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/Transforms/Utils/KCFIHash.h"
+#include "llvm/Support/Endian.h"
 #include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/xxhash.h"
 
 using namespace llvm;
+using namespace support;
+
+// xxHash64 is a deprecated pre-xxh3 hash, retained here only as the default
+// KCFI type-ID hash for ABI compatibility.
+
+static uint64_t rotl64(uint64_t X, size_t R) {
+  return (X << R) | (X >> (64 - R));
+}
+
+constexpr uint64_t PRIME64_1 = 11400714785074694791ULL;
+constexpr uint64_t PRIME64_2 = 14029467366897019727ULL;
+constexpr uint64_t PRIME64_3 = 1609587929392839161ULL;
+constexpr uint64_t PRIME64_4 = 9650029242287828579ULL;
+constexpr uint64_t PRIME64_5 = 2870177450012600261ULL;
+
+static uint64_t round(uint64_t Acc, uint64_t Input) {
+  Acc += Input * PRIME64_2;
+  Acc = rotl64(Acc, 31);
+  Acc *= PRIME64_1;
+  return Acc;
+}
+
+static uint64_t mergeRound(uint64_t Acc, uint64_t Val) {
+  Val = round(0, Val);
+  Acc ^= Val;
+  Acc = Acc * PRIME64_1 + PRIME64_4;
+  return Acc;
+}
+
+static uint64_t avalanche(uint64_t H) {
+  H ^= H >> 33;
+  H *= PRIME64_2;
+  H ^= H >> 29;
+  H *= PRIME64_3;
+  H ^= H >> 32;
+  return H;
+}
+
+static uint64_t xxHash64(const uint8_t *P, size_t Len) {
+  const uint8_t *const BEnd = P + Len;
+  uint64_t H64;
+
+  if (Len >= 32) {
+    const uint8_t *const Limit = BEnd - 32;
+    uint64_t V1 = PRIME64_1 + PRIME64_2;
+    uint64_t V2 = PRIME64_2;
+    uint64_t V3 = 0;
+    uint64_t V4 = -PRIME64_1;
+
+    do {
+      V1 = round(V1, endian::read64le(P));
+      P += 8;
+      V2 = round(V2, endian::read64le(P));
+      P += 8;
+      V3 = round(V3, endian::read64le(P));
+      P += 8;
+      V4 = round(V4, endian::read64le(P));
+      P += 8;
+    } while (P <= Limit);
+
+    H64 = rotl64(V1, 1) + rotl64(V2, 7) + rotl64(V3, 12) + rotl64(V4, 18);
+    H64 = mergeRound(H64, V1);
+    H64 = mergeRound(H64, V2);
+    H64 = mergeRound(H64, V3);
+    H64 = mergeRound(H64, V4);
+  } else {
+    H64 = PRIME64_5;
+  }
+
+  H64 += (uint64_t)Len;
+
+  while (reinterpret_cast<uintptr_t>(P) + 8 <=
+         reinterpret_cast<uintptr_t>(BEnd)) {
+    H64 ^= round(0, endian::read64le(P));
+    H64 = rotl64(H64, 27) * PRIME64_1 + PRIME64_4;
+    P += 8;
+  }
+
+  if (reinterpret_cast<uintptr_t>(P) + 4 <= reinterpret_cast<uintptr_t>(BEnd)) 
{
+    H64 ^= (uint64_t)endian::read32le(P) * PRIME64_1;
+    H64 = rotl64(H64, 23) * PRIME64_2 + PRIME64_3;
+    P += 4;
+  }
+
+  while (P < BEnd) {
+    H64 ^= (*P) * PRIME64_5;
+    H64 = rotl64(H64, 11) * PRIME64_1;
+    ++P;
+  }
+
+  return avalanche(H64);
+}
 
 KCFIHashAlgorithm llvm::parseKCFIHashAlgorithm(StringRef Name) {
   if (Name == "FNV-1a")
diff --git a/llvm/unittests/Support/xxhashTest.cpp 
b/llvm/unittests/Support/xxhashTest.cpp
index 9f91fc79e1f62..6097f0525e2b2 100644
--- a/llvm/unittests/Support/xxhashTest.cpp
+++ b/llvm/unittests/Support/xxhashTest.cpp
@@ -32,18 +32,6 @@ static void fillTestBuffer(uint8_t *buffer, size_t len) {
   }
 }
 
-TEST(xxhashTest, Basic) {
-  EXPECT_EQ(0xef46db3751d8e999U, xxHash64(nullptr, 0));
-  EXPECT_EQ(0x33bf00a859c4ba3fU,
-            xxHash64(reinterpret_cast<const uint8_t *>("foo"), 3));
-  EXPECT_EQ(0x48a37c90ad27a659U,
-            xxHash64(reinterpret_cast<const uint8_t *>("bar"), 3));
-  EXPECT_EQ(0x69196c1b3af0bff9U,
-            xxHash64(reinterpret_cast<const uint8_t *>(
-                         "0123456789abcdefghijklmnopqrstuvwxyz"),
-                     36));
-}
-
 TEST(xxhashTest, xxh3) {
   constexpr size_t size = 2243;
   uint8_t a[size];

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to