[llvm] 83fbd86 - SPARCMCCodeEmitter: Set PCRel at fixup creation

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 4 15:37:29 PDT 2025


Author: Fangrui Song
Date: 2025-07-04T15:37:24-07:00
New Revision: 83fbd86909111510f973d8e1c4214022368ef810

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

LOG: SPARCMCCodeEmitter: Set PCRel at fixup creation

Added: 
    

Modified: 
    llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
index 8ba99719946a2..40cc5fde5d777 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
@@ -91,6 +91,21 @@ class SparcMCCodeEmitter : public MCCodeEmitter {
 
 } // end anonymous namespace
 
+static void addFixup(SmallVectorImpl<MCFixup> &Fixups, uint32_t Offset,
+                     const MCExpr *Value, uint16_t Kind) {
+  bool PCRel = false;
+  switch (Kind) {
+  case ELF::R_SPARC_PC10:
+  case ELF::R_SPARC_PC22:
+  case ELF::R_SPARC_WDISP10:
+  case ELF::R_SPARC_WDISP16:
+  case ELF::R_SPARC_WDISP19:
+  case ELF::R_SPARC_WDISP22:
+    PCRel = true;
+  }
+  Fixups.push_back(MCFixup::create(Offset, Value, Kind, PCRel));
+}
+
 void SparcMCCodeEmitter::encodeInstruction(const MCInst &MI,
                                            SmallVectorImpl<char> &CB,
                                            SmallVectorImpl<MCFixup> &Fixups,
@@ -135,7 +150,7 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
   assert(MO.isExpr());
   const MCExpr *Expr = MO.getExpr();
   if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
-    Fixups.push_back(MCFixup::create(0, Expr, SExpr->getSpecifier()));
+    addFixup(Fixups, 0, Expr, SExpr->getSpecifier());
     return 0;
   }
 
@@ -165,10 +180,10 @@ unsigned SparcMCCodeEmitter::getSImm5OpValue(const MCInst &MI, unsigned OpNo,
     return CE->getValue();
 
   if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
-    Fixups.push_back(MCFixup::create(0, Expr, SExpr->getSpecifier()));
+    addFixup(Fixups, 0, Expr, SExpr->getSpecifier());
     return 0;
   }
-  Fixups.push_back(MCFixup::create(0, Expr, ELF::R_SPARC_5));
+  addFixup(Fixups, 0, Expr, ELF::R_SPARC_5);
   return 0;
 }
 
@@ -191,10 +206,10 @@ SparcMCCodeEmitter::getSImm13OpValue(const MCInst &MI, unsigned OpNo,
     return CE->getValue();
 
   if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
-    Fixups.push_back(MCFixup::create(0, Expr, SExpr->getSpecifier()));
+    addFixup(Fixups, 0, Expr, SExpr->getSpecifier());
     return 0;
   }
-  Fixups.push_back(MCFixup::create(0, Expr, Sparc::fixup_sparc_13));
+  addFixup(Fixups, 0, Expr, Sparc::fixup_sparc_13);
   return 0;
 }
 
@@ -209,7 +224,7 @@ getCallTargetOpValue(const MCInst &MI, unsigned OpNo,
   }
 
   const MCOperand &MO = MI.getOperand(OpNo);
-  Fixups.push_back(MCFixup::create(0, MO.getExpr(), Sparc::fixup_sparc_call30));
+  addFixup(Fixups, 0, MO.getExpr(), Sparc::fixup_sparc_call30);
   return 0;
 }
 
@@ -221,7 +236,7 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
   if (MO.isReg() || MO.isImm())
     return getMachineOpValue(MI, MO, Fixups, STI);
 
-  Fixups.push_back(MCFixup::create(0, MO.getExpr(), ELF::R_SPARC_WDISP22));
+  addFixup(Fixups, 0, MO.getExpr(), ELF::R_SPARC_WDISP22);
   return 0;
 }
 
@@ -232,7 +247,7 @@ unsigned SparcMCCodeEmitter::getBranchPredTargetOpValue(
   if (MO.isReg() || MO.isImm())
     return getMachineOpValue(MI, MO, Fixups, STI);
 
-  Fixups.push_back(MCFixup::create(0, MO.getExpr(), ELF::R_SPARC_WDISP19));
+  addFixup(Fixups, 0, MO.getExpr(), ELF::R_SPARC_WDISP19);
   return 0;
 }
 
@@ -243,8 +258,7 @@ unsigned SparcMCCodeEmitter::getBranchOnRegTargetOpValue(
   if (MO.isReg() || MO.isImm())
     return getMachineOpValue(MI, MO, Fixups, STI);
 
-  Fixups.push_back(MCFixup::create(0, MO.getExpr(), ELF::R_SPARC_WDISP16));
-
+  addFixup(Fixups, 0, MO.getExpr(), ELF::R_SPARC_WDISP16);
   return 0;
 }
 
@@ -255,8 +269,7 @@ unsigned SparcMCCodeEmitter::getCompareAndBranchTargetOpValue(
   if (MO.isImm())
     return getMachineOpValue(MI, MO, Fixups, STI);
 
-  Fixups.push_back(MCFixup::create(0, MO.getExpr(), ELF::R_SPARC_WDISP10));
-
+  addFixup(Fixups, 0, MO.getExpr(), ELF::R_SPARC_WDISP10);
   return 0;
 }
 


        


More information about the llvm-commits mailing list