[AArch64][TLSIE][2/2] Implement TLS IE for tiny model

2015-08-26  Marcus Shawcroft  <marcus.shawcroft@arm.com>
	    Jiong Wang  <jiong.wang@arm.com>
gcc/
	* config/aarch64/aarch64.md (UNSPEC_GOTTINYTLS): New UNSPEC.
	(tlsie_tiny_<mode>): New define_insn.
	(tlsie_tiny_sidi): Likewise.
	* config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
	SYMBOL_TINY_TLSIE.
	(aarch64_symbol_context): New comment for SYMBOL_TINY_TLSIE.
	* config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Support
	SYMBOL_TINY_TLSIE.
	(aarch64_expand_mov_immediate): Likewise.
	(aarch64_print_operand): Likewise.
	(arch64_classify_tls_symbol): Likewise.

gcc/testsuite/
	* gcc.target/aarch64/tlsie_tiny_1.c: New testcase.

From-SVN: r227220
This commit is contained in:
Jiong Wang 2015-08-26 13:38:40 +00:00
parent e656fbc820
commit 5ae7caad51
6 changed files with 91 additions and 1 deletions

View File

@ -1,3 +1,18 @@
2015-08-26 Marcus Shawcroft <marcus.shawcroft@arm.com>
Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64.md (UNSPEC_GOTTINYTLS): New UNSPEC.
(tlsie_tiny_<mode>): New define_insn.
(tlsie_tiny_sidi): Likewise.
* config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
SYMBOL_TINY_TLSIE.
(aarch64_symbol_context): New comment for SYMBOL_TINY_TLSIE.
* config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Support
SYMBOL_TINY_TLSIE.
(aarch64_expand_mov_immediate): Likewise.
(aarch64_print_operand): Likewise.
(arch64_classify_tls_symbol): Likewise.
2015-08-26 Matthew Wahab <matthew.wahab@arm.com>
* config/arm/arm-arches.def: Replace single value flags with

View File

@ -74,6 +74,7 @@ enum aarch64_symbol_context
SYMBOL_SMALL_TLSGD
SYMBOL_SMALL_TLSDESC
SYMBOL_SMALL_GOTTPREL
SYMBOL_TINY_TLSIE
SYMBOL_TLSLE12
SYMBOL_TLSLE24
SYMBOL_TLSLE32
@ -114,6 +115,7 @@ enum aarch64_symbol_type
SYMBOL_SMALL_GOTTPREL,
SYMBOL_TINY_ABSOLUTE,
SYMBOL_TINY_GOT,
SYMBOL_TINY_TLSIE,
SYMBOL_TLSLE12,
SYMBOL_TLSLE24,
SYMBOL_TLSLE32,

View File

@ -1159,6 +1159,31 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
emit_insn (gen_ldr_got_tiny (dest, imm));
return;
case SYMBOL_TINY_TLSIE:
{
machine_mode mode = GET_MODE (dest);
rtx tp = aarch64_load_tp (NULL);
if (mode == ptr_mode)
{
if (mode == DImode)
emit_insn (gen_tlsie_tiny_di (dest, imm, tp));
else
{
tp = gen_lowpart (mode, tp);
emit_insn (gen_tlsie_tiny_si (dest, imm, tp));
}
}
else
{
gcc_assert (mode == Pmode);
emit_insn (gen_tlsie_tiny_sidi (dest, imm, tp));
}
set_unique_reg_note (get_last_insn (), REG_EQUIV, imm);
return;
}
default:
gcc_unreachable ();
}
@ -1693,6 +1718,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
case SYMBOL_SMALL_GOT_28K:
case SYMBOL_SMALL_GOT_4G:
case SYMBOL_TINY_GOT:
case SYMBOL_TINY_TLSIE:
if (offset != const0_rtx)
{
gcc_assert(can_create_pseudo_p ());
@ -4623,6 +4649,10 @@ aarch64_print_operand (FILE *f, rtx x, char code)
asm_fprintf (asm_out_file, ":got:");
break;
case SYMBOL_TINY_TLSIE:
asm_fprintf (asm_out_file, ":gottprel:");
break;
default:
break;
}
@ -8728,7 +8758,14 @@ aarch64_classify_tls_symbol (rtx x)
return TARGET_TLS_DESC ? SYMBOL_SMALL_TLSDESC : SYMBOL_SMALL_TLSGD;
case TLS_MODEL_INITIAL_EXEC:
return SYMBOL_SMALL_GOTTPREL;
switch (aarch64_cmodel)
{
case AARCH64_CMODEL_TINY:
case AARCH64_CMODEL_TINY_PIC:
return SYMBOL_TINY_TLSIE;
default:
return SYMBOL_SMALL_GOTTPREL;
}
case TLS_MODEL_LOCAL_EXEC:
if (aarch64_tls_size == 12)

View File

@ -90,6 +90,7 @@
UNSPEC_GOTSMALLPIC28K
UNSPEC_GOTSMALLTLS
UNSPEC_GOTTINYPIC
UNSPEC_GOTTINYTLS
UNSPEC_LD1
UNSPEC_LD2
UNSPEC_LD2_DUP
@ -4515,6 +4516,30 @@
(set_attr "length" "8")]
)
(define_insn "tlsie_tiny_<mode>"
[(set (match_operand:PTR 0 "register_operand" "=&r")
(unspec:PTR [(match_operand 1 "aarch64_tls_ie_symref" "S")
(match_operand:PTR 2 "register_operand" "r")]
UNSPEC_GOTTINYTLS))]
""
"ldr\\t%<w>0, %L1\;add\\t%<w>0, %<w>0, %<w>2"
[(set_attr "type" "multiple")
(set_attr "length" "8")]
)
(define_insn "tlsie_tiny_sidi"
[(set (match_operand:DI 0 "register_operand" "=&r")
(zero_extend:DI
(unspec:SI [(match_operand 1 "aarch64_tls_ie_symref" "S")
(match_operand:DI 2 "register_operand" "r")
]
UNSPEC_GOTTINYTLS)))]
""
"ldr\\t%w0, %L1\;add\\t%<w>0, %<w>0, %<w>2"
[(set_attr "type" "multiple")
(set_attr "length" "8")]
)
(define_insn "tlsle12_<mode>"
[(set (match_operand:P 0 "register_operand" "=r")
(unspec:P [(match_operand:P 1 "register_operand" "r")

View File

@ -1,3 +1,7 @@
2015-08-26 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/tlsie_tiny_1.c: New testcase.
2015-08-26 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/tlsle_1.x: Rename to tls_1.x

View File

@ -0,0 +1,7 @@
/* { dg-do compile } */
/* { dg-require-effective-target tls_native } */
/* { dg-options "-O2 -fpic -ftls-model=initial-exec -mcmodel=tiny" } */
#include "tls_1.x"
/* { dg-final { scan-assembler-times ":gottprel:" 2 } } */