[llvm-branch-commits] [clang] 3a08ad2 - [Clang] Fix crash in coverage of if consteval.

2022-09-12 Thread Tobias Hieta via llvm-branch-commits

Author: Corentin Jabot
Date: 2022-09-12T12:54:20+02:00
New Revision: 3a08ad21ce89174f4ecdf1aad8ed7a161ef52a65

URL: 
https://github.com/llvm/llvm-project/commit/3a08ad21ce89174f4ecdf1aad8ed7a161ef52a65
DIFF: 
https://github.com/llvm/llvm-project/commit/3a08ad21ce89174f4ecdf1aad8ed7a161ef52a65.diff

LOG: [Clang] Fix crash in coverage of if consteval.

Clang crashes when encountering an `if consteval` statement.
This is the minimum fix not to crash.
The fix is consistent with the current behavior of if constexpr,
which does generate coverage data for the discarded branches.
This is of course not correct and a better solution is
needed for both if constexpr and if consteval.
See https://github.com/llvm/llvm-project/issues/54419.

Fixes #57377

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D132723

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/lib/CodeGen/CoverageMappingGen.cpp
clang/test/CoverageMapping/if.cpp

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 96c4120ea522d..cbf3f4b37b5fc 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -206,6 +206,9 @@ Bug Fixes
   missing when used, or vice versa. This makes sure that Clang picks the
   correct one, where it previously would consider multiple ones as potentially
   acceptable (and erroneously use whichever one is tried first).
+- Fix a crash when generating code coverage information for an
+  ``if consteval`` statement. This fixes
+  `Issue 57377 `_.
 
 Improvements to Clang's diagnostics
 ^^^

diff  --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0fe084b628dab..836aabf80179d 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -1377,19 +1377,23 @@ struct CounterCoverageMappingBuilder
 
 // Extend into the condition before we propagate through it below - this is
 // needed to handle macros that generate the "if" but not the condition.
-extendRegion(S->getCond());
+if (!S->isConsteval())
+  extendRegion(S->getCond());
 
 Counter ParentCount = getRegion().getCounter();
 Counter ThenCount = getRegionCounter(S);
 
-// Emitting a counter for the condition makes it easier to interpret the
-// counter for the body when looking at the coverage.
-propagateCounts(ParentCount, S->getCond());
+if (!S->isConsteval()) {
+  // Emitting a counter for the condition makes it easier to interpret the
+  // counter for the body when looking at the coverage.
+  propagateCounts(ParentCount, S->getCond());
 
-// The 'then' count applies to the area immediately after the condition.
-auto Gap = findGapAreaBetween(S->getRParenLoc(), getStart(S->getThen()));
-if (Gap)
-  fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), ThenCount);
+  // The 'then' count applies to the area immediately after the condition.
+  Optional Gap =
+  findGapAreaBetween(S->getRParenLoc(), getStart(S->getThen()));
+  if (Gap)
+fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), ThenCount);
+}
 
 extendRegion(S->getThen());
 Counter OutCount = propagateCounts(ThenCount, S->getThen());
@@ -1398,9 +1402,9 @@ struct CounterCoverageMappingBuilder
 if (const Stmt *Else = S->getElse()) {
   bool ThenHasTerminateStmt = HasTerminateStmt;
   HasTerminateStmt = false;
-
   // The 'else' count applies to the area immediately after the 'then'.
-  Gap = findGapAreaBetween(getEnd(S->getThen()), getStart(Else));
+  Optional Gap =
+  findGapAreaBetween(getEnd(S->getThen()), getStart(Else));
   if (Gap)
 fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), ElseCount);
   extendRegion(Else);
@@ -1416,9 +1420,11 @@ struct CounterCoverageMappingBuilder
   GapRegionCounter = OutCount;
 }
 
-// Create Branch Region around condition.
-createBranchRegion(S->getCond(), ThenCount,
-   subtractCounters(ParentCount, ThenCount));
+if (!S->isConsteval()) {
+  // Create Branch Region around condition.
+  createBranchRegion(S->getCond(), ThenCount,
+ subtractCounters(ParentCount, ThenCount));
+}
   }
 
   void VisitCXXTryStmt(const CXXTryStmt *S) {

diff  --git a/clang/test/CoverageMapping/if.cpp 
b/clang/test/CoverageMapping/if.cpp
index 5b705cd46ab72..de3554c100b96 100644
--- a/clang/test/CoverageMapping/if.cpp
+++ b/clang/test/CoverageMapping/if.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false 
-fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping 
-emit-llvm-only -std=c++1z -triple %itanium_abi_triple -main-file-name if.cpp 
%s | FileCheck %s
+// RUN: %clang_cc1 -mllvm

[llvm-branch-commits] [llvm] 1a5c5e0 - [DwarfEhPrepare] Assign dummy debug location for inserted _Unwind_Resume calls (PR57469)

2022-09-12 Thread Tobias Hieta via llvm-branch-commits

Author: Nikita Popov
Date: 2022-09-12T12:54:29+02:00
New Revision: 1a5c5e0f67be2e08c86b754da1e008f645d49c61

URL: 
https://github.com/llvm/llvm-project/commit/1a5c5e0f67be2e08c86b754da1e008f645d49c61
DIFF: 
https://github.com/llvm/llvm-project/commit/1a5c5e0f67be2e08c86b754da1e008f645d49c61.diff

LOG: [DwarfEhPrepare] Assign dummy debug location for inserted _Unwind_Resume 
calls (PR57469)

DwarfEhPrepare inserts calls to _Unwind_Resume into landing pads.
If _Unwind_Resume happens to be defined in the same module and
debug info is used, then this leads to a verifier error:

  inlinable function call in a function with debug info must
have a !dbg location
  call void @_Unwind_Resume(ptr %exn.obj) #0

Fix this by assigning a dummy location to the call. (As this
happens in the backend, inlining is not actually relevant here.)

Fixes https://github.com/llvm/llvm-project/issues/57469.

Differential Revision: https://reviews.llvm.org/D133095

(cherry picked from commit 5134bd432f8c35c87f4c4dc3bb744d396adcab58)

Added: 
llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll

Modified: 
llvm/lib/CodeGen/DwarfEHPrepare.cpp

Removed: 




diff  --git a/llvm/lib/CodeGen/DwarfEHPrepare.cpp 
b/llvm/lib/CodeGen/DwarfEHPrepare.cpp
index fb8a3e383950c..aa81f618dc59f 100644
--- a/llvm/lib/CodeGen/DwarfEHPrepare.cpp
+++ b/llvm/lib/CodeGen/DwarfEHPrepare.cpp
@@ -25,6 +25,7 @@
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Constants.h"
+#include "llvm/IR/DebugInfoMetadata.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Dominators.h"
 #include "llvm/IR/Function.h"
@@ -247,6 +248,13 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
 // Call the rewind function.
 CallInst *CI =
 CallInst::Create(RewindFunction, RewindFunctionArgs, "", UnwindBB);
+// The verifier requires that all calls of debug-info-bearing functions
+// from debug-info-bearing functions have a debug location (for inlining
+// purposes). Assign a dummy location to satisfy the constraint.
+Function *RewindFn = dyn_cast(RewindFunction.getCallee());
+if (RewindFn && RewindFn->getSubprogram())
+  if (DISubprogram *SP = F.getSubprogram())
+CI->setDebugLoc(DILocation::get(SP->getContext(), 0, 0, SP));
 CI->setCallingConv(RewindFunctionCallingConv);
 
 // We never expect _Unwind_Resume to return.

diff  --git a/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll 
b/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll
new file mode 100644
index 0..094f6bf415b64
--- /dev/null
+++ b/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll
@@ -0,0 +1,64 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=x86_64-linux-gnu -dwarfehprepare < %s | FileCheck %s
+
+; PR57469: If _Unwind_Resume is defined in the same module and we have debug
+; info, then the inserted _Unwind_Resume calls also need to have a dummy debug
+; location to satisfy inlining requirements.
+
+define void @_Unwind_Resume(ptr %ptr) !dbg !4 {
+; CHECK-LABEL: @_Unwind_Resume(
+; CHECK-NEXT:ret void, !dbg [[DBG11:![0-9]+]]
+;
+  ret void, !dbg !11
+}
+
+declare i32 @__gxx_personality_v0(...)
+declare void @might_throw()
+
+define void @simple_cleanup_catch() personality ptr @__gxx_personality_v0 !dbg 
!12 {
+; CHECK-LABEL: @simple_cleanup_catch(
+; CHECK-NEXT:invoke void @might_throw()
+; CHECK-NEXT:to label [[EXIT:%.*]] unwind label [[LANDINGPAD:%.*]], !dbg 
[[DBG15:![0-9]+]]
+; CHECK:   exit:
+; CHECK-NEXT:ret void
+; CHECK:   landingpad:
+; CHECK-NEXT:[[EX:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT:cleanup
+; CHECK-NEXT:[[EXN_OBJ:%.*]] = extractvalue { ptr, i32 } [[EX]], 0
+; CHECK-NEXT:call void @_Unwind_Resume(ptr [[EXN_OBJ]]) #[[ATTR0:[0-9]+]], 
!dbg [[DBG16:![0-9]+]]
+; CHECK-NEXT:unreachable
+;
+  invoke void @might_throw()
+  to label %exit unwind label %landingpad, !dbg !15
+
+exit:
+  ret void
+
+landingpad:
+  %ex = landingpad { ptr, i32 }
+  cleanup
+  resume { ptr, i32 } %ex
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2, !3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang 
version 16.0.0 (https://github.com/llvm/llvm-project.git 
a4c8fb9d1f46f30c66a9ca0dd07c7933f338bb34)", isOptimized: true, runtimeVersion: 
0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "/app/example.c", directory: "/app")
+!2 = !{i32 7, !"Dwarf Version", i32 4}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "_Unwind_Resume", scope: !5, file: !5, line: 
1, type: !6, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, 
spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)
+!5 = !DIFile(filename: "example.c", directory: "/app")
+!6 = !DISubroutineType(types: !7)
+!7 = !{null, !8}
+

[llvm-branch-commits] [lld] 92e7ef9 - [LLD][COFF] Fix writing a map file when range extension thunks are inserted

2022-09-12 Thread Tobias Hieta via llvm-branch-commits

Author: Jan Ole Hüser
Date: 2022-09-12T12:54:42+02:00
New Revision: 92e7ef99303f8f367f279ccfa2393e4b96db915a

URL: 
https://github.com/llvm/llvm-project/commit/92e7ef99303f8f367f279ccfa2393e4b96db915a
DIFF: 
https://github.com/llvm/llvm-project/commit/92e7ef99303f8f367f279ccfa2393e4b96db915a.diff

LOG: [LLD][COFF] Fix writing a map file when range extension thunks are inserted

Bug: An assertion fails:

Assertion failed: isa(Val) && "cast() argument of incompatible 
type!",
file 
C:\Users\\prog\llvm\llvm-git-lld-bug\llvm\include\llvm/Support/Casting.h, 
line 578

Bug is triggered, if

- a map file is requested with /MAP, and
- Architecture is ARMv7, Thumb, and
- a relative jump (branch instruction) is greater than 16 MiB (2^24)

The reason for the Bug is:

- a Thunk is created for the jump
- a Symbol for the Thunk is created
- of type `DefinedSynthetic`
- in file `Writer.cpp`
- in function `getThunk`
- the Symbol has no name
- when creating the map file, the name of the Symbol is queried
- the function `Symbol::computeName` of the base class `Symbol`
  casts the `this` pointer to type `DefinedCOFF` (a derived type),
  but the acutal type is `DefinedSynthetic`
- The in the llvm::cast an assertion fails

Changes:

- Modify regression test to trigger this bug
- Give the symbol pointing to the thunk a name, to fix the bug
- Add assertion, that only DefinedCOFF symbols are allowed to have an
  empty name, when the constructor of the base class Symbol is executed

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D133201

(cherry picked from commit 4e5a59a3839f54d928d37d49d4c4ddbb3f339b76)

Added: 


Modified: 
lld/COFF/Symbols.h
lld/COFF/Writer.cpp
lld/test/COFF/arm-thumb-thunks.s
lld/test/COFF/arm64-thunks.s

Removed: 




diff  --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h
index c8865d128fb84..a4c6f893f10cf 100644
--- a/lld/COFF/Symbols.h
+++ b/lld/COFF/Symbols.h
@@ -106,7 +106,10 @@ class Symbol {
   : symbolKind(k), isExternal(true), isCOMDAT(false),
 writtenToSymtab(false), pendingArchiveLoad(false), isGCRoot(false),
 isRuntimePseudoReloc(false), deferUndefined(false), canInline(true),
-nameSize(n.size()), nameData(n.empty() ? nullptr : n.data()) {}
+nameSize(n.size()), nameData(n.empty() ? nullptr : n.data()) {
+assert((!n.empty() || k <= LastDefinedCOFFKind) &&
+   "If the name is empty, the Symbol must be a DefinedCOFF.");
+  }
 
   const unsigned symbolKind : 8;
   unsigned isExternal : 1;

diff  --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index df60c9032b2d3..f39697d5d3813 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -395,7 +395,7 @@ getThunk(DenseMap &lastThunks, Defined 
*target, uint64_t p,
   default:
 llvm_unreachable("Unexpected architecture");
   }
-  Defined *d = make("", c);
+  Defined *d = make("range_extension_thunk", c);
   lastThunk = d;
   return {d, true};
 }

diff  --git a/lld/test/COFF/arm-thumb-thunks.s 
b/lld/test/COFF/arm-thumb-thunks.s
index 2a176b00c6a99..9f01981fefb93 100644
--- a/lld/test/COFF/arm-thumb-thunks.s
+++ b/lld/test/COFF/arm-thumb-thunks.s
@@ -1,6 +1,6 @@
 // REQUIRES: arm
 // RUN: llvm-mc -filetype=obj -triple=thumbv7-windows %s -o %t.obj
-// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe -verbose 
2>&1 | FileCheck -check-prefix=VERBOSE %s
+// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe -map 
-verbose 2>&1 | FileCheck -check-prefix=VERBOSE %s
 // RUN: llvm-objdump -d %t.exe --start-address=0x401000 
--stop-address=0x401022 | FileCheck --check-prefix=MAIN %s
 // RUN: llvm-objdump -d %t.exe --start-address=0x501022 
--stop-address=0x501032 | FileCheck --check-prefix=FUNC1 %s
 // RUN: llvm-objdump -d %t.exe --start-address=0x601032 | FileCheck 
--check-prefix=FUNC2 %s

diff  --git a/lld/test/COFF/arm64-thunks.s b/lld/test/COFF/arm64-thunks.s
index 86760ed08c3ad..240af765a1933 100644
--- a/lld/test/COFF/arm64-thunks.s
+++ b/lld/test/COFF/arm64-thunks.s
@@ -1,6 +1,6 @@
 // REQUIRES: aarch64
 // RUN: llvm-mc -filetype=obj -triple=aarch64-windows %s -o %t.obj
-// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe -verbose 
2>&1 | FileCheck -check-prefix=VERBOSE %s
+// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe -map 
-verbose 2>&1 | FileCheck -check-prefix=VERBOSE %s
 // RUN: llvm-objdump -d %t.exe | FileCheck --check-prefix=DISASM %s
 
 // VERBOSE: Added 2 thunks with margin {{.*}} in 1 passes



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [mlir] c643956 - [mlir] Fix building CRunnerUtils on OpenBSD with 15.x

2022-09-12 Thread Tobias Hieta via llvm-branch-commits

Author: Brad Smith
Date: 2022-09-12T12:54:35+02:00
New Revision: c643956d69b1813cc2caf938207f073d28b7b72c

URL: 
https://github.com/llvm/llvm-project/commit/c643956d69b1813cc2caf938207f073d28b7b72c
DIFF: 
https://github.com/llvm/llvm-project/commit/c643956d69b1813cc2caf938207f073d28b7b72c.diff

LOG: [mlir] Fix building CRunnerUtils on OpenBSD with 15.x

CRunnerUtils builds as C++11. 9c1d133c3a0256cce7f40e2e06966f84e8b99ffe broke
the build on OpenBSD. aligned_alloc() was only introduced in C++17.

Added: 


Modified: 
mlir/lib/ExecutionEngine/CRunnerUtils.cpp

Removed: 




diff  --git a/mlir/lib/ExecutionEngine/CRunnerUtils.cpp 
b/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
index f2a43a5de95f0..323e6d5b51878 100644
--- a/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
+++ b/mlir/lib/ExecutionEngine/CRunnerUtils.cpp
@@ -127,14 +127,10 @@ extern "C" void *_mlir_alloc(uint64_t size) { return 
malloc(size); }
 extern "C" void *_mlir_aligned_alloc(uint64_t alignment, uint64_t size) {
 #ifdef _WIN32
   return _aligned_malloc(size, alignment);
-#elif defined(__APPLE__)
-  // aligned_alloc was added in MacOS 10.15. Fall back to posix_memalign to 
also
-  // support older versions.
+#else
   void *result = nullptr;
   (void)::posix_memalign(&result, alignment, size);
   return result;
-#else
-  return aligned_alloc(alignment, size);
 #endif
 }
 



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] fe67401 - [NFC][ScheduleDAG] Use structure bindings and emplace_back

2022-09-12 Thread Pavel Samolysov via llvm-branch-commits

Author: Pavel Samolysov
Date: 2022-09-12T15:38:11+03:00
New Revision: fe67401fd8140787b0591bb0e1de39ad78f34456

URL: 
https://github.com/llvm/llvm-project/commit/fe67401fd8140787b0591bb0e1de39ad78f34456
DIFF: 
https://github.com/llvm/llvm-project/commit/fe67401fd8140787b0591bb0e1de39ad78f34456.diff

LOG: [NFC][ScheduleDAG] Use structure bindings and emplace_back

Some uses of std::make_pair and the std::pair's first/second members
in the ScheduleDAGRRList.cpp file were replaced with using of the
vector's emplace_back along with structure bindings from C++17.

Added: 


Modified: 
llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp

Removed: 




diff  --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp 
b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
index 12450b6602ea..04a8b4d3b42e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
@@ -1204,11 +1204,11 @@ SUnit *ScheduleDAGRRList::CopyAndMoveSuccessors(SUnit 
*SU) {
   D.setSUnit(NewSU);
   AddPredQueued(SuccSU, D);
   D.setSUnit(SU);
-  DelDeps.push_back(std::make_pair(SuccSU, D));
+  DelDeps.emplace_back(SuccSU, D);
 }
   }
-  for (auto &DelDep : DelDeps)
-RemovePred(DelDep.first, DelDep.second);
+  for (const auto &[DelSU, DelD] : DelDeps)
+RemovePred(DelSU, DelD);
 
   AvailableQueue->updateNode(SU);
   AvailableQueue->addNode(NewSU);
@@ -1242,17 +1242,17 @@ void ScheduleDAGRRList::InsertCopiesAndMoveSuccs(SUnit 
*SU, unsigned Reg,
   SDep D = Succ;
   D.setSUnit(CopyToSU);
   AddPredQueued(SuccSU, D);
-  DelDeps.push_back(std::make_pair(SuccSU, Succ));
+  DelDeps.emplace_back(SuccSU, Succ);
 }
 else {
-  // Avoid scheduling the def-side copy before other successors. Otherwise
+  // Avoid scheduling the def-side copy before other successors. Otherwise,
   // we could introduce another physreg interference on the copy and
   // continue inserting copies indefinitely.
   AddPredQueued(SuccSU, SDep(CopyFromSU, SDep::Artificial));
 }
   }
-  for (auto &DelDep : DelDeps)
-RemovePred(DelDep.first, DelDep.second);
+  for (const auto &[DelSU, DelD] : DelDeps)
+RemovePred(DelSU, DelD);
 
   SDep FromDep(SU, SDep::Data, Reg);
   FromDep.setLatency(SU->Latency);
@@ -1484,16 +1484,15 @@ SUnit *ScheduleDAGRRList::PickNodeToScheduleBottomUp() {
  if (LRegs[0] == TRI->getNumRegs()) dbgs() << "CallResource";
  else dbgs() << printReg(LRegs[0], TRI);
  dbgs() << " SU #" << CurSU->NodeNum << '\n');
-  std::pair LRegsPair =
-LRegsMap.insert(std::make_pair(CurSU, LRegs));
-  if (LRegsPair.second) {
+  auto [LRegsIter, LRegsInserted] = LRegsMap.try_emplace(CurSU, LRegs);
+  if (LRegsInserted) {
 CurSU->isPending = true;  // This SU is not in AvailableQueue right 
now.
 Interferences.push_back(CurSU);
   }
   else {
 assert(CurSU->isPending && "Interferences are pending");
 // Update the interference with current live regs.
-LRegsPair.first->second = LRegs;
+LRegsIter->second = LRegs;
   }
   CurSU = AvailableQueue->pop();
 }



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits