On Sat, Mar 21, 2020 at 3:21 PM Iain Sandoe <i...@sandoe.co.uk> wrote: > > Hi, > > 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). > > === > > The change to i386.h is just a tidy up, and I can apply the darwin.h portion > independently of that to fix the problem if you’d prefer no changes at this > stage. > > OK for master (for the i386.h part of the change)? > backports to open branches (for the i386.h part of the change)?
OK everywhere, but please rewrite the condition to equivalent: (flag_pic && !(TARGET_64BIT || HAVE_AS_GOTOFF_IN_DATA)) Thanks, Uros. > > thanks > Iain. > > gcc/ChangeLog: > > 2020-03-21 Iain Sandoe <i...@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. > > diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h > index 1b94cb88c98..5faa1f40089 100644 > --- a/gcc/config/i386/darwin.h > +++ b/gcc/config/i386/darwin.h > @@ -239,6 +239,16 @@ along with GCC; see the file COPYING3. If not see > #undef TARGET_ASM_OUTPUT_IDENT > #define TARGET_ASM_OUTPUT_IDENT default_asm_output_ident_directive > > +/* We always want jump tables in the text section: > + * for PIC code, we need the subtracted symbol to be defined at > + assembly-time. > + * for mdynamic-no-pic, we cannot support jump tables in the .const > + section for weak functions, this looks to ld64 like direct access > + to the weak symbol from an anonymous atom. */ > + > +#undef JUMP_TABLES_IN_TEXT_SECTION > +#define JUMP_TABLES_IN_TEXT_SECTION 1 > + > /* Darwin profiling -- call mcount. > If we need a stub, then we unconditionally mark it as used. */ > #undef FUNCTION_PROFILER > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h > index 98235f75a9e..d4255f0d678 100644 > --- a/gcc/config/i386/i386.h > +++ b/gcc/config/i386/i386.h > @@ -2285,11 +2285,10 @@ extern int const > svr4_dbx_register_map[FIRST_PSEUDO_REGISTER]; > > /* Under some conditions we need jump tables in the text section, > because the assembler cannot handle label differences between > - sections. This is the case for x86_64 on Mach-O for example. */ > + sections. */ > > #define JUMP_TABLES_IN_TEXT_SECTION \ > - (flag_pic && ((TARGET_MACHO && TARGET_64BIT) \ > - || (!TARGET_64BIT && !HAVE_AS_GOTOFF_IN_DATA))) > + (flag_pic && (!TARGET_64BIT && !HAVE_AS_GOTOFF_IN_DATA)) > > /* Switch to init or fini section via SECTION_OP, emit a call to FUNC, > and switch back. For x86 we do this only to save a few bytes that >