From 602f8baa0b572ef8693a6ec6711ecca0399a6b3f Mon Sep 17 00:00:00 2001 From: Christophe Fergeau Date: Wed, 8 Jun 2011 11:18:26 +0200 Subject: [PATCH] bitlock: don't use asm goto on older gcc 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 | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/glib/gbitlock.c b/glib/gbitlock.c index 72ee96c..a9f7a5e 100644 --- a/glib/gbitlock.c +++ b/glib/gbitlock.c @@ -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) -- 2.7.4