This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/63634] New: Compiler generated R_AARCH64_TLSLE_ADD_TPREL_HI12/LO12 pair overflowed by large TP offset
- From: "shenhan at google dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 23 Oct 2014 23:08:07 +0000
- Subject: [Bug target/63634] New: Compiler generated R_AARCH64_TLSLE_ADD_TPREL_HI12/LO12 pair overflowed by large TP offset
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63634
Bug ID: 63634
Summary: Compiler generated R_AARCH64_TLSLE_ADD_TPREL_HI12/LO12
pair overflowed by large TP offset
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: shenhan at google dot com
CC: jingyu at google dot com, shenhan at google dot com
Target: aarch64
Created attachment 33798
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33798&action=edit
Test case
(Trunk) Compiler generates by default the following insn and relocation pair to
access a TLS variable via its offset from TP, like below -
main:
mrs x3, tpidr_el0
mov w2, 7
add x0, x3, #:tprel_hi12:.LANCHOR0
add x0, x0, #:tprel_lo12_nc:.LANCHOR0
add x1, x0, 1000
.L2:
strb w2, [x0], 1
cmp x0, x1
bne .L2
>> add x3, x3, #:tprel_hi12:.LANCHOR1
>> add x3, x3, #:tprel_lo12_nc:.LANCHOR1
ldr w0, [x3, 1024]
ret
Insns where indicated by ">>" are generated to add offset to x3, which is the
TP(thread pointer), the actually offset value is filled in by linker at static
link phase. However this means offsets are limited to 24 bits, in other words,
it fails the attach test case. (The bad things is bfd fails silentlyï resulting
a bad binary.)
To fix this, the compiler/assembler at least needs to generate the following to
support 32-bit TP offset.
>> movk xx, #:R_AARCH64_TLSLE_MOVW_TPREL_G1, lsl 16
>> movk xx, #:R_AARCH64_TLSLE_MOVW_TPREL_G0
>> add x3, xx