From patchwork Sat Jul 17 18:09:53 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Sandoe X-Patchwork-Id: 59147 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 9C97DB70A6 for ; Sun, 18 Jul 2010 04:10:07 +1000 (EST) Received: (qmail 20673 invoked by alias); 17 Jul 2010 18:10:06 -0000 Received: (qmail 20659 invoked by uid 22791); 17 Jul 2010 18:10:04 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL, BAYES_05, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KAM_STOCKGEN, TW_TR X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 17 Jul 2010 18:09:59 +0000 Received: by wye20 with SMTP id 20so3606890wye.20 for ; Sat, 17 Jul 2010 11:09:57 -0700 (PDT) Received: by 10.227.37.140 with SMTP id x12mr2163891wbd.98.1279390196870; Sat, 17 Jul 2010 11:09:56 -0700 (PDT) Received: from thor.office (host81-138-1-83.in-addr.btopenworld.com [81.138.1.83]) by mx.google.com with ESMTPS id i25sm25219027wbi.10.2010.07.17.11.09.55 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 17 Jul 2010 11:09:56 -0700 (PDT) Cc: mrs@gcc.gnu.org, Uros Bizjak , David Edelsohn , Richard Henderson Message-Id: From: IainS To: gcc-patches List In-Reply-To: Mime-Version: 1.0 (Apple Message framework v936) Subject: Re: [Patch, darwin] do not generate branch islands when the linker can do it. Date: Sat, 17 Jul 2010 19:09:53 +0100 References: <01CDBBB5-4E03-4483-ADCC-454819159375@sandoe-acoustics.co.uk> <4C3F478D.4060405@redhat.com> <8987CD7A-53F6-45B1-9A88-E27107B1AAFB@sandoe-acoustics.co.uk> <4C3F5723.3090803@redhat.com> Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On 15 Jul 2010, at 20:34, IainS wrote: > On 15 Jul 2010, at 19:44, Richard Henderson wrote: > >> On 07/15/2010 11:27 AM, IainS wrote: >>> +#ifndef TARGET_MACHO_BRANCH_ISLANDS >>> +# define TARGET_MACHO_BRANCH_ISLANDS 0 >>> +#endif >> >> This could go next to the TARGET_MACHO definition in i386.h, for >> consistency. >> >> From a i386 maintainer perspective, I think this is ok. I'll defer >> for ppc and darwin knowledge. > > FWIW: At your suggestion, > since then I've built powerpc-unknown-linux-gnu (crossed from i6868- > darwin9) and proved it can compile a trivial source file. > > (of course, the patch was already tested on powerpc-apple-darwin9 > as well) consolidated patch with the amendments suggested by Richard, ... ... still needs rs6000 and darwin reviews. thanks, Iain Index: gcc/config/i386/darwin.h =================================================================== --- gcc/config/i386/darwin.h (revision 162275) +++ gcc/config/i386/darwin.h (working copy) @@ -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 '&' */ \ Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 162275) +++ gcc/config/i386/i386.c (working copy) @@ -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); } Index: gcc/config/i386/i386.h =================================================================== --- gcc/config/i386/i386.h (revision 162275) +++ gcc/config/i386/i386.h (working copy) @@ -477,6 +477,11 @@ extern tree x86_mfence; redefines this to 1. */ #define TARGET_MACHO 0 +/* This is a options flag on darwin systems. */ +#ifndef TARGET_MACHO_BRANCH_ISLANDS +#define TARGET_MACHO_BRANCH_ISLANDS 0 +#endif + /* Likewise, for the Windows 64-bit ABI. */ #define TARGET_64BIT_MS_ABI (TARGET_64BIT && ix86_cfun_abi () == MS_ABI) Index: gcc/config/rs6000/darwin.h =================================================================== --- gcc/config/rs6000/darwin.h (revision 162275) +++ gcc/config/rs6000/darwin.h (working copy) @@ -65,6 +65,9 @@ } \ while (0) +/* Generate branch islands stubs if this is true. */ +extern int darwin_emit_branch_islands; + #define SUBTARGET_OVERRIDE_OPTIONS darwin_rs6000_override_options () #define C_COMMON_OVERRIDE_OPTIONS do { \ @@ -385,8 +388,6 @@ #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE)) -/* XXX: Darwin supports neither .quad, or .llong, but it also doesn't - support 64 bit PowerPC either, so this just keeps things happy. */ #define DOUBLE_INT_ASM_OP "\t.quad\t" /* For binary compatibility with 2.95; Darwin C APIs use bool from Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 162275) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -15392,7 +15392,8 @@ print_operand (FILE *file, rtx x, int code) { const char *name = XSTR (x, 0); #if TARGET_MACHO - if (MACHOPIC_INDIRECT + if (darwin_emit_branch_islands + && MACHOPIC_INDIRECT && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION) name = machopic_indirection_name (x, /*stub_p=*/true); #endif @@ -24482,14 +24483,6 @@ get_prev_label (tree function_name) return 0; } -#ifndef DARWIN_LINKER_GENERATES_ISLANDS -#define DARWIN_LINKER_GENERATES_ISLANDS 0 -#endif - -/* KEXTs still need branch islands. */ -#define DARWIN_GENERATE_ISLANDS (!DARWIN_LINKER_GENERATES_ISLANDS \ - || flag_mkernel || flag_apple_kext) - /* INSN is either a function call or a millicode call. It may have an unconditional jump in its delay slot. @@ -24500,7 +24493,7 @@ output_call (rtx insn, rtx *operands, int dest_ope int cookie_operand_number) { static char buf[256]; - if (DARWIN_GENERATE_ISLANDS + if (darwin_emit_branch_islands && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF && (INTVAL (operands[cookie_operand_number]) & CALL_LONG)) { Index: gcc/config/darwin.c =================================================================== --- gcc/config/darwin.c (revision 162275) +++ gcc/config/darwin.c (working copy) @@ -79,6 +79,12 @@ along with GCC; see the file COPYING3. If not see of MACHO_SYMBOL_STATIC for the code that handles @code{static} symbol indirection. */ +/* For darwin >= 9 (OSX 10.5) the linker is capable of making the necessary + branch islands and we no longer need to emit darwin stubs. + However, if we are generating code for earlier systems (or for use in the + kernel) the stubs might still be required, and this will be set true. */ +int darwin_emit_branch_islands = false; + /* Section names. */ section * darwin_sections[NUM_DARWIN_SECTIONS]; @@ -625,6 +631,9 @@ machopic_indirect_data_reference (rtx orig, rtx re rtx machopic_indirect_call_target (rtx target) { + if (! darwin_emit_branch_islands) + return target; + if (GET_CODE (target) != MEM) return target; @@ -1888,12 +1897,19 @@ darwin_override_options (void) flag_exceptions = 0; /* No -fnon-call-exceptions data in kexts. */ flag_non_call_exceptions = 0; + /* We still need to emit branch islands for kernel context. */ + darwin_emit_branch_islands = true; } if (flag_var_tracking && strverscmp (darwin_macosx_version_min, "10.5") >= 0 && debug_info_level >= DINFO_LEVEL_NORMAL && debug_hooks->var_location != do_nothing_debug_hooks.var_location) flag_var_tracking_uninit = 1; + + /* It is assumed that branch island stubs are needed for earlier systems. */ + if (darwin_macosx_version_min + && strverscmp (darwin_macosx_version_min, "10.5") < 0) + darwin_emit_branch_islands = true; } /* Add $LDBL128 suffix to long double builtins. */ Index: gcc/config/darwin9.h =================================================================== --- gcc/config/darwin9.h (revision 162275) +++ gcc/config/darwin9.h (working copy) @@ -44,9 +44,6 @@ along with GCC; see the file COPYING3. If not see /* libSystem contains unwind information for signal frames. */ #define DARWIN_LIBSYSTEM_HAS_UNWIND -/* The linker can generate branch islands. */ -#define DARWIN_LINKER_GENERATES_ISLANDS 1 - #undef ASM_OUTPUT_ALIGNED_COMMON #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ do { \