[PATCH, libbacktrace] SPU does not support __sync or __atomic

Ulrich Weigand uweigand@de.ibm.com
Fri Aug 28 16:57:00 GMT 2015


Hello,

this is the (hopefully) last compatibility problem with libbacktrace on SPU:
we do not have either the __sync or the __atomic routines (since the SPU
is a fundamentally single-threaded target).

There are configure.ac checks for both of these functions, but for
cross-compilation, the code assumes they are always available.
This patch adds explicit checks for the SPU target and disables
those functions for that target, just as is done with other checks.

However, the resulting source does not build, since the fallback (abort)
defines in internals.h cause compile warnings (made into errors due to
-Werror).  There are two problems:

- "variable set but not used" for some variables used as arguments to
  the backtrace_atomic_... routines.  Fixed by adding dummy uses of
  the arguments to the fallback definitions of those macros.

- "right-hand operand of comma expression has to effect" for two cases
  where code ignored the return value of __sync_bool_compare_and_swap
  with a fallback definition of (abort (), 1).

  I was unable to find a solution solely by modifying the fallback
  definition.  There doesn't appear to be a way to do so using regular
  macros.  Turning the fallback into an inline function doesn't work
  since it is a type-generic primitive.  I guess a statement expression
  might work, but I'm not sure if GNU extensions are OK here.

  So I ended up with actually adding (void) casts to the two places
  where this happens.  It seems to me explicitly indicating that it
  is OK to ignore the return value of __sync_bool_compare_and_swap
  in those places may be useful anyway.

  Of course I'd be happy for alternative suggestions how to fix this.

Tested on x86_64-linux and spu-elf.

OK for mainline?

Bye,
Ulrich
 

ChangeLog:

	* configure.ac: For spu-*-* targets, set libbacktrace_cv_sys_sync
	and libbacktrace_cv_sys_sync to no.
	* configure: Regenerate.
	* internals.h [!HAVE_ATOMIC_FUNCTIONS, !HAVE_SYNC_FUNCTIONS]
	(backtrace_atomic_load_pointer, backtrace_atomic_load_int,
	backtrace_atomic_store_pointer, backtrace_atomic_store_size_t,
	backtrace_atomic_store_int): Add dummy uses of arguments.
	* elf.c (backtrace_initialize): Explicitly cast unused return
	value of __sync_bool_compare_and_swap to void.
	* pecoff.c (backtrace_initialize): Likewise.

Index: libbacktrace/configure.ac
===================================================================
*** libbacktrace/configure.ac	(revision 227304)
--- libbacktrace/configure.ac	(working copy)
*************** AC_SUBST(PIC_FLAG)
*** 172,178 ****
  AC_CACHE_CHECK([__sync extensions],
  [libbacktrace_cv_sys_sync],
  [if test -n "${with_target_subdir}"; then
!    libbacktrace_cv_sys_sync=yes
   else
     AC_LINK_IFELSE(
       [AC_LANG_PROGRAM([int i;],
--- 172,181 ----
  AC_CACHE_CHECK([__sync extensions],
  [libbacktrace_cv_sys_sync],
  [if test -n "${with_target_subdir}"; then
!    case "${host}" in
!    spu-*-*) libbacktrace_cv_sys_sync=no ;;
!    *) libbacktrace_cv_sys_sync=yes ;;
!    esac
   else
     AC_LINK_IFELSE(
       [AC_LANG_PROGRAM([int i;],
*************** AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
*** 194,200 ****
  AC_CACHE_CHECK([__atomic extensions],
  [libbacktrace_cv_sys_atomic],
  [if test -n "${with_target_subdir}"; then
!    libbacktrace_cv_sys_atomic=yes
   else
     AC_LINK_IFELSE(
       [AC_LANG_PROGRAM([int i;],
--- 197,206 ----
  AC_CACHE_CHECK([__atomic extensions],
  [libbacktrace_cv_sys_atomic],
  [if test -n "${with_target_subdir}"; then
!    case "${host}" in
!    spu-*-*) libbacktrace_cv_sys_atomic=no ;;
!    *) libbacktrace_cv_sys_atomic=yes ;;
!    esac
   else
     AC_LINK_IFELSE(
       [AC_LANG_PROGRAM([int i;],
Index: libbacktrace/internal.h
===================================================================
*** libbacktrace/internal.h	(revision 227304)
--- libbacktrace/internal.h	(working copy)
*************** extern void backtrace_atomic_store_int (
*** 99,109 ****
  /* We have neither the sync nor the atomic functions.  These will
     never be called.  */
  
! #define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
! #define backtrace_atomic_load_int(p) (abort(), 0)
! #define backtrace_atomic_store_pointer(p, v) abort()
! #define backtrace_atomic_store_size_t(p, v) abort()
! #define backtrace_atomic_store_int(p, v) abort()
  
  #endif /* !defined (HAVE_SYNC_FUNCTIONS) */
  #endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
--- 99,109 ----
  /* We have neither the sync nor the atomic functions.  These will
     never be called.  */
  
! #define backtrace_atomic_load_pointer(p) ((void)(p), abort(), (void *) NULL)
! #define backtrace_atomic_load_int(p) ((void)(p), abort(), 0)
! #define backtrace_atomic_store_pointer(p, v) ((void)(p), (void)(v), abort())
! #define backtrace_atomic_store_size_t(p, v) ((void)(p), (void)(v), abort())
! #define backtrace_atomic_store_int(p, v) ((void)(p), (void)(v), abort())
  
  #endif /* !defined (HAVE_SYNC_FUNCTIONS) */
  #endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
Index: libbacktrace/elf.c
===================================================================
*** libbacktrace/elf.c	(revision 227304)
--- libbacktrace/elf.c	(working copy)
*************** backtrace_initialize (struct backtrace_s
*** 955,961 ****
        if (found_sym)
  	backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
        else
! 	__sync_bool_compare_and_swap (&state->syminfo_fn, NULL, elf_nosyms);
      }
  
    if (!state->threaded)
--- 955,962 ----
        if (found_sym)
  	backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
        else
! 	(void) __sync_bool_compare_and_swap (&state->syminfo_fn,
! 					     NULL, elf_nosyms);
      }
  
    if (!state->threaded)
Index: libbacktrace/pecoff.c
===================================================================
*** libbacktrace/pecoff.c	(revision 227304)
--- libbacktrace/pecoff.c	(working copy)
*************** backtrace_initialize (struct backtrace_s
*** 916,922 ****
        if (found_sym)
  	backtrace_atomic_store_pointer (&state->syminfo_fn, coff_syminfo);
        else
! 	__sync_bool_compare_and_swap (&state->syminfo_fn, NULL, coff_nosyms);
      }
  
    if (!state->threaded)
--- 916,923 ----
        if (found_sym)
  	backtrace_atomic_store_pointer (&state->syminfo_fn, coff_syminfo);
        else
! 	(void) __sync_bool_compare_and_swap (&state->syminfo_fn,
! 					     NULL, coff_nosyms);
      }
  
    if (!state->threaded)
-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com



More information about the Gcc-patches mailing list