[llvm] 1d4d92d - [MC] Move MCAssembler::IndirectSymbols to MachObjectWriter

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 4 22:56:07 PDT 2024


Author: Fangrui Song
Date: 2024-07-04T22:56:03-07:00
New Revision: 1d4d92d1cc98f22259aded4c3f29c67e7686ee30

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

LOG: [MC] Move MCAssembler::IndirectSymbols to MachObjectWriter

Added: 
    

Modified: 
    llvm/include/llvm/MC/MCAssembler.h
    llvm/include/llvm/MC/MCMachObjectWriter.h
    llvm/lib/MC/MCAssembler.cpp
    llvm/lib/MC/MCMachOStreamer.cpp
    llvm/lib/MC/MachObjectWriter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h
index 92f110084a04d..6f9e69c178b32 100644
--- a/llvm/include/llvm/MC/MCAssembler.h
+++ b/llvm/include/llvm/MC/MCAssembler.h
@@ -53,12 +53,6 @@ class MCObjectWriter;
 class MCSection;
 class MCValue;
 
-// FIXME: This really doesn't belong here. See comments below.
-struct IndirectSymbolData {
-  MCSymbol *Symbol;
-  MCSection *Section;
-};
-
 // FIXME: Ditto this. Purely so the Streamer and the ObjectWriter can talk
 // to one another.
 struct DataRegionData {
@@ -84,10 +78,6 @@ class MCAssembler {
   using symbol_range = iterator_range<symbol_iterator>;
   using const_symbol_range = iterator_range<const_symbol_iterator>;
 
-  using const_indirect_symbol_iterator =
-      std::vector<IndirectSymbolData>::const_iterator;
-  using indirect_symbol_iterator = std::vector<IndirectSymbolData>::iterator;
-
   using const_data_region_iterator =
       std::vector<DataRegionData>::const_iterator;
   using data_region_iterator = std::vector<DataRegionData>::iterator;
@@ -124,8 +114,6 @@ class MCAssembler {
 
   SymbolDataListType Symbols;
 
-  std::vector<IndirectSymbolData> IndirectSymbols;
-
   std::vector<DataRegionData> DataRegions;
 
   /// The list of linker options to propagate into the object file.
@@ -388,17 +376,6 @@ class MCAssembler {
 
   size_t symbol_size() const { return Symbols.size(); }
 
-  /// @}
-  /// \name Indirect Symbol List Access
-  /// @{
-
-  // FIXME: This is a total hack, this should not be here. Once things are
-  // factored so that the streamer has direct access to the .o writer, it can
-  // disappear.
-  std::vector<IndirectSymbolData> &getIndirectSymbols() {
-    return IndirectSymbols;
-  }
-
   /// @}
   /// \name Linker Option List Access
   /// @{

diff  --git a/llvm/include/llvm/MC/MCMachObjectWriter.h b/llvm/include/llvm/MC/MCMachObjectWriter.h
index 172dadb128192..7db1cd4ee5d2b 100644
--- a/llvm/include/llvm/MC/MCMachObjectWriter.h
+++ b/llvm/include/llvm/MC/MCMachObjectWriter.h
@@ -91,6 +91,11 @@ class MachObjectWriter : public MCObjectWriter {
     bool operator<(const MachSymbolData &RHS) const;
   };
 
+  struct IndirectSymbolData {
+    MCSymbol *Symbol;
+    MCSection *Section;
+  };
+
   /// The target specific Mach-O writer instance.
   std::unique_ptr<MCMachObjectTargetWriter> TargetObjectWriter;
 
@@ -105,6 +110,7 @@ class MachObjectWriter : public MCObjectWriter {
   };
 
   DenseMap<const MCSection *, std::vector<RelAndSymbol>> Relocations;
+  std::vector<IndirectSymbolData> IndirectSymbols;
   DenseMap<const MCSection *, unsigned> IndirectSymBase;
 
   SectionAddrMap SectionAddress;
@@ -153,6 +159,9 @@ class MachObjectWriter : public MCObjectWriter {
 
   bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind);
 
+  std::vector<IndirectSymbolData> &getIndirectSymbols() {
+    return IndirectSymbols;
+  }
   const llvm::SmallVectorImpl<MCSection *> &getSectionOrder() const {
     return SectionOrder;
   }

diff  --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index cdac58c5fbf68..81a738ec3e9e5 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -97,7 +97,6 @@ void MCAssembler::reset() {
   IncrementalLinkerCompatible = false;
   Sections.clear();
   Symbols.clear();
-  IndirectSymbols.clear();
   DataRegions.clear();
   LinkerOptions.clear();
   FileNames.clear();

diff  --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index 6eb9f44de44fd..2fefeef2a7c32 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -19,6 +19,7 @@
 #include "llvm/MC/MCFixup.h"
 #include "llvm/MC/MCFragment.h"
 #include "llvm/MC/MCLinkerOptimizationHint.h"
+#include "llvm/MC/MCMachObjectWriter.h"
 #include "llvm/MC/MCObjectFileInfo.h"
 #include "llvm/MC/MCObjectStreamer.h"
 #include "llvm/MC/MCObjectWriter.h"
@@ -321,10 +322,9 @@ bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
   if (Attribute == MCSA_IndirectSymbol) {
     // Note that we intentionally cannot use the symbol data here; this is
     // important for matching the string table that 'as' generates.
-    IndirectSymbolData ISD;
-    ISD.Symbol = Symbol;
-    ISD.Section = getCurrentSectionOnly();
-    getAssembler().getIndirectSymbols().push_back(ISD);
+    static_cast<MachObjectWriter &>(getAssembler().getWriter())
+        .getIndirectSymbols()
+        .push_back({Symbol, getCurrentSectionOnly()});
     return true;
   }
 

diff  --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index f5fae805edbcb..acacee2b00994 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -47,6 +47,7 @@ using namespace llvm;
 void MachObjectWriter::reset() {
   Relocations.clear();
   IndirectSymBase.clear();
+  IndirectSymbols.clear();
   SectionAddress.clear();
   SectionOrder.clear();
   StringTable.clear();
@@ -516,7 +517,7 @@ void MachObjectWriter::bindIndirectSymbols(MCAssembler &Asm) {
 
   // Report errors for use of .indirect_symbol not in a symbol pointer section
   // or stub section.
-  for (IndirectSymbolData &ISD : Asm.getIndirectSymbols()) {
+  for (IndirectSymbolData &ISD : IndirectSymbols) {
     const MCSectionMachO &Section = cast<MCSectionMachO>(*ISD.Section);
 
     if (Section.getType() != MachO::S_NON_LAZY_SYMBOL_POINTERS &&
@@ -530,7 +531,7 @@ void MachObjectWriter::bindIndirectSymbols(MCAssembler &Asm) {
   }
 
   // Bind non-lazy symbol pointers first.
-  for (auto [IndirectIndex, ISD] : enumerate(Asm.getIndirectSymbols())) {
+  for (auto [IndirectIndex, ISD] : enumerate(IndirectSymbols)) {
     const auto &Section = cast<MCSectionMachO>(*ISD.Section);
 
     if (Section.getType() != MachO::S_NON_LAZY_SYMBOL_POINTERS &&
@@ -544,7 +545,7 @@ void MachObjectWriter::bindIndirectSymbols(MCAssembler &Asm) {
   }
 
   // Then lazy symbol pointers and symbol stubs.
-  for (auto [IndirectIndex, ISD] : enumerate(Asm.getIndirectSymbols())) {
+  for (auto [IndirectIndex, ISD] : enumerate(IndirectSymbols)) {
     const auto &Section = cast<MCSectionMachO>(*ISD.Section);
 
     if (Section.getType() != MachO::S_LAZY_SYMBOL_POINTERS &&
@@ -970,7 +971,7 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm) {
     unsigned NumExternalSymbols = ExternalSymbolData.size();
     unsigned FirstUndefinedSymbol = FirstExternalSymbol + NumExternalSymbols;
     unsigned NumUndefinedSymbols = UndefinedSymbolData.size();
-    unsigned NumIndirectSymbols = Asm.getIndirectSymbols().size();
+    unsigned NumIndirectSymbols = IndirectSymbols.size();
     unsigned NumSymTabSymbols =
       NumLocalSymbols + NumExternalSymbols + NumUndefinedSymbols;
     uint64_t IndirectSymbolSize = NumIndirectSymbols * 4;
@@ -1060,7 +1061,7 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm) {
   // Write the symbol table data, if used.
   if (NumSymbols) {
     // Write the indirect symbol entries.
-    for (auto &ISD : Asm.getIndirectSymbols()) {
+    for (auto &ISD : IndirectSymbols) {
       // Indirect symbols in the non-lazy symbol pointer section have some
       // special handling.
       const MCSectionMachO &Section =


        


More information about the llvm-commits mailing list