From 06ab660911eef084716fdc6f13595cdbff9da08a Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 22 Aug 2025 00:25:55 -0700 Subject: [PATCH] MCSymbol: Avoid isExported/setExported The next change will move these methods from the base class. --- llvm/include/llvm/MC/MCMachObjectWriter.h | 5 +++-- llvm/lib/MC/MCMachOStreamer.cpp | 12 +++++++----- llvm/lib/MC/MCXCOFFStreamer.cpp | 6 +++--- llvm/lib/MC/MachObjectWriter.cpp | 16 +++++++++------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/llvm/include/llvm/MC/MCMachObjectWriter.h b/llvm/include/llvm/MC/MCMachObjectWriter.h index 170e2e74c671..41416a2f9c69 100644 --- a/llvm/include/llvm/MC/MCMachObjectWriter.h +++ b/llvm/include/llvm/MC/MCMachObjectWriter.h @@ -17,6 +17,7 @@ #include "llvm/MC/MCLinkerOptimizationHint.h" #include "llvm/MC/MCObjectWriter.h" #include "llvm/MC/MCSectionMachO.h" +#include "llvm/MC/MCSymbolMachO.h" #include "llvm/MC/StringTableBuilder.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/EndianStream.h" @@ -110,7 +111,7 @@ public: private: /// Helper struct for containing some precomputed information on symbols. struct MachSymbolData { - const MCSymbol *Symbol; + const MCSymbolMachO *Symbol; uint64_t StringIndex; uint8_t SectionIndex; @@ -119,7 +120,7 @@ private: }; struct IndirectSymbolData { - MCSymbol *Symbol; + MCSymbolMachO *Symbol; MCSection *Section; }; diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index 6226b02a0615..2b7a248e6d10 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -149,7 +149,7 @@ void MCMachOStreamer::emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol) { auto *Sym = static_cast(Symbol); getAssembler().registerSymbol(*Symbol); - if (Symbol->isExternal()) + if (Sym->isExternal()) emitSymbolAttribute(EHSymbol, MCSA_Global); if (Sym->isWeakDefinition()) emitSymbolAttribute(EHSymbol, MCSA_WeakDefinition); @@ -372,12 +372,13 @@ void MCMachOStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { void MCMachOStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) { + auto &Sym = static_cast(*Symbol); // FIXME: Darwin 'as' does appear to allow redef of a .comm by itself. assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); - getAssembler().registerSymbol(*Symbol); - Symbol->setExternal(true); - Symbol->setCommon(Size, ByteAlignment); + getAssembler().registerSymbol(Sym); + Sym.setExternal(true); + Sym.setCommon(Size, ByteAlignment); } void MCMachOStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, @@ -460,7 +461,8 @@ void MCMachOStreamer::finishImpl() { } void MCMachOStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE) { - const MCSymbol *S = &SRE->getSymbol(); + auto *S = + static_cast(const_cast(&SRE->getSymbol())); if (getAssembler().registerSymbol(*S)) S->setExternal(true); } diff --git a/llvm/lib/MC/MCXCOFFStreamer.cpp b/llvm/lib/MC/MCXCOFFStreamer.cpp index 684e05a9be09..4bf14c11068c 100644 --- a/llvm/lib/MC/MCXCOFFStreamer.cpp +++ b/llvm/lib/MC/MCXCOFFStreamer.cpp @@ -128,14 +128,14 @@ void MCXCOFFStreamer::emitXCOFFCInfoSym(StringRef Name, StringRef Metadata) { void MCXCOFFStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) { - auto *Sym = static_cast(Symbol); + auto &Sym = static_cast(*Symbol); getAssembler().registerSymbol(*Symbol); - Symbol->setExternal(Sym->getStorageClass() != XCOFF::C_HIDEXT); + Sym.setExternal(Sym.getStorageClass() != XCOFF::C_HIDEXT); Symbol->setCommon(Size, ByteAlignment); // Default csect align is 4, but common symbols have explicit alignment values // and we should honor it. - Sym->getRepresentedCsect()->setAlignment(ByteAlignment); + Sym.getRepresentedCsect()->setAlignment(ByteAlignment); // Emit the alignment and storage for the variable to the section. emitValueToAlignment(ByteAlignment); diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index eb59e39d73ed..39542bfbdd8e 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -383,7 +383,7 @@ const MCSymbol &MachObjectWriter::findAliasedSymbol(const MCSymbol &Sym) const { } void MachObjectWriter::writeNlist(MachSymbolData &MSD, const MCAssembler &Asm) { - auto *Symbol = static_cast(MSD.Symbol); + auto *Symbol = MSD.Symbol; const auto &Data = static_cast(*Symbol); auto *AliasedSymbol = static_cast(&findAliasedSymbol(*Symbol)); @@ -602,15 +602,16 @@ void MachObjectWriter::computeSymbolTable( // match 'as'. Even though it doesn't matter for correctness, this is // important for letting us diff .o files. for (const MCSymbol &Symbol : Asm.symbols()) { + auto &Sym = static_cast(Symbol); // Ignore non-linker visible symbols. - if (!static_cast(Symbol).isSymbolLinkerVisible()) + if (!Sym.isSymbolLinkerVisible()) continue; - if (!Symbol.isExternal() && !Symbol.isUndefined()) + if (!Sym.isExternal() && !Sym.isUndefined()) continue; MachSymbolData MSD; - MSD.Symbol = &Symbol; + MSD.Symbol = &Sym; MSD.StringIndex = StringTable.getOffset(Symbol.getName()); if (Symbol.isUndefined()) { @@ -628,15 +629,16 @@ void MachObjectWriter::computeSymbolTable( // Now add the data for local symbols. for (const MCSymbol &Symbol : Asm.symbols()) { + auto &Sym = static_cast(Symbol); // Ignore non-linker visible symbols. - if (!static_cast(Symbol).isSymbolLinkerVisible()) + if (!Sym.isSymbolLinkerVisible()) continue; - if (Symbol.isExternal() || Symbol.isUndefined()) + if (Sym.isExternal() || Sym.isUndefined()) continue; MachSymbolData MSD; - MSD.Symbol = &Symbol; + MSD.Symbol = &Sym; MSD.StringIndex = StringTable.getOffset(Symbol.getName()); if (Symbol.isAbsolute()) {