[clang] 1ac400e - [clang][Frontend] Batch LangOptions context hashing (#203162)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 6 08:05:22 PDT 2026
Author: David Zbarsky
Date: 2026-07-06T08:05:18-07:00
New Revision: 1ac400e69f26946bf3c84a253e61d1d0ede0d680
URL: https://github.com/llvm/llvm-project/commit/1ac400e69f26946bf3c84a253e61d1d0ede0d680
DIFF: https://github.com/llvm/llvm-project/commit/1ac400e69f26946bf3c84a253e61d1d0ede0d680.diff
LOG: [clang][Frontend] Batch LangOptions context hashing (#203162)
`CompilerInvocation::computeContextHash` currently expands 269
non-benign `LangOptions` into individual `HashBuilder::add` calls. This
collects the values in an `unsigned` array and passes the array to
`HashBuilder::addRangeElements`, which preserves the ordered
native-endian bytes without adding an element count.
In a Release arm64 build, clangd decreases by 16,528 bytes unstripped
and 16,544 bytes stripped.
Work towards #202616
AI tool disclosure: Co-authored with OpenAI Codex.
Added:
Modified:
clang/lib/Frontend/CompilerInvocation.cpp
Removed:
################################################################################
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 50a2359c0e986..6545307a8c8a7 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -5237,15 +5237,22 @@ std::string CompilerInvocation::computeContextHash() const {
HBuilder.add(serialization::VERSION_MAJOR, serialization::VERSION_MINOR);
// Extend the signature with the language options
- // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
- using CK = LangOptions::CompatibilityKind;
+ const unsigned LanguageOptionValues[] = {
+#define HASH_LANGOPT_Benign(Value)
+#define HASH_LANGOPT_Compatible(Value) Value,
+#define HASH_LANGOPT_NotCompatible(Value) Value,
#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
- if constexpr (CK::Compatibility != CK::Benign) \
- HBuilder.add(LangOpts->Name);
+ HASH_LANGOPT_##Compatibility(LangOpts->Name)
#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
- if constexpr (CK::Compatibility != CK::Benign) \
- HBuilder.add(static_cast<unsigned>(LangOpts->get##Name()));
+ HASH_LANGOPT_##Compatibility(static_cast<unsigned>(LangOpts->get##Name()))
#include "clang/Basic/LangOptions.def"
+ };
+#undef HASH_LANGOPT_Benign
+#undef HASH_LANGOPT_Compatible
+#undef HASH_LANGOPT_NotCompatible
+ // addRangeElements preserves the HBuilder.add sequence and excludes the
+ // LanguageOptionValues element count.
+ HBuilder.addRangeElements(LanguageOptionValues);
HBuilder.addRange(getLangOpts().ModuleFeatures);
More information about the cfe-commits
mailing list