Fix target/93119 (aarch64): ICE with traditional TLS support on ILP32
authorAndrew Pinski <apinski@marvell.com>
Fri, 17 Jan 2020 06:54:53 +0000 (06:54 +0000)
committerAndrew Pinski <apinski@marvell.com>
Wed, 22 Jan 2020 01:31:54 +0000 (01:31 +0000)
commit87ca615aa6f400c64d0bf13088c0ffdd14e22830
treeba64ee35b1ca11859330206faebda0f656292d28
parentac68e287fc2e939ae6b45ba7ff04e493982b7f62
Fix target/93119 (aarch64): ICE with traditional TLS support on ILP32

The problem here was g:23b88fda665d2f995c was not a complete fix
for supporting tranditional TLS on ILP32.

So the problem here is a couple of things, first __tls_get_addr
call will return a C pointer value so we need to use ptr_mode
when we are creating the call.  Then we need to convert
back that register to the correct mode, either zero extending
it or just creating a move instruction.
Also symbol_ref can either be in SImode or DImode.  So we need to
allow both modes.

Built and tested on aarch64-linux-gnu with no regressions.
Also built a full toolchain (including glibc) defaulting to traditional
TLS that targets ilp32 and lp64.

ChangeLog:
PR target/93119
* config/aarch64/aarch64.md (tlsgd_small_<mode>): Have operand 0
as PTR mode. Have operand 1 as being modeless, it can be P mode.
(*tlsgd_small_<mode>): Likewise.
* config/aarch64/aarch64.c (aarch64_load_symref_appropriately)
<case SYMBOL_SMALL_TLSGD>: Call gen_tlsgd_small_* with a ptr_mode
register.  Convert that register back to dest using convert_mode.
gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pr93119.c [new file with mode: 0644]