[llvm] c440563 - [CSKY] Fix CSKYMCCodeEmitter::getTargetFixup and set STT_TLS for TLS relocation specifiers

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 23 00:20:46 PDT 2025


Author: Fangrui Song
Date: 2025-03-23T00:20:41-07:00
New Revision: c440563da724cbf60c5cdb1cd7c61a21aec04145

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

LOG: [CSKY] Fix CSKYMCCodeEmitter::getTargetFixup and set STT_TLS for TLS relocation specifiers

Added: 
    

Modified: 
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
    llvm/test/MC/CSKY/relocation-specifier.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
index 4471c1cc05d99..6adeb53731fde 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
@@ -9,9 +9,11 @@
 #include "CSKYFixupKinds.h"
 #include "CSKYMCExpr.h"
 #include "CSKYMCTargetDesc.h"
+#include "MCTargetDesc/CSKYMCExpr.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCELFObjectWriter.h"
 #include "llvm/MC/MCObjectWriter.h"
+#include "llvm/MC/MCSymbolELF.h"
 
 #define DEBUG_TYPE "csky-elf-object-writer"
 
@@ -27,6 +29,8 @@ class CSKYELFObjectWriter : public MCELFObjectTargetWriter {
 
   unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
                         const MCFixup &Fixup, bool IsPCRel) const override;
+  bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym,
+                               unsigned Type) const override;
 };
 
 } // namespace
@@ -40,6 +44,19 @@ unsigned CSKYELFObjectWriter::getRelocType(MCContext &Ctx,
   unsigned Kind = Fixup.getTargetKind();
   uint8_t Modifier = Target.getAccessVariant();
 
+  switch (Target.getRefKind()) {
+  case CSKYMCExpr::VK_TLSIE:
+  case CSKYMCExpr::VK_TLSLE:
+  case CSKYMCExpr::VK_TLSGD:
+  case CSKYMCExpr::VK_TLSLDM:
+  case CSKYMCExpr::VK_TLSLDO:
+    if (auto *S = Target.getSymA())
+      cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
+    break;
+  default:
+    break;
+  }
+
   if (IsPCRel) {
     switch (Kind) {
     default:
@@ -150,6 +167,18 @@ unsigned CSKYELFObjectWriter::getRelocType(MCContext &Ctx,
   }
 }
 
+bool CSKYELFObjectWriter::needsRelocateWithSymbol(const MCValue &V,
+                                                  const MCSymbol &,
+                                                  unsigned Type) const {
+  switch (V.getRefKind()) {
+  case CSKYMCExpr::VK_PLT:
+  case CSKYMCExpr::VK_GOT:
+    return true;
+  default:
+    return false;
+  }
+}
+
 std::unique_ptr<MCObjectTargetWriter> llvm::createCSKYELFObjectWriter() {
   return std::make_unique<CSKYELFObjectWriter>();
 }

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
index c508b0121888a..70a797ddd331e 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
@@ -294,8 +294,7 @@ unsigned CSKYMCCodeEmitter::getImmJMPIX(const MCInst &MI, unsigned Idx,
 
 MCFixupKind CSKYMCCodeEmitter::getTargetFixup(const MCExpr *Expr) const {
   const CSKYMCExpr *CSKYExpr = cast<CSKYMCExpr>(Expr);
-
-  switch (CSKYExpr->getKind()) {
+  switch (CSKYExpr->getSpecifier()) {
   default:
     llvm_unreachable("Unhandled fixup kind!");
   case CSKYMCExpr::VK_ADDR:

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
index 9b15cca58ff71..7c35f35385d85 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
@@ -67,59 +67,12 @@ void CSKYMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
   OS << getVariantKindName(getSpecifier());
 }
 
-static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
-  switch (Expr->getKind()) {
-  case MCExpr::Target:
-    llvm_unreachable("Can't handle nested target expression");
-    break;
-  case MCExpr::Constant:
-    break;
-
-  case MCExpr::Binary: {
-    const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
-    fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
-    fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
-    break;
-  }
-
-  case MCExpr::SymbolRef: {
-    // We're known to be under a TLS fixup, so any symbol should be
-    // modified. There should be only one.
-    const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
-    cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
-    break;
-  }
-
-  case MCExpr::Unary:
-    fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
-    break;
-  }
-}
-
 bool CSKYMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
                                            const MCAssembler *Asm) const {
   if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
     return false;
 
-  // Some custom fixup types are not valid with symbol 
diff erence expressions
-  if (Res.getSymA() && Res.getSymB()) {
-    switch (getSpecifier()) {
-    default:
-      return true;
-    case VK_GOT:
-    case VK_GOT_IMM18_BY4:
-    case VK_GOTPC:
-    case VK_GOTOFF:
-    case VK_PLT:
-    case VK_PLT_IMM18_BY4:
-    case VK_TLSIE:
-    case VK_TLSLE:
-    case VK_TLSGD:
-    case VK_TLSLDO:
-    case VK_TLSLDM:
-      return false;
-    }
-  }
-
-  return true;
+  Res =
+      MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), specifier);
+  return !Res.getSymB();
 }

diff  --git a/llvm/test/MC/CSKY/relocation-specifier.s b/llvm/test/MC/CSKY/relocation-specifier.s
index e46f9b6912220..759d6df5e545c 100644
--- a/llvm/test/MC/CSKY/relocation-specifier.s
+++ b/llvm/test/MC/CSKY/relocation-specifier.s
@@ -5,10 +5,10 @@
 # READELF: R_CKCORE_GOT32 00000000 .data + 0
 # READELF: R_CKCORE_PLT32 00000000 .data + 0
 
-# READELF: NOTYPE GLOBAL DEFAULT UND gd
-# READELF: NOTYPE GLOBAL DEFAULT UND ld
-# READELF: NOTYPE GLOBAL DEFAULT UND ie
-# READELF: NOTYPE GLOBAL DEFAULT UND le
+# READELF: TLS GLOBAL DEFAULT UND gd
+# READELF: TLS GLOBAL DEFAULT UND ld
+# READELF: TLS GLOBAL DEFAULT UND ie
+# READELF: TLS GLOBAL DEFAULT UND le
 
 lrw16 r0, gd at TLSGD32
 lrw16 r0, ld at TLSLDM32


        


More information about the llvm-commits mailing list