Skip to content

Commit 45e33e8

Browse files
LemonBoybrad0
authored andcommitted
[SPARC] Recognize and handle the %lm(sym) operator
Reviewed By: joerg Differential Revision: https://reviews.llvm.org/D77737
1 parent 10c1d29 commit 45e33e8

File tree

7 files changed

+17
-0
lines changed

7 files changed

+17
-0
lines changed

llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
5252
case Sparc::fixup_sparc_tls_ldm_hi22:
5353
case Sparc::fixup_sparc_tls_ie_hi22:
5454
case Sparc::fixup_sparc_hi22:
55+
case Sparc::fixup_sparc_lm:
5556
return (Value >> 10) & 0x3fffff;
5657

5758
case Sparc::fixup_sparc_got13:
@@ -146,6 +147,7 @@ namespace {
146147
{ "fixup_sparc_l44", 20, 12, 0 },
147148
{ "fixup_sparc_hh", 10, 22, 0 },
148149
{ "fixup_sparc_hm", 22, 10, 0 },
150+
{ "fixup_sparc_lm", 10, 22, 0 },
149151
{ "fixup_sparc_pc22", 10, 22, MCFixupKindInfo::FKF_IsPCRel },
150152
{ "fixup_sparc_pc10", 22, 10, MCFixupKindInfo::FKF_IsPCRel },
151153
{ "fixup_sparc_got22", 10, 22, 0 },
@@ -187,6 +189,7 @@ namespace {
187189
{ "fixup_sparc_l44", 0, 12, 0 },
188190
{ "fixup_sparc_hh", 0, 22, 0 },
189191
{ "fixup_sparc_hm", 0, 10, 0 },
192+
{ "fixup_sparc_lm", 0, 22, 0 },
190193
{ "fixup_sparc_pc22", 0, 22, MCFixupKindInfo::FKF_IsPCRel },
191194
{ "fixup_sparc_pc10", 0, 10, MCFixupKindInfo::FKF_IsPCRel },
192195
{ "fixup_sparc_got22", 0, 22, 0 },

llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
8686
case Sparc::fixup_sparc_l44: return ELF::R_SPARC_L44;
8787
case Sparc::fixup_sparc_hh: return ELF::R_SPARC_HH22;
8888
case Sparc::fixup_sparc_hm: return ELF::R_SPARC_HM10;
89+
case Sparc::fixup_sparc_lm: return ELF::R_SPARC_LM22;
8990
case Sparc::fixup_sparc_got22: return ELF::R_SPARC_GOT22;
9091
case Sparc::fixup_sparc_got10: return ELF::R_SPARC_GOT10;
9192
case Sparc::fixup_sparc_got13: return ELF::R_SPARC_GOT13;

llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ namespace llvm {
5454
/// fixup_sparc_hm - 10-bit fixup corresponding to %hm(foo)
5555
fixup_sparc_hm,
5656

57+
/// fixup_sparc_lm - 22-bit fixup corresponding to %lm(foo)
58+
fixup_sparc_lm,
59+
5760
/// fixup_sparc_pc22 - 22-bit fixup corresponding to %pc22(foo)
5861
fixup_sparc_pc22,
5962

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ bool SparcMCExpr::printVariantKind(raw_ostream &OS, VariantKind Kind)
5050
case VK_Sparc_L44: OS << "%l44("; return true;
5151
case VK_Sparc_HH: OS << "%hh("; return true;
5252
case VK_Sparc_HM: OS << "%hm("; return true;
53+
case VK_Sparc_LM: OS << "%lm("; return true;
5354
// FIXME: use %pc22/%pc10, if system assembler supports them.
5455
case VK_Sparc_PC22: OS << "%hi("; return true;
5556
case VK_Sparc_PC10: OS << "%lo("; return true;
@@ -93,6 +94,7 @@ SparcMCExpr::VariantKind SparcMCExpr::parseVariantKind(StringRef name)
9394
.Case("l44", VK_Sparc_L44)
9495
.Case("hh", VK_Sparc_HH)
9596
.Case("hm", VK_Sparc_HM)
97+
.Case("lm", VK_Sparc_LM)
9698
.Case("pc22", VK_Sparc_PC22)
9799
.Case("pc10", VK_Sparc_PC10)
98100
.Case("got22", VK_Sparc_GOT22)
@@ -130,6 +132,7 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {
130132
case VK_Sparc_L44: return Sparc::fixup_sparc_l44;
131133
case VK_Sparc_HH: return Sparc::fixup_sparc_hh;
132134
case VK_Sparc_HM: return Sparc::fixup_sparc_hm;
135+
case VK_Sparc_LM: return Sparc::fixup_sparc_lm;
133136
case VK_Sparc_PC22: return Sparc::fixup_sparc_pc22;
134137
case VK_Sparc_PC10: return Sparc::fixup_sparc_pc10;
135138
case VK_Sparc_GOT22: return Sparc::fixup_sparc_got22;

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class SparcMCExpr : public MCTargetExpr {
3131
VK_Sparc_L44,
3232
VK_Sparc_HH,
3333
VK_Sparc_HM,
34+
VK_Sparc_LM,
3435
VK_Sparc_PC22,
3536
VK_Sparc_PC10,
3637
VK_Sparc_GOT22,

llvm/lib/Target/Sparc/SparcAsmPrinter.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ void SparcAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
303303
assert((TF == SparcMCExpr::VK_Sparc_HI
304304
|| TF == SparcMCExpr::VK_Sparc_H44
305305
|| TF == SparcMCExpr::VK_Sparc_HH
306+
|| TF == SparcMCExpr::VK_Sparc_LM
306307
|| TF == SparcMCExpr::VK_Sparc_TLS_GD_HI22
307308
|| TF == SparcMCExpr::VK_Sparc_TLS_LDM_HI22
308309
|| TF == SparcMCExpr::VK_Sparc_TLS_LDO_HIX22

llvm/test/MC/Sparc/sparc-relocations.s

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym
1212
! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym
1313
! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym
14+
! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_LM22 sym
1415
! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_13 sym
1516
! CHECK-ELF: ]
1617

@@ -46,6 +47,10 @@
4647
! CHECK-NEXT: ! fixup A - offset: 0, value: %hm(sym), kind: fixup_sparc_hm
4748
or %g1, %hm(sym), %g3
4849

50+
! CHECK: sethi %lm(sym), %l0 ! encoding: [0x21,0b00AAAAAA,A,A]
51+
! CHECK-NEXT: ! fixup A - offset: 0, value: %lm(sym), kind: fixup_sparc_lm
52+
sethi %lm(sym), %l0
53+
4954
! CHECK: or %g1, sym, %g3 ! encoding: [0x86,0x10,0b011AAAAA,A]
5055
! CHECK-NEXT: ! fixup A - offset: 0, value: sym, kind: fixup_sparc_13
5156
or %g1, sym, %g3

0 commit comments

Comments
 (0)