[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