https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82725
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Well, r58383 only allowed some exceptions that would be otherwise rejected
before.
If we want to handle for ntpoff symbol + small offset, then I think we need to
handle it in legitimate_pic_address_disp_p instead. We have there:
15148 if (TARGET_64BIT)
15149 {
15150 /* We are unsafe to allow PLUS expressions. This limit allowed
distance
15151 of GOT tables. We should not need these anyway. */
15152 if (GET_CODE (disp) != UNSPEC
15153 || (XINT (disp, 1) != UNSPEC_GOTPCREL
15154 && XINT (disp, 1) != UNSPEC_GOTOFF
15155 && XINT (disp, 1) != UNSPEC_PCREL
15156 && XINT (disp, 1) != UNSPEC_PLTOFF))
15157 return false;
15158
15159 if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
15160 && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
15161 return false;
15162 return true;
15163 }
and for 32-bit target fall through and handle plus and then UNSPEC_DTPOFF and
UNSPEC_NTPOFF with offsets.
Wonder if offsets other than signed 32-bit are valid and assembler/linker will
deal with them though, something like:
extern __thread int a[];
int *
foo (void)
{
return &a[0x200000000];
}