diff options
author | Aaron Sawdey <acsawdey@linux.ibm.com> | 2020-04-14 14:38:47 -0500 |
---|---|---|
committer | Aaron Sawdey <acsawdey@linux.ibm.com> | 2020-04-14 14:38:47 -0500 |
commit | aba6453890ce1754b7d1c01a67612766690ff15e (patch) | |
tree | e8e492c75ed16f848e383ae796080b75e63529ee | |
parent | 52d4ed1d96d48e2ceafc89a8734e14de3d5de3fe (diff) | |
download | gcc-aba6453890ce1754b7d1c01a67612766690ff15e.zip gcc-aba6453890ce1754b7d1c01a67612766690ff15e.tar.gz gcc-aba6453890ce1754b7d1c01a67612766690ff15e.tar.bz2 |
Fix for PR/94542, do not make TLS refs PC-relative
For rs6000 target, it is not valid to make PC-relative
references to TLS symbols. So addr_to_insn_form() needs
to check if things are TLS before returning PC-rel forms.
2020-04-14 Aaron Sawdey <acsawdey@linux.ibm.com>
PR target/94542
* config/rs6000/rs6000.c (address_to_insn_form): Do not attempt to
use PC-relative addressing for TLS references.
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 33 |
2 files changed, 28 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 483bd85..e88c0e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-04-14 Aaron Sawdey <acsawdey@linux.ibm.com> + + PR target/94542 + * config/rs6000/rs6000.c (address_to_insn_form): Do not attempt to + use PC-relative addressing for TLS references. + 2020-04-14 Martin Jambor <mjambor@suse.cz> PR ipa/94434 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2b6613b..4defc1a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -24824,15 +24824,21 @@ address_to_insn_form (rtx addr, if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC) return INSN_FORM_UPDATE; - /* Handle PC-relative symbols and labels. Check for both local and external - symbols. Assume labels are always local. */ + /* Handle PC-relative symbols and labels. Check for both local and + external symbols. Assume labels are always local. TLS symbols + are not PC-relative for rs6000. */ if (TARGET_PCREL) { - if (SYMBOL_REF_P (addr) && !SYMBOL_REF_LOCAL_P (addr)) - return INSN_FORM_PCREL_EXTERNAL; - - if (SYMBOL_REF_P (addr) || LABEL_REF_P (addr)) + if (LABEL_REF_P (addr)) return INSN_FORM_PCREL_LOCAL; + + if (SYMBOL_REF_P (addr) && !SYMBOL_REF_TLS_MODEL (addr)) + { + if (!SYMBOL_REF_LOCAL_P (addr)) + return INSN_FORM_PCREL_EXTERNAL; + else + return INSN_FORM_PCREL_LOCAL; + } } if (GET_CODE (addr) == CONST) @@ -24866,14 +24872,19 @@ address_to_insn_form (rtx addr, return INSN_FORM_BAD; /* Check for local and external PC-relative addresses. Labels are always - local. */ + local. TLS symbols are not PC-relative for rs6000. */ if (TARGET_PCREL) { - if (SYMBOL_REF_P (op0) && !SYMBOL_REF_LOCAL_P (op0)) - return INSN_FORM_PCREL_EXTERNAL; - - if (SYMBOL_REF_P (op0) || LABEL_REF_P (op0)) + if (LABEL_REF_P (op0)) return INSN_FORM_PCREL_LOCAL; + + if (SYMBOL_REF_P (op0) && !SYMBOL_REF_TLS_MODEL (op0)) + { + if (!SYMBOL_REF_LOCAL_P (op0)) + return INSN_FORM_PCREL_EXTERNAL; + else + return INSN_FORM_PCREL_LOCAL; + } } /* If it isn't PC-relative, the address must use a base register. */ |