This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA: Remove alias usage from libgcc/sync.c


Ian Lance Taylor <iant@google.com> writes:
> On Tue, Oct 15, 2013 at 2:18 AM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>>
>> Ok for the tailcall parts and the testcase - I'd prefer someone else to
>> ack the libgcc change.  CCing maintainer.
>
> The libgcc patch is missing the updates to the comments.  This code is
> confusing enough as it is, having incorrect comments wouldn't help.

How does this look?

Thanks,
Richard


gcc/
2013-10-15  Richard Biener  <rguenther@suse.de>

	* tree-tailcall.c (find_tail_calls): Don't use tail-call recursion
	for built-in functions.

gcc/testsuite/
	* gcc.dg/torture/builtin-self.c: New file.

libgcc/
	* sync.c: Remove static aliases and define each function directly
	under its real name.

Index: gcc/tree-tailcall.c
===================================================================
--- gcc/tree-tailcall.c	2013-10-15 08:52:07.358853220 +0100
+++ gcc/tree-tailcall.c	2013-10-15 08:53:06.980419473 +0100
@@ -446,7 +446,9 @@ find_tail_calls (basic_block bb, struct
   /* We found the call, check whether it is suitable.  */
   tail_recursion = false;
   func = gimple_call_fndecl (call);
-  if (func && recursive_call_p (current_function_decl, func))
+  if (func
+      && !DECL_BUILT_IN (func)
+      && recursive_call_p (current_function_decl, func))
     {
       tree arg;
 
Index: gcc/testsuite/gcc.dg/torture/builtin-self.c
===================================================================
--- /dev/null	2013-10-13 08:29:45.608935301 +0100
+++ gcc/testsuite/gcc.dg/torture/builtin-self.c	2013-10-15 08:58:00.064045777 +0100
@@ -0,0 +1,10 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* Check that we can use this idiom to define out-of-line copies of built-in
+   functions.  This is used by libgcc/sync.c, for example.  */
+void __sync_synchronize (void)
+{
+  __sync_synchronize ();
+}
+/* { dg-final { scan-assembler "__sync_synchronize" } } */
+/* { dg-final { scan-assembler "\t(lock|mfence)" } } */
+/* { dg-final { scan-assembler-not "\tcall" } } */
Index: libgcc/sync.c
===================================================================
--- libgcc/sync.c	2013-10-15 08:52:07.358853220 +0100
+++ libgcc/sync.c	2013-10-15 18:16:24.383123115 +0100
@@ -67,27 +67,26 @@ Software Foundation; either version 3, o
 
 #if defined FN
 
-/* Define macros for each __sync_* function type.  Each macro defines a
-   local function called <NAME>_<UNITS> that acts like __<NAME>_<UNITS>.
-   TYPE is a type that has UNITS bytes.  */
+/* Define functions called __sync_<NAME>_<UNITS>, with one macro per
+   signature.  TYPE is a type that has UNITS bytes.  */
 
 #define DEFINE_V_PV(NAME, UNITS, TYPE)					\
-  static TYPE								\
-  NAME##_##UNITS (TYPE *ptr, TYPE value)				\
+  TYPE									\
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value)				\
   {									\
     return __##NAME (ptr, value);					\
   }
 
-#define DEFINE_V_PVV(NAME, UNITS, TYPE)				\
-  static TYPE								\
-  NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)			\
+#define DEFINE_V_PVV(NAME, UNITS, TYPE)					\
+  TYPE									\
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)		\
   {									\
     return __##NAME (ptr, value1, value2);				\
   }
 
 #define DEFINE_BOOL_PVV(NAME, UNITS, TYPE)				\
-  static _Bool								\
-  NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)			\
+  _Bool									\
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)		\
   {									\
     return __##NAME (ptr, value1, value2);				\
   }
@@ -118,9 +117,7 @@ #define local_sync_lock_test_and_set DEF
 #define DEFINE1(NAME, UNITS, TYPE) \
   static int unused[sizeof (TYPE) == UNITS ? 1 : -1]	\
     __attribute__((unused));				\
-  local_##NAME (NAME, UNITS, TYPE);			\
-  typeof (NAME##_##UNITS) __##NAME##_##UNITS		\
-    __attribute__((alias (#NAME "_" #UNITS)));
+  local_##NAME (NAME, UNITS, TYPE);
 
 /* As above, but performing macro expansion on the arguments.  */
 #define DEFINE(NAME, UNITS, TYPE) DEFINE1 (NAME, UNITS, TYPE)
@@ -167,13 +164,11 @@ DEFINE (FN, 8, UOItype)
 
 #if defined Lsync_synchronize
 
-static void
-sync_synchronize (void)
+void
+__sync_synchronize (void)
 {
   __sync_synchronize ();
 }
-typeof (sync_synchronize) __sync_synchronize \
-  __attribute__((alias ("sync_synchronize")));
 
 #endif
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]