diff mbox

[build] Define HAVE_GAS_HIDDEN on Darwin

Message ID yddaadshds2.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth June 8, 2011, 9:29 a.m. UTC
Jason Merrill <jason@redhat.com> writes:

> On 05/19/2011 01:33 PM, Rainer Orth wrote:
>> The cleanest way to account for this seems to allow overriding
>> USE_LINKONCE_INDIRECT in target headers (darwin.h in this case).
>>
>> If Jason or Richard consider this appropriate, I'll modify the patch
>> accordingly and apply after retesting.
>
> Not really.  The use in dwarf2asm seems no different from the use in
> i386.c, except that the latter has a special TARGET_MACHO case instead. As
> you say, dwarf2asm shouldn't be using .hidden directly, and that's the bug
> to fix.

Once I got around to it, this proved to be remarkably easy, as can be
seen below.

One additional complication was detected during Darwin testing: with
HAVE_GAS_HIDDEN defined, the 32-bit {ix86, rs6000}_stack_protect_fail
would call default_hidden_stack_protect_fail.  This emits calls to
__stack_chk_fail_local which is missing from Darwin libc, so I had to
revert to the default on Darwin.

Bootstrapped without regressions on i386-apple-darwin9.8.0.
powerpc-apple-darwin9.8.0 bootstrap is still running.  Unfortunately,
Darwin seems to be exceedingly unreliable under load: tests randomly
time out and work again the next time.  This doesn't happen for me on
any other platform.  This makes actually checking for regressions quite
tedious.  I've checked that any newly failing test was a timeout, not an
actual failure.

The patch has also been bootstrapped without regressions on
i386-pc-solaris2.8 and i386-pc-solaris2.11 and the DW.ref.* symbols are
still hidden as before.

The Darwin parts of the previous versions have already been approved,
but I'd appreciate if Mike could have a look at the changes.  Ok for
mainline?

Thanks.
        Rainer


2011-04-30  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	gcc:
	* configure.ac (gcc_cv_as_hidden): Enable on *-*-darwin*.
	(gcc_cv_ld_hidden): Likewise.
	* configure: Regenerate.
	* config/i386/i386.c (USE_HIDDEN_LINKONCE): Remove TARGET_MACHO.
	(ix86_stack_protect_fail): Mark unused.
	(TARGET_STACK_PROTECT_FAIL) [TARGET_MACHO]: Don't redefine.
	* config/rs6000/rs6000.c (rs6000_assemble_visibility)
	[TARGET_MACHO]: Don't define.
	(TARGET_ASM_ASSEMBLE_VISIBILITY): Likewise.
	(TARGET_STACK_PROTECT_FAIL): Likewise.
	(rs6000_stack_protect_fail): Mark unused.
	* dwarf2asm.c (dw2_output_indirect_constant_1): Mark decl hidden if
	USE_LINKONCE_INDIRECT.
	Don't emit .hidden expicitly.

Comments

Mike Stump June 8, 2011, 7:38 p.m. UTC | #1
On Jun 8, 2011, at 2:29 AM, Rainer Orth wrote:
> The Darwin parts of the previous versions have already been approved,
> but I'd appreciate if Mike could have a look at the changes.  Ok for
> mainline?

Ok.
Mike Stump June 8, 2011, 7:54 p.m. UTC | #2
On Jun 8, 2011, at 2:29 AM, Rainer Orth wrote:
> Bootstrapped without regressions on i386-apple-darwin9.8.0.
> powerpc-apple-darwin9.8.0 bootstrap is still running.  Unfortunately,
> Darwin seems to be exceedingly unreliable under load: tests randomly
> time out and work again the next time.  This doesn't happen for me on
> any other platform.

:-(  There are one or two testcases that are slightly less than deterministic (in java), though, for me, they seem always to be deterministic.  I wonder if the actual time required for a testcase is just too close to the margin and failing because you gave it a loaded machine.  In my experience, if you do a normal -j check run, and another -j make run (unrelated), we will then time out things, simply because people say, I have 300 seconds to run a testcase, so I am going to use 100% of the machine for 298 seconds and if I don't get it, I'm going to fail.  :-(  Nasty.  I think any testcase that takes more than 30 seconds should be shot on sight, then you can have 3 running at the same time, and never fail on time outs.

Feel free to name the testcases that gave you problems...  Maybe someone has ideas.  Another thought, change the 300 to 600, and see if it is then perfectly reliable.  If so, well...  Maybe the compiler is just slower than it used to be.  :-(
Jason Merrill June 8, 2011, 9:17 p.m. UTC | #3
On 06/08/2011 05:29 AM, Rainer Orth wrote:
> Once I got around to it, this proved to be remarkably easy, as can be
> seen below.

Yes, much better.  The dwarf2asm change is OK.

Jason
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -8725,7 +8725,7 @@  ix86_setup_frame_addresses (void)
 }
 
 #ifndef USE_HIDDEN_LINKONCE
-# if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
+# if defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)
 #  define USE_HIDDEN_LINKONCE 1
 # else
 #  define USE_HIDDEN_LINKONCE 0
@@ -32207,7 +32207,7 @@  ix86_mangle_type (const_tree type)
    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
    register, so it is better to call __stack_chk_fail directly.  */
 
-static tree
+static tree ATTRIBUTE_UNUSED
 ix86_stack_protect_fail (void)
 {
   return TARGET_64BIT
@@ -35407,8 +35407,10 @@  ix86_autovectorize_vector_sizes (void)
 #undef TARGET_MANGLE_TYPE
 #define TARGET_MANGLE_TYPE ix86_mangle_type
 
+#ifndef TARGET_MACHO
 #undef TARGET_STACK_PROTECT_FAIL
 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
+#endif
 
 #undef TARGET_SUPPORTS_SPLIT_STACK
 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -884,7 +884,7 @@  static bool legitimate_lo_sum_address_p 
 static struct machine_function * rs6000_init_machine_status (void);
 static bool rs6000_assemble_integer (rtx, unsigned int, int);
 static bool no_global_regs_above (int, bool);
-#ifdef HAVE_GAS_HIDDEN
+#if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
 static void rs6000_assemble_visibility (tree, int);
 #endif
 static int rs6000_ra_ever_killed (void);
@@ -1349,7 +1349,7 @@  static const struct default_options rs60
 #undef TARGET_ASM_INTEGER
 #define TARGET_ASM_INTEGER rs6000_assemble_integer
 
-#ifdef HAVE_GAS_HIDDEN
+#if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
 #endif
@@ -1558,8 +1558,10 @@  static const struct default_options rs60
 #define TARGET_DEFAULT_TARGET_FLAGS \
   (TARGET_DEFAULT)
 
+#ifndef TARGET_MACHO
 #undef TARGET_STACK_PROTECT_FAIL
 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
+#endif
 
 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
    The PowerPC architecture requires only weak consistency among
@@ -16390,7 +16392,7 @@  rs6000_assemble_integer (rtx x, unsigned
   return default_assemble_integer (x, size, aligned_p);
 }
 
-#ifdef HAVE_GAS_HIDDEN
+#if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
 /* Emit an assembler directive to set symbol visibility for DECL to
    VISIBILITY_TYPE.  */
 
@@ -27323,7 +27325,7 @@  invalid_arg_for_unprototyped_fn (const_t
    calling __stack_chk_fail directly.  Otherwise it is better to call
    __stack_chk_fail directly.  */
 
-static tree
+static tree ATTRIBUTE_UNUSED
 rs6000_stack_protect_fail (void)
 {
   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2192,6 +2192,12 @@  EOF
     gcc_cv_as_hidden=yes
     ;;
 esac])
+case "${target}" in
+  *-*-darwin*)
+    # Darwin as has some visibility support, though with a different syntax.
+    gcc_cv_as_hidden=yes
+    ;;
+esac
 
 # gnu_indirect_function type is an extension proposed at
 # http://groups.google/com/group/generic-abi/files. It allows dynamic runtime
@@ -2291,6 +2297,10 @@  else
     fi
   else
     case "${target}" in
+      *-*-darwin*)
+	# Darwin ld has some visibility support.
+	gcc_cv_ld_hidden=yes
+        ;;
       hppa64*-*-hpux* | ia64*-*-hpux*)
 	gcc_cv_ld_hidden=yes
 	;;
diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c
--- a/gcc/dwarf2asm.c
+++ b/gcc/dwarf2asm.c
@@ -1,5 +1,5 @@ 
 /* Dwarf2 assembler output helper routines.
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -915,14 +915,13 @@  dw2_output_indirect_constant_1 (splay_tr
     {
       TREE_PUBLIC (decl) = 1;
       make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
+      if (USE_LINKONCE_INDIRECT)
+	DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
     }
   else
     TREE_STATIC (decl) = 1;
 
   sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
-  sym = targetm.strip_name_encoding (sym);
-  if (TREE_PUBLIC (decl) && USE_LINKONCE_INDIRECT)
-    fprintf (asm_out_file, "\t.hidden %sDW.ref.%s\n", user_label_prefix, sym);
   assemble_variable (decl, 1, 1, 1);
   assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);