https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93119

--- Comment #1 from Peakulorain <pengliren at huawei dot com> ---
Here is my patch to fix this program.

diff -Nurp a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
--- a/gcc/config/aarch64/aarch64.md     2019-12-20 03:16:50.706754343 +0800
+++ b/gcc/config/aarch64/aarch64.md     2019-12-31 04:33:11.229005263 +0800
@@ -5288,20 +5288,41 @@
 ;; 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_<mode>"
+(define_expand "tlsgd_small_si"
  [(parallel [(set (match_operand 0 "register_operand" "")
                   (call (mem:DI (match_dup 2)) (const_int 1)))
-            (unspec:DI [(match_operand:PTR 1 "aarch64_valid_symref" "")]
UNSPEC_GOTSMALLTLS)
+            (unspec:DI [(match_operand:SI 1 "aarch64_valid_symref" "")]
UNSPEC_GOTSMALLTLS)
             (clobber (reg:DI LR_REGNUM))])]
  ""
 {
   operands[2] = aarch64_tls_get_addr ();
 })

-(define_insn "*tlsgd_small_<mode>"
+(define_expand "tlsgd_small_di"
+ [(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)
+             (clobber (reg:DI LR_REGNUM))])]
+ ""
+{
+  operands[2] = aarch64_tls_get_addr ();
+})
+
+(define_insn "*tlsgd_small_si"
   [(set (match_operand 0 "register_operand" "")
        (call (mem:DI (match_operand:DI 2 "" "")) (const_int 1)))
-   (unspec:DI [(match_operand:PTR 1 "aarch64_valid_symref" "S")]
UNSPEC_GOTSMALLTLS)
+   (unspec:DI [(match_operand:SI 1 "aarch64_valid_symref" "S")]
UNSPEC_GOTSMALLTLS)
+   (clobber (reg:DI LR_REGNUM))
+  ]
+  ""
+  "adrp\\tx0, %A1\;add\\tx0, x0, %L1\;bl\\t%2\;nop"
+  [(set_attr "type" "call")
+   (set_attr "length" "16")])
+
+(define_insn "*tlsgd_small_di"
+  [(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)
    (clobber (reg:DI LR_REGNUM))
   ]
   ""

Reply via email to