[clang] [lld] [llvm] [Windows] Add support for emitting PGO/LTO magic strings in the Windows PE debug directory (PR #114260)
Mikołaj Piróg via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 4 12:34:03 PST 2024
https://github.com/mikolaj-pirog updated https://github.com/llvm/llvm-project/pull/114260
>From f903e7e2effbd9675d0977dc1fd176ce97f11778 Mon Sep 17 00:00:00 2001
From: "Pirog, Mikolaj Maciej" <mikolaj.maciej.pirog at intel.com>
Date: Wed, 30 Oct 2024 16:30:39 +0100
Subject: [PATCH 1/5] Correct test
---
clang/test/CodeGen/debug-dir-win-pe-pgi-string.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
diff --git a/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c b/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
new file mode 100644
index 00000000000000..7f1e9e35aaf120
--- /dev/null
+++ b/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
@@ -0,0 +1,14 @@
+// This test checks if Windows PE file compiled with
+// -fprofile-generate has magic string "PGI" to indicate so.
+
+
+// REQUIRES: system-windows
+
+// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-generate -fuse-ld=lld %s -o %t.exe
+// RUN: dumpbin /HEADERS %t.exe | FileCheck --check-prefix=CHECK2 %s
+// CHECK2: {{.*}}PGI{{.*}}
+
+int main(void) {
+
+ return 0;
+}
>From 9dfc603efb9d826c782a5b2919f910bbb6b0d4ff Mon Sep 17 00:00:00 2001
From: "Pirog, Mikolaj Maciej" <mikolaj.maciej.pirog at intel.com>
Date: Wed, 30 Oct 2024 16:42:07 +0100
Subject: [PATCH 2/5] Add emitting of Windows PE PGO/LTO strings
---
clang/lib/CodeGen/BackendUtil.cpp | 3 +
.../CodeGen/debug-dir-win-pe-ltcg-string.c | 13 +++++
.../CodeGen/debug-dir-win-pe-pgu-string.c | 18 ++++++
lld/COFF/Writer.cpp | 56 ++++++++++++++++++-
...debug_dir_magic_strings_from_section_pgi.s | 18 ++++++
...debug_dir_magic_strings_from_section_pgu.s | 17 ++++++
llvm/include/llvm/MC/MCTargetOptions.h | 3 +-
llvm/lib/MC/WinCOFFObjectWriter.cpp | 13 +++++
8 files changed, 139 insertions(+), 2 deletions(-)
create mode 100644 clang/test/CodeGen/debug-dir-win-pe-ltcg-string.c
create mode 100644 clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
create mode 100644 lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
create mode 100644 lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index f018130807519d..fcf3dc25d95fc0 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -525,6 +525,9 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
Options.MCOptions.PPCUseFullRegisterNames =
CodeGenOpts.PPCUseFullRegisterNames;
Options.MisExpect = CodeGenOpts.MisExpect;
+ Options.MCOptions.PgoInstrumentation = CodeGenOpts.getProfileInstr() > 0;
+ Options.MCOptions.PgoUse =
+ CodeGenOpts.getProfileUse() > 0 || !CodeGenOpts.SampleProfileFile.empty();
return true;
}
diff --git a/clang/test/CodeGen/debug-dir-win-pe-ltcg-string.c b/clang/test/CodeGen/debug-dir-win-pe-ltcg-string.c
new file mode 100644
index 00000000000000..a121ab8c9acc45
--- /dev/null
+++ b/clang/test/CodeGen/debug-dir-win-pe-ltcg-string.c
@@ -0,0 +1,13 @@
+// This test checks if Window PE file compiled with -flto option contains a magic
+// string "LTCG" to indicate LTO compilation.
+
+// REQUIRES: system-windows
+
+// RUN: %clang --target=x86_64-pc-windows-msvc -flto -fuse-ld=lld %s -o %t.exe
+// RUN: dumpbin /HEADERS %t.exe | FileCheck %s
+// CHECK: {{.*}}LTCG{{.*}}
+
+int main(void) {
+
+ return 0;
+}
diff --git a/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c b/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
new file mode 100644
index 00000000000000..12c63425aee0f5
--- /dev/null
+++ b/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
@@ -0,0 +1,18 @@
+// This test checks if Windows PE file contains a "PGU" string to indicate that
+// it was compiled using profiling data.
+
+// REQUIRES: system-windows
+
+// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-instr-generate="%profdata" -fuse-ld=lld %s -o %t.exe
+// RUN: %t.exe
+// RUN: llvm-profdata merge -output=%code.profdata %profdata
+// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-use=%code.profdata -fuse-ld=lld %s -o %t.exe
+// RUN: dumpbin /HEADERS %t.exe | FileCheck %s
+
+// CHECK: {{.*}}PGU{{.*}}
+
+int main(void) {
+
+ return 0;
+}
+
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 71ee5ce4685553..0ce62ad21c4634 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -77,6 +77,12 @@ static unsigned char dosProgram[] = {
static_assert(sizeof(dosProgram) % 8 == 0,
"DOSProgram size must be multiple of 8");
+static char ltcg[] = "LTCG";
+static char pgi[] = "PGI";
+static char pgu[] = "PGU";
+static char pgiSectionName[] = ".pgi";
+static char pguSectionName[] = ".pgu";
+
static const int dosStubSize = sizeof(dos_header) + sizeof(dosProgram);
static_assert(dosStubSize % 8 == 0, "DOSStub size must be multiple of 8");
@@ -179,6 +185,23 @@ class ExtendedDllCharacteristicsChunk : public NonSectionChunk {
uint32_t characteristics = 0;
};
+class DebugDirStringChunk : public NonSectionChunk {
+public:
+ DebugDirStringChunk(std::string str) : str(str.begin(), str.end()) {
+ while (this->str.size() % 4 != 0)
+ this->str.push_back(0);
+ }
+ size_t getSize() const override { return str.size(); }
+
+ void writeTo(uint8_t *b) const override {
+ char *p = reinterpret_cast<char *>(b);
+ auto strReverse = str;
+ std::reverse(strReverse.begin(), strReverse.end());
+ memcpy(p, strReverse.data(), strReverse.size());
+ }
+ std::vector<char> str;
+};
+
// PartialSection represents a group of chunks that contribute to an
// OutputSection. Collating a collection of PartialSections of same name and
// characteristics constitutes the OutputSection.
@@ -1165,6 +1188,23 @@ void Writer::createMiscChunks() {
llvm::TimeTraceScope timeScope("Misc chunks");
Configuration *config = &ctx.config;
+ auto searchForPgoMagicSection = [this](char sectionName[]) {
+ for (auto *obj : ctx.objFileInstances) {
+ for (auto &chunk : obj->getChunks()) {
+ if (chunk->kind() == Chunk::SectionKind &&
+ chunk->getSectionName() == sectionName) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ bool writePgi = searchForPgoMagicSection(pgiSectionName);
+ bool writePgu = !writePgi && searchForPgoMagicSection(pguSectionName);
+ bool writeLTO = ctx.bitcodeFileInstances.size();
+
+
for (MergeChunk *p : ctx.mergeChunkInstances) {
if (p) {
p->finalizeContents();
@@ -1181,7 +1221,7 @@ void Writer::createMiscChunks() {
// Create Debug Information Chunks
debugInfoSec = config->mingw ? buildidSec : rdataSec;
if (config->buildIDHash != BuildIDHash::None || config->debug ||
- config->repro || config->cetCompat) {
+ config->repro || config->cetCompat || writePgi || writePgu || writeLTO) {
debugDirectory =
make<DebugDirectoryChunk>(ctx, debugRecords, config->repro);
debugDirectory->setAlignment(4);
@@ -1206,6 +1246,20 @@ void Writer::createMiscChunks() {
IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT));
}
+
+ if (writeLTO) {
+ debugRecords.emplace_back(COFF::IMAGE_DEBUG_TYPE_POGO,
+ make<DebugDirStringChunk>(ltcg));
+ }
+
+ if (writePgi) {
+ debugRecords.emplace_back(COFF::IMAGE_DEBUG_TYPE_POGO,
+ make<DebugDirStringChunk>(pgi));
+ } else if (writePgu) {
+ debugRecords.emplace_back(COFF::IMAGE_DEBUG_TYPE_POGO,
+ make<DebugDirStringChunk>(pgu));
+ }
+
// Align and add each chunk referenced by the debug data directory.
for (std::pair<COFF::DebugType, Chunk *> r : debugRecords) {
r.second->setAlignment(4);
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
new file mode 100644
index 00000000000000..e59bc5f19b7a55
--- /dev/null
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
@@ -0,0 +1,18 @@
+// This test checks if lld puts magic string "PGI" reversed when an object files contains
+// .pgi section.
+
+// REQUIRES: system-windows
+
+
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main.obj
+
+// RUN: lld-link -out:%t.exe %t.main.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: dumpbin /HEADERS %t.exe
+// CHECK: PGI
+
+#--- main.s
+.section .pgi
+.global entry
+entry:
+ movl %edx, %edx
+
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
new file mode 100644
index 00000000000000..59ace661f7c2e5
--- /dev/null
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
@@ -0,0 +1,17 @@
+// This test checks if lld puts magic string "PGU" reversed when an object files contains
+// .pgu section.
+
+// REQUIRES: system-windows
+
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main.obj
+
+// RUN: lld-link -out:%t.exe %t.main.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: dumpbin /HEADERS %t.exe
+// CHECK: PGU
+
+#--- main.s
+.section .pgu
+.global entry
+entry:
+ movl %edx, %edx
+
diff --git a/llvm/include/llvm/MC/MCTargetOptions.h b/llvm/include/llvm/MC/MCTargetOptions.h
index 7b0d81faf73d2d..5e6a58a36615b1 100644
--- a/llvm/include/llvm/MC/MCTargetOptions.h
+++ b/llvm/include/llvm/MC/MCTargetOptions.h
@@ -1,5 +1,4 @@
//===- MCTargetOptions.h - MC Target Options --------------------*- C++ -*-===//
-//
// 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
@@ -112,6 +111,8 @@ class MCTargetOptions {
// Whether or not to use full register names on PowerPC.
bool PPCUseFullRegisterNames : 1;
+ bool PgoInstrumentation = false;
+ bool PgoUse = false;
MCTargetOptions();
/// getABIName - If this returns a non-empty string this represents the
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 62f53423126ea9..e413a2d3e48b9e 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -28,6 +28,7 @@
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCSymbolCOFF.h"
+#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/MCValue.h"
#include "llvm/MC/MCWinCOFFObjectWriter.h"
#include "llvm/MC/StringTableBuilder.h"
@@ -981,6 +982,18 @@ static std::time_t getTime() {
uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {
uint64_t StartOffset = W.OS.tell();
+ const auto *Options = Asm.getContext().getTargetOptions();
+
+ if (Options && Options->PgoInstrumentation) {
+ auto *Section = Asm.getContext().getCOFFSection(".pgi", 0);
+ defineSection(Asm, *Section);
+ }
+
+ if (Options && Options->PgoUse) {
+ auto *Section = Asm.getContext().getCOFFSection(".pgu", 0);
+ defineSection(Asm, *Section);
+ }
+
if (Sections.size() > INT32_MAX)
report_fatal_error(
"PE COFF object files can't have more than 2147483647 sections");
>From aff0c9021299b3e3ce66fa865dc28ebdc01abd9d Mon Sep 17 00:00:00 2001
From: "Pirog, Mikolaj Maciej" <mikolaj.maciej.pirog at intel.com>
Date: Wed, 30 Oct 2024 16:45:31 +0100
Subject: [PATCH 3/5] Correct test description
---
lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s | 3 +--
lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
index e59bc5f19b7a55..b1782dade39042 100644
--- a/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
@@ -1,9 +1,8 @@
-// This test checks if lld puts magic string "PGI" reversed when an object files contains
+// This test checks if lld puts magic string "PGI" when an object files contains
// .pgi section.
// REQUIRES: system-windows
-
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main.obj
// RUN: lld-link -out:%t.exe %t.main.obj -entry:entry -subsystem:console -debug:symtab
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
index 59ace661f7c2e5..341f88d25bbaad 100644
--- a/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
@@ -1,4 +1,4 @@
-// This test checks if lld puts magic string "PGU" reversed when an object files contains
+// This test checks if lld puts magic string "PGU" when an object files contains
// .pgu section.
// REQUIRES: system-windows
>From 5cb0237d1b6fd1d3ee973faf41a8e6f9012da9f1 Mon Sep 17 00:00:00 2001
From: "Pirog, Mikolaj Maciej" <mikolaj.maciej.pirog at intel.com>
Date: Mon, 4 Nov 2024 12:31:20 +0100
Subject: [PATCH 4/5] Don't write to DwoOnly files
---
llvm/lib/MC/WinCOFFObjectWriter.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index e413a2d3e48b9e..6e6685008d16ec 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -984,12 +984,12 @@ uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {
const auto *Options = Asm.getContext().getTargetOptions();
- if (Options && Options->PgoInstrumentation) {
+ if (Mode != DwoOnly && Options && Options->PgoInstrumentation) {
auto *Section = Asm.getContext().getCOFFSection(".pgi", 0);
defineSection(Asm, *Section);
}
- if (Options && Options->PgoUse) {
+ if (Mode != DwoOnly && Options && Options->PgoUse) {
auto *Section = Asm.getContext().getCOFFSection(".pgu", 0);
defineSection(Asm, *Section);
}
>From 0e3749fa3dfaab658f8f877d55864c378beedd7e Mon Sep 17 00:00:00 2001
From: "Pirog, Mikolaj Maciej" <mikolaj.maciej.pirog at intel.com>
Date: Mon, 4 Nov 2024 21:33:19 +0100
Subject: [PATCH 5/5] Apply reviewers' suggestions to testing
---
clang/test/CodeGen/debug-dir-win-pe-pgi-string.c | 14 +++++++-------
clang/test/CodeGen/debug-dir-win-pe-pgu-string.c | 4 ++--
.../debug_dir_magic_strings_from_section_pgi.s | 15 +++++++--------
.../debug_dir_magic_strings_from_section_pgu.s | 15 +++++++--------
4 files changed, 23 insertions(+), 25 deletions(-)
diff --git a/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c b/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
index 7f1e9e35aaf120..60c9c745fd4d8c 100644
--- a/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
+++ b/clang/test/CodeGen/debug-dir-win-pe-pgi-string.c
@@ -1,12 +1,12 @@
-// This test checks if Windows PE file compiled with
-// -fprofile-generate has magic string "PGI" to indicate so.
+// This test checks if COFF file compiled with
+// -fprofile-generate has magic section ".pgi" to indicate so.
+// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-generate %s -c -o %t_x86
+// RUN: llvm-objdump -h %t_x86 | FileCheck --check-prefix=CHECK_PGI %s
+// RUN: %clang --target=aarch64-pc-windows-msvc -fprofile-generate %s -c -o %t_aarch
+// RUN: llvm-objdump -h %t_aarch | FileCheck --check-prefix=CHECK_PGI %s
-// REQUIRES: system-windows
-
-// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-generate -fuse-ld=lld %s -o %t.exe
-// RUN: dumpbin /HEADERS %t.exe | FileCheck --check-prefix=CHECK2 %s
-// CHECK2: {{.*}}PGI{{.*}}
+// CHECK_PGI: {{.*}}.pgi{{.*}}
int main(void) {
diff --git a/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c b/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
index 12c63425aee0f5..a934f12940a5bf 100644
--- a/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
+++ b/clang/test/CodeGen/debug-dir-win-pe-pgu-string.c
@@ -7,9 +7,9 @@
// RUN: %t.exe
// RUN: llvm-profdata merge -output=%code.profdata %profdata
// RUN: %clang --target=x86_64-pc-windows-msvc -fprofile-use=%code.profdata -fuse-ld=lld %s -o %t.exe
-// RUN: dumpbin /HEADERS %t.exe | FileCheck %s
+// RUN: llvm-readobj --coff-debug-directory %t.exe | FileCheck %s
-// CHECK: {{.*}}PGU{{.*}}
+// CHECK: {{.*}}ugp{{.*}}
int main(void) {
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
index b1782dade39042..1f8ea7d0dae582 100644
--- a/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgi.s
@@ -1,17 +1,16 @@
// This test checks if lld puts magic string "PGI" when an object files contains
// .pgi section.
-// REQUIRES: system-windows
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main_x86.obj
+// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-windows-msvc %s -o %t.main_aarch.obj
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main.obj
-
-// RUN: lld-link -out:%t.exe %t.main.obj -entry:entry -subsystem:console -debug:symtab
-// RUN: dumpbin /HEADERS %t.exe
-// CHECK: PGI
+// RUN: lld-link -out:%t_x86.exe %t.main_x86.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: lld-link -out:%t_aarch.exe %t.main_aarch.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: llvm-readobj --coff-debug-directory %t_x86.exe | FileCheck --check-prefix=CHECK_PGI %s
+// RUN: llvm-readobj --coff-debug-directory %t_aarch.exe | FileCheck --check-prefix=CHECK_PGI %s
+// CHECK_PGI: {{.*}}IGP{{.*}}
#--- main.s
.section .pgi
.global entry
entry:
- movl %edx, %edx
-
diff --git a/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
index 341f88d25bbaad..bca1345eac3337 100644
--- a/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
+++ b/lld/test/COFF/debug_dir_magic_strings_from_section_pgu.s
@@ -1,17 +1,16 @@
// This test checks if lld puts magic string "PGU" when an object files contains
// .pgu section.
-// REQUIRES: system-windows
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main_x86.obj
+// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-windows-msvc %s -o %t.main_aarch.obj
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows-msvc %s -o %t.main.obj
-
-// RUN: lld-link -out:%t.exe %t.main.obj -entry:entry -subsystem:console -debug:symtab
-// RUN: dumpbin /HEADERS %t.exe
-// CHECK: PGU
+// RUN: lld-link -out:%t_x86.exe %t.main_x86.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: lld-link -out:%t_aarch.exe %t.main_aarch.obj -entry:entry -subsystem:console -debug:symtab
+// RUN: llvm-readobj --coff-debug-directory %t_x86.exe | FileCheck --check-prefix=CHECK_PGU %s
+// RUN: llvm-readobj --coff-debug-directory %t_aarch.exe | FileCheck --check-prefix=CHECK_PGU %s
+// CHECK_PGU: {{.*}}UGP{{.*}}
#--- main.s
.section .pgu
.global entry
entry:
- movl %edx, %edx
-
More information about the cfe-commits
mailing list