[llvm] [COFF] Do not expose WinCOFFWriter to llvm namespace (PR #100505)

Haohai Wen via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 25 03:17:20 PDT 2024


https://github.com/HaohaiWen updated https://github.com/llvm/llvm-project/pull/100505

>From cdfad721fb04712dbcddedaadae25866670cc3c9 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Thu, 25 Jul 2024 11:02:17 +0800
Subject: [PATCH 1/2] [COFF] Do not expose WinCOFFWriter to llvm namespace

It is internal implementation to support split-dwarf for WinCOFFObjectWriter.
---
 llvm/include/llvm/MC/MCWinCOFFObjectWriter.h |  4 +-
 llvm/lib/MC/WinCOFFObjectWriter.cpp          | 72 +++++++++++---------
 2 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h b/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
index a4ede61e45099..eb72acf2a479c 100644
--- a/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
+++ b/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
@@ -43,10 +43,8 @@ class MCWinCOFFObjectTargetWriter : public MCObjectTargetWriter {
   virtual bool recordRelocation(const MCFixup &) const { return true; }
 };
 
-class WinCOFFWriter;
-
 class WinCOFFObjectWriter final : public MCObjectWriter {
-  friend class WinCOFFWriter;
+  class WinCOFFWriter;
 
   std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
   std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 62f53423126ea..9fa9041caf362 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -121,7 +121,7 @@ class COFFSection {
 };
 } // namespace
 
-class llvm::WinCOFFWriter {
+class WinCOFFObjectWriter::WinCOFFWriter {
   WinCOFFObjectWriter &OWriter;
   support::endian::Writer W;
 
@@ -227,8 +227,9 @@ void COFFSymbol::set_name_offset(uint32_t Offset) {
 //------------------------------------------------------------------------------
 // WinCOFFWriter class implementation
 
-WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
-                             raw_pwrite_stream &OS, DwoMode Mode)
+WinCOFFObjectWriter::WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
+                                                  raw_pwrite_stream &OS,
+                                                  DwoMode Mode)
     : OWriter(OWriter), W(OS, llvm::endianness::little), Mode(Mode) {
   Header.Machine = OWriter.TargetObjectWriter->getMachine();
   // Some relocations on ARM64 (the 21 bit ADRP relocations) have a slightly
@@ -238,19 +239,20 @@ WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
   UseOffsetLabels = COFF::isAnyArm64(Header.Machine);
 }
 
-COFFSymbol *WinCOFFWriter::createSymbol(StringRef Name) {
+COFFSymbol *WinCOFFObjectWriter::WinCOFFWriter::createSymbol(StringRef Name) {
   Symbols.push_back(std::make_unique<COFFSymbol>(Name));
   return Symbols.back().get();
 }
 
-COFFSymbol *WinCOFFWriter::GetOrCreateCOFFSymbol(const MCSymbol *Symbol) {
+COFFSymbol *WinCOFFObjectWriter::WinCOFFWriter::GetOrCreateCOFFSymbol(
+    const MCSymbol *Symbol) {
   COFFSymbol *&Ret = SymbolMap[Symbol];
   if (!Ret)
     Ret = createSymbol(Symbol->getName());
   return Ret;
 }
 
-COFFSection *WinCOFFWriter::createSection(StringRef Name) {
+COFFSection *WinCOFFObjectWriter::WinCOFFWriter::createSection(StringRef Name) {
   Sections.emplace_back(std::make_unique<COFFSection>(Name));
   return Sections.back().get();
 }
@@ -291,8 +293,8 @@ static uint32_t getAlignment(const MCSectionCOFF &Sec) {
 
 /// This function takes a section data object from the assembler
 /// and creates the associated COFF section staging object.
-void WinCOFFWriter::defineSection(const MCAssembler &Asm,
-                                  const MCSectionCOFF &MCSec) {
+void WinCOFFObjectWriter::WinCOFFWriter::defineSection(
+    const MCAssembler &Asm, const MCSectionCOFF &MCSec) {
   COFFSection *Section = createSection(MCSec.getName());
   COFFSymbol *Symbol = createSymbol(MCSec.getName());
   Section->Symbol = Symbol;
@@ -350,7 +352,8 @@ static uint64_t getSymbolValue(const MCSymbol &Symbol, const MCAssembler &Asm) {
   return Res;
 }
 
-COFFSymbol *WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
+COFFSymbol *
+WinCOFFObjectWriter::WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
   if (!Symbol.isVariable())
     return nullptr;
 
@@ -368,8 +371,8 @@ COFFSymbol *WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
 
 /// This function takes a symbol data object from the assembler
 /// and creates the associated COFF symbol staging object.
-void WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
-                                 const MCSymbol &MCSym) {
+void WinCOFFObjectWriter::WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
+                                                      const MCSymbol &MCSym) {
   const MCSymbol *Base = Asm.getBaseSymbol(MCSym);
   COFFSection *Sec = nullptr;
   MCSectionCOFF *MCSec = nullptr;
@@ -436,7 +439,7 @@ void WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
   Sym->MC = &MCSym;
 }
 
-void WinCOFFWriter::SetSectionName(COFFSection &S) {
+void WinCOFFObjectWriter::WinCOFFWriter::SetSectionName(COFFSection &S) {
   if (S.Name.size() <= COFF::NameSize) {
     std::memcpy(S.Header.Name, S.Name.c_str(), S.Name.size());
     return;
@@ -447,14 +450,14 @@ void WinCOFFWriter::SetSectionName(COFFSection &S) {
     report_fatal_error("COFF string table is greater than 64 GB.");
 }
 
-void WinCOFFWriter::SetSymbolName(COFFSymbol &S) {
+void WinCOFFObjectWriter::WinCOFFWriter::SetSymbolName(COFFSymbol &S) {
   if (S.Name.size() > COFF::NameSize)
     S.set_name_offset(Strings.getOffset(S.Name));
   else
     std::memcpy(S.Data.Name, S.Name.c_str(), S.Name.size());
 }
 
-bool WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
+bool WinCOFFObjectWriter::WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
   return (S->Header.Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) ==
          0;
 }
@@ -462,7 +465,8 @@ bool WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
 //------------------------------------------------------------------------------
 // entity writing methods
 
-void WinCOFFWriter::WriteFileHeader(const COFF::header &Header) {
+void WinCOFFObjectWriter::WinCOFFWriter::WriteFileHeader(
+    const COFF::header &Header) {
   if (UseBigObj) {
     W.write<uint16_t>(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
     W.write<uint16_t>(0xFFFF);
@@ -488,7 +492,7 @@ void WinCOFFWriter::WriteFileHeader(const COFF::header &Header) {
   }
 }
 
-void WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
+void WinCOFFObjectWriter::WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
   W.OS.write(S.Data.Name, COFF::NameSize);
   W.write<uint32_t>(S.Data.Value);
   if (UseBigObj)
@@ -501,7 +505,7 @@ void WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
   WriteAuxiliarySymbols(S.Aux);
 }
 
-void WinCOFFWriter::WriteAuxiliarySymbols(
+void WinCOFFObjectWriter::WinCOFFWriter::WriteAuxiliarySymbols(
     const COFFSymbol::AuxiliarySymbols &S) {
   for (const AuxSymbol &i : S) {
     switch (i.AuxType) {
@@ -534,7 +538,7 @@ void WinCOFFWriter::WriteAuxiliarySymbols(
 }
 
 // Write the section header.
-void WinCOFFWriter::writeSectionHeaders() {
+void WinCOFFObjectWriter::WinCOFFWriter::writeSectionHeaders() {
   // Section numbers must be monotonically increasing in the section
   // header, but our Sections array is not sorted by section number,
   // so make a copy of Sections and sort it.
@@ -565,7 +569,8 @@ void WinCOFFWriter::writeSectionHeaders() {
   }
 }
 
-void WinCOFFWriter::WriteRelocation(const COFF::relocation &R) {
+void WinCOFFObjectWriter::WinCOFFWriter::WriteRelocation(
+    const COFF::relocation &R) {
   W.write<uint32_t>(R.VirtualAddress);
   W.write<uint32_t>(R.SymbolTableIndex);
   W.write<uint16_t>(R.Type);
@@ -574,8 +579,8 @@ void WinCOFFWriter::WriteRelocation(const COFF::relocation &R) {
 // Write MCSec's contents. What this function does is essentially
 // "Asm.writeSectionData(&MCSec)", but it's a bit complicated
 // because it needs to compute a CRC.
-uint32_t WinCOFFWriter::writeSectionContents(MCAssembler &Asm,
-                                             const MCSection &MCSec) {
+uint32_t WinCOFFObjectWriter::WinCOFFWriter::writeSectionContents(
+    MCAssembler &Asm, const MCSection &MCSec) {
   // Save the contents of the section to a temporary buffer, we need this
   // to CRC the data before we dump it into the object file.
   SmallVector<char, 128> Buf;
@@ -592,7 +597,8 @@ uint32_t WinCOFFWriter::writeSectionContents(MCAssembler &Asm,
   return JC.getCRC();
 }
 
-void WinCOFFWriter::writeSection(MCAssembler &Asm, const COFFSection &Sec) {
+void WinCOFFObjectWriter::WinCOFFWriter::writeSection(MCAssembler &Asm,
+                                                      const COFFSection &Sec) {
   if (Sec.Number == -1)
     return;
 
@@ -635,7 +641,7 @@ void WinCOFFWriter::writeSection(MCAssembler &Asm, const COFFSection &Sec) {
 }
 
 // Create .file symbols.
-void WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
+void WinCOFFObjectWriter::WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
   for (const std::pair<std::string, size_t> &It : OWriter.getFileNames()) {
     // round up to calculate the number of auxiliary symbols required
     const std::string &Name = It.first;
@@ -666,7 +672,7 @@ void WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
   }
 }
 
-void WinCOFFWriter::setWeakDefaultNames() {
+void WinCOFFObjectWriter::WinCOFFWriter::setWeakDefaultNames() {
   if (WeakDefaults.empty())
     return;
 
@@ -712,7 +718,7 @@ static bool isAssociative(const COFFSection &Section) {
          COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE;
 }
 
-void WinCOFFWriter::assignSectionNumbers() {
+void WinCOFFObjectWriter::WinCOFFWriter::assignSectionNumbers() {
   size_t I = 1;
   auto Assign = [&](COFFSection &Section) {
     Section.Number = I;
@@ -733,7 +739,7 @@ void WinCOFFWriter::assignSectionNumbers() {
 }
 
 // Assign file offsets to COFF object file structures.
-void WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
+void WinCOFFObjectWriter::WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
   unsigned Offset = W.OS.tell();
 
   Offset += UseBigObj ? COFF::Header32Size : COFF::Header16Size;
@@ -792,7 +798,7 @@ void WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
   Header.PointerToSymbolTable = Offset;
 }
 
-void WinCOFFWriter::reset() {
+void WinCOFFObjectWriter::WinCOFFWriter::reset() {
   memset(&Header, 0, sizeof(Header));
   Header.Machine = OWriter.TargetObjectWriter->getMachine();
   Sections.clear();
@@ -803,7 +809,8 @@ void WinCOFFWriter::reset() {
   WeakDefaults.clear();
 }
 
-void WinCOFFWriter::executePostLayoutBinding(MCAssembler &Asm) {
+void WinCOFFObjectWriter::WinCOFFWriter::executePostLayoutBinding(
+    MCAssembler &Asm) {
   // "Define" each section & symbol. This creates section & symbol
   // entries in the staging area.
   for (const auto &Section : Asm) {
@@ -821,10 +828,9 @@ void WinCOFFWriter::executePostLayoutBinding(MCAssembler &Asm) {
         defineSymbol(Asm, Symbol);
 }
 
-void WinCOFFWriter::recordRelocation(MCAssembler &Asm,
-                                     const MCFragment *Fragment,
-                                     const MCFixup &Fixup, MCValue Target,
-                                     uint64_t &FixedValue) {
+void WinCOFFObjectWriter::WinCOFFWriter::recordRelocation(
+    MCAssembler &Asm, const MCFragment *Fragment, const MCFixup &Fixup,
+    MCValue Target, uint64_t &FixedValue) {
   assert(Target.getSymA() && "Relocation must reference a symbol!");
 
   const MCSymbol &A = Target.getSymA()->getSymbol();
@@ -978,7 +984,7 @@ static std::time_t getTime() {
   return Now;
 }
 
-uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {
+uint64_t WinCOFFObjectWriter::WinCOFFWriter::writeObject(MCAssembler &Asm) {
   uint64_t StartOffset = W.OS.tell();
 
   if (Sections.size() > INT32_MAX)

>From 68d1a3e5958cb2c1c494a4a1c94d3e1dad9e7b73 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Thu, 25 Jul 2024 18:16:59 +0800
Subject: [PATCH 2/2] Address comments

---
 llvm/include/llvm/MC/MCObjectWriter.h        | 84 +++++++++++---------
 llvm/include/llvm/MC/MCWinCOFFObjectWriter.h | 12 +--
 llvm/lib/MC/MCObjectWriter.cpp               | 22 ++---
 llvm/lib/MC/WinCOFFObjectWriter.cpp          | 84 +++++++++-----------
 4 files changed, 101 insertions(+), 101 deletions(-)

diff --git a/llvm/include/llvm/MC/MCObjectWriter.h b/llvm/include/llvm/MC/MCObjectWriter.h
index 81ba6ffd5d44e..a319be8601b1e 100644
--- a/llvm/include/llvm/MC/MCObjectWriter.h
+++ b/llvm/include/llvm/MC/MCObjectWriter.h
@@ -22,40 +22,12 @@ class MCSymbol;
 class MCSymbolRefExpr;
 class MCValue;
 
-/// Defines the object file and target independent interfaces used by the
-/// assembler backend to write native file format object files.
-///
-/// The object writer contains a few callbacks used by the assembler to allow
-/// the object writer to modify the assembler data structures at appropriate
-/// points. Once assembly is complete, the object writer is given the
-/// MCAssembler instance, which contains all the symbol and section data which
-/// should be emitted as part of writeObject().
-class MCObjectWriter {
-protected:
-  /// List of declared file names
-  SmallVector<std::pair<std::string, size_t>, 0> FileNames;
-  // XCOFF specific: Optional compiler version.
-  std::string CompilerVersion;
-  std::vector<const MCSymbol *> AddrsigSyms;
-  bool EmitAddrsigSection = false;
-  bool SubsectionsViaSymbols = false;
-
-  struct CGProfileEntry {
-    const MCSymbolRefExpr *From;
-    const MCSymbolRefExpr *To;
-    uint64_t Count;
-  };
-  SmallVector<CGProfileEntry, 0> CGProfile;
-
-  MCObjectWriter() = default;
-
-public:
-  MCObjectWriter(const MCObjectWriter &) = delete;
-  MCObjectWriter &operator=(const MCObjectWriter &) = delete;
-  virtual ~MCObjectWriter();
+/// Abstract class for MCObjectWriter.
+struct MCObjectWriterBase {
+  virtual ~MCObjectWriterBase();
 
   /// lifetime management
-  virtual void reset();
+  virtual void reset() = 0;
 
   /// \name High-Level API
   /// @{
@@ -93,6 +65,47 @@ class MCObjectWriter {
                                                       bool InSet,
                                                       bool IsPCRel) const;
 
+  /// Write the object file and returns the number of bytes written.
+  ///
+  /// This routine is called by the assembler after layout and relaxation is
+  /// complete, fixups have been evaluated and applied, and relocations
+  /// generated.
+  virtual uint64_t writeObject(MCAssembler &Asm) = 0;
+};
+
+/// Defines the object file and target independent interfaces used by the
+/// assembler backend to write native file format object files.
+///
+/// The object writer contains a few callbacks used by the assembler to allow
+/// the object writer to modify the assembler data structures at appropriate
+/// points. Once assembly is complete, the object writer is given the
+/// MCAssembler instance, which contains all the symbol and section data which
+/// should be emitted as part of writeObject().
+class MCObjectWriter : public MCObjectWriterBase {
+protected:
+  /// List of declared file names
+  SmallVector<std::pair<std::string, size_t>, 0> FileNames;
+  // XCOFF specific: Optional compiler version.
+  std::string CompilerVersion;
+  std::vector<const MCSymbol *> AddrsigSyms;
+  bool EmitAddrsigSection = false;
+  bool SubsectionsViaSymbols = false;
+
+  struct CGProfileEntry {
+    const MCSymbolRefExpr *From;
+    const MCSymbolRefExpr *To;
+    uint64_t Count;
+  };
+  SmallVector<CGProfileEntry, 0> CGProfile;
+
+  MCObjectWriter() = default;
+
+public:
+  MCObjectWriter(const MCObjectWriter &) = delete;
+  MCObjectWriter &operator=(const MCObjectWriter &) = delete;
+
+  void reset() override;
+
   MutableArrayRef<std::pair<std::string, size_t>> getFileNames() {
     return FileNames;
   }
@@ -119,13 +132,6 @@ class MCObjectWriter {
   bool getSubsectionsViaSymbols() const { return SubsectionsViaSymbols; }
   void setSubsectionsViaSymbols(bool Value) { SubsectionsViaSymbols = Value; }
 
-  /// Write the object file and returns the number of bytes written.
-  ///
-  /// This routine is called by the assembler after layout and relaxation is
-  /// complete, fixups have been evaluated and applied, and relocations
-  /// generated.
-  virtual uint64_t writeObject(MCAssembler &Asm) = 0;
-
   /// @}
 };
 
diff --git a/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h b/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
index eb72acf2a479c..2b7a5e1db99bc 100644
--- a/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
+++ b/llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
@@ -44,12 +44,6 @@ class MCWinCOFFObjectTargetWriter : public MCObjectTargetWriter {
 };
 
 class WinCOFFObjectWriter final : public MCObjectWriter {
-  class WinCOFFWriter;
-
-  std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
-  std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;
-  bool IncrementalLinkerCompatible = false;
-
 public:
   WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
                       raw_pwrite_stream &OS);
@@ -70,6 +64,12 @@ class WinCOFFObjectWriter final : public MCObjectWriter {
                         const MCFixup &Fixup, MCValue Target,
                         uint64_t &FixedValue) override;
   uint64_t writeObject(MCAssembler &Asm) override;
+
+  std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
+  bool IncrementalLinkerCompatible = false;
+
+private:
+  std::unique_ptr<MCObjectWriterBase> ObjWriter, DwoWriter;
 };
 
 /// Construct a new Win COFF writer instance.
diff --git a/llvm/lib/MC/MCObjectWriter.cpp b/llvm/lib/MC/MCObjectWriter.cpp
index 818e703514d61..883d63b285a62 100644
--- a/llvm/lib/MC/MCObjectWriter.cpp
+++ b/llvm/lib/MC/MCObjectWriter.cpp
@@ -17,17 +17,9 @@ class MCSection;
 
 using namespace llvm;
 
-MCObjectWriter::~MCObjectWriter() = default;
+MCObjectWriterBase::~MCObjectWriterBase() = default;
 
-void MCObjectWriter::reset() {
-  FileNames.clear();
-  AddrsigSyms.clear();
-  EmitAddrsigSection = false;
-  SubsectionsViaSymbols = false;
-  CGProfile.clear();
-}
-
-bool MCObjectWriter::isSymbolRefDifferenceFullyResolved(
+bool MCObjectWriterBase::isSymbolRefDifferenceFullyResolved(
     const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B,
     bool InSet) const {
   // Modified symbol references cannot be resolved.
@@ -45,7 +37,7 @@ bool MCObjectWriter::isSymbolRefDifferenceFullyResolved(
   return isSymbolRefDifferenceFullyResolvedImpl(Asm, SA, *FB, InSet, /*IsPCRel=*/false);
 }
 
-bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
+bool MCObjectWriterBase::isSymbolRefDifferenceFullyResolvedImpl(
     const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB,
     bool InSet, bool IsPCRel) const {
   const MCSection &SecA = SymA.getSection();
@@ -54,6 +46,14 @@ bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
   return &SecA == &SecB;
 }
 
+void MCObjectWriter::reset() {
+  FileNames.clear();
+  AddrsigSyms.clear();
+  EmitAddrsigSection = false;
+  SubsectionsViaSymbols = false;
+  CGProfile.clear();
+}
+
 void MCObjectWriter::addFileName(MCAssembler &Asm, StringRef FileName) {
   FileNames.emplace_back(std::string(FileName), Asm.Symbols.size());
 }
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp
index 9fa9041caf362..dbb1f3a719ea4 100644
--- a/llvm/lib/MC/WinCOFFObjectWriter.cpp
+++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp
@@ -119,9 +119,8 @@ class COFFSection {
 
   SmallVector<COFFSymbol *, 1> OffsetSymbols;
 };
-} // namespace
 
-class WinCOFFObjectWriter::WinCOFFWriter {
+class WinCOFFWriter : public MCObjectWriterBase {
   WinCOFFObjectWriter &OWriter;
   support::endian::Writer W;
 
@@ -158,12 +157,12 @@ class WinCOFFObjectWriter::WinCOFFWriter {
   WinCOFFWriter(WinCOFFObjectWriter &OWriter, raw_pwrite_stream &OS,
                 DwoMode Mode);
 
-  void reset();
-  void executePostLayoutBinding(MCAssembler &Asm);
+  void reset() override;
+  void executePostLayoutBinding(MCAssembler &Asm) override;
   void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
                         const MCFixup &Fixup, MCValue Target,
-                        uint64_t &FixedValue);
-  uint64_t writeObject(MCAssembler &Asm);
+                        uint64_t &FixedValue) override;
+  uint64_t writeObject(MCAssembler &Asm) override;
 
 private:
   COFFSymbol *createSymbol(StringRef Name);
@@ -194,6 +193,7 @@ class WinCOFFObjectWriter::WinCOFFWriter {
   void assignSectionNumbers();
   void assignFileOffsets(MCAssembler &Asm);
 };
+} // namespace
 
 WinCOFFObjectWriter::WinCOFFObjectWriter(
     std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
@@ -227,9 +227,8 @@ void COFFSymbol::set_name_offset(uint32_t Offset) {
 //------------------------------------------------------------------------------
 // WinCOFFWriter class implementation
 
-WinCOFFObjectWriter::WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
-                                                  raw_pwrite_stream &OS,
-                                                  DwoMode Mode)
+WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
+                             raw_pwrite_stream &OS, DwoMode Mode)
     : OWriter(OWriter), W(OS, llvm::endianness::little), Mode(Mode) {
   Header.Machine = OWriter.TargetObjectWriter->getMachine();
   // Some relocations on ARM64 (the 21 bit ADRP relocations) have a slightly
@@ -239,20 +238,19 @@ WinCOFFObjectWriter::WinCOFFWriter::WinCOFFWriter(WinCOFFObjectWriter &OWriter,
   UseOffsetLabels = COFF::isAnyArm64(Header.Machine);
 }
 
-COFFSymbol *WinCOFFObjectWriter::WinCOFFWriter::createSymbol(StringRef Name) {
+COFFSymbol *WinCOFFWriter::createSymbol(StringRef Name) {
   Symbols.push_back(std::make_unique<COFFSymbol>(Name));
   return Symbols.back().get();
 }
 
-COFFSymbol *WinCOFFObjectWriter::WinCOFFWriter::GetOrCreateCOFFSymbol(
-    const MCSymbol *Symbol) {
+COFFSymbol *WinCOFFWriter::GetOrCreateCOFFSymbol(const MCSymbol *Symbol) {
   COFFSymbol *&Ret = SymbolMap[Symbol];
   if (!Ret)
     Ret = createSymbol(Symbol->getName());
   return Ret;
 }
 
-COFFSection *WinCOFFObjectWriter::WinCOFFWriter::createSection(StringRef Name) {
+COFFSection *WinCOFFWriter::createSection(StringRef Name) {
   Sections.emplace_back(std::make_unique<COFFSection>(Name));
   return Sections.back().get();
 }
@@ -293,8 +291,8 @@ static uint32_t getAlignment(const MCSectionCOFF &Sec) {
 
 /// This function takes a section data object from the assembler
 /// and creates the associated COFF section staging object.
-void WinCOFFObjectWriter::WinCOFFWriter::defineSection(
-    const MCAssembler &Asm, const MCSectionCOFF &MCSec) {
+void WinCOFFWriter::defineSection(const MCAssembler &Asm,
+                                  const MCSectionCOFF &MCSec) {
   COFFSection *Section = createSection(MCSec.getName());
   COFFSymbol *Symbol = createSymbol(MCSec.getName());
   Section->Symbol = Symbol;
@@ -352,8 +350,7 @@ static uint64_t getSymbolValue(const MCSymbol &Symbol, const MCAssembler &Asm) {
   return Res;
 }
 
-COFFSymbol *
-WinCOFFObjectWriter::WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
+COFFSymbol *WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
   if (!Symbol.isVariable())
     return nullptr;
 
@@ -371,8 +368,8 @@ WinCOFFObjectWriter::WinCOFFWriter::getLinkedSymbol(const MCSymbol &Symbol) {
 
 /// This function takes a symbol data object from the assembler
 /// and creates the associated COFF symbol staging object.
-void WinCOFFObjectWriter::WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
-                                                      const MCSymbol &MCSym) {
+void WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
+                                 const MCSymbol &MCSym) {
   const MCSymbol *Base = Asm.getBaseSymbol(MCSym);
   COFFSection *Sec = nullptr;
   MCSectionCOFF *MCSec = nullptr;
@@ -439,7 +436,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::defineSymbol(const MCAssembler &Asm,
   Sym->MC = &MCSym;
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::SetSectionName(COFFSection &S) {
+void WinCOFFWriter::SetSectionName(COFFSection &S) {
   if (S.Name.size() <= COFF::NameSize) {
     std::memcpy(S.Header.Name, S.Name.c_str(), S.Name.size());
     return;
@@ -450,14 +447,14 @@ void WinCOFFObjectWriter::WinCOFFWriter::SetSectionName(COFFSection &S) {
     report_fatal_error("COFF string table is greater than 64 GB.");
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::SetSymbolName(COFFSymbol &S) {
+void WinCOFFWriter::SetSymbolName(COFFSymbol &S) {
   if (S.Name.size() > COFF::NameSize)
     S.set_name_offset(Strings.getOffset(S.Name));
   else
     std::memcpy(S.Data.Name, S.Name.c_str(), S.Name.size());
 }
 
-bool WinCOFFObjectWriter::WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
+bool WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
   return (S->Header.Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) ==
          0;
 }
@@ -465,8 +462,7 @@ bool WinCOFFObjectWriter::WinCOFFWriter::IsPhysicalSection(COFFSection *S) {
 //------------------------------------------------------------------------------
 // entity writing methods
 
-void WinCOFFObjectWriter::WinCOFFWriter::WriteFileHeader(
-    const COFF::header &Header) {
+void WinCOFFWriter::WriteFileHeader(const COFF::header &Header) {
   if (UseBigObj) {
     W.write<uint16_t>(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
     W.write<uint16_t>(0xFFFF);
@@ -492,7 +488,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::WriteFileHeader(
   }
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
+void WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
   W.OS.write(S.Data.Name, COFF::NameSize);
   W.write<uint32_t>(S.Data.Value);
   if (UseBigObj)
@@ -505,7 +501,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::WriteSymbol(const COFFSymbol &S) {
   WriteAuxiliarySymbols(S.Aux);
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::WriteAuxiliarySymbols(
+void WinCOFFWriter::WriteAuxiliarySymbols(
     const COFFSymbol::AuxiliarySymbols &S) {
   for (const AuxSymbol &i : S) {
     switch (i.AuxType) {
@@ -538,7 +534,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::WriteAuxiliarySymbols(
 }
 
 // Write the section header.
-void WinCOFFObjectWriter::WinCOFFWriter::writeSectionHeaders() {
+void WinCOFFWriter::writeSectionHeaders() {
   // Section numbers must be monotonically increasing in the section
   // header, but our Sections array is not sorted by section number,
   // so make a copy of Sections and sort it.
@@ -569,8 +565,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::writeSectionHeaders() {
   }
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::WriteRelocation(
-    const COFF::relocation &R) {
+void WinCOFFWriter::WriteRelocation(const COFF::relocation &R) {
   W.write<uint32_t>(R.VirtualAddress);
   W.write<uint32_t>(R.SymbolTableIndex);
   W.write<uint16_t>(R.Type);
@@ -579,8 +574,8 @@ void WinCOFFObjectWriter::WinCOFFWriter::WriteRelocation(
 // Write MCSec's contents. What this function does is essentially
 // "Asm.writeSectionData(&MCSec)", but it's a bit complicated
 // because it needs to compute a CRC.
-uint32_t WinCOFFObjectWriter::WinCOFFWriter::writeSectionContents(
-    MCAssembler &Asm, const MCSection &MCSec) {
+uint32_t WinCOFFWriter::writeSectionContents(MCAssembler &Asm,
+                                             const MCSection &MCSec) {
   // Save the contents of the section to a temporary buffer, we need this
   // to CRC the data before we dump it into the object file.
   SmallVector<char, 128> Buf;
@@ -597,8 +592,7 @@ uint32_t WinCOFFObjectWriter::WinCOFFWriter::writeSectionContents(
   return JC.getCRC();
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::writeSection(MCAssembler &Asm,
-                                                      const COFFSection &Sec) {
+void WinCOFFWriter::writeSection(MCAssembler &Asm, const COFFSection &Sec) {
   if (Sec.Number == -1)
     return;
 
@@ -641,7 +635,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::writeSection(MCAssembler &Asm,
 }
 
 // Create .file symbols.
-void WinCOFFObjectWriter::WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
+void WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
   for (const std::pair<std::string, size_t> &It : OWriter.getFileNames()) {
     // round up to calculate the number of auxiliary symbols required
     const std::string &Name = It.first;
@@ -672,7 +666,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
   }
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::setWeakDefaultNames() {
+void WinCOFFWriter::setWeakDefaultNames() {
   if (WeakDefaults.empty())
     return;
 
@@ -718,7 +712,7 @@ static bool isAssociative(const COFFSection &Section) {
          COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE;
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::assignSectionNumbers() {
+void WinCOFFWriter::assignSectionNumbers() {
   size_t I = 1;
   auto Assign = [&](COFFSection &Section) {
     Section.Number = I;
@@ -739,7 +733,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::assignSectionNumbers() {
 }
 
 // Assign file offsets to COFF object file structures.
-void WinCOFFObjectWriter::WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
+void WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
   unsigned Offset = W.OS.tell();
 
   Offset += UseBigObj ? COFF::Header32Size : COFF::Header16Size;
@@ -798,7 +792,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::assignFileOffsets(MCAssembler &Asm) {
   Header.PointerToSymbolTable = Offset;
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::reset() {
+void WinCOFFWriter::reset() {
   memset(&Header, 0, sizeof(Header));
   Header.Machine = OWriter.TargetObjectWriter->getMachine();
   Sections.clear();
@@ -809,8 +803,7 @@ void WinCOFFObjectWriter::WinCOFFWriter::reset() {
   WeakDefaults.clear();
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::executePostLayoutBinding(
-    MCAssembler &Asm) {
+void WinCOFFWriter::executePostLayoutBinding(MCAssembler &Asm) {
   // "Define" each section & symbol. This creates section & symbol
   // entries in the staging area.
   for (const auto &Section : Asm) {
@@ -828,9 +821,10 @@ void WinCOFFObjectWriter::WinCOFFWriter::executePostLayoutBinding(
         defineSymbol(Asm, Symbol);
 }
 
-void WinCOFFObjectWriter::WinCOFFWriter::recordRelocation(
-    MCAssembler &Asm, const MCFragment *Fragment, const MCFixup &Fixup,
-    MCValue Target, uint64_t &FixedValue) {
+void WinCOFFWriter::recordRelocation(MCAssembler &Asm,
+                                     const MCFragment *Fragment,
+                                     const MCFixup &Fixup, MCValue Target,
+                                     uint64_t &FixedValue) {
   assert(Target.getSymA() && "Relocation must reference a symbol!");
 
   const MCSymbol &A = Target.getSymA()->getSymbol();
@@ -984,7 +978,7 @@ static std::time_t getTime() {
   return Now;
 }
 
-uint64_t WinCOFFObjectWriter::WinCOFFWriter::writeObject(MCAssembler &Asm) {
+uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {
   uint64_t StartOffset = W.OS.tell();
 
   if (Sections.size() > INT32_MAX)
@@ -1073,7 +1067,7 @@ uint64_t WinCOFFObjectWriter::WinCOFFWriter::writeObject(MCAssembler &Asm) {
         ".llvm_addrsig", COFF::IMAGE_SCN_LNK_REMOVE);
     auto *Frag = cast<MCDataFragment>(Sec->curFragList()->Head);
     raw_svector_ostream OS(Frag->getContents());
-    for (const MCSymbol *S : OWriter.AddrsigSyms) {
+    for (const MCSymbol *S : OWriter.getAddrsigSyms()) {
       if (!S->isRegistered())
         continue;
       if (!S->isTemporary()) {



More information about the llvm-commits mailing list