https://github.com/vvereschaka updated https://github.com/llvm/llvm-project/pull/194542
>From ce18d063f2c51e94a30cc48300a549d7f48ba654 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Mon, 27 Apr 2026 21:25:36 -0700 Subject: [PATCH 1/4] [Clang] Produce determenistic hash for anonymous namespaces. This change adds a path substitution for the main module file during anonymous namespace hash generation using the prefix map specified by -fmacro-prefix-map option. That ensures deterministic symbol mangling for reproducible builds. --- clang/lib/AST/MicrosoftMangle.cpp | 8 +++++++- clang/test/AST/anon-ns-determ-hash.cpp | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 clang/test/AST/anon-ns-determ-hash.cpp diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 20c52969d7024..7d0c60d57253c 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -29,6 +29,7 @@ #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Lex/Preprocessor.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CRC.h" @@ -503,8 +504,13 @@ MicrosoftMangleContextImpl::MicrosoftMangleContextImpl(ASTContext &Context, // which are something like "?A0x01234567@". SourceManager &SM = Context.getSourceManager(); if (OptionalFileEntryRef FE = SM.getFileEntryRefForID(SM.getMainFileID())) { + SmallString<256> Path(FE->getName()); + // Do a path substitution from the MacroPrefixMap if needed. + clang::Preprocessor::processPathForFileMacro(Path, Context.getLangOpts(), + Context.getTargetInfo()); + // Truncate the hash so we get 8 characters of hexadecimal. - uint32_t TruncatedHash = uint32_t(xxh3_64bits(FE->getName())); + uint32_t TruncatedHash = uint32_t(xxh3_64bits(Path)); AnonymousNamespaceHash = llvm::utohexstr(TruncatedHash); } else { // If we don't have a path to the main file, we'll just use 0. diff --git a/clang/test/AST/anon-ns-determ-hash.cpp b/clang/test/AST/anon-ns-determ-hash.cpp new file mode 100644 index 0000000000000..aa16455d80154 --- /dev/null +++ b/clang/test/AST/anon-ns-determ-hash.cpp @@ -0,0 +1,9 @@ +// Check anonymous namespace deterministic hash generation. +// RUN: %clang_cc1 -std=c++2a -ast-dump=json -fmacro-prefix-map=%p=/static-path %s | FileCheck %s + +namespace { + int internal_ns_var = 0; +} + +// The 0xA110234F hash value must be identical on any system with proper path substitution. +// CHECK: "mangledName": "?internal_ns_var@?A0xA110234F@@3HA", >From acf285bf0dfd8ccfd10a1cc3a279a0b84a93325d Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 28 Apr 2026 15:39:05 -0700 Subject: [PATCH 2/4] Apply proper *-msvc triple to enable namespace hash within the symbols. --- clang/test/AST/anon-ns-determ-hash.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/test/AST/anon-ns-determ-hash.cpp b/clang/test/AST/anon-ns-determ-hash.cpp index aa16455d80154..4cfca7438ba4a 100644 --- a/clang/test/AST/anon-ns-determ-hash.cpp +++ b/clang/test/AST/anon-ns-determ-hash.cpp @@ -1,5 +1,8 @@ // Check anonymous namespace deterministic hash generation. -// RUN: %clang_cc1 -std=c++2a -ast-dump=json -fmacro-prefix-map=%p=/static-path %s | FileCheck %s +// NOTE: applies to *-msvc targets only. + +// RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -std=c++2a -ast-dump=json -fmacro-prefix-map=%p=/static-path %s | FileCheck %s +// REQUIRES: x86-registered-target namespace { int internal_ns_var = 0; >From ba57d7e0a8cfba8c9a16d548a44b703d933ad423 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 5 May 2026 22:00:48 -0700 Subject: [PATCH 3/4] Update clang/docs/ReleaseNotes.rst accordingly. --- clang/docs/ReleaseNotes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ec64c2008d89b..84f4e7abfd747 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -636,6 +636,8 @@ Windows Support - Clang now defines the ``_MSVC_TRADITIONAL`` macro as ``1`` when emulating MSVC 19.15 (Visual Studio 2017 version 15.8) and later. (#GH47114) +- ``-fmacro-prefix-map=`` (``-ffile-prefix-map=``) now affects an anonymous namespace hash generation + for the MSVC targets and allows deterministic symbol mangling for reproducible builds. (#GH194542) LoongArch Support ^^^^^^^^^^^^^^^^^ >From 9c95f9432718099facb17e229af02a56975c4374 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Wed, 6 May 2026 09:28:59 -0700 Subject: [PATCH 4/4] Update clang/docs/ReleaseNotes.rst with suggested changes. Co-authored-by: Corentin Jabot <[email protected]> --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 84f4e7abfd747..8c856f27852c6 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -637,7 +637,7 @@ Windows Support - Clang now defines the ``_MSVC_TRADITIONAL`` macro as ``1`` when emulating MSVC 19.15 (Visual Studio 2017 version 15.8) and later. (#GH47114) - ``-fmacro-prefix-map=`` (``-ffile-prefix-map=``) now affects an anonymous namespace hash generation - for the MSVC targets and allows deterministic symbol mangling for reproducible builds. (#GH194542) + for the MSVC targets and allows deterministic symbol mangling for reproducible builds. LoongArch Support ^^^^^^^^^^^^^^^^^ _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
