Skip to content

Commit c3ff3b2

Browse files
authored
[SPARC][MC] Fix %gdop_hix22() and %gdop_lox10() to use correct relocations (#137915)
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: ```asm 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 4c587f5 commit c3ff3b2

File tree

6 files changed

+18
-33
lines changed

6 files changed

+18
-33
lines changed

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

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
8282

8383
case Sparc::fixup_sparc_hm:
8484
return (Value >> 32) & 0x3ff;
85-
86-
case Sparc::fixup_sparc_gotdata_lox10:
87-
case Sparc::fixup_sparc_gotdata_hix22:
88-
case Sparc::fixup_sparc_gotdata_op:
89-
return 0;
9085
}
9186
}
9287

@@ -137,6 +132,7 @@ namespace {
137132
}
138133

139134
MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const override {
135+
// clang-format off
140136
const static MCFixupKindInfo InfosBE[Sparc::NumTargetFixupKinds] = {
141137
// name offset bits flags
142138
{ "fixup_sparc_call30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
@@ -157,9 +153,6 @@ namespace {
157153
{ "fixup_sparc_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
158154
{ "fixup_sparc_hix22", 10, 22, 0 },
159155
{ "fixup_sparc_lox10", 19, 13, 0 },
160-
{ "fixup_sparc_gotdata_hix22", 0, 0, 0 },
161-
{ "fixup_sparc_gotdata_lox10", 0, 0, 0 },
162-
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
163156
};
164157

165158
const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = {
@@ -182,10 +175,8 @@ namespace {
182175
{ "fixup_sparc_wplt30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
183176
{ "fixup_sparc_hix22", 0, 22, 0 },
184177
{ "fixup_sparc_lox10", 0, 13, 0 },
185-
{ "fixup_sparc_gotdata_hix22", 0, 0, 0 },
186-
{ "fixup_sparc_gotdata_lox10", 0, 0, 0 },
187-
{ "fixup_sparc_gotdata_op", 0, 0, 0 },
188178
};
179+
// clang-format on
189180

190181
// Fixup kinds from .reloc directive are like R_SPARC_NONE. They do
191182
// not require any extra processing.

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
9898
}
9999
}
100100

101+
// clang-format off
101102
switch(Fixup.getTargetKind()) {
102103
default:
103104
llvm_unreachable("Unimplemented fixup -> relocation");
@@ -127,10 +128,8 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
127128
case Sparc::fixup_sparc_lm: return ELF::R_SPARC_LM22;
128129
case Sparc::fixup_sparc_hix22: return ELF::R_SPARC_HIX22;
129130
case Sparc::fixup_sparc_lox10: return ELF::R_SPARC_LOX10;
130-
case Sparc::fixup_sparc_gotdata_hix22: return ELF::R_SPARC_GOTDATA_HIX22;
131-
case Sparc::fixup_sparc_gotdata_lox10: return ELF::R_SPARC_GOTDATA_LOX10;
132-
case Sparc::fixup_sparc_gotdata_op: return ELF::R_SPARC_GOTDATA_OP;
133131
}
132+
// clang-format on
134133

135134
return ELF::R_SPARC_NONE;
136135
}

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

Lines changed: 2 additions & 7 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,
@@ -70,17 +71,11 @@ namespace llvm {
7071
/// 13-bit fixup corresponding to %lox(foo)
7172
fixup_sparc_lox10,
7273

73-
/// 22-bit fixup corresponding to %gdop_hix22(foo)
74-
fixup_sparc_gotdata_hix22,
75-
/// 13-bit fixup corresponding to %gdop_lox10(foo)
76-
fixup_sparc_gotdata_lox10,
77-
/// 32-bit fixup corresponding to %gdop(foo)
78-
fixup_sparc_gotdata_op,
79-
8074
// Marker
8175
LastTargetFixupKind,
8276
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
8377
};
78+
// clang-format on
8479
}
8580
}
8681

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ StringRef SparcMCExpr::getSpecifierName(SparcMCExpr::Specifier S) {
8080
case VK_TLS_LE_LOX10: return "tle_lox10";
8181
case VK_HIX22: return "hix";
8282
case VK_LOX10: return "lox";
83-
case VK_GOTDATA_HIX22: return "gdop_hix22";
84-
case VK_GOTDATA_LOX10: return "gdop_lox10";
85-
case VK_GOTDATA_OP: return "gdop";
83+
case VK_GOTDATA_OP_HIX22: return "gdop_hix22";
84+
case VK_GOTDATA_OP_LOX10: return "gdop_lox10";
85+
case VK_GOTDATA_OP: return "gdop";
8686
}
8787
// clang-format on
8888
llvm_unreachable("Unhandled SparcMCExpr::Specifier");
@@ -126,8 +126,8 @@ SparcMCExpr::Specifier SparcMCExpr::parseSpecifier(StringRef name) {
126126
.Case("tle_lox10", VK_TLS_LE_LOX10)
127127
.Case("hix", VK_HIX22)
128128
.Case("lox", VK_LOX10)
129-
.Case("gdop_hix22", VK_GOTDATA_HIX22)
130-
.Case("gdop_lox10", VK_GOTDATA_LOX10)
129+
.Case("gdop_hix22", VK_GOTDATA_OP_HIX22)
130+
.Case("gdop_lox10", VK_GOTDATA_OP_LOX10)
131131
.Case("gdop", VK_GOTDATA_OP)
132132
.Default(VK_None);
133133
}
@@ -172,9 +172,9 @@ uint16_t SparcMCExpr::getFixupKind() const {
172172
case VK_TLS_LE_LOX10: return ELF::R_SPARC_TLS_LE_LOX10;
173173
case VK_HIX22: return Sparc::fixup_sparc_hix22;
174174
case VK_LOX10: return Sparc::fixup_sparc_lox10;
175-
case VK_GOTDATA_HIX22: return Sparc::fixup_sparc_gotdata_hix22;
176-
case VK_GOTDATA_LOX10: return Sparc::fixup_sparc_gotdata_lox10;
177-
case VK_GOTDATA_OP: return Sparc::fixup_sparc_gotdata_op;
175+
case VK_GOTDATA_OP_HIX22: return ELF::R_SPARC_GOTDATA_OP_HIX22;
176+
case VK_GOTDATA_OP_LOX10: return ELF::R_SPARC_GOTDATA_OP_LOX10;
177+
case VK_GOTDATA_OP: return ELF::R_SPARC_GOTDATA_OP;
178178
}
179179
// clang-format on
180180
}

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/relocation-specifier.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ sethi %lm(sym), %l0
6363
# ASM-NEXT: ldx [%l7+%l1], %l2, %gdop(sym)
6464
# OBJDUMP: R_SPARC_HIX22 sym
6565
# OBJDUMP: R_SPARC_LOX10 sym
66-
# OBJDUMP: R_SPARC_GOTDATA_HIX22 sym
67-
# OBJDUMP: R_SPARC_GOTDATA_LOX10 sym
66+
# OBJDUMP: R_SPARC_GOTDATA_OP_HIX22 sym
67+
# OBJDUMP: R_SPARC_GOTDATA_OP_LOX10 sym
6868
# OBJDUMP: R_SPARC_GOTDATA_OP sym
6969
sethi %hix(sym), %g1
7070
xor %g1, %lox(sym), %g1

0 commit comments

Comments
 (0)