bitlock: don't use asm goto on older gcc
authorChristophe Fergeau <cfergeau@redhat.com>
Wed, 8 Jun 2011 09:18:26 +0000 (11:18 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 9 Jun 2011 02:39:35 +0000 (22:39 -0400)
asm goto was addded in gcc 4.5 so don't try to use it on gcc versions
older than this one. This is achieved by explicitly checking gcc
version, an alternative would be to try to compile a program using
asm volatile in configure.

https://bugzilla.gnome.org/show_bug.cgi?id=651959

glib/gbitlock.c

index 72ee96c..a9f7a5e 100644 (file)
@@ -181,6 +181,12 @@ g_futex_wake (const volatile gint *address)
 #define CONTENTION_CLASSES 11
 static volatile gint g_bit_lock_contended[CONTENTION_CLASSES];
 
+#if (defined (i386) || defined (__amd64__))
+  #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+    #define USE_ASM_GOTO 1
+  #endif
+#endif
+
 /**
  * g_bit_lock:
  * @address: a pointer to an integer
@@ -206,7 +212,7 @@ void
 g_bit_lock (volatile gint *address,
             gint           lock_bit)
 {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
  retry:
   asm volatile goto ("lock bts %1, (%0)\n"
                      "jc %l[contended]"
@@ -277,7 +283,7 @@ gboolean
 g_bit_trylock (volatile gint *address,
                gint           lock_bit)
 {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
   gboolean result;
 
   asm volatile ("lock bts %2, (%1)\n"
@@ -317,7 +323,7 @@ void
 g_bit_unlock (volatile gint *address,
               gint           lock_bit)
 {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
   asm volatile ("lock btr %1, (%0)"
                 : /* no output */
                 : "r" (address), "r" (lock_bit)
@@ -393,7 +399,7 @@ void
   g_return_if_fail (lock_bit < 32);
 
   {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
  retry:
     asm volatile goto ("lock bts %1, (%0)\n"
                        "jc %l[contended]"
@@ -463,7 +469,7 @@ gboolean
   g_return_val_if_fail (lock_bit < 32, FALSE);
 
   {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
     gboolean result;
 
     asm volatile ("lock bts %2, (%1)\n"
@@ -508,7 +514,7 @@ void
   g_return_if_fail (lock_bit < 32);
 
   {
-#if defined (__GNUC__) && (defined (i386) || defined (__amd64__))
+#ifdef USE_ASM_GOTO
     asm volatile ("lock btr %1, (%0)"
                   : /* no output */
                   : "r" (address), "r" ((gsize) lock_bit)