Patchwork [darwin] do not generate branch islands when the linker can do it.

login
register
mail settings
Submitter IainS
Date July 17, 2010, 6:09 p.m.
Message ID <C4754598-6935-43D4-8E47-E9416071E21D@sandoe-acoustics.co.uk>
Download mbox | patch
Permalink /patch/59147/
State New
Headers show

Comments

IainS - July 17, 2010, 6:09 p.m.
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
David Edelsohn - July 18, 2010, 1:08 p.m.
Iain,

The rs6000 changes are very Darwin-specific and should be reviewed by
a Darwin maintainer.

Why are you removing the comment from rs6000/darwin.h?

-/* 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"

Thanks, David

> consolidated patch with the amendments suggested by Richard, ...
> ... still needs rs6000 and darwin reviews.
IainS - July 18, 2010, 1:20 p.m.
On 18 Jul 2010, at 14:08, David Edelsohn wrote:

> Why are you removing the comment from rs6000/darwin.h?
>
> -/* 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"

I've been building powerpc64-apple-darwin for a long time,  support  
for 64 bit ppc appeared (partially) in darwin8.
It is fully operational in darwin9, so the comment seems somewhat out  
of date and possibly misleading.

(or I misunderstand what the comment is about, in which case it needs  
revision, please).

thanks for reviewing,
cheers
Iain
Mike Stump - July 18, 2010, 6:18 p.m.
On Jul 17, 2010, at 11:09 AM, IainS wrote:
> consolidated patch with the amendments suggested by Richard, ...
> ... still needs rs6000 and darwin reviews.

Ok.  Thanks.
IainS - July 19, 2010, 9:12 a.m.
On 18 Jul 2010, at 19:18, Mike Stump wrote:

> On Jul 17, 2010, at 11:09 AM, IainS wrote:
>> consolidated patch with the amendments suggested by Richard, ...
>> ... still needs rs6000 and darwin reviews.
>
> Ok.  Thanks.

  r162299
cheers,
Iain

Patch

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 {									\