gcc_unreachable ();
}
- insn = emit_call_insn (gen_call_value_internal (v0, loongarch_tls_symbol,
- const0_rtx));
+ if (flag_plt)
+ insn = emit_call_insn (gen_call_value_internal (v0, loongarch_tls_symbol,
+ const0_rtx));
+ else
+ {
+ rtx dest = gen_reg_rtx (Pmode);
+ rtx high = gen_reg_rtx (Pmode);
+ loongarch_emit_move (high, gen_rtx_HIGH (Pmode, loongarch_tls_symbol));
+ emit_insn (gen_ld_from_got (Pmode, dest, high, loongarch_tls_symbol));
+ insn = emit_call_insn (gen_call_value_internal (v0, dest, const0_rtx));
+ }
+
RTL_CONST_CALL_P (insn) = 1;
use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
insn = get_insns ();
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-plt -mcmodel=normal" } */
+/* { dg-final { scan-assembler "pcalau12i\t.*%got_pc_hi20\\(__tls_get_addr\\)" } } */
+
+__attribute__ ((tls_model ("global-dynamic"))) __thread int a;
+
+void
+test (void)
+{
+ a = 10;
+}
+