diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2011-10-07 13:50:01 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2011-10-07 13:50:01 +0000 |
commit | 68c0ef75f351958c900e278f7fe8577274cf621f (patch) | |
tree | 0f5f655d1af6d1b7a11d136b7c845feef28c4a3e /gcc | |
parent | 8be5e1cc7d2c6d8fbc9a9ca8b199b1ae258fd180 (diff) | |
download | gcc-68c0ef75f351958c900e278f7fe8577274cf621f.zip gcc-68c0ef75f351958c900e278f7fe8577274cf621f.tar.gz gcc-68c0ef75f351958c900e278f7fe8577274cf621f.tar.bz2 |
s390.c (s390_emit_tls_call_insn): Remove assertion.
2011-10-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.c (s390_emit_tls_call_insn): Remove assertion.
Load GOT pointer for non-pic builds.
(s390_load_got): Replace pic_offset_table_rtx with hardcoded r12.
(s390_emit_call): Likewise.
From-SVN: r179658
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 20 |
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7658511..695ba66 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-10-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * config/s390/s390.c (s390_emit_tls_call_insn): Remove assertion. + Load GOT pointer for non-pic builds. + (s390_load_got): Replace pic_offset_table_rtx with hardcoded r12. + (s390_emit_call): Likewise. + 2011-10-07 Tom de Vries <tom@codesourcery.com> PR middle-end/50527 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 22f05f9..ffca91a 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -3604,7 +3604,8 @@ s390_emit_tls_call_insn (rtx result_reg, rtx tls_call) { rtx insn; - gcc_assert (flag_pic); + if (!flag_pic) + emit_insn (s390_load_got ()); if (!s390_tls_symbol) s390_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_offset"); @@ -7859,6 +7860,12 @@ s390_load_got (void) { rtx insns; + /* We cannot use pic_offset_table_rtx here since we use this + function also for non-pic if __tls_get_offset is called and in + that case PIC_OFFSET_TABLE_REGNUM as well as pic_offset_table_rtx + aren't usable. */ + rtx got_rtx = gen_rtx_REG (Pmode, 12); + if (!got_symbol) { got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_"); @@ -7869,7 +7876,7 @@ s390_load_got (void) if (TARGET_CPU_ZARCH) { - emit_move_insn (pic_offset_table_rtx, got_symbol); + emit_move_insn (got_rtx, got_symbol); } else { @@ -7880,13 +7887,13 @@ s390_load_got (void) offset = gen_rtx_CONST (Pmode, offset); offset = force_const_mem (Pmode, offset); - emit_move_insn (pic_offset_table_rtx, offset); + emit_move_insn (got_rtx, offset); offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (offset, 0)), UNSPEC_LTREL_BASE); - offset = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, offset); + offset = gen_rtx_PLUS (Pmode, got_rtx, offset); - emit_move_insn (pic_offset_table_rtx, offset); + emit_move_insn (got_rtx, offset); } insns = get_insns (); @@ -9827,8 +9834,7 @@ s390_emit_call (rtx addr_location, rtx tls_call, rtx result_reg, /* s390_function_ok_for_sibcall should have denied sibcalls in this case. */ gcc_assert (retaddr_reg != NULL_RTX); - - use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx); + use_reg (&CALL_INSN_FUNCTION_USAGE (insn), gen_rtx_REG (Pmode, 12)); } return insn; } |