Skip to content

Commit 44f9357

Browse files
authored
[SPARC][IAS] Add support for %uhi and %ulo extensions
This adds support for GNU %uhi and %ulo extensions. Those resolve to the same relocations as %hh and %hm. Reviewers: cyndyishida, dcci, brad0, jrtc27, aaupov, Endilll, rorth, maksfb, #reviewers-libcxxabi, s-barannikov, rafaelauler, ayermolo, #reviewers-libunwind, #reviewers-libcxx, daniel-grumberg, tbaederr Reviewed By: s-barannikov Pull Request: #94246
1 parent f20d8b9 commit 44f9357

File tree

2 files changed

+50
-38
lines changed

2 files changed

+50
-38
lines changed

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

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -93,44 +93,46 @@ bool SparcMCExpr::printVariantKind(raw_ostream &OS, VariantKind Kind)
9393
SparcMCExpr::VariantKind SparcMCExpr::parseVariantKind(StringRef name)
9494
{
9595
return StringSwitch<SparcMCExpr::VariantKind>(name)
96-
.Case("lo", VK_Sparc_LO)
97-
.Case("hi", VK_Sparc_HI)
98-
.Case("h44", VK_Sparc_H44)
99-
.Case("m44", VK_Sparc_M44)
100-
.Case("l44", VK_Sparc_L44)
101-
.Case("hh", VK_Sparc_HH)
102-
.Case("hm", VK_Sparc_HM)
103-
.Case("lm", VK_Sparc_LM)
104-
.Case("pc22", VK_Sparc_PC22)
105-
.Case("pc10", VK_Sparc_PC10)
106-
.Case("got22", VK_Sparc_GOT22)
107-
.Case("got10", VK_Sparc_GOT10)
108-
.Case("got13", VK_Sparc_GOT13)
109-
.Case("r_disp32", VK_Sparc_R_DISP32)
110-
.Case("tgd_hi22", VK_Sparc_TLS_GD_HI22)
111-
.Case("tgd_lo10", VK_Sparc_TLS_GD_LO10)
112-
.Case("tgd_add", VK_Sparc_TLS_GD_ADD)
113-
.Case("tgd_call", VK_Sparc_TLS_GD_CALL)
114-
.Case("tldm_hi22", VK_Sparc_TLS_LDM_HI22)
115-
.Case("tldm_lo10", VK_Sparc_TLS_LDM_LO10)
116-
.Case("tldm_add", VK_Sparc_TLS_LDM_ADD)
117-
.Case("tldm_call", VK_Sparc_TLS_LDM_CALL)
118-
.Case("tldo_hix22", VK_Sparc_TLS_LDO_HIX22)
119-
.Case("tldo_lox10", VK_Sparc_TLS_LDO_LOX10)
120-
.Case("tldo_add", VK_Sparc_TLS_LDO_ADD)
121-
.Case("tie_hi22", VK_Sparc_TLS_IE_HI22)
122-
.Case("tie_lo10", VK_Sparc_TLS_IE_LO10)
123-
.Case("tie_ld", VK_Sparc_TLS_IE_LD)
124-
.Case("tie_ldx", VK_Sparc_TLS_IE_LDX)
125-
.Case("tie_add", VK_Sparc_TLS_IE_ADD)
126-
.Case("tle_hix22", VK_Sparc_TLS_LE_HIX22)
127-
.Case("tle_lox10", VK_Sparc_TLS_LE_LOX10)
128-
.Case("hix", VK_Sparc_HIX22)
129-
.Case("lox", VK_Sparc_LOX10)
130-
.Case("gdop_hix22", VK_Sparc_GOTDATA_HIX22)
131-
.Case("gdop_lox10", VK_Sparc_GOTDATA_LOX10)
132-
.Case("gdop", VK_Sparc_GOTDATA_OP)
133-
.Default(VK_Sparc_None);
96+
.Case("lo", VK_Sparc_LO)
97+
.Case("hi", VK_Sparc_HI)
98+
.Case("h44", VK_Sparc_H44)
99+
.Case("m44", VK_Sparc_M44)
100+
.Case("l44", VK_Sparc_L44)
101+
.Case("hh", VK_Sparc_HH)
102+
.Case("uhi", VK_Sparc_HH) // Nonstandard GNU extension
103+
.Case("hm", VK_Sparc_HM)
104+
.Case("ulo", VK_Sparc_HM) // Nonstandard GNU extension
105+
.Case("lm", VK_Sparc_LM)
106+
.Case("pc22", VK_Sparc_PC22)
107+
.Case("pc10", VK_Sparc_PC10)
108+
.Case("got22", VK_Sparc_GOT22)
109+
.Case("got10", VK_Sparc_GOT10)
110+
.Case("got13", VK_Sparc_GOT13)
111+
.Case("r_disp32", VK_Sparc_R_DISP32)
112+
.Case("tgd_hi22", VK_Sparc_TLS_GD_HI22)
113+
.Case("tgd_lo10", VK_Sparc_TLS_GD_LO10)
114+
.Case("tgd_add", VK_Sparc_TLS_GD_ADD)
115+
.Case("tgd_call", VK_Sparc_TLS_GD_CALL)
116+
.Case("tldm_hi22", VK_Sparc_TLS_LDM_HI22)
117+
.Case("tldm_lo10", VK_Sparc_TLS_LDM_LO10)
118+
.Case("tldm_add", VK_Sparc_TLS_LDM_ADD)
119+
.Case("tldm_call", VK_Sparc_TLS_LDM_CALL)
120+
.Case("tldo_hix22", VK_Sparc_TLS_LDO_HIX22)
121+
.Case("tldo_lox10", VK_Sparc_TLS_LDO_LOX10)
122+
.Case("tldo_add", VK_Sparc_TLS_LDO_ADD)
123+
.Case("tie_hi22", VK_Sparc_TLS_IE_HI22)
124+
.Case("tie_lo10", VK_Sparc_TLS_IE_LO10)
125+
.Case("tie_ld", VK_Sparc_TLS_IE_LD)
126+
.Case("tie_ldx", VK_Sparc_TLS_IE_LDX)
127+
.Case("tie_add", VK_Sparc_TLS_IE_ADD)
128+
.Case("tle_hix22", VK_Sparc_TLS_LE_HIX22)
129+
.Case("tle_lox10", VK_Sparc_TLS_LE_LOX10)
130+
.Case("hix", VK_Sparc_HIX22)
131+
.Case("lox", VK_Sparc_LOX10)
132+
.Case("gdop_hix22", VK_Sparc_GOTDATA_HIX22)
133+
.Case("gdop_lox10", VK_Sparc_GOTDATA_LOX10)
134+
.Case("gdop", VK_Sparc_GOTDATA_OP)
135+
.Default(VK_Sparc_None);
134136
}
135137

136138
Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_M44 sym
1111
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym
1212
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym
13+
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym
14+
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym
1315
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym
1416
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_LM22 sym
1517
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_13 sym
@@ -49,10 +51,18 @@
4951
! CHECK-NEXT: ! fixup A - offset: 0, value: %hh(sym), kind: fixup_sparc_hh
5052
sethi %hh(sym), %l0
5153

54+
! CHECK: sethi %hh(sym), %l0 ! encoding: [0x21,0b00AAAAAA,A,A]
55+
! CHECK-NEXT: ! fixup A - offset: 0, value: %hh(sym), kind: fixup_sparc_hh
56+
sethi %uhi(sym), %l0
57+
5258
! CHECK: or %g1, %hm(sym), %g3 ! encoding: [0x86,0x10,0b011000AA,A]
5359
! CHECK-NEXT: ! fixup A - offset: 0, value: %hm(sym), kind: fixup_sparc_hm
5460
or %g1, %hm(sym), %g3
5561

62+
! CHECK: or %g1, %hm(sym), %g3 ! encoding: [0x86,0x10,0b011000AA,A]
63+
! CHECK-NEXT: ! fixup A - offset: 0, value: %hm(sym), kind: fixup_sparc_hm
64+
or %g1, %ulo(sym), %g3
65+
5666
! CHECK: sethi %lm(sym), %l0 ! encoding: [0x21,0b00AAAAAA,A,A]
5767
! CHECK-NEXT: ! fixup A - offset: 0, value: %lm(sym), kind: fixup_sparc_lm
5868
sethi %lm(sym), %l0

0 commit comments

Comments
 (0)