[llvm] e2d761d - MCSymbolELF: Migrate away from classof

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 3 15:05:28 PDT 2025


Author: Fangrui Song
Date: 2025-08-03T15:05:22-07:00
New Revision: e2d761df321a711234470b7596a47ccd6ffd665d

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

LOG: MCSymbolELF: Migrate away from classof

The object file format specific derived classes are used in context
where the type is statically known. We don't use isa/dyn_cast and we
want to eliminate MCSymbol::Kind in the base class.

Added: 
    

Modified: 
    llvm/lib/MC/ELFObjectWriter.cpp
    llvm/lib/MC/MCContext.cpp
    llvm/lib/MC/MCELFStreamer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index ae8dffc297de4..76294ef7513bf 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -401,14 +401,14 @@ static bool isIFunc(const MCSymbolELF *Symbol) {
         mergeTypeForSet(Symbol->getType(), ELF::STT_GNU_IFUNC) !=
             ELF::STT_GNU_IFUNC)
       return false;
-    Symbol = &cast<MCSymbolELF>(Value->getSymbol());
+    Symbol = &static_cast<const MCSymbolELF &>(Value->getSymbol());
   }
   return true;
 }
 
 void ELFWriter::writeSymbol(SymbolTableWriter &Writer, uint32_t StringIndex,
                             ELFSymbolData &MSD) {
-  const auto &Symbol = cast<MCSymbolELF>(*MSD.Symbol);
+  auto &Symbol = static_cast<const MCSymbolELF &>(*MSD.Symbol);
   const MCSymbolELF *Base =
       cast_or_null<MCSymbolELF>(Asm.getBaseSymbol(Symbol));
 
@@ -446,7 +446,7 @@ void ELFWriter::writeSymbol(SymbolTableWriter &Writer, uint32_t StringIndex,
     const MCSymbolELF *Sym = &Symbol;
     while (Sym->isVariable()) {
       if (auto *Expr = dyn_cast<MCSymbolRefExpr>(Sym->getVariableValue())) {
-        Sym = cast<MCSymbolELF>(&Expr->getSymbol());
+        Sym = static_cast<const MCSymbolELF *>(&Expr->getSymbol());
         if (!Sym->getSize())
           continue;
         ESize = Sym->getSize();
@@ -523,7 +523,7 @@ void ELFWriter::computeSymbolTable(const RevGroupMapTy &RevGroupMap) {
   // Add the data for the symbols.
   bool HasLargeSectionIndex = false;
   for (auto It : llvm::enumerate(Asm.symbols())) {
-    const auto &Symbol = cast<MCSymbolELF>(It.value());
+    auto &Symbol = static_cast<const MCSymbolELF &>(It.value());
     if (!isInSymtab(Symbol))
       continue;
 
@@ -533,7 +533,7 @@ void ELFWriter::computeSymbolTable(const RevGroupMapTy &RevGroupMap) {
     }
 
     ELFSymbolData MSD;
-    MSD.Symbol = cast<MCSymbolELF>(&Symbol);
+    MSD.Symbol = static_cast<const MCSymbolELF *>(&Symbol);
     MSD.Order = It.index();
 
     bool Local = Symbol.getBinding() == ELF::STB_LOCAL;
@@ -1175,7 +1175,7 @@ void ELFObjectWriter::executePostLayoutBinding() {
   // versions declared with @@@ to be renamed.
   for (const Symver &S : Symvers) {
     StringRef AliasName = S.Name;
-    const auto &Symbol = cast<MCSymbolELF>(*S.Sym);
+    auto &Symbol = static_cast<const MCSymbolELF &>(*S.Sym);
     size_t Pos = AliasName.find('@');
     assert(Pos != StringRef::npos);
 
@@ -1185,8 +1185,8 @@ void ELFObjectWriter::executePostLayoutBinding() {
     if (Rest.starts_with("@@@"))
       Tail = Rest.substr(Symbol.isUndefined() ? 2 : 1);
 
-    auto *Alias =
-        cast<MCSymbolELF>(Asm->getContext().getOrCreateSymbol(Prefix + Tail));
+    auto *Alias = static_cast<MCSymbolELF *>(
+        Asm->getContext().getOrCreateSymbol(Prefix + Tail));
     Asm->registerSymbol(*Alias);
     const MCExpr *Value = MCSymbolRefExpr::create(&Symbol, Asm->getContext());
     Alias->setVariableValue(Value);
@@ -1218,7 +1218,8 @@ void ELFObjectWriter::executePostLayoutBinding() {
   }
 
   for (const MCSymbol *&Sym : AddrsigSyms) {
-    if (const MCSymbol *R = Renames.lookup(cast<MCSymbolELF>(Sym)))
+    if (const MCSymbol *R =
+            Renames.lookup(static_cast<const MCSymbolELF *>(Sym)))
       Sym = R;
     if (Sym->isInSection() && Sym->getName().starts_with(".L"))
       Sym = Sym->getSection().getBeginSymbol();
@@ -1234,7 +1235,7 @@ void ELFObjectWriter::executePostLayoutBinding() {
       continue;
     auto *Expr = Alias->getVariableValue();
     if (const auto *Inner = dyn_cast<MCSymbolRefExpr>(Expr)) {
-      auto &Sym = cast<MCSymbolELF>(Inner->getSymbol());
+      auto &Sym = static_cast<const MCSymbolELF &>(Inner->getSymbol());
       if (Asm->registerSymbol(Sym))
         Sym.setBinding(ELF::STB_WEAK);
     }
@@ -1328,7 +1329,7 @@ void ELFObjectWriter::recordRelocation(const MCFragment &F,
   uint64_t FixupOffset = Asm->getFragmentOffset(F) + Fixup.getOffset();
   uint64_t Addend = Target.getConstant();
   if (auto *RefB = Target.getSubSym()) {
-    const auto &SymB = cast<MCSymbolELF>(*RefB);
+    auto &SymB = static_cast<const MCSymbolELF &>(*RefB);
     if (SymB.isUndefined()) {
       Ctx.reportError(Fixup.getLoc(),
                       Twine("symbol '") + SymB.getName() +
@@ -1363,7 +1364,7 @@ void ELFObjectWriter::recordRelocation(const MCFragment &F,
                        !mc::isRelocRelocation(Fixup.getKind());
   if (UseSectionSym && useSectionSymbol(Target, SymA, Addend, Type)) {
     Addend += Asm->getSymbolOffset(*SymA);
-    SymA = cast<MCSymbolELF>(SecA->getBeginSymbol());
+    SymA = static_cast<const MCSymbolELF *>(SecA->getBeginSymbol());
   } else if (const MCSymbolELF *R = Renames.lookup(SymA)) {
     SymA = R;
   }
@@ -1383,7 +1384,7 @@ bool ELFObjectWriter::usesRela(const MCTargetOptions *TO,
 
 bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
     const MCSymbol &SA, const MCFragment &FB, bool InSet, bool IsPCRel) const {
-  const auto &SymA = cast<MCSymbolELF>(SA);
+  auto &SymA = static_cast<const MCSymbolELF &>(SA);
   if (IsPCRel) {
     assert(!InSet);
     if (SymA.getBinding() != ELF::STB_LOCAL ||

diff  --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index 4d89a2d73e4dd..ce5edc54b133f 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -306,13 +306,16 @@ MCSymbol *MCContext::cloneSymbol(MCSymbol &Sym) {
   auto Name = Sym.getNameEntryPtr();
   switch (getObjectFileType()) {
   case MCContext::IsCOFF:
-    NewSym = new (Name, *this) MCSymbolCOFF(cast<MCSymbolCOFF>(Sym));
+    NewSym =
+        new (Name, *this) MCSymbolCOFF(static_cast<const MCSymbolCOFF &>(Sym));
     break;
   case MCContext::IsELF:
-    NewSym = new (Name, *this) MCSymbolELF(cast<MCSymbolELF>(Sym));
+    NewSym =
+        new (Name, *this) MCSymbolELF(static_cast<const MCSymbolELF &>(Sym));
     break;
   case MCContext::IsMachO:
-    NewSym = new (Name, *this) MCSymbolMachO(cast<MCSymbolMachO>(Sym));
+    NewSym = new (Name, *this)
+        MCSymbolMachO(static_cast<const MCSymbolMachO &>(Sym));
     break;
   default:
     reportFatalUsageError(".set redefinition is not supported");
@@ -601,7 +604,7 @@ MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,
                                        const MCSymbolELF *LinkedToSym) {
   MCSymbolELF *GroupSym = nullptr;
   if (!Group.isTriviallyEmpty() && !Group.str().empty())
-    GroupSym = cast<MCSymbolELF>(getOrCreateSymbol(Group));
+    GroupSym = static_cast<MCSymbolELF *>(getOrCreateSymbol(Group));
 
   return getELFSection(Section, Type, Flags, EntrySize, GroupSym, IsComdat,
                        UniqueID, LinkedToSym);

diff  --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 38744a07a2adb..fcc0262768a30 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -277,7 +277,7 @@ void MCELFStreamer::emitCommonSymbol(MCSymbol *S, uint64_t Size,
 }
 
 void MCELFStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
-  cast<MCSymbolELF>(Symbol)->setSize(Value);
+  static_cast<MCSymbolELF *>(Symbol)->setSize(Value);
 }
 
 void MCELFStreamer::emitELFSymverDirective(const MCSymbol *OriginalSym,


        


More information about the llvm-commits mailing list