[llvm-branch-commits] [llvm] [MC] Rename MCAsmStreamer to MCGNUAsmStreamer (PR #183763)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Feb 27 08:21:06 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-systemz
@llvm/pr-subscribers-llvm-mc
Author: Kai Nacke (redstar)
<details>
<summary>Changes</summary>
Also rename MCBaseAsmStreamer to MCAsmStreamer.
---
Patch is 192.40 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/183763.diff
6 Files Affected:
- (renamed) llvm/include/llvm/MC/MCAsmStreamer.h (+8-8)
- (modified) llvm/lib/MC/CMakeLists.txt (+1-1)
- (removed) llvm/lib/MC/MCAsmBaseStreamer.cpp (-143)
- (modified) llvm/lib/MC/MCAsmStreamer.cpp (+100-2560)
- (added) llvm/lib/MC/MCGNUAsmStreamer.cpp (+2605)
- (modified) llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h (+3-3)
``````````diff
diff --git a/llvm/include/llvm/MC/MCAsmBaseStreamer.h b/llvm/include/llvm/MC/MCAsmStreamer.h
similarity index 77%
rename from llvm/include/llvm/MC/MCAsmBaseStreamer.h
rename to llvm/include/llvm/MC/MCAsmStreamer.h
index f034c9501bb6b..1acad32ac2fc3 100644
--- a/llvm/include/llvm/MC/MCAsmBaseStreamer.h
+++ b/llvm/include/llvm/MC/MCAsmStreamer.h
@@ -1,4 +1,4 @@
-//===- MCAsmBaseStreamer.h - Base Class for Asm Streamers -------*- C++ -*-===//
+//===- MCAsmStreamer.h - Base Class for Asm Streamers -----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,13 +6,13 @@
//
//===----------------------------------------------------------------------===//
//
-// This file declares the MCAsmBaseStreamer class, a base class for streamers
+// This file declares the MCAsmStreamer class, a base class for streamers
// which emits assembly text.
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_MC_MCASMBASESTREAMER_H
-#define LLVM_MC_MCASMBASESTREAMER_H
+#ifndef LLVM_MC_MCASMSTREAMER_H
+#define LLVM_MC_MCASMSTREAMER_H
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCAssembler.h"
@@ -28,15 +28,15 @@ class MCContext;
class MCInst;
class MCSubtargetInfo;
-class MCAsmBaseStreamer : public MCStreamer {
+class MCAsmStreamer : public MCStreamer {
protected:
std::unique_ptr<MCAssembler> Assembler;
SmallString<128> CommentToEmit;
raw_svector_ostream CommentStream;
raw_null_ostream NullStream;
- MCAsmBaseStreamer(MCContext &Context, std::unique_ptr<MCCodeEmitter> Emitter,
- std::unique_ptr<MCAsmBackend> AsmBackend);
+ MCAsmStreamer(MCContext &Context, std::unique_ptr<MCCodeEmitter> Emitter,
+ std::unique_ptr<MCAsmBackend> AsmBackend);
public:
/// Return a raw_ostream that comments can be written to.
@@ -58,4 +58,4 @@ class MCAsmBaseStreamer : public MCStreamer {
} // end namespace llvm
-#endif // LLVM_MC_MCASMBASESTREAMER_H
+#endif // LLVM_MC_MCASMSTREAMER_H
diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt
index d42b735f1b130..653962f9c7937 100644
--- a/llvm/lib/MC/CMakeLists.txt
+++ b/llvm/lib/MC/CMakeLists.txt
@@ -5,7 +5,6 @@ add_llvm_component_library(LLVMMC
ELFObjectWriter.cpp
GOFFObjectWriter.cpp
MCAsmBackend.cpp
- MCAsmBaseStreamer.cpp
MCAsmInfo.cpp
MCAsmInfoCOFF.cpp
MCAsmInfoDarwin.cpp
@@ -26,6 +25,7 @@ add_llvm_component_library(LLVMMC
MCELFStreamer.cpp
MCExpr.cpp
MCFragment.cpp
+ MCGNUAsmStreamer.cpp
MCGOFFStreamer.cpp
MCInst.cpp
MCInstPrinter.cpp
diff --git a/llvm/lib/MC/MCAsmBaseStreamer.cpp b/llvm/lib/MC/MCAsmBaseStreamer.cpp
deleted file mode 100644
index c05b80e8f9d83..0000000000000
--- a/llvm/lib/MC/MCAsmBaseStreamer.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-//===- MCAsmBaseStreamer.cpp - Base Class for Asm Streamers -----*- 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
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/MC/MCAsmBaseStreamer.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/MC/MCAsmBackend.h"
-#include "llvm/MC/MCAsmInfo.h"
-#include "llvm/MC/MCAssembler.h"
-#include "llvm/MC/MCCodeEmitter.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCFixup.h"
-#include "llvm/MC/MCInst.h"
-#include "llvm/MC/MCObjectWriter.h"
-#include "llvm/MC/MCSubtargetInfo.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/raw_ostream.h"
-
-using namespace llvm;
-
-MCAsmBaseStreamer::MCAsmBaseStreamer(MCContext &Context,
- std::unique_ptr<MCCodeEmitter> Emitter,
- std::unique_ptr<MCAsmBackend> AsmBackend)
- : MCStreamer(Context),
- Assembler(std::make_unique<MCAssembler>(
- Context, std::move(AsmBackend), std::move(Emitter),
- (AsmBackend) ? AsmBackend->createObjectWriter(NullStream) : nullptr)),
- CommentStream(CommentToEmit) {}
-
-void MCAsmBaseStreamer::addEncodingComment(const MCInst &Inst,
- const MCSubtargetInfo &STI) {
- raw_ostream &OS = getCommentOS();
- SmallString<256> Code;
- SmallVector<MCFixup, 4> Fixups;
-
- // If we have no code emitter, don't emit code.
- if (!getAssembler().getEmitterPtr())
- return;
-
- getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
-
- // RISC-V instructions are always little-endian, even on BE systems.
- bool ForceLE = getContext().getTargetTriple().isRISCV();
-
- const MCAsmInfo *MAI = getContext().getAsmInfo();
-
- // If we are showing fixups, create symbolic markers in the encoded
- // representation. We do this by making a per-bit map to the fixup item index,
- // then trying to display it as nicely as possible.
- SmallVector<uint8_t, 64> FixupMap;
- FixupMap.resize(Code.size() * 8);
- for (unsigned I = 0, E = Code.size() * 8; I != E; ++I)
- FixupMap[I] = 0;
-
- for (unsigned I = 0, E = Fixups.size(); I != E; ++I) {
- MCFixup &F = Fixups[I];
- MCFixupKindInfo Info =
- getAssembler().getBackend().getFixupKindInfo(F.getKind());
- for (unsigned J = 0; J != Info.TargetSize; ++J) {
- unsigned Index = F.getOffset() * 8 + Info.TargetOffset + J;
- assert(Index < Code.size() * 8 && "Invalid offset in fixup!");
- FixupMap[Index] = 1 + I;
- }
- }
-
- // FIXME: Note the fixup comments for Thumb2 are completely bogus since the
- // high order halfword of a 32-bit Thumb2 instruction is emitted first.
- OS << "encoding: [";
- for (unsigned I = 0, E = Code.size(); I != E; ++I) {
- if (I)
- OS << ',';
-
- // See if all bits are the same map entry.
- uint8_t MapEntry = FixupMap[I * 8 + 0];
- for (unsigned J = 1; J != 8; ++J) {
- if (FixupMap[I * 8 + J] == MapEntry)
- continue;
-
- MapEntry = uint8_t(~0U);
- break;
- }
-
- if (MapEntry != uint8_t(~0U)) {
- if (MapEntry == 0) {
- OS << format("0x%02x", uint8_t(Code[I]));
- } else {
- if (Code[I]) {
- // FIXME: Some of the 8 bits require fix up.
- OS << format("0x%02x", uint8_t(Code[I])) << '\''
- << char('A' + MapEntry - 1) << '\'';
- } else
- OS << char('A' + MapEntry - 1);
- }
- } else {
- // Otherwise, write out in binary.
- OS << "0b";
- for (unsigned J = 8; J--;) {
- unsigned Bit = (Code[I] >> J) & 1;
-
- unsigned FixupBit;
- // RISC-V instructions are always little-endian.
- // The FixupMap is indexed by actual bit positions in the LE
- // instruction.
- if (MAI->isLittleEndian() || ForceLE)
- FixupBit = I * 8 + J;
- else
- FixupBit = I * 8 + (7 - J);
-
- if (uint8_t MapEntry = FixupMap[FixupBit]) {
- assert(Bit == 0 && "Encoder wrote into fixed up bit!");
- OS << char('A' + MapEntry - 1);
- } else
- OS << Bit;
- }
- }
- }
- OS << "]\n";
-
- for (unsigned I = 0, E = Fixups.size(); I != E; ++I) {
- MCFixup &F = Fixups[I];
- OS << " fixup " << char('A' + I) << " - "
- << "offset: " << F.getOffset() << ", value: ";
- MAI->printExpr(OS, *F.getValue());
- auto Kind = F.getKind();
- if (mc::isRelocation(Kind))
- OS << ", relocation type: " << Kind;
- else {
- OS << ", kind: ";
- auto Info = getAssembler().getBackend().getFixupKindInfo(Kind);
- if (F.isPCRel() && StringRef(Info.Name).starts_with("FK_Data_"))
- OS << "FK_PCRel_" << (Info.TargetSize / 8);
- else
- OS << Info.Name;
- }
- OS << '\n';
- }
-}
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index b451abba2e70c..f3ab3f0c48ac3 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -1,4 +1,4 @@
-//===- lib/MC/MCAsmStreamer.cpp - Text Assembly Output ----------*- C++ -*-===//
+//===- MCAsmStreamer.cpp - Base Class for Asm Streamers ---------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,2598 +6,138 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/MC/MCAsmStreamer.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/MC/MCAsmBackend.h"
-#include "llvm/MC/MCAsmBaseStreamer.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCCodeEmitter.h"
-#include "llvm/MC/MCCodeView.h"
#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCFixup.h"
#include "llvm/MC/MCInst.h"
-#include "llvm/MC/MCInstPrinter.h"
-#include "llvm/MC/MCLFIRewriter.h"
-#include "llvm/MC/MCObjectFileInfo.h"
#include "llvm/MC/MCObjectWriter.h"
-#include "llvm/MC/MCPseudoProbe.h"
-#include "llvm/MC/MCRegister.h"
-#include "llvm/MC/MCRegisterInfo.h"
-#include "llvm/MC/MCSectionMachO.h"
-#include "llvm/MC/MCStreamer.h"
-#include "llvm/MC/MCSymbolXCOFF.h"
-#include "llvm/MC/TargetRegistry.h"
-#include "llvm/Support/ErrorHandling.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Support/Format.h"
-#include "llvm/Support/FormattedStream.h"
-#include "llvm/Support/LEB128.h"
-#include "llvm/Support/MathExtras.h"
-#include "llvm/Support/Path.h"
-#include <algorithm>
-#include <optional>
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
-namespace {
+MCAsmStreamer::MCAsmStreamer(MCContext &Context,
+ std::unique_ptr<MCCodeEmitter> Emitter,
+ std::unique_ptr<MCAsmBackend> AsmBackend)
+ : MCStreamer(Context),
+ Assembler(std::make_unique<MCAssembler>(
+ Context, std::move(AsmBackend), std::move(Emitter),
+ (AsmBackend) ? AsmBackend->createObjectWriter(NullStream) : nullptr)),
+ CommentStream(CommentToEmit) {}
-class MCAsmStreamer final : public MCAsmBaseStreamer {
- std::unique_ptr<formatted_raw_ostream> OSOwner;
- formatted_raw_ostream &OS;
- const MCAsmInfo *MAI;
- std::unique_ptr<MCInstPrinter> InstPrinter;
+void MCAsmStreamer::addEncodingComment(const MCInst &Inst,
+ const MCSubtargetInfo &STI) {
+ raw_ostream &OS = getCommentOS();
+ SmallString<256> Code;
+ SmallVector<MCFixup, 4> Fixups;
- SmallString<128> ExplicitCommentToEmit;
-
- bool EmittedSectionDirective = false;
-
- bool IsVerboseAsm = false;
- bool ShowInst = false;
- bool UseDwarfDirectory = false;
-
- void EmitRegisterName(int64_t Register);
- void PrintQuotedString(StringRef Data, raw_ostream &OS) const;
- void printDwarfFileDirective(unsigned FileNo, StringRef Directory,
- StringRef Filename,
- std::optional<MD5::MD5Result> Checksum,
- std::optional<StringRef> Source,
- bool UseDwarfDirectory,
- raw_svector_ostream &OS) const;
- void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
- void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
-
- /// Helper to emit common .loc directive flags, isa, and discriminator.
- void emitDwarfLocDirectiveFlags(unsigned Flags, unsigned Isa,
- unsigned Discriminator);
-
- /// Helper to emit the common suffix of .loc directives (flags, comment, EOL,
- /// parent call).
- void emitDwarfLocDirectiveSuffix(unsigned FileNo, unsigned Line,
- unsigned Column, unsigned Flags,
- unsigned Isa, unsigned Discriminator,
- StringRef FileName, StringRef Comment);
-
-public:
- MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> OS,
- std::unique_ptr<MCInstPrinter> Printer,
- std::unique_ptr<MCCodeEmitter> Emitter,
- std::unique_ptr<MCAsmBackend> AsmBackend)
- : MCAsmBaseStreamer(Context, std::move(Emitter), std::move(AsmBackend)),
- OSOwner(std::move(OS)), OS(*OSOwner), MAI(Context.getAsmInfo()),
- InstPrinter(std::move(Printer)) {
- assert(InstPrinter);
- if (Assembler->getBackendPtr())
- setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
-
- Context.setUseNamesOnTempLabels(true);
-
- auto *TO = Context.getTargetOptions();
- if (!TO)
- return;
- IsVerboseAsm = TO->AsmVerbose;
- if (IsVerboseAsm)
- InstPrinter->setCommentStream(CommentStream);
- ShowInst = TO->ShowMCInst;
- switch (TO->MCUseDwarfDirectory) {
- case MCTargetOptions::DisableDwarfDirectory:
- UseDwarfDirectory = false;
- break;
- case MCTargetOptions::EnableDwarfDirectory:
- UseDwarfDirectory = true;
- break;
- case MCTargetOptions::DefaultDwarfDirectory:
- UseDwarfDirectory =
- Context.getAsmInfo()->enableDwarfFileDirectoryDefault();
- break;
- }
- }
-
- inline void EmitEOL() {
- // Dump Explicit Comments here.
- emitExplicitComments();
- // If we don't have any comments, just emit a \n.
- if (!IsVerboseAsm) {
- OS << '\n';
- return;
- }
- EmitCommentsAndEOL();
- }
-
- void emitSyntaxDirective(StringRef Syntax, StringRef Options) override;
-
- void EmitCommentsAndEOL();
-
- /// Return true if this streamer supports verbose assembly at all.
- bool isVerboseAsm() const override { return IsVerboseAsm; }
-
- /// Do we support EmitRawText?
- bool hasRawTextSupport() const override { return true; }
-
- /// Add a comment that can be emitted to the generated .s file to make the
- /// output of the compiler more readable. This only affects the MCAsmStreamer
- /// and only when verbose assembly output is enabled.
- void AddComment(const Twine &T, bool EOL = true) override;
-
- void emitRawComment(const Twine &T, bool TabPrefix = true) override;
-
- void addExplicitComment(const Twine &T) override;
- void emitExplicitComments() override;
-
- /// Emit a blank line to a .s file to pretty it up.
- void addBlankLine() override { EmitEOL(); }
-
- /// @name MCStreamer Interface
- /// @{
-
- void switchSection(MCSection *Section, uint32_t Subsection) override;
- bool popSection() override;
-
- void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name,
- bool KeepOriginalSym) override;
-
- void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override;
-
- void emitGNUAttribute(unsigned Tag, unsigned Value) override;
-
- StringRef getMnemonic(const MCInst &MI) const override {
- auto [Ptr, Bits] = InstPrinter->getMnemonic(MI);
- assert((Bits != 0 || Ptr == nullptr) &&
- "Invalid char pointer for instruction with no mnemonic");
- return Ptr;
- }
-
- void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
-
- void emitSubsectionsViaSymbols() override;
- void emitLinkerOptions(ArrayRef<std::string> Options) override;
- void emitDataRegion(MCDataRegionType Kind) override;
- void emitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,
- unsigned Update, VersionTuple SDKVersion) override;
- void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor,
- unsigned Update, VersionTuple SDKVersion) override;
- void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
- unsigned Minor, unsigned Update,
- VersionTuple SDKVersion) override;
-
- void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
- void emitConditionalAssignment(MCSymbol *Symbol,
- const MCExpr *Value) override;
- void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
- bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
-
- void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
- void beginCOFFSymbolDef(const MCSymbol *Symbol) override;
- void emitCOFFSymbolStorageClass(int StorageClass) override;
- void emitCOFFSymbolType(int Type) override;
- void endCOFFSymbolDef() override;
- void emitCOFFSafeSEH(MCSymbol const *Symbol) override;
- void emitCOFFSymbolIndex(MCSymbol const *Symbol) override;
- void emitCOFFSectionIndex(MCSymbol const *Symbol) override;
- void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override;
- void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) override;
- void emitCOFFSecNumber(MCSymbol const *Symbol) override;
- void emitCOFFSecOffset(MCSymbol const *Symbol) override;
- void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size,
- MCSymbol *CsectSym, Align Alignment) override;
- void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
- MCSymbolAttr Linkage,
- MCSymbolAttr Visibility) override;
- void emitXCOFFRenameDirective(const MCSymbol *Name,
- StringRef Rename) override;
-
- void emitXCOFFRefDirective(const MCSymbol *Symbol) override;
-
- void emitXCOFFExceptDirective(const MCSymbol *Symbol,
- const MCSymbol *Trap,
- unsigned Lang, unsigned Reason,
- unsigned FunctionSize, bool hasDebug) override;
- void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata) override;
-
- void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;
- void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
- Align ByteAlignment) override;
-
- /// Emit a local common (.lcomm) symbol.
- ///
- /// @param Symbol - The common symbol to emit.
- /// @param Size - The size of the common symbol.
- /// @param ByteAlignment - The alignment of the common symbol in bytes.
- void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
- Align ByteAlignment) override;
-
- void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
- uint64_t Size = 0, Align ByteAlignment = Align(1),
- SMLoc Loc = SMLoc()) override;
-
- void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
- Align ByteAlignment = Align(1)) override;
-
- void emitBinaryData(StringRef Data) override;
-
- void emitBytes(StringRef Data) override;
-
- void emitValueImpl(const MCExpr *Value, unsigned Size,
- SMLoc Loc = SMLoc()) override;
- void emitIntValue(uint64_t Value, unsigned Size) override;
- void emitIntValueInHex(uint64_t Value, unsigned Size) override;
- void emitIntValueInHexWithPadding(uint64_t Value, unsigned Size) override;
-
- void emitULEB128Value(const MCExpr *Value) override;
-
- void emitSLEB128Value(const MCExpr *Value) override;
-
- void emitFill(const MCExpr &NumBytes, uint64_t FillValue,
- SMLoc Loc = SMLoc()) override;
-
- void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
- SMLoc Loc = SMLoc()) override;
-
- void emitAlignmentDirective(uint64_t ByteAlignment,
- std::optional<int64_t> Value, unsigned ValueSize,
- unsigned MaxBytesToEmit);
-
- void emitValueToAlignment(Align Alignment, int64_t Fill = 0,
- uint8_t FillLen = 1,
- unsigned MaxBytesToEmit = 0) override;
-
- void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI,
- unsigned MaxBytesToEmit = 0) override;
- void emitPrefAlign(Align Alignment) override;
-
- void emitValueToOffset(const MCExpr *Offset,
- unsigned char Value,
- SMLoc Loc) override;
-
- void emitFileDirective(StringRef Filename) override;
...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/183763
More information about the llvm-branch-commits
mailing list