mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-17 03:49:46 +08:00
ada456dcfe
Found by: find -name '*.h' |xargs grep -i 'attribute.*(([a-z]' For an example of the type of bugs this causes, try compiling this valid C11 program (it's valid because 'noreturn' is reserved for use in the user namespace unless you include <stdnoreturn.h>): $ cat foo.c #define noreturn __attribute__((noreturn)) #include <stdlib.h> $ gcc -c -o foo.o -Wall foo.c In file included from /usr/include/stdlib.h:11:0, from foo.c:2: foo.c:1:18: error: expected ')' before '__attribute__' #define noreturn __attribute__((noreturn)) ^ /usr/include/stdlib.h:66:28: error: expected ',' or ';' before ')' token _VOID _EXFUN(abort,(_VOID) _ATTRIBUTE ((noreturn))); ^ * libc/machine/spu/spu_timer_internal.h: Decorate attribute names with __, for namespace safety. * libc/machine/xscale/machine/profile.h: Likewise. * libc/include/stdlib.h: Likewise. * libc/include/_ansi.h: Likewise. * libc/include/sys/unistd.h: Likewise. * libc/sys/linux/linuxthreads/libc-symbols.h: Likewise. * libc/sys/linux/linuxthreads/internals.h: Likewise. * libc/sys/linux/machine/i386/weakalias.h: Likewise. * libc/sys/linux/machine/i386/dl-procinfo.h: Likewise. * libc/sys/linux/machine/i386/dl-machine.h: Likewise. * libc/sys/linux/libc-symbols.h: Likewise. * libc/sys/linux/iconv/gconv_charset.h: Likewise. * libc/sys/linux/include/resolv.h: Likewise. * libc/sys/linux/sys/unistd.h: Likewise. * libc/sys/linux/dl/atomicity.h: Likewise. * libc/sys/linux/dl/dynamic-link.h: Likewise. * libc/sys/linux/dl/ldsodefs.h: Likewise.
57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
/* Low-level functions for atomic operations. ix86 version, x >= 4.
|
|
Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA. */
|
|
|
|
#ifndef _ATOMICITY_H
|
|
#define _ATOMICITY_H 1
|
|
|
|
|
|
|
|
static inline uint32_t
|
|
__attribute__ ((__unused__))
|
|
exchange_and_add (volatile uint32_t *mem, uint32_t val)
|
|
{
|
|
register uint32_t result;
|
|
__asm__ __volatile__ ("lock; xaddl %0,%1"
|
|
: "=r" (result), "=m" (*mem) : "m" (val), "1" (*mem));
|
|
return result;
|
|
}
|
|
|
|
static inline void
|
|
__attribute__ ((__unused__))
|
|
atomic_add (volatile uint32_t *mem, int val)
|
|
{
|
|
__asm__ __volatile__ ("lock; addl %1,%0"
|
|
: "=m" (*mem) : "ir" (val), "m" (*mem));
|
|
}
|
|
|
|
static inline char
|
|
__attribute__ ((__unused__))
|
|
compare_and_swap (volatile long int *p, long int oldval, long int newval)
|
|
{
|
|
char ret;
|
|
long int readval;
|
|
|
|
__asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
|
|
: "=q" (ret), "=m" (*p), "=a" (readval)
|
|
: "r" (newval), "1" (*p), "a" (oldval));
|
|
return ret;
|
|
}
|
|
|
|
#endif /* atomicity.h */
|