diff options
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/darwin.h | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 8 |
3 files changed, 18 insertions, 5 deletions
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index d26ef2d..7917f2fc 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -60,6 +60,12 @@ along with GCC; see the file COPYING3. If not see #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 +/* Generate branch islands stubs if this is true. */ +extern int darwin_emit_branch_islands; + +#undef TARGET_MACHO_BRANCH_ISLANDS +#define TARGET_MACHO_BRANCH_ISLANDS darwin_emit_branch_islands + #undef MAX_BITS_PER_WORD #define MAX_BITS_PER_WORD 64 @@ -225,7 +231,7 @@ along with GCC; see the file COPYING3. If not see #undef FUNCTION_PROFILER #define FUNCTION_PROFILER(FILE, LABELNO) \ do { \ - if (MACHOPIC_INDIRECT && !TARGET_64BIT) \ + if (TARGET_MACHO_BRANCH_ISLANDS && MACHOPIC_INDIRECT && !TARGET_64BIT) \ { \ const char *name = machopic_mcount_stub_name (); \ fprintf (FILE, "\tcall %s\n", name+1); /* skip '&' */ \ diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index fdb4787..bb0b890 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -11513,7 +11513,7 @@ output_pic_addr_const (FILE *file, rtx x, int code) break; case SYMBOL_REF: - if (! TARGET_MACHO || TARGET_64BIT) + if (TARGET_64BIT || ! TARGET_MACHO_BRANCH_ISLANDS) output_addr_const (file, x); else { @@ -27233,10 +27233,11 @@ x86_output_mi_thunk (FILE *file, if (TARGET_MACHO) { rtx sym_ref = XEXP (DECL_RTL (function), 0); - tmp = (gen_rtx_SYMBOL_REF + if (TARGET_MACHO_BRANCH_ISLANDS) + sym_ref = (gen_rtx_SYMBOL_REF (Pmode, machopic_indirection_name (sym_ref, /*stub_p=*/true))); - tmp = gen_rtx_MEM (QImode, tmp); + tmp = gen_rtx_MEM (QImode, sym_ref); xops[0] = tmp; output_asm_insn ("jmp\t%0", xops); } diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index b5c6b9a..e153920 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -477,7 +477,13 @@ extern tree x86_mfence; redefines this to 1. */ #define TARGET_MACHO 0 -/* Likewise, for the Windows 64-bit ABI. */ +/* Branch island 'stubs' are emitted for earlier versions of darwin. + This provides a default (over-ridden in darwin.h.) */ +#ifndef TARGET_MACHO_BRANCH_ISLANDS +#define TARGET_MACHO_BRANCH_ISLANDS 0 +#endif + +/* For the Windows 64-bit ABI. */ #define TARGET_64BIT_MS_ABI (TARGET_64BIT && ix86_cfun_abi () == MS_ABI) /* Available call abi. */ |