Skip to content

Commit 417390d

Browse files
committed
[M68k] Set STT_TLS for TLS relocations
1 parent 4379d22 commit 417390d

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
6868
auto Specifier = M68kMCExpr::Specifier(Target.getAccessVariant());
6969
unsigned Kind = Fixup.getKind();
7070
M68kRelType Type = getType(Kind, Specifier, IsPCRel);
71+
switch (Specifier) {
72+
case M68kMCExpr::VK_GOTTPOFF:
73+
case M68kMCExpr::VK_TLSGD:
74+
case M68kMCExpr::VK_TLSLD:
75+
case M68kMCExpr::VK_TLSLDM:
76+
case M68kMCExpr::VK_TPOFF:
77+
if (auto *S = Target.getSymA())
78+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
79+
break;
80+
default:
81+
break;
82+
}
83+
7184
switch (Specifier) {
7285
default:
7386
llvm_unreachable("Unimplemented");

llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ class M68kMCExpr : public MCTargetExpr {
5252
bool evaluateAsRelocatableImpl(MCValue &Res,
5353
const MCAssembler *Asm) const override;
5454
void visitUsedExpr(MCStreamer &Streamer) const override;
55-
MCFragment *findAssociatedFragment() const override;
55+
MCFragment *findAssociatedFragment() const override {
56+
return getSubExpr()->findAssociatedFragment();
57+
}
5658
};
5759
} // namespace llvm
5860

llvm/test/MC/M68k/Relocations/tls.s

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
; RUN: llvm-mc -triple m68k -show-encoding %s | FileCheck -check-prefix=INSTR %s
2+
; RUN: llvm-mc -triple m68k --mcpu=M68020 -filetype=obj %s -o %t
3+
; RUN: llvm-readelf -rs %t | FileCheck --check-prefix=READELF %s --implicit-check-not=TLS
4+
5+
; INSTR: move.l (le@TPOFF,%a0), %d0
6+
; INSTR-NEXT: fixup A - offset: 2, value: le@TPOFF, kind: FK_Data_2
7+
; INSTR-NEXT: move.l (ie@GOTTPOFF,%a0), %a2
8+
; INSTR-NEXT: fixup A - offset: 2, value: ie@GOTTPOFF, kind: FK_Data_2
9+
; INSTR-NEXT: lea (gd@TLSGD,%a0), %a0
10+
; INSTR-NEXT: fixup A - offset: 2, value: gd@TLSGD, kind: FK_Data_2
11+
; INSTR-NEXT: move.l (ld@TLSLD,%a0), %d0
12+
; INSTR-NEXT: fixup A - offset: 2, value: ld@TLSLD, kind: FK_Data_2
13+
; INSTR-NEXT: lea (ld@TLSLDM,%a2), %a1
14+
; INSTR-NEXT: fixup A - offset: 2, value: ld@TLSLDM, kind: FK_Data_2
15+
16+
; READELF: R_68K_TLS_LE16 00000000 le + 0
17+
; READELF-NEXT: R_68K_TLS_IE16 00000000 ie + 0
18+
; READELF-NEXT: R_68K_TLS_GD16 00000000 gd + 0
19+
; READELF-NEXT: R_68K_TLS_LDO16 00000000 ld + 0
20+
; READELF-NEXT: R_68K_TLS_LDM16 00000000 ld + 0
21+
22+
; READELF: TLS GLOBAL DEFAULT UND le
23+
; READELF-NEXT: TLS GLOBAL DEFAULT UND ie
24+
; READELF-NEXT: TLS GLOBAL DEFAULT UND gd
25+
; READELF-NEXT: TLS GLOBAL DEFAULT UND ld
26+
27+
move.l (le@TPOFF,%a0), %d0
28+
move.l (ie@GOTTPOFF,%a0), %a2
29+
lea (gd@TLSGD,%a0), %a0
30+
move.l (ld@TLSLD,%a0), %d0
31+
lea (ld@TLSLDM,%a2), %a1

0 commit comments

Comments
 (0)