From 23b88fda665d2f995c73336f74dcf8931f5fdf71 Mon Sep 17 00:00:00 2001 From: "Naveen H.S" Date: Thu, 8 Dec 2016 05:09:37 +0000 Subject: [PATCH] aarch64.c (aarch64_load_symref_appropriately): Handle SYMBOL_SMALL_TLSGD for ILP32. 2016-12-08 Naveen H.S gcc * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Handle SYMBOL_SMALL_TLSGD for ILP32. * config/aarch64/aarch64.md : tlsgd_small modified into tlsgd_small_ to support SImode and DImode. *tlsgd_small modified into *tlsgd_small_ to support SImode and DImode. gcc/testsuite * gcc.target/aarch64/pr78382.c : New Testcase. From-SVN: r243428 --- gcc/ChangeLog | 9 +++++++++ gcc/config/aarch64/aarch64.c | 8 ++++++-- gcc/config/aarch64/aarch64.md | 8 ++++---- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/aarch64/pr78382.c | 10 ++++++++++ 5 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/pr78382.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a44ba8bcf8a..20262613f7a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-12-08 Naveen H.S + + * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): + Handle SYMBOL_SMALL_TLSGD for ILP32. + * config/aarch64/aarch64.md : tlsgd_small modified into + tlsgd_small_ to support SImode and DImode. + *tlsgd_small modified into *tlsgd_small_ to support SImode and + DImode. + 2016-12-08 Andrew Pinski * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 98f76c15b4e..1a06432655e 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -1379,10 +1379,14 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm, case SYMBOL_SMALL_TLSGD: { rtx_insn *insns; - rtx result = gen_rtx_REG (Pmode, R0_REGNUM); + machine_mode mode = GET_MODE (dest); + rtx result = gen_rtx_REG (mode, R0_REGNUM); start_sequence (); - aarch64_emit_call_insn (gen_tlsgd_small (result, imm)); + if (TARGET_ILP32) + aarch64_emit_call_insn (gen_tlsgd_small_si (result, imm)); + else + aarch64_emit_call_insn (gen_tlsgd_small_di (result, imm)); insns = get_insns (); end_sequence (); diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 811a0785e7d..65eb3265bc2 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -5173,20 +5173,20 @@ ;; The TLS ABI specifically requires that the compiler does not schedule ;; instructions in the TLS stubs, in order to enable linker relaxation. ;; Therefore we treat the stubs as an atomic sequence. -(define_expand "tlsgd_small" +(define_expand "tlsgd_small_" [(parallel [(set (match_operand 0 "register_operand" "") (call (mem:DI (match_dup 2)) (const_int 1))) - (unspec:DI [(match_operand:DI 1 "aarch64_valid_symref" "")] UNSPEC_GOTSMALLTLS) + (unspec:DI [(match_operand:PTR 1 "aarch64_valid_symref" "")] UNSPEC_GOTSMALLTLS) (clobber (reg:DI LR_REGNUM))])] "" { operands[2] = aarch64_tls_get_addr (); }) -(define_insn "*tlsgd_small" +(define_insn "*tlsgd_small_" [(set (match_operand 0 "register_operand" "") (call (mem:DI (match_operand:DI 2 "" "")) (const_int 1))) - (unspec:DI [(match_operand:DI 1 "aarch64_valid_symref" "S")] UNSPEC_GOTSMALLTLS) + (unspec:DI [(match_operand:PTR 1 "aarch64_valid_symref" "S")] UNSPEC_GOTSMALLTLS) (clobber (reg:DI LR_REGNUM)) ] "" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d4fb081254d..bf6db373076 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-12-08 Naveen H.S + + * gcc.target/aarch64/pr78382.c : New Testcase. + 2016-12-08 Andrew Pinski * gcc.target/aarch64/pr71112.c : New Testcase. diff --git a/gcc/testsuite/gcc.target/aarch64/pr78382.c b/gcc/testsuite/gcc.target/aarch64/pr78382.c new file mode 100644 index 00000000000..febe7bc8d0a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr78382.c @@ -0,0 +1,10 @@ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-mtls-dialect=trad -fpic" } */ + +__thread int abc; +void +foo () +{ + int *p; + p = &abc; +} -- 2.30.2