[llvm] [llvm-dwp] Replace MCStreamer with direct ELF writer for zero-copy output (PR #192112)

via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 16 10:26:57 PDT 2026


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions h,cpp -- llvm/include/llvm/BinaryFormat/ELFWriter.h llvm/lib/BinaryFormat/ELFWriter.cpp llvm/include/llvm/DWP/DWP.h llvm/include/llvm/DWP/DWPStringPool.h llvm/lib/DWP/DWP.cpp llvm/lib/MC/ELFObjectWriter.cpp llvm/tools/llvm-dwp/llvm-dwp.cpp --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/llvm/include/llvm/BinaryFormat/ELFWriter.h b/llvm/include/llvm/BinaryFormat/ELFWriter.h
index 4a11621db..7b5ecc34e 100644
--- a/llvm/include/llvm/BinaryFormat/ELFWriter.h
+++ b/llvm/include/llvm/BinaryFormat/ELFWriter.h
@@ -26,11 +26,10 @@ void writeHeader(support::endian::Writer &W, bool Is64Bit, uint8_t OSABI,
                  uint64_t SHOff, uint16_t SHNum, uint16_t SHStrNdx);
 
 /// Write a single ELF section header entry (Elf32_Shdr or Elf64_Shdr).
-void writeSectionHeader(support::endian::Writer &W, bool Is64Bit,
-                        uint32_t Name, uint32_t Type, uint64_t Flags,
-                        uint64_t Address, uint64_t Offset, uint64_t Size,
-                        uint32_t Link, uint32_t Info, uint64_t Alignment,
-                        uint64_t EntrySize);
+void writeSectionHeader(support::endian::Writer &W, bool Is64Bit, uint32_t Name,
+                        uint32_t Type, uint64_t Flags, uint64_t Address,
+                        uint64_t Offset, uint64_t Size, uint32_t Link,
+                        uint32_t Info, uint64_t Alignment, uint64_t EntrySize);
 
 } // namespace ELF
 } // namespace llvm
diff --git a/llvm/lib/BinaryFormat/ELFWriter.cpp b/llvm/lib/BinaryFormat/ELFWriter.cpp
index 4a0fd79d0..2d593d501 100644
--- a/llvm/lib/BinaryFormat/ELFWriter.cpp
+++ b/llvm/lib/BinaryFormat/ELFWriter.cpp
@@ -19,8 +19,8 @@ static void writeWord(support::endian::Writer &W, bool Is64Bit, uint64_t Val) {
 }
 
 void ELF::writeHeader(support::endian::Writer &W, bool Is64Bit, uint8_t OSABI,
-                       uint8_t ABIVersion, uint16_t EMachine, uint32_t EFlags,
-                       uint64_t SHOff, uint16_t SHNum, uint16_t SHStrNdx) {
+                      uint8_t ABIVersion, uint16_t EMachine, uint32_t EFlags,
+                      uint64_t SHOff, uint16_t SHNum, uint16_t SHStrNdx) {
   W.OS << ElfMagic;
   W.OS << char(Is64Bit ? ELFCLASS64 : ELFCLASS32);
   W.OS << char(W.Endian == llvm::endianness::little ? ELFDATA2LSB
@@ -46,10 +46,10 @@ void ELF::writeHeader(support::endian::Writer &W, bool Is64Bit, uint8_t OSABI,
 }
 
 void ELF::writeSectionHeader(support::endian::Writer &W, bool Is64Bit,
-                              uint32_t Name, uint32_t Type, uint64_t Flags,
-                              uint64_t Address, uint64_t Offset, uint64_t Size,
-                              uint32_t Link, uint32_t Info, uint64_t Alignment,
-                              uint64_t EntrySize) {
+                             uint32_t Name, uint32_t Type, uint64_t Flags,
+                             uint64_t Address, uint64_t Offset, uint64_t Size,
+                             uint32_t Link, uint32_t Info, uint64_t Alignment,
+                             uint64_t EntrySize) {
   W.write<uint32_t>(Name);
   W.write<uint32_t>(Type);
   writeWord(W, Is64Bit, Flags);
diff --git a/llvm/lib/DWP/DWP.cpp b/llvm/lib/DWP/DWP.cpp
index d4286566d..233ace9ac 100644
--- a/llvm/lib/DWP/DWP.cpp
+++ b/llvm/lib/DWP/DWP.cpp
@@ -15,10 +15,10 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/BinaryFormat/ELFWriter.h"
 #include "llvm/DWP/DWPError.h"
 #include "llvm/Object/Decompressor.h"
 #include "llvm/Object/ELFObjectFile.h"
-#include "llvm/BinaryFormat/ELFWriter.h"
 #include "llvm/Support/EndianStream.h"
 #include "llvm/Support/MathExtras.h"
 #include <limits>
@@ -352,9 +352,9 @@ handleCompressedSection(std::deque<SmallString<32>> &UncompressedSections,
   return Error::success();
 }
 
-static Error buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
-                                 const CompileUnitIdentifiers &ID,
-                                 StringRef DWPName) {
+static Error
+buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
+                    const CompileUnitIdentifiers &ID, StringRef DWPName) {
   return make_error<DWPError>(
       std::string("duplicate DWO ID (") + utohexstr(PrevE.first) + ") in " +
       buildDWODescription(PrevE.second.Name, PrevE.second.DWPName,
@@ -452,8 +452,7 @@ writeStringsAndOffsets(DWPWriter &Out, DWPStringPool &Strings,
 
   // Fast path: when there is only one input, all strings are unique and offsets
   // don't need remapping. Copy both sections directly without any hashing.
-  if (SingleInput &&
-      StrOffsetsOptValue != Dwarf64StrOffsetsPromotion::Always) {
+  if (SingleInput && StrOffsetsOptValue != Dwarf64StrOffsetsPromotion::Always) {
     Out.switchSection(DS_Str);
     Out.emitBytes(CurStrSection);
     Out.switchSection(DS_StrOffsets);
@@ -780,10 +779,9 @@ Error write(DWPWriter &Out, ArrayRef<std::string> Inputs,
     for (const auto &Section : Obj.sections())
       if (auto Err = handleSection(
               KnownSections, Section, Out, UncompressedSections,
-              ContributionOffsets, CurEntry, CurStrSection,
-              CurStrOffsetSection, CurTypesSection, CurInfoSection,
-              AbbrevSection, CurCUIndexSection, CurTUIndexSection,
-              SectionLength))
+              ContributionOffsets, CurEntry, CurStrSection, CurStrOffsetSection,
+              CurTypesSection, CurInfoSection, AbbrevSection, CurCUIndexSection,
+              CurTUIndexSection, SectionLength))
         return Err;
 
     if (CurInfoSection.empty())
@@ -1059,7 +1057,8 @@ Error DWPWriter::writeELF(raw_pwrite_stream &OS) {
       {DS_Line, ".debug_line.dwo", ELF::SHF_EXCLUDE, 0},
       {DS_Rnglists, ".debug_rnglists.dwo", ELF::SHF_EXCLUDE, 0},
       {DS_Macro, ".debug_macro.dwo", ELF::SHF_EXCLUDE, 0},
-      {DS_Str, ".debug_str.dwo", ELF::SHF_EXCLUDE | ELF::SHF_MERGE | ELF::SHF_STRINGS, 1},
+      {DS_Str, ".debug_str.dwo",
+       ELF::SHF_EXCLUDE | ELF::SHF_MERGE | ELF::SHF_STRINGS, 1},
       {DS_StrOffsets, ".debug_str_offsets.dwo", ELF::SHF_EXCLUDE, 0},
       {DS_Info, ".debug_info.dwo", ELF::SHF_EXCLUDE, 0},
       {DS_Types, ".debug_types.dwo", ELF::SHF_EXCLUDE, 0},
@@ -1087,7 +1086,8 @@ Error DWPWriter::writeELF(raw_pwrite_stream &OS) {
     uint32_t NameOff = Strtab.size();
     Strtab.append(M.Name);
     Strtab.push_back('\0');
-    Entries.push_back({&Sections[M.Id], M.Name, M.Flags, M.EntSize, NameOff, 0});
+    Entries.push_back(
+        {&Sections[M.Id], M.Name, M.Flags, M.EntSize, NameOff, 0});
   }
 
   // Add .strtab and .symtab name entries.
@@ -1131,7 +1131,7 @@ Error DWPWriter::writeELF(raw_pwrite_stream &OS) {
 
   // --- Write ELF header ---
   ELF::writeHeader(Wr, /*Is64Bit=*/true, ELFOSABI, /*ABIVersion=*/0, ELFMachine,
-                 /*EFlags=*/0, SHTOffset, NumSections, StrtabIdx);
+                   /*EFlags=*/0, SHTOffset, NumSections, StrtabIdx);
 
   // --- Write section data ---
   for (const auto &E : Entries)
@@ -1154,16 +1154,17 @@ Error DWPWriter::writeELF(raw_pwrite_stream &OS) {
   // [1..N] data sections
   for (const auto &E : Entries)
     ELF::writeSectionHeader(Wr, true, E.NameOffset, ELF::SHT_PROGBITS, E.Flags,
-                          0, E.FileOffset, E.Data->totalSize(), 0, 0, 1,
-                          E.EntSize);
+                            0, E.FileOffset, E.Data->totalSize(), 0, 0, 1,
+                            E.EntSize);
 
   // [N+1] .strtab
   ELF::writeSectionHeader(Wr, true, StrtabNameOff, ELF::SHT_STRTAB, 0, 0,
-                        StrtabOffset, Strtab.size(), 0, 0, 1, 0);
+                          StrtabOffset, Strtab.size(), 0, 0, 1, 0);
 
   // [N+2] .symtab
   ELF::writeSectionHeader(Wr, true, SymtabNameOff, ELF::SHT_SYMTAB, 0, 0,
-                        SymtabOffset, SymEntSize, StrtabIdx, 1, 8, SymEntSize);
+                          SymtabOffset, SymEntSize, StrtabIdx, 1, 8,
+                          SymEntSize);
 
   return Error::success();
 }
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index d17a2f7e1..99fafcfce 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -19,6 +19,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/BinaryFormat/ELFWriter.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCAssembler.h"
@@ -28,7 +29,6 @@
 #include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCFixup.h"
 #include "llvm/MC/MCObjectWriter.h"
-#include "llvm/BinaryFormat/ELFWriter.h"
 #include "llvm/MC/MCSection.h"
 #include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCSymbol.h"

``````````

</details>


https://github.com/llvm/llvm-project/pull/192112


More information about the llvm-commits mailing list