It *appears* as if the references we were generating before switching the thunk to rtl weren't valid. Certainly those same references don't pass legitimate_address_p, which is the direct cause of the assertion failure.
Fixed by using the same address transformation that ix86_expand_call would have used, rather than doing something by hand. Thanks to Dominiq for testing. Committed. r~
PR target/49714 * config/i386/i386.c (x86_output_mi_thunk): Use machopic_indirect_call_target instead of machopic_indirection_name directly. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 4ca95ab..9f63bf7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -29409,12 +29409,8 @@ x86_output_mi_thunk (FILE *file, #if TARGET_MACHO else if (TARGET_MACHO) { - rtx sym_ref = XEXP (DECL_RTL (function), 0); - if (TARGET_MACHO_BRANCH_ISLANDS) - sym_ref = (gen_rtx_SYMBOL_REF - (Pmode, - machopic_indirection_name (sym_ref, /*stub_p=*/true))); - fnaddr = gen_rtx_MEM (Pmode, sym_ref); + fnaddr = machopic_indirect_call_target (DECL_RTL (function)); + fnaddr = XEXP (fnaddr, 0); } #endif /* TARGET_MACHO */ else