https://github.com/koplas updated https://github.com/llvm/llvm-project/pull/132802
>From 2d143ca15476df04063e9e7e2c5fd1938c4f705b Mon Sep 17 00:00:00 2001 From: koplas <p...@schwabauer.co> Date: Mon, 24 Mar 2025 19:20:52 +0100 Subject: [PATCH 1/2] [PATCH] [clang][modules] Fix serialization and de-serialization of PCH module file refs (#105994) Co-authored-by: ShaderKeeper <no-re...@shaderkeeper.com> --- clang/lib/Serialization/ASTReader.cpp | 4 +- clang/test/Modules/MixedModulePrecompile.cpp | 63 ++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 clang/test/Modules/MixedModulePrecompile.cpp diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 2728e93c69516..7540ff5a3a95c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9615,7 +9615,7 @@ ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &M, unsigned ID) const { // It's a prefix (preamble, PCH, ...). Look it up by index. unsigned IndexFromEnd = ID >> 1; assert(IndexFromEnd && "got reference to unknown module file"); - return getModuleManager().pch_modules().end()[-IndexFromEnd]; + return getModuleManager().pch_modules().end()[-static_cast<int>(IndexFromEnd)]; } } @@ -9633,7 +9633,7 @@ unsigned ASTReader::getModuleFileID(ModuleFile *M) { auto PCHModules = getModuleManager().pch_modules(); auto I = llvm::find(PCHModules, M); assert(I != PCHModules.end() && "emitting reference to unknown file"); - return (I - PCHModules.end()) << 1; + return std::distance(I, PCHModules.end()) << 1; } std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) { diff --git a/clang/test/Modules/MixedModulePrecompile.cpp b/clang/test/Modules/MixedModulePrecompile.cpp new file mode 100644 index 0000000000000..473817ef71de6 --- /dev/null +++ b/clang/test/Modules/MixedModulePrecompile.cpp @@ -0,0 +1,63 @@ +// Tests mixed usage of precompiled headers and modules. +// +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 -x c++-header -emit-pch %t/a.hpp \ +// RUN: -o %t/a.pch + +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/Part1.cppm \ +// RUN: -include-pch %t/a.pch -o %t/Part1.pcm +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/Part2.cppm \ +// RUN: -include-pch %t/a.pch -o %t/Part2.pcm +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/Part3.cppm \ +// RUN: -include-pch %t/a.pch -o %t/Part3.pcm +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/Part4.cppm \ +// RUN: -include-pch %t/a.pch -o %t/Part4.pcm + +// RUN: %clang_cc1 -std=c++20 -emit-module-interface \ +// RUN: -fmodule-file=mod:part1=%t/Part1.pcm \ +// RUN: -fmodule-file=mod:part2=%t/Part2.pcm \ +// RUN: -fmodule-file=mod:part3=%t/Part3.pcm \ +// RUN: -fmodule-file=mod:part4=%t/Part4.pcm \ +// RUN: %t/Mod.cppm \ +// RUN: -include-pch %t/a.pch -o %t/Mod.pcm + +// RUN: %clang_cc1 -std=c++20 -emit-obj \ +// RUN: -main-file-name Mod.cppm \ +// RUN: -fmodule-file=mod:part1=%t/Part1.pcm \ +// RUN: -fmodule-file=mod:part2=%t/Part2.pcm \ +// RUN: -fmodule-file=mod:part3=%t/Part3.pcm \ +// RUN: -fmodule-file=mod:part4=%t/Part4.pcm \ +// RUN: -x pcm %t/Mod.pcm \ +// RUN: -include-pch %t/a.pch -o %t/Mod.o + + +//--- a.hpp +#pragma once + +class a { + virtual ~a(); + a() {} +}; + +//--- Part1.cppm +export module mod:part1; + +//--- Part2.cppm +export module mod:part2; + +//--- Part3.cppm +export module mod:part3; + +//--- Part4.cppm +export module mod:part4; + +//--- Mod.cppm +export module mod; +export import :part1; +export import :part2; +export import :part3; +export import :part4; + >From 5dff7f9854c412f803d9b3e1931612f2dd2192f6 Mon Sep 17 00:00:00 2001 From: Paul Schwabauer <pschwaba...@intevation.de> Date: Tue, 25 Mar 2025 06:18:28 +0100 Subject: [PATCH 2/2] Address comment Co-authored-by: Chuanqi Xu <yedeng...@linux.alibaba.com> --- clang/lib/Serialization/ASTReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 7540ff5a3a95c..0cd2cedb48dd9 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9613,7 +9613,7 @@ ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &M, unsigned ID) const { return I == GlobalSubmoduleMap.end() ? nullptr : I->second; } else { // It's a prefix (preamble, PCH, ...). Look it up by index. - unsigned IndexFromEnd = ID >> 1; + int IndexFromEnd = static_cast<int>(ID >> 1); assert(IndexFromEnd && "got reference to unknown module file"); return getModuleManager().pch_modules().end()[-static_cast<int>(IndexFromEnd)]; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits