diff --git a/Misc/ACKS b/Misc/ACKS
index 2a68b69f161041..7bf1d9c99ea24c 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -504,6 +504,7 @@ Grant Edwards
Vlad Efanov
Zvi Effron
John Ehresman
+Chris Eibl
Tal Einat
Eric Eisner
Andrew Eland
diff --git a/Misc/NEWS.d/next/Build/2025-02-13-19-21-41.gh-issue-130090.3ngJaV.rst b/Misc/NEWS.d/next/Build/2025-02-13-19-21-41.gh-issue-130090.3ngJaV.rst
new file mode 100644
index 00000000000000..9ee7d5cdd8ae8a
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2025-02-13-19-21-41.gh-issue-130090.3ngJaV.rst
@@ -0,0 +1,2 @@
+Building with ``PlatformToolset=ClangCL`` on Windows now supports PGO
+(profile guided optimization). Patch by Chris Eibl with invaluable support from Steve Dover.
diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj
index e12876114459bc..44292ee32b19fa 100644
--- a/PCbuild/_freeze_module.vcxproj
+++ b/PCbuild/_freeze_module.vcxproj
@@ -92,6 +92,7 @@
$(IntDir);%(AdditionalIncludeDirectories)Disabledfalse
+ %(AdditionalOptions) -fno-ltoConsole
diff --git a/PCbuild/pyproject-clangcl.props b/PCbuild/pyproject-clangcl.props
new file mode 100644
index 00000000000000..30db6824f3caf5
--- /dev/null
+++ b/PCbuild/pyproject-clangcl.props
@@ -0,0 +1,50 @@
+
+
+
+ <__PyprojectClangCl_Props_Imported>true
+
+
+
+
+ $(OutDir)
+ <_CLANG_PROFILE_PATH>$(CLANG_PROFILE_PATH)
+ <_CLANG_PROFILE_PATH Condition="!HasTrailingSlash($(_CLANG_PROFILE_PATH))">$(_CLANG_PROFILE_PATH)\
+
+
+
+ <_profrawFiles Include="$(OutDir)instrumented\$(TargetName)_*.profraw" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -Wno-deprecated-non-prototype -Wno-unused-label -Wno-pointer-sign -Wno-incompatible-pointer-types-discards-qualifiers -Wno-unused-function %(AdditionalOptions)
+ -m32 %(AdditionalOptions)
+ -m64 %(AdditionalOptions)
+ -flto %(AdditionalOptions)
+ -fprofile-instr-generate=$(_CLANG_PROFILE_PATH)$(TargetName)_%m.profraw %(AdditionalOptions)
+ -fprofile-instr-use=$(OutDir)instrumented\profdata.profdata -Wno-profile-instr-unprofiled %(AdditionalOptions)
+
+
+
+
diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props
index 17abfa85201a90..2681e2d42e8996 100644
--- a/PCbuild/pyproject.props
+++ b/PCbuild/pyproject.props
@@ -24,6 +24,9 @@
false
+
+
+
$(TargetName)$(TargetExt)
<_TargetNameSep>$(TargetNameExt.LastIndexOf(`.`))
@@ -69,8 +72,6 @@
$(EnableControlFlowGuard)true/utf-8 %(AdditionalOptions)
- -Wno-deprecated-non-prototype -Wno-unused-label -Wno-pointer-sign -Wno-incompatible-pointer-types-discards-qualifiers -Wno-unused-function %(AdditionalOptions)
- -flto %(AdditionalOptions)-d2pattern-opt-disable:-932189325 %(AdditionalOptions)-d2ssa-patterns-all- %(AdditionalOptions)/sourceDependencies "$(IntDir.Trim(`\`))" %(AdditionalOptions)
@@ -186,7 +187,7 @@ public override bool Execute() {
Targets="CleanAll" />
-
+
<_PGCFiles Include="$(OutDir)instrumented\$(TargetName)!*.pgc" />
<_PGDFile Include="$(OutDir)instrumented\$(TargetName).pgd" />
@@ -194,7 +195,7 @@ public override bool Execute() {
+ Condition="$(RequireProfileData) == 'true' and @(_PGCFiles) == ''" />
true
- true
+ truetruefalse
diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt
index 693fcee5f90ce2..33952d31681cbc 100644
--- a/PCbuild/readme.txt
+++ b/PCbuild/readme.txt
@@ -52,6 +52,45 @@ Release
settings, though without PGO.
+Building Python using Clang/LLVM
+--------------------------------
+
+See https://learn.microsoft.com/cpp/build/clang-support-msbuild
+for how to install and use clang-cl bundled with Microsoft Visual Studio.
+You can use the IDE to switch to clang-cl for local development,
+but because this alters the *.vcxproj files, the recommended way is
+to use build.bat:
+
+build.bat "/p:PlatformToolset=ClangCL"
+
+All other build.bat options continue to work as with MSVC, so this
+will create a 64bit release binary.
+
+You can also use a specific version of clang-cl downloaded from
+https://github.com/llvm/llvm-project/releases, e.g.
+clang+llvm-18.1.8-x86_64-pc-windows-msvc.tar.xz.
+Given you have extracted that to , you can use it like so
+build.bat --pgo "/p:PlatformToolset=ClangCL" "/p:LLVMInstallDir= "/p:LLVMToolsVersion=18"
+
+Setting LLVMToolsVersion to the major version is enough, although you
+can be specific and use 18.1.8 in the above example, too.
+
+Use the --pgo option to build with PGO (Profile Guided Optimization).
+
+However, if you want to run the PGO task
+on a different host than the build host, you must pass
+"/p:CLANG_PROFILE_PATH="
+in the PGInstrument step to make sure the profile data is generated
+into the instrumented directory when running the PGO task.
+E.g., if you place the instrumented binaries into the folder
+"workdir/instrumented" and then run the PGO task using "workdir"
+as the current working directory, the usage is
+"/p:CLANG_PROFILE_PATH=instrumented"
+
+Like in the MSVC case, after fetching (or manually copying) the instrumented
+folder back into your build tree, you can continue with the PGUpdate
+step with no further parameters.
+
Building Python using the build.bat script
----------------------------------------------