Darwin: Fix i686 bootstrap when the assembler supports GOTOFF in data.
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 22 Mar 2020 09:27:05 +0000 (09:27 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Sun, 22 Mar 2020 09:30:46 +0000 (09:30 +0000)
commit85e10e4f0fa5c6b1a9f3caf7d9cab28ef8490a83
tree87c00c7f407beefac816c470faf5a860a98733ba
parent88d7d0ce8fa4643923958497f4b2a49db8d32611
Darwin: Fix i686 bootstrap when the assembler supports GOTOFF in data.

When we use an assembler that supports " .long XX@GOTOFF", the current
combination of configuration parameters and conditional compilation
(when building an i686-darwin compiler with mdynamic-no-pic) assume that
it's OK to put jump tables in the .const section.

However, when we encounter a weak function with a jump table, this
produces relocations that directly access the weak symbol section from
the .const section - which is deemed illegal by the linker (since that
would mean that the weak symbol could not be replaced).

Arguably, this is a limitation (maybe even a bug) in the linker - but
it seems that we'd have to change the ABI to fix it - since it would
require some annotation (maybe just using a special section for the
jump tables) to tell the linker that this specific circumstance is OK
because the direct access to the weak symbol can only occur from that
symbol itself.

The fix is to force jump tables into the text section for all X86 Darwin
versions (PIC code already had this change).

gcc/ChangeLog:

2020-03-22  Iain Sandoe  <iain@sandoe.co.uk>

* config/i386/darwin.h (JUMP_TABLES_IN_TEXT_SECTION): Remove
references to Darwin.
* config/i386/i386.h (JUMP_TABLES_IN_TEXT_SECTION): Define this
unconditionally and comment on why.
gcc/ChangeLog
gcc/config/i386/darwin.h
gcc/config/i386/i386.h