Skip to content

Commit 94be52e

Browse files
committed
[SPARC][MC] Fix %gdop_hix22() and %gdop_lox10() to use correct relocations.
1bfc5e7 introduced support for %gdop_hix22() and %gdop_lox10(). However, it incorrectly mapped them to R_SPARC_GOTDATA_HIX22 and R_SPARC_GOTDATA_LOX10. They should in fact emit R_SPARC_GOTDATA_OP_HIX22 and R_SPARC_GOTDATA_OP_LOX10. This became a problem when assembling glibc's PIC startup code: sethi %gdop_hix22(main), %o0 xor %o0, %gdop_lox10(main), %o0 ldx [%l7 + %o0], %o0, %gdop(main) After the xor, %o0 should contain the GOT offset for main, but because of the incorrect relocations, it actually ends up containing the address of main, which of course makes the following ldx fail.
1 parent a01a5b8 commit 94be52e

File tree

6 files changed

+35
-27
lines changed

6 files changed

+35
-27
lines changed

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
107107
case Sparc::fixup_sparc_tls_ie_ld:
108108
case Sparc::fixup_sparc_tls_ie_ldx:
109109
case Sparc::fixup_sparc_tls_ie_add:
110-
case Sparc::fixup_sparc_gotdata_lox10:
111-
case Sparc::fixup_sparc_gotdata_hix22:
110+
case Sparc::fixup_sparc_gotdata_op_lox10:
111+
case Sparc::fixup_sparc_gotdata_op_hix22:
112112
case Sparc::fixup_sparc_gotdata_op:
113113
return 0;
114114
}
@@ -162,6 +162,7 @@ namespace {
162162

163163
MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const override {
164164
const static MCFixupKindInfo InfosBE[Sparc::NumTargetFixupKinds] = {
165+
// clang-format off
165166
// name offset bits flags
166167
{ "fixup_sparc_call30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
167168
{ "fixup_sparc_br22", 10, 22, MCFixupKindInfo::FKF_IsPCRel },
@@ -202,12 +203,14 @@ namespace {
202203
{ "fixup_sparc_tls_le_lox10", 0, 0, 0 },
203204
{ "fixup_sparc_hix22", 10, 22, 0 },
204205
{ "fixup_sparc_lox10", 19, 13, 0 },
205-
{ "fixup_sparc_gotdata_hix22", 0, 0, 0 },
206-
{ "fixup_sparc_gotdata_lox10", 0, 0, 0 },
207-
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
206+
{ "fixup_sparc_gotdata_op_hix22", 10, 22, 0 },
207+
{ "fixup_sparc_gotdata_op_lox10", 19, 13, 0 },
208+
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
209+
// clang-format on
208210
};
209211

210212
const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = {
213+
// clang-format off
211214
// name offset bits flags
212215
{ "fixup_sparc_call30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
213216
{ "fixup_sparc_br22", 0, 22, MCFixupKindInfo::FKF_IsPCRel },
@@ -248,9 +251,10 @@ namespace {
248251
{ "fixup_sparc_tls_le_lox10", 0, 0, 0 },
249252
{ "fixup_sparc_hix22", 0, 22, 0 },
250253
{ "fixup_sparc_lox10", 0, 13, 0 },
251-
{ "fixup_sparc_gotdata_hix22", 0, 0, 0 },
252-
{ "fixup_sparc_gotdata_lox10", 0, 0, 0 },
253-
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
254+
{ "fixup_sparc_gotdata_op_hix22", 0, 22, 0 },
255+
{ "fixup_sparc_gotdata_op_lox10", 0, 13, 0 },
256+
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
257+
// clang-format on
254258
};
255259

256260
// Fixup kinds from .reloc directive are like R_SPARC_NONE. They do

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
9393
switch(Fixup.getTargetKind()) {
9494
default:
9595
llvm_unreachable("Unimplemented fixup -> relocation");
96+
// clang-format off
9697
case FK_NONE: return ELF::R_SPARC_NONE;
9798
case FK_Data_1: return ELF::R_SPARC_8;
9899
case FK_Data_2: return ((Fixup.getOffset() % 2)
@@ -136,9 +137,10 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
136137
case Sparc::fixup_sparc_tls_le_lox10: return ELF::R_SPARC_TLS_LE_LOX10;
137138
case Sparc::fixup_sparc_hix22: return ELF::R_SPARC_HIX22;
138139
case Sparc::fixup_sparc_lox10: return ELF::R_SPARC_LOX10;
139-
case Sparc::fixup_sparc_gotdata_hix22: return ELF::R_SPARC_GOTDATA_HIX22;
140-
case Sparc::fixup_sparc_gotdata_lox10: return ELF::R_SPARC_GOTDATA_LOX10;
141-
case Sparc::fixup_sparc_gotdata_op: return ELF::R_SPARC_GOTDATA_OP;
140+
case Sparc::fixup_sparc_gotdata_op_hix22: return ELF::R_SPARC_GOTDATA_OP_HIX22;
141+
case Sparc::fixup_sparc_gotdata_op_lox10: return ELF::R_SPARC_GOTDATA_OP_LOX10;
142+
case Sparc::fixup_sparc_gotdata_op: return ELF::R_SPARC_GOTDATA_OP;
143+
// clang-format on
142144
}
143145

144146
return ELF::R_SPARC_NONE;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace llvm {
1515
namespace Sparc {
16+
// clang-format off
1617
enum Fixups {
1718
// fixup_sparc_call30 - 30-bit PC relative relocation for call
1819
fixup_sparc_call30 = FirstTargetFixupKind,
@@ -100,16 +101,17 @@ namespace llvm {
100101
fixup_sparc_lox10,
101102

102103
/// 22-bit fixup corresponding to %gdop_hix22(foo)
103-
fixup_sparc_gotdata_hix22,
104+
fixup_sparc_gotdata_op_hix22,
104105
/// 13-bit fixup corresponding to %gdop_lox10(foo)
105-
fixup_sparc_gotdata_lox10,
106+
fixup_sparc_gotdata_op_lox10,
106107
/// 32-bit fixup corresponding to %gdop(foo)
107108
fixup_sparc_gotdata_op,
108109

109110
// Marker
110111
LastTargetFixupKind,
111112
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
112113
};
114+
// clang-format off
113115
}
114116
}
115117

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ bool SparcMCExpr::printSpecifier(raw_ostream &OS, Specifier S) {
8383
case VK_TLS_LE_LOX10: OS << "%tle_lox10("; return true;
8484
case VK_HIX22: OS << "%hix("; return true;
8585
case VK_LOX10: OS << "%lox("; return true;
86-
case VK_GOTDATA_HIX22: OS << "%gdop_hix22("; return true;
87-
case VK_GOTDATA_LOX10: OS << "%gdop_lox10("; return true;
88-
case VK_GOTDATA_OP: OS << "%gdop("; return true;
86+
case VK_GOTDATA_OP_HIX22: OS << "%gdop_hix22("; return true;
87+
case VK_GOTDATA_OP_LOX10: OS << "%gdop_lox10("; return true;
88+
case VK_GOTDATA_OP: OS << "%gdop("; return true;
8989
}
9090
// clang-format on
9191
llvm_unreachable("Unhandled SparcMCExpr::Specifier");
@@ -129,8 +129,8 @@ SparcMCExpr::Specifier SparcMCExpr::parseSpecifier(StringRef name) {
129129
.Case("tle_lox10", VK_TLS_LE_LOX10)
130130
.Case("hix", VK_HIX22)
131131
.Case("lox", VK_LOX10)
132-
.Case("gdop_hix22", VK_GOTDATA_HIX22)
133-
.Case("gdop_lox10", VK_GOTDATA_LOX10)
132+
.Case("gdop_hix22", VK_GOTDATA_OP_HIX22)
133+
.Case("gdop_lox10", VK_GOTDATA_OP_LOX10)
134134
.Case("gdop", VK_GOTDATA_OP)
135135
.Default(VK_None);
136136
}
@@ -175,9 +175,9 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::Specifier S) {
175175
case VK_TLS_LE_LOX10: return Sparc::fixup_sparc_tls_le_lox10;
176176
case VK_HIX22: return Sparc::fixup_sparc_hix22;
177177
case VK_LOX10: return Sparc::fixup_sparc_lox10;
178-
case VK_GOTDATA_HIX22: return Sparc::fixup_sparc_gotdata_hix22;
179-
case VK_GOTDATA_LOX10: return Sparc::fixup_sparc_gotdata_lox10;
180-
case VK_GOTDATA_OP: return Sparc::fixup_sparc_gotdata_op;
178+
case VK_GOTDATA_OP_HIX22: return Sparc::fixup_sparc_gotdata_op_hix22;
179+
case VK_GOTDATA_OP_LOX10: return Sparc::fixup_sparc_gotdata_op_lox10;
180+
case VK_GOTDATA_OP: return Sparc::fixup_sparc_gotdata_op;
181181
}
182182
// clang-format on
183183
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class SparcMCExpr : public MCTargetExpr {
6161
VK_TLS_LE_LOX10,
6262
VK_HIX22,
6363
VK_LOX10,
64-
VK_GOTDATA_HIX22,
65-
VK_GOTDATA_LOX10,
64+
VK_GOTDATA_OP_HIX22,
65+
VK_GOTDATA_OP_LOX10,
6666
VK_GOTDATA_OP,
6767
};
6868

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_13 sym
1919
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HIX22 sym
2020
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_LOX10 sym
21-
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_HIX22 sym
22-
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_LOX10 sym
21+
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP_HIX22 sym
22+
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP_LOX10 sym
2323
! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP sym
2424
! CHECK-OBJ-NEXT: }
2525

@@ -68,10 +68,10 @@
6868
! CHECK: xor %g1, %lox(sym), %g1 ! encoding: [0x82,0x18,0b011AAAAA,A]
6969
xor %g1, %lox(sym), %g1
7070

71-
! CHECK: sethi %gdop_hix22(sym), %l1 ! encoding: [0x23,0x00,0x00,0x00]
71+
! CHECK: sethi %gdop_hix22(sym), %l1 ! encoding: [0x23,0b00AAAAAA,A,A]
7272
sethi %gdop_hix22(sym), %l1
7373

74-
! CHECK: or %l1, %gdop_lox10(sym), %l1 ! encoding: [0xa2,0x14,0x60,0x00]
74+
! CHECK: or %l1, %gdop_lox10(sym), %l1 ! encoding: [0xa2,0x14,0b011AAAAA,A]
7575
or %l1, %gdop_lox10(sym), %l1
7676

7777
! CHECK: ldx [%l7+%l1], %l2, %gdop(sym) ! encoding: [0xe4,0x5d,0xc0,0x11]

0 commit comments

Comments
 (0)