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
>

Reply via email to