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))
]
""