Sparc: Use mc::isRelocation and remove GOT fixup kinds that map to relocation types
Simplify code, which is enabled by
40789ce7f1b7cff6de82b7f93db25a8c54194d46 ("MCFixup: Move relocation values before FK_NONE")
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
index cc8b86e..2ece0ce 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
@@ -54,7 +54,6 @@
return (~Value >> 10) & 0x3fffff;
case Sparc::fixup_sparc_pc22:
- case Sparc::fixup_sparc_got22:
case Sparc::fixup_sparc_tls_gd_hi22:
case Sparc::fixup_sparc_tls_ldm_hi22:
case Sparc::fixup_sparc_tls_ie_hi22:
@@ -62,7 +61,6 @@
case Sparc::fixup_sparc_lm:
return (Value >> 10) & 0x3fffff;
- case Sparc::fixup_sparc_got13:
case Sparc::fixup_sparc_13:
return Value & 0x1fff;
@@ -70,7 +68,6 @@
return (Value & 0x3ff) | 0x1c00;
case Sparc::fixup_sparc_pc10:
- case Sparc::fixup_sparc_got10:
case Sparc::fixup_sparc_tls_gd_lo10:
case Sparc::fixup_sparc_tls_ldm_lo10:
case Sparc::fixup_sparc_tls_ie_lo10:
@@ -178,9 +175,6 @@
{ "fixup_sparc_lm", 10, 22, 0 },
{ "fixup_sparc_pc22", 10, 22, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_pc10", 22, 10, MCFixupKindInfo::FKF_IsPCRel },
- { "fixup_sparc_got22", 10, 22, 0 },
- { "fixup_sparc_got10", 22, 10, 0 },
- { "fixup_sparc_got13", 19, 13, 0 },
{ "fixup_sparc_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_tls_gd_hi22", 10, 22, 0 },
{ "fixup_sparc_tls_gd_lo10", 22, 10, 0 },
@@ -224,9 +218,6 @@
{ "fixup_sparc_lm", 0, 22, 0 },
{ "fixup_sparc_pc22", 0, 22, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_pc10", 0, 10, MCFixupKindInfo::FKF_IsPCRel },
- { "fixup_sparc_got22", 0, 22, 0 },
- { "fixup_sparc_got10", 0, 10, 0 },
- { "fixup_sparc_got13", 0, 13, 0 },
{ "fixup_sparc_wplt30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_tls_gd_hi22", 0, 22, 0 },
{ "fixup_sparc_tls_gd_lo10", 0, 10, 0 },
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
index f95e5ac..0d705de 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
@@ -66,13 +66,19 @@
break;
}
+ // Extract the relocation type from the fixup kind, after applying STT_TLS as
+ // needed.
+ unsigned Kind = Fixup.getTargetKind();
+ if (mc::isRelocation(Fixup.getKind()))
+ return Kind;
+
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Fixup.getValue())) {
if (SExpr->getSpecifier() == SparcMCExpr::VK_R_DISP32)
return ELF::R_SPARC_DISP32;
}
if (IsPCRel) {
- switch(Fixup.getTargetKind()) {
+ switch (Kind) {
default:
llvm_unreachable("Unimplemented fixup -> relocation");
case FK_Data_1: return ELF::R_SPARC_DISP8;
@@ -113,9 +119,6 @@
case Sparc::fixup_sparc_hh: return ELF::R_SPARC_HH22;
case Sparc::fixup_sparc_hm: return ELF::R_SPARC_HM10;
case Sparc::fixup_sparc_lm: return ELF::R_SPARC_LM22;
- case Sparc::fixup_sparc_got22: return ELF::R_SPARC_GOT22;
- case Sparc::fixup_sparc_got10: return ELF::R_SPARC_GOT10;
- case Sparc::fixup_sparc_got13: return ELF::R_SPARC_GOT13;
case Sparc::fixup_sparc_tls_gd_hi22: return ELF::R_SPARC_TLS_GD_HI22;
case Sparc::fixup_sparc_tls_gd_lo10: return ELF::R_SPARC_TLS_GD_LO10;
case Sparc::fixup_sparc_tls_gd_add: return ELF::R_SPARC_TLS_GD_ADD;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
index 3b91326..fc4e315 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
@@ -62,15 +62,6 @@
/// fixup_sparc_pc10 - 10-bit fixup corresponding to %pc10(foo)
fixup_sparc_pc10,
- /// fixup_sparc_got22 - 22-bit fixup corresponding to %got22(foo)
- fixup_sparc_got22,
-
- /// fixup_sparc_got10 - 10-bit fixup corresponding to %got10(foo)
- fixup_sparc_got10,
-
- /// fixup_sparc_got13 - 13-bit fixup corresponding to %got13(foo)
- fixup_sparc_got13,
-
/// fixup_sparc_wplt30
fixup_sparc_wplt30,
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
index 0c9ba6a..b23cc16 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
@@ -15,6 +15,7 @@
#include "SparcMCTargetDesc.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
+#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
@@ -128,8 +129,7 @@
assert(MO.isExpr());
const MCExpr *Expr = MO.getExpr();
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Expr)) {
- MCFixupKind Kind = (MCFixupKind)SExpr->getFixupKind();
- Fixups.push_back(MCFixup::create(0, Expr, Kind));
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
return 0;
}
@@ -159,15 +159,13 @@
if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
return CE->getValue();
- MCFixupKind Kind;
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Expr)) {
- Kind = MCFixupKind(SExpr->getFixupKind());
- } else {
- bool IsPic = Ctx.getObjectFileInfo()->isPositionIndependent();
- Kind = IsPic ? MCFixupKind(Sparc::fixup_sparc_got13)
- : MCFixupKind(Sparc::fixup_sparc_13);
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
+ return 0;
}
-
+ uint16_t Kind = Sparc::fixup_sparc_13;
+ if (Ctx.getObjectFileInfo()->isPositionIndependent())
+ Kind = ELF::R_SPARC_GOT13;
Fixups.push_back(MCFixup::create(0, Expr, Kind));
return 0;
}
@@ -194,8 +192,7 @@
return 0;
}
- MCFixupKind Kind = MCFixupKind(SExpr->getFixupKind());
- Fixups.push_back(MCFixup::create(0, Expr, Kind));
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
return 0;
}
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
index fa05622..4ae2d30 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -135,9 +135,9 @@
.Default(VK_None);
}
-Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::Specifier S) {
+uint16_t SparcMCExpr::getFixupKind() const {
// clang-format off
- switch (S) {
+ switch (specifier) {
default: llvm_unreachable("Unhandled SparcMCExpr::Specifier");
case VK_LO: return Sparc::fixup_sparc_lo10;
case VK_HI: return Sparc::fixup_sparc_hi22;
@@ -149,9 +149,9 @@
case VK_LM: return Sparc::fixup_sparc_lm;
case VK_PC22: return Sparc::fixup_sparc_pc22;
case VK_PC10: return Sparc::fixup_sparc_pc10;
- case VK_GOT22: return Sparc::fixup_sparc_got22;
- case VK_GOT10: return Sparc::fixup_sparc_got10;
- case VK_GOT13: return Sparc::fixup_sparc_got13;
+ case VK_GOT22: return ELF::R_SPARC_GOT22;
+ case VK_GOT10: return ELF::R_SPARC_GOT10;
+ case VK_GOT13: return ELF::R_SPARC_GOT13;
case VK_13: return Sparc::fixup_sparc_13;
case VK_WPLT30: return Sparc::fixup_sparc_wplt30;
case VK_WDISP30: return Sparc::fixup_sparc_call30;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
index 05d9a5c..107f6a4 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
@@ -85,7 +85,7 @@
Specifier getSpecifier() const { return specifier; }
const MCExpr *getSubExpr() const { return Expr; }
- Sparc::Fixups getFixupKind() const { return getFixupKind(specifier); }
+ uint16_t getFixupKind() const;
/// @}
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
@@ -102,7 +102,6 @@
static Specifier parseSpecifier(StringRef name);
static bool printSpecifier(raw_ostream &OS, Specifier Kind);
- static Sparc::Fixups getFixupKind(Specifier Kind);
};
} // end namespace llvm.