Added the includes needed to build GNU's libio package. Tries to be glibc
compatible while cleaning them up and reflecting our standard header locations a bit more. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3031 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
c387fbc54b
commit
95fed0d3e1
132
src/kernel/libroot/posix/glibc/include/arch/x86/bits/byteswap.h
Normal file
132
src/kernel/libroot/posix/glibc/include/arch/x86/bits/byteswap.h
Normal file
@ -0,0 +1,132 @@
|
||||
/* Macros to swap the order of bytes in integer values.
|
||||
Copyright (C) 1997, 1998, 2000, 2002 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. */
|
||||
|
||||
#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
|
||||
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
|
||||
#endif
|
||||
|
||||
#ifndef _BITS_BYTESWAP_H
|
||||
#define _BITS_BYTESWAP_H 1
|
||||
|
||||
/* Swap bytes in 16 bit value. */
|
||||
#define __bswap_constant_16(x) \
|
||||
((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
|
||||
|
||||
#ifdef __GNUC__
|
||||
# if __GNUC__ >= 2
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned short int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
__v = __bswap_constant_16 (__x); \
|
||||
else \
|
||||
__asm__ ("rorw $8, %w0" \
|
||||
: "=r" (__v) \
|
||||
: "0" (__x) \
|
||||
: "cc"); \
|
||||
__v; }))
|
||||
# else
|
||||
/* This is better than nothing. */
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
|
||||
# endif
|
||||
#else
|
||||
static __inline unsigned short int
|
||||
__bswap_16 (unsigned short int __bsx)
|
||||
{
|
||||
return __bswap_constant_16 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Swap bytes in 32 bit value. */
|
||||
#define __bswap_constant_32(x) \
|
||||
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
||||
|
||||
#ifdef __GNUC__
|
||||
# if __GNUC__ >= 2
|
||||
/* To swap the bytes in a word the i486 processors and up provide the
|
||||
`bswap' opcode. On i386 we have to use three instructions. */
|
||||
# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
__v = __bswap_constant_32 (__x); \
|
||||
else \
|
||||
__asm__ ("rorw $8, %w0;" \
|
||||
"rorl $16, %0;" \
|
||||
"rorw $8, %w0" \
|
||||
: "=r" (__v) \
|
||||
: "0" (__x) \
|
||||
: "cc"); \
|
||||
__v; }))
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
__v = __bswap_constant_32 (__x); \
|
||||
else \
|
||||
__asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); \
|
||||
__v; }))
|
||||
# endif
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
|
||||
# endif
|
||||
#else
|
||||
static __inline unsigned int
|
||||
__bswap_32 (unsigned int __bsx)
|
||||
{
|
||||
return __bswap_constant_32 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
/* Swap bytes in 64 bit value. */
|
||||
#define __bswap_constant_64(x) \
|
||||
((((x) & 0xff00000000000000ull) >> 56) \
|
||||
| (((x) & 0x00ff000000000000ull) >> 40) \
|
||||
| (((x) & 0x0000ff0000000000ull) >> 24) \
|
||||
| (((x) & 0x000000ff00000000ull) >> 8) \
|
||||
| (((x) & 0x00000000ff000000ull) << 8) \
|
||||
| (((x) & 0x0000000000ff0000ull) << 24) \
|
||||
| (((x) & 0x000000000000ff00ull) << 40) \
|
||||
| (((x) & 0x00000000000000ffull) << 56))
|
||||
|
||||
# define __bswap_64(x) \
|
||||
(__extension__ \
|
||||
({ union { __extension__ unsigned long long int __ll; \
|
||||
unsigned long int __l[2]; } __w, __r; \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__r.__ll = __bswap_constant_64 (x); \
|
||||
else \
|
||||
{ \
|
||||
__w.__ll = (x); \
|
||||
__r.__l[0] = __bswap_32 (__w.__l[1]); \
|
||||
__r.__l[1] = __bswap_32 (__w.__l[0]); \
|
||||
} \
|
||||
__r.__ll; }))
|
||||
#endif
|
||||
|
||||
#endif /* _BITS_BYTESWAP_H */
|
@ -0,0 +1,7 @@
|
||||
/* i386 is little-endian. */
|
||||
|
||||
#ifndef _ENDIAN_H
|
||||
# error "Never use <bits/endian.h> directly; include <endian.h> instead."
|
||||
#endif
|
||||
|
||||
#define __BYTE_ORDER __LITTLE_ENDIAN
|
@ -0,0 +1,19 @@
|
||||
/* Copyright (C) 1999 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. */
|
||||
|
||||
#define __WORDSIZE 32
|
235
src/kernel/libroot/posix/glibc/include/arch/x86/config.h
Normal file
235
src/kernel/libroot/posix/glibc/include/arch/x86/config.h
Normal file
@ -0,0 +1,235 @@
|
||||
#if !defined __ASSEMBLER__ && !defined _ISOMAC && !defined __OPTIMIZE__
|
||||
# error "glibc cannot be compiled without optimization"
|
||||
#endif
|
||||
|
||||
/* Another evil option when it comes to compiling the C library is
|
||||
--ffast-math since it alters the ABI. */
|
||||
#if defined __FAST_MATH__ && !defined TEST_FAST_MATH
|
||||
# error "glibc must not be compiled with -ffast-math"
|
||||
#endif
|
||||
|
||||
/* Define if using GNU ld, with support for weak symbols in a.out,
|
||||
and for symbol set and warning messages extensions in a.out and ELF.
|
||||
This implies HAVE_WEAK_SYMBOLS; set by --with-gnu-ld. */
|
||||
#define HAVE_GNU_LD 1
|
||||
|
||||
/* Define if using ELF, which supports weak symbols.
|
||||
This implies HAVE_ASM_WEAK_DIRECTIVE and NO_UNDERSCORES; set by
|
||||
--with-elf. */
|
||||
#define HAVE_ELF 1
|
||||
|
||||
/* Define if using XCOFF. Set by --with-xcoff. */
|
||||
#undef HAVE_XCOFF
|
||||
|
||||
/* Define if C symbols are asm symbols. Don't define if C symbols
|
||||
have a `_' prepended to make the asm symbol. */
|
||||
#define NO_UNDERSCORES 1
|
||||
|
||||
/* Define if weak symbols are available via the `.weak' directive. */
|
||||
#define HAVE_ASM_WEAK_DIRECTIVE 1
|
||||
|
||||
/* Define if weak symbols are available via the `.weakext' directive. */
|
||||
#undef HAVE_ASM_WEAKEXT_DIRECTIVE
|
||||
|
||||
/* Define to the assembler line separator character for multiple
|
||||
assembler instructions per line. Default is `;' */
|
||||
#undef ASM_LINE_SEP
|
||||
|
||||
/* Define if not using ELF, but `.init' and `.fini' sections are available. */
|
||||
#undef HAVE_INITFINI
|
||||
|
||||
/* Define if __attribute__((section("foo"))) puts quotes around foo. */
|
||||
#define HAVE_SECTION_QUOTES 1
|
||||
|
||||
/* Define if using the GNU assembler, gas. */
|
||||
#define HAVE_GNU_AS 1
|
||||
|
||||
/* Define if the assembler supports the `.set' directive. */
|
||||
#define HAVE_ASM_SET_DIRECTIVE 1
|
||||
|
||||
/* Define to the name of the assembler's directive for
|
||||
declaring a symbol global (default `.globl'). */
|
||||
#define ASM_GLOBAL_DIRECTIVE .globl
|
||||
|
||||
/* Define to the prefix before `object' or `function' in the
|
||||
assembler's `.type' directive, if it has one. */
|
||||
#undef ASM_TYPE_DIRECTIVE_PREFIX
|
||||
|
||||
/* Define a symbol_name as a global .symbol_name for ld. */
|
||||
#undef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
|
||||
/* Define if the assembler generates debugging information directly. */
|
||||
#undef HAVE_CPP_ASM_DEBUGINFO
|
||||
|
||||
/* Define if _Unwind_Find_FDE should be exported from glibc. */
|
||||
#undef EXPORT_UNWIND_FIND_FDE
|
||||
|
||||
/* Define to use GNU libio instead of GNU stdio.
|
||||
This is defined by configure under --enable-libio. */
|
||||
#define USE_IN_LIBIO 1
|
||||
|
||||
/* Define if using ELF and the assembler supports the `.previous'
|
||||
directive. */
|
||||
#define HAVE_ASM_PREVIOUS_DIRECTIVE 1
|
||||
|
||||
/* Define if using ELF and the assembler supports the `.popsection'
|
||||
directive. */
|
||||
#undef HAVE_ASM_POPSECTION_DIRECTIVE
|
||||
|
||||
/* Define if versioning of the library is wanted. */
|
||||
#undef DO_VERSIONING
|
||||
|
||||
/* Defined to the oldest ABI we support, like 2.1. */
|
||||
#undef GLIBC_OLDEST_ABI
|
||||
|
||||
/* Define if static NSS modules are wanted. */
|
||||
#undef DO_STATIC_NSS
|
||||
|
||||
/* Define if gcc uses DWARF2 unwind information for exception support. */
|
||||
#define HAVE_DWARF2_UNWIND_INFO 1
|
||||
|
||||
/* Define if gcc uses DWARF2 unwind information for exception support
|
||||
with static variable. */
|
||||
#define HAVE_DWARF2_UNWIND_INFO_STATIC 1
|
||||
|
||||
/* Define if the compiler supports __builtin_expect. */
|
||||
#undef HAVE_BUILTIN_EXPECT
|
||||
|
||||
/* Define if the compiler supports __builtin_memset. */
|
||||
#undef HAVE_BUILTIN_MEMSET
|
||||
|
||||
/* Define if the __thread keyword is supported. */
|
||||
#undef HAVE___THREAD
|
||||
|
||||
/* Define if the compiler supports __attribute__((tls_model(""))). */
|
||||
#undef HAVE_TLS_MODEL_ATTRIBUTE
|
||||
|
||||
/* Define if the regparm attribute shall be used for local functions
|
||||
(gcc on ix86 only). */
|
||||
#define USE_REGPARMS 1
|
||||
|
||||
/* Defined on PowerPC if the GCC being used has a problem with clobbering
|
||||
certain registers (CR0, MQ, CTR, LR) in asm statements. */
|
||||
#undef BROKEN_PPC_ASM_CR0
|
||||
|
||||
/* Defined on SPARC if ld doesn't handle R_SPARC_WDISP22 against .hidden
|
||||
symbol. sysdeps/sparc/sparc32/elf/configure. */
|
||||
#undef BROKEN_SPARC_WDISP22
|
||||
|
||||
/* Define if the linker supports the -z combreloc option. */
|
||||
#undef HAVE_Z_COMBRELOC
|
||||
|
||||
/* Define if the assembler supported .protected. */
|
||||
#undef HAVE_PROTECTED
|
||||
|
||||
/* Define if the assembler supported .hidden. */
|
||||
#undef HAVE_HIDDEN
|
||||
|
||||
/* Define if the compiler supports __attribute__ ((visibility (...))). */
|
||||
#undef HAVE_VISIBILITY_ATTRIBUTE
|
||||
|
||||
/* Define if the compiler doesn't support __attribute__ ((visibility (...)))
|
||||
together with __asm__ redirection properly. */
|
||||
#undef HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
||||
|
||||
/* Define if the compiler doesn't support __attribute__ ((alias (...)))
|
||||
together with __asm__ redirection properly. */
|
||||
#undef HAVE_BROKEN_ALIAS_ATTRIBUTE
|
||||
|
||||
/* Define if _rtld_local structure should be forced into .sdata section. */
|
||||
#undef HAVE_SDATA_SECTION
|
||||
|
||||
/* Define if binutils support TLS handling. */
|
||||
#undef HAVE_TLS_SUPPORT
|
||||
|
||||
/* Define if the linker supports .preinit_array/.init_array/.fini_array
|
||||
sections. */
|
||||
#undef HAVE_INITFINI_ARRAY
|
||||
|
||||
/* Define if the access to static and hidden variables is position independent
|
||||
and does not need relocations. */
|
||||
#undef PI_STATIC_AND_HIDDEN
|
||||
|
||||
/* Define this to disable the `hidden_proto' et al macros in
|
||||
include/libc-symbols.h that avoid PLT slots in the shared objects. */
|
||||
#undef NO_HIDDEN
|
||||
|
||||
|
||||
/* Defined to some form of __attribute__ ((...)) if the compiler supports
|
||||
a different, more efficient calling convention. */
|
||||
#if defined USE_REGPARMS && !defined PROF && !defined __BOUNDED_POINTERS__
|
||||
# define internal_function __attribute__ ((regparm (3), stdcall))
|
||||
#endif
|
||||
|
||||
/* Linux specific: minimum supported kernel version. */
|
||||
#undef __LINUX_KERNEL_VERSION
|
||||
|
||||
/* Override abi-tags ABI version if necessary. */
|
||||
#undef __ABI_TAG_VERSION
|
||||
|
||||
/* An extension in gcc 2.96 and up allows the subtraction of two
|
||||
local labels. */
|
||||
#undef HAVE_SUBTRACT_LOCAL_LABELS
|
||||
|
||||
/* bash 2.0 introduced the _XXX_GNU_nonoption_argv_flags_ variable to help
|
||||
getopt determine whether a parameter is a flag or not. This features
|
||||
was disabled later since it caused trouble. We are by default therefore
|
||||
disabling the support as well. */
|
||||
#undef USE_NONOPTION_FLAGS
|
||||
|
||||
/* Mach/Hurd specific: define if mig supports the `retcode' keyword. */
|
||||
#undef HAVE_MIG_RETCODE
|
||||
|
||||
/* Mach specific: define if the `host_page_size' RPC is available. */
|
||||
#undef HAVE_HOST_PAGE_SIZE
|
||||
|
||||
/* Mach/i386 specific: define if the `i386_io_perm_*' RPCs are available. */
|
||||
#undef HAVE_I386_IO_PERM_MODIFY
|
||||
|
||||
/* Mach/i386 specific: define if the `i386_set_gdt' RPC is available. */
|
||||
#undef HAVE_I386_SET_GDT
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
#ifndef _LIBC
|
||||
|
||||
/* These symbols might be defined by some sysdeps configures.
|
||||
They are used only in miscellaneous generator programs, not
|
||||
in compiling libc itself. */
|
||||
|
||||
/* sysdeps/generic/configure.in */
|
||||
#undef HAVE_PSIGNAL
|
||||
|
||||
/* sysdeps/unix/configure.in */
|
||||
#define HAVE_STRERROR
|
||||
|
||||
/* sysdeps/unix/common/configure.in */
|
||||
#undef HAVE_SYS_SIGLIST
|
||||
#undef HAVE__SYS_SIGLIST
|
||||
#undef HAVE__CTYPE_
|
||||
#undef HAVE___CTYPE_
|
||||
#undef HAVE___CTYPE
|
||||
#undef HAVE__CTYPE__
|
||||
#undef HAVE__CTYPE
|
||||
#undef HAVE__LOCP
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
#ifdef _LIBC
|
||||
|
||||
/* The zic and zdump programs need these definitions. */
|
||||
|
||||
#define HAVE_STRERROR 1
|
||||
|
||||
/* The locale code needs these definitions. */
|
||||
|
||||
#define HAVE_REGEX 1
|
||||
|
||||
//#define HAVE_MMAP 1
|
||||
#undef HAVE_MMAP
|
||||
|
||||
#endif
|
29
src/kernel/libroot/posix/glibc/include/arch/x86/gmp-mparam.h
Normal file
29
src/kernel/libroot/posix/glibc/include/arch/x86/gmp-mparam.h
Normal file
@ -0,0 +1,29 @@
|
||||
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||
|
||||
Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
The GNU MP Library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Library General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The GNU MP 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 Library General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA. */
|
||||
|
||||
#define BITS_PER_MP_LIMB 32
|
||||
#define BYTES_PER_MP_LIMB 4
|
||||
#define BITS_PER_LONGINT 32
|
||||
#define BITS_PER_INT 32
|
||||
#define BITS_PER_SHORTINT 16
|
||||
#define BITS_PER_CHAR 8
|
||||
|
||||
#define IEEE_DOUBLE_BIG_ENDIAN 0
|
280
src/kernel/libroot/posix/glibc/include/bits/libc-lock.h
Normal file
280
src/kernel/libroot/posix/glibc/include/bits/libc-lock.h
Normal file
@ -0,0 +1,280 @@
|
||||
/* libc-internal interface for mutex locks. BeOS version.
|
||||
Copyright (C) 1998 Be Inc.
|
||||
*/
|
||||
|
||||
#ifndef _BITS_LIBC_LOCK_H
|
||||
#define _BITS_LIBC_LOCK_H 1
|
||||
|
||||
#include <OS.h>
|
||||
#include <Errors.h>
|
||||
|
||||
|
||||
/* Helper definitions and prototypes. */
|
||||
|
||||
/* Atomic operations. */
|
||||
|
||||
extern char _single_threaded;
|
||||
|
||||
#ifdef __INTEL__
|
||||
|
||||
// ToDo: this does not belong here!
|
||||
|
||||
static inline int
|
||||
__compare_and_swap (volatile int32 *p, int oldval, int newval)
|
||||
{
|
||||
char ret;
|
||||
long int readval;
|
||||
|
||||
__asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
|
||||
: "=q" (ret), "=m" (*p), "=a" (readval)
|
||||
: "r" (newval), "m" (*p), "a" (oldval));
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Mutex type. */
|
||||
typedef struct __libc_lock_t {
|
||||
volatile int32 count;
|
||||
sem_id sem;
|
||||
thread_id owner;
|
||||
int owner_count;
|
||||
} __libc_lock_t;
|
||||
|
||||
#define __LIBC_LOCK_INITIALIZER { 0, 0, 0, 0 }
|
||||
#define _LIBC_LOCK_RECURSIVE_INITIALIZER { 0, 0, 0, 0 }
|
||||
|
||||
/* Type for object to ensure once-only execution. */
|
||||
typedef struct {
|
||||
int __initialized;
|
||||
__libc_lock_t __lock;
|
||||
} __libc_once_t;
|
||||
|
||||
/* Define a lock variable NAME with storage class CLASS. The lock must be
|
||||
initialized with __libc_lock_init before it can be used (or define it
|
||||
with __libc_lock_define_initialized, below). Use `extern' for CLASS to
|
||||
declare a lock defined in another module. In public structure
|
||||
definitions you must use a pointer to the lock structure (i.e., NAME
|
||||
begins with a `*'), because its storage size will not be known outside
|
||||
of libc. */
|
||||
#define __libc_lock_define(CLASS,NAME) \
|
||||
CLASS __libc_lock_t NAME;
|
||||
|
||||
#define __libc_lock_define_recursive(CLASS, NAME) \
|
||||
CLASS __libc_lock_t NAME;
|
||||
|
||||
/* Define an initialized lock variable NAME with storage class CLASS. */
|
||||
#define __libc_lock_define_initialized(CLASS,NAME) \
|
||||
CLASS __libc_lock_t NAME = __LIBC_LOCK_INITIALIZER;
|
||||
|
||||
/* Define an initialized recursive lock variable NAME with storage
|
||||
class CLASS. */
|
||||
#define __libc_lock_define_initialized_recursive(CLASS,NAME) \
|
||||
__libc_lock_define_initialized (CLASS, NAME)
|
||||
|
||||
/* Initialize the named lock variable, leaving it in a consistent, unlocked
|
||||
state. */
|
||||
#define __libc_lock_init(NAME) \
|
||||
(NAME).count = (NAME).sem = (NAME).owner_count = (NAME).owner = 0 \
|
||||
|
||||
/* Same as last but this time we initialize a recursive mutex. */
|
||||
#define __libc_lock_init_recursive(NAME) \
|
||||
__libc_lock_init(NAME)
|
||||
|
||||
/* Finalize the named lock variable, which must be locked. It cannot be
|
||||
used again until __libc_lock_init is called again on it. This must be
|
||||
called on a lock variable before the containing storage is reused. */
|
||||
#define __libc_lock_fini(NAME) \
|
||||
do { \
|
||||
if ((NAME).sem) \
|
||||
delete_sem((NAME).sem); \
|
||||
} while(0)
|
||||
|
||||
/* Finalize recursive named lock. */
|
||||
#define __libc_lock_fini_recursive(NAME) __libc_lock_fini(NAME)
|
||||
|
||||
/* Lock the named lock variable. */
|
||||
#define __libc_lock_lock(NAME) \
|
||||
do { \
|
||||
if (!_single_threaded) { \
|
||||
long err; \
|
||||
long old = atomic_add(&(NAME).count, 1); \
|
||||
if (old > 0) { \
|
||||
if ((NAME).sem == 0) { \
|
||||
sem_id __new_sem = create_sem (0, "libc:" #NAME); \
|
||||
if (!__compare_and_swap ((volatile int32 *)&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
do { \
|
||||
err = acquire_sem((NAME).sem); \
|
||||
} while (err == B_INTERRUPTED); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* Lock the recursive named lock variable. */
|
||||
#define __libc_lock_lock_recursive(NAME) \
|
||||
do { \
|
||||
if (!_single_threaded) { \
|
||||
thread_id owner = find_thread(NULL); \
|
||||
long old, err = B_OK; \
|
||||
if (owner == (NAME).owner) { \
|
||||
(NAME).owner_count++; \
|
||||
break; \
|
||||
} \
|
||||
old = atomic_add(&(NAME).count, 1); \
|
||||
if (old > 0) { \
|
||||
if ((NAME).sem == 0) { \
|
||||
sem_id __new_sem = create_sem (0, "libc:" #NAME); \
|
||||
if (!__compare_and_swap ((volatile int32 *)&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
do { \
|
||||
err = acquire_sem((NAME).sem); \
|
||||
} while (err == B_INTERRUPTED); \
|
||||
} \
|
||||
if (err == B_OK) { \
|
||||
(NAME).owner = owner; \
|
||||
(NAME).owner_count = 1; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#if 0
|
||||
/* Try to lock the named lock variable. */
|
||||
#define __libc_lock_trylock(NAME) \
|
||||
({ \
|
||||
int __result = EBUSY; \
|
||||
status_t err; \
|
||||
if (!(NAME).sem) { \
|
||||
__libc_sem_id __new_sem = create_sem (1, "libc:" #NAME); \
|
||||
if (!__compare_and_swap (&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
do { \
|
||||
err = acquire_sem_etc ((NAME).sem, 1, B_TIMEOUT, 0); \
|
||||
if (err == B_OK) { \
|
||||
NAME.__count = 1; \
|
||||
__result = 0; \
|
||||
} \
|
||||
} while (err == B_INTERRUPTED); \
|
||||
__result; })
|
||||
|
||||
/* Try to lock the recursive named lock variable. */
|
||||
#define __libc_lock_trylock_recursive(NAME) \
|
||||
({ \
|
||||
__libc_thread_id __me = find_thread (NULL); \
|
||||
int __result = EBUSY; \
|
||||
status_t err; \
|
||||
if (!(NAME).sem) { \
|
||||
__libc_sem_id __new_sem = create_sem (1, "libc:" #NAME); \
|
||||
if (!__compare_and_swap (&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
if ((NAME).__owner == __me) {\
|
||||
++(NAME).__count; \
|
||||
__result = 0; \
|
||||
} else \
|
||||
do { \
|
||||
err = acquire_sem_etc ((NAME).sem, 1, B_TIMEOUT, 0); \
|
||||
if (err == B_OK) { \
|
||||
(NAME).__owner = __me; \
|
||||
(NAME).__count = 1; \
|
||||
__result = 0; \
|
||||
} \
|
||||
} while (err == B_INTERRUPTED); \
|
||||
__result; })
|
||||
#endif
|
||||
|
||||
/* Unlock the named lock variable. */
|
||||
#define __libc_lock_unlock(NAME) \
|
||||
do { \
|
||||
if (!_single_threaded) { \
|
||||
if (atomic_add(&(NAME).count, -1) > 1) { \
|
||||
if ((NAME).sem == 0) { \
|
||||
sem_id __new_sem = create_sem (0, "libc:" #NAME); \
|
||||
if (!__compare_and_swap ((volatile int32 *)&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
release_sem((NAME).sem); \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/* Unlock the recursive named lock variable. */
|
||||
#define __libc_lock_unlock_recursive(NAME) \
|
||||
do { \
|
||||
if (!_single_threaded) { \
|
||||
(NAME).owner_count--; \
|
||||
if ((NAME).owner_count == 0) { \
|
||||
(NAME).owner = 0; \
|
||||
if (atomic_add(&(NAME).count, -1) > 1) { \
|
||||
if ((NAME).sem == 0) { \
|
||||
sem_id __new_sem = create_sem (0, "libc:" #NAME); \
|
||||
if (!__compare_and_swap ((volatile int32 *)&(NAME).sem, 0, __new_sem)) \
|
||||
/* We do not need the semaphore. */ \
|
||||
delete_sem (__new_sem); \
|
||||
} \
|
||||
release_sem((NAME).sem); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
|
||||
/* Define once control variable. */
|
||||
#define __libc_once_define(CLASS, NAME) \
|
||||
CLASS __libc_once_t NAME = { 0, __LIBC_LOCK_INITIALIZER }
|
||||
|
||||
/* Call handler iff the first call. */
|
||||
#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
|
||||
do { \
|
||||
if (! ONCE_CONTROL.__initialized) \
|
||||
{ \
|
||||
__libc_lock_lock (ONCE_CONTROL.__lock); \
|
||||
if (! ONCE_CONTROL.__initialized) \
|
||||
{ \
|
||||
/* Still not initialized, then call the function. */ \
|
||||
INIT_FUNCTION (); \
|
||||
ONCE_CONTROL.__initialized = 1; \
|
||||
} \
|
||||
__libc_lock_unlock (ONCE_CONTROL.__lock); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* Start critical region with cleanup. */
|
||||
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
|
||||
|
||||
/* End critical region with cleanup. */
|
||||
#define __libc_cleanup_region_end(DOIT) \
|
||||
|
||||
/* Sometimes we have to exit the block in the middle. */
|
||||
#define __libc_cleanup_end(DOIT) \
|
||||
|
||||
/* Create thread-specific key. */
|
||||
#define __libc_key_create(KEY, DESTRUCTOR) \
|
||||
1
|
||||
|
||||
/* Get thread-specific data. */
|
||||
#define __libc_getspecific(KEY) \
|
||||
0
|
||||
|
||||
/* Set thread-specific data. */
|
||||
#define __libc_setspecific(KEY, VALUE) \
|
||||
0
|
||||
|
||||
|
||||
/* Register handlers to execute before and after `fork'. */
|
||||
#define __libc_atfork(PREPARE, PARENT, CHILD) \
|
||||
0
|
||||
|
||||
#endif /* bits/libc-lock.h */
|
||||
|
69
src/kernel/libroot/posix/glibc/include/bits/libc-tsd.h
Normal file
69
src/kernel/libroot/posix/glibc/include/bits/libc-tsd.h
Normal file
@ -0,0 +1,69 @@
|
||||
/* libc-internal interface for thread-specific data. Stub or TLS version.
|
||||
Copyright (C) 1998,2001,02 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 _GENERIC_BITS_LIBC_TSD_H
|
||||
#define _GENERIC_BITS_LIBC_TSD_H 1
|
||||
|
||||
/* This file defines the following macros for accessing a small fixed
|
||||
set of thread-specific `void *' data used only internally by libc.
|
||||
|
||||
__libc_tsd_define(CLASS, KEY) -- Define or declare a `void *' datum
|
||||
for KEY. CLASS can be `static' for
|
||||
keys used in only one source file,
|
||||
empty for global definitions, or
|
||||
`extern' for global declarations.
|
||||
__libc_tsd_address(KEY) -- Return the `void **' pointing to
|
||||
the current thread's datum for KEY.
|
||||
__libc_tsd_get(KEY) -- Return the `void *' datum for KEY.
|
||||
__libc_tsd_set(KEY, VALUE) -- Set the datum for KEY to VALUE.
|
||||
|
||||
The set of available KEY's will usually be provided as an enum,
|
||||
and contains (at least):
|
||||
_LIBC_TSD_KEY_MALLOC
|
||||
_LIBC_TSD_KEY_DL_ERROR
|
||||
_LIBC_TSD_KEY_RPC_VARS
|
||||
All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
|
||||
Some implementations may not provide any enum at all and instead
|
||||
using string pasting in the macros. */
|
||||
|
||||
#include <TLS.h>
|
||||
|
||||
/* When full support for __thread variables is available, this interface is
|
||||
just a trivial wrapper for it. Without TLS, this is the generic/stub
|
||||
implementation for wholly single-threaded systems.
|
||||
|
||||
We don't define an enum for the possible key values, because the KEYs
|
||||
translate directly into variables by macro magic. */
|
||||
|
||||
#if USE___THREAD
|
||||
# define __libc_tsd_define(CLASS, KEY) \
|
||||
CLASS __thread void *__libc_tsd_##KEY attribute_tls_model_ie;
|
||||
|
||||
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY)
|
||||
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY)
|
||||
# define __libc_tsd_set(KEY, VALUE) (__libc_tsd_##KEY = (VALUE))
|
||||
#else
|
||||
# define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data;
|
||||
|
||||
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY##_data)
|
||||
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY##_data)
|
||||
# define __libc_tsd_set(KEY, VALUE) (__libc_tsd_##KEY##_data = (VALUE))
|
||||
#endif
|
||||
|
||||
#endif /* bits/libc-tsd.h */
|
49
src/kernel/libroot/posix/glibc/include/bits/stdio-lock.h
Normal file
49
src/kernel/libroot/posix/glibc/include/bits/stdio-lock.h
Normal file
@ -0,0 +1,49 @@
|
||||
/* Thread package specific definitions of stream lock type. Generic version.
|
||||
Copyright (C) 2000, 2001, 2002 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 _BITS_STDIO_LOCK_H
|
||||
#define _BITS_STDIO_LOCK_H 1
|
||||
|
||||
#include <bits/libc-lock.h>
|
||||
|
||||
__libc_lock_define_recursive (typedef, _IO_lock_t)
|
||||
|
||||
/* We need recursive (counting) mutexes. */
|
||||
#ifdef _LIBC_LOCK_RECURSIVE_INITIALIZER
|
||||
# define _IO_lock_initializer _LIBC_LOCK_RECURSIVE_INITIALIZER
|
||||
#elif _IO_MTSAFE_IO
|
||||
#error libio needs recursive mutexes for _IO_MTSAFE_IO
|
||||
#endif
|
||||
|
||||
#define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
|
||||
#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name)
|
||||
#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name)
|
||||
#define _IO_lock_trylock(_name) __libc_lock_trylock_recursive (_name)
|
||||
#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name)
|
||||
|
||||
|
||||
#define _IO_cleanup_region_start(_fct, _fp) \
|
||||
__libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp)
|
||||
#define _IO_cleanup_region_start_noarg(_fct) \
|
||||
__libc_cleanup_region_start (1, _fct, NULL)
|
||||
#define _IO_cleanup_region_end(_doit) \
|
||||
__libc_cleanup_region_end (_doit)
|
||||
|
||||
|
||||
#endif /* bits/stdio-lock.h */
|
1
src/kernel/libroot/posix/glibc/include/bits/stdio_lim.h
Normal file
1
src/kernel/libroot/posix/glibc/include/bits/stdio_lim.h
Normal file
@ -0,0 +1 @@
|
||||
#include <stdio.h>
|
24
src/kernel/libroot/posix/glibc/include/bits/sys_errlist.h
Normal file
24
src/kernel/libroot/posix/glibc/include/bits/sys_errlist.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* Declare sys_errlist and sys_nerr, or don't. Don't version.
|
||||
Copyright (C) 2002 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 _STDIO_H
|
||||
# error "Never include <bits/sys_errlist.h> directly; use <stdio.h> instead."
|
||||
#endif
|
||||
|
||||
/* sys_errlist and sys_nerr are deprecated. Use strerror instead. */
|
191
src/kernel/libroot/posix/glibc/include/bits/types.h
Normal file
191
src/kernel/libroot/posix/glibc/include/bits/types.h
Normal file
@ -0,0 +1,191 @@
|
||||
/* bits/types.h -- definitions of __*_t types underlying *_t types.
|
||||
Copyright (C) 2002 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. */
|
||||
|
||||
/*
|
||||
* Never include this file directly; use <sys/types.h> instead.
|
||||
*/
|
||||
|
||||
#ifndef _BITS_TYPES_H
|
||||
#define _BITS_TYPES_H 1
|
||||
|
||||
#include <features.h>
|
||||
#include <bits/wordsize.h>
|
||||
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
|
||||
/* Convenience types. */
|
||||
typedef unsigned char __u_char;
|
||||
typedef unsigned short int __u_short;
|
||||
typedef unsigned int __u_int;
|
||||
typedef unsigned long int __u_long;
|
||||
|
||||
/* Fixed-size types, underlying types depend on word size and compiler. */
|
||||
typedef signed char __int8_t;
|
||||
typedef unsigned char __uint8_t;
|
||||
typedef signed short int __int16_t;
|
||||
typedef unsigned short int __uint16_t;
|
||||
typedef signed int __int32_t;
|
||||
typedef unsigned int __uint32_t;
|
||||
#if __WORDSIZE == 64
|
||||
typedef signed long int __int64_t;
|
||||
typedef unsigned long int __uint64_t;
|
||||
#elif defined __GLIBC_HAVE_LONG_LONG
|
||||
__extension__ typedef signed long long int __int64_t;
|
||||
__extension__ typedef unsigned long long int __uint64_t;
|
||||
#endif
|
||||
|
||||
/* quad_t is also 64 bits, but is traditionally defined as `long long'
|
||||
even when `long' is also 64 bits. */
|
||||
#ifdef __GLIBC_HAVE_LONG_LONG
|
||||
__extension__ typedef long long int __quad_t;
|
||||
__extension__ typedef unsigned long long int __u_quad_t;
|
||||
#elif __WORDSIZE == 64
|
||||
typedef long int __quad_t;
|
||||
typedef unsigned long int __u_quad_t;
|
||||
#else
|
||||
typedef struct
|
||||
{
|
||||
long __val[2];
|
||||
} __quad_t;
|
||||
typedef struct
|
||||
{
|
||||
__u_long __val[2];
|
||||
} __u_quad_t;
|
||||
#endif
|
||||
|
||||
|
||||
/* The machine-dependent file <bits/typesizes.h> defines __*_T_TYPE
|
||||
macros for each of the OS types we define below. The definitions
|
||||
of those macros must use the following macros for underlying types.
|
||||
We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
|
||||
variants of each of the following integer types on this machine.
|
||||
|
||||
16 -- "natural" 16-bit type (always short)
|
||||
32 -- "natural" 32-bit type (always int)
|
||||
64 -- "natural" 64-bit type (long or long long)
|
||||
LONG32 -- 32-bit type, traditionally long
|
||||
QUAD -- 64-bit type, always long long
|
||||
WORD -- natural type of __WORDSIZE bits (int or long)
|
||||
LONGWORD -- type of __WORDSIZE bits, traditionally long
|
||||
|
||||
We distinguish WORD/LONGWORD, 32/LONG32, and 64/QUAD so that the
|
||||
conventional uses of `long' or `long long' type modifiers match the
|
||||
types we define, even when a less-adorned type would be the same size.
|
||||
This matters for (somewhat) portably writing printf/scanf formats for
|
||||
these types, where using the appropriate l or ll format modifiers can
|
||||
make the typedefs and the formats match up across all GNU platforms. If
|
||||
we used `long' when it's 64 bits where `long long' is expected, then the
|
||||
compiler would warn about the formats not matching the argument types,
|
||||
and the programmer changing them to shut up the compiler would break the
|
||||
program's portability.
|
||||
|
||||
Here we assume what is presently the case in all the GCC configurations
|
||||
we support: long long is always 64 bits, long is always word/address size,
|
||||
and int is always 32 bits. */
|
||||
|
||||
#define __S16_TYPE short int
|
||||
#define __U16_TYPE unsigned short int
|
||||
#define __S32_TYPE int
|
||||
#define __U32_TYPE unsigned int
|
||||
#define __SLONGWORD_TYPE long int
|
||||
#define __ULONGWORD_TYPE unsigned long int
|
||||
#define __SQUAD_TYPE long long int
|
||||
#define __UQUAD_TYPE unsigned long long int
|
||||
#if __WORDSIZE == 32
|
||||
# define __SWORD_TYPE int
|
||||
# define __UWORD_TYPE unsigned int
|
||||
# define __SLONG32_TYPE long int
|
||||
# define __ULONG32_TYPE unsigned long int
|
||||
# define __S64_TYPE __quad_t
|
||||
# define __U64_TYPE __u_quad_t
|
||||
#elif __WORDSIZE == 64
|
||||
# define __SWORD_TYPE long int
|
||||
# define __UWORD_TYPE unsigned long int
|
||||
# define __SLONG32_TYPE int
|
||||
# define __ULONG32_TYPE unsigned int
|
||||
# define __S64_TYPE long int
|
||||
# define __U64_TYPE unsigned long int
|
||||
#else
|
||||
# error
|
||||
#endif
|
||||
#include <bits/typesizes.h> /* Defines __*_T_TYPE macros. */
|
||||
|
||||
|
||||
typedef __DEV_T_TYPE __dev_t; /* Type of device numbers. */
|
||||
typedef __UID_T_TYPE __uid_t; /* Type of user identifications. */
|
||||
typedef __GID_T_TYPE __gid_t; /* Type of group identifications. */
|
||||
typedef __INO_T_TYPE __ino_t; /* Type of file serial numbers. */
|
||||
typedef __INO64_T_TYPE __ino64_t; /* Type of file serial numbers (LFS). */
|
||||
typedef __MODE_T_TYPE __mode_t; /* Type of file attribute bitmasks. */
|
||||
typedef __NLINK_T_TYPE __nlink_t; /* Type of file link counts. */
|
||||
typedef __OFF_T_TYPE __off_t; /* Type of file sizes and offsets. */
|
||||
typedef __OFF64_T_TYPE __off64_t; /* Type of file sizes and offsets (LFS). */
|
||||
typedef __PID_T_TYPE __pid_t; /* Type of process identifications. */
|
||||
typedef __FSID_T_TYPE __fsid_t; /* Type of file system IDs. */
|
||||
typedef __CLOCK_T_TYPE __clock_t; /* Type of CPU usage counts. */
|
||||
typedef __RLIM_T_TYPE __rlim_t; /* Type for resource measurement. */
|
||||
typedef __RLIM64_T_TYPE __rlim64_t; /* Type for resource measurement (LFS). */
|
||||
typedef __ID_T_TYPE __id_t; /* General type for IDs. */
|
||||
typedef __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
|
||||
typedef __USECONDS_T_TYPE __useconds_t; /* Count of microseconds. */
|
||||
typedef __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds. */
|
||||
|
||||
typedef __DADDR_T_TYPE __daddr_t; /* The type of a disk address. */
|
||||
typedef __SWBLK_T_TYPE __swblk_t; /* Type of a swap block maybe? */
|
||||
typedef __KEY_T_TYPE __key_t; /* Type of an IPC key */
|
||||
|
||||
/* Clock ID used in clock and timer functions. */
|
||||
typedef __CLOCKID_T_TYPE __clockid_t;
|
||||
|
||||
/* Timer ID returned by `timer_create'. */
|
||||
typedef __TIMER_T_TYPE __timer_t;
|
||||
|
||||
/* Type to represent block size. */
|
||||
typedef __BLKSIZE_T_TYPE __blksize_t;
|
||||
|
||||
/* Types from the Large File Support interface. */
|
||||
|
||||
/* Type to count number of disk blocks. */
|
||||
typedef __BLKCNT_T_TYPE __blkcnt_t;
|
||||
typedef __BLKCNT64_T_TYPE __blkcnt64_t;
|
||||
|
||||
/* Type to count file system blocks. */
|
||||
typedef __FSBLKCNT_T_TYPE __fsblkcnt_t;
|
||||
typedef __FSBLKCNT64_T_TYPE __fsblkcnt64_t;
|
||||
|
||||
/* Type to count file system nodes. */
|
||||
typedef __FSFILCNT_T_TYPE __fsfilcnt_t;
|
||||
typedef __FSFILCNT64_T_TYPE __fsfilcnt64_t;
|
||||
|
||||
|
||||
/* These few don't really vary by system, they always correspond
|
||||
to one of the other defined types. */
|
||||
typedef __SWORD_TYPE __ssize_t; /* Type of a byte count, or error. */
|
||||
typedef __off64_t __loff_t; /* Type of file sizes and offsets (LFS). */
|
||||
typedef __quad_t *__qaddr_t;
|
||||
typedef char *__caddr_t;
|
||||
|
||||
/* Duplicates info from stdint.h but this is used in unistd.h. */
|
||||
typedef __SWORD_TYPE __intptr_t;
|
||||
|
||||
/* Duplicate info from sys/socket.h. */
|
||||
typedef __U32_TYPE __socklen_t;
|
||||
|
||||
#endif /* bits/types.h */
|
65
src/kernel/libroot/posix/glibc/include/bits/typesizes.h
Normal file
65
src/kernel/libroot/posix/glibc/include/bits/typesizes.h
Normal file
@ -0,0 +1,65 @@
|
||||
/* bits/typesizes.h -- underlying types for *_t. Generic version.
|
||||
Copyright (C) 2002 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 _BITS_TYPES_H
|
||||
# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
|
||||
#endif
|
||||
|
||||
#ifndef _BITS_TYPESIZES_H
|
||||
#define _BITS_TYPESIZES_H 1
|
||||
|
||||
/* See <bits/types.h> for the meaning of these macros. This file exists so
|
||||
that <bits/types.h> need not vary across different GNU platforms. */
|
||||
|
||||
#define __DEV_T_TYPE __UQUAD_TYPE
|
||||
#define __UID_T_TYPE __U32_TYPE
|
||||
#define __GID_T_TYPE __U32_TYPE
|
||||
#define __INO_T_TYPE __ULONGWORD_TYPE
|
||||
#define __INO64_T_TYPE __UQUAD_TYPE
|
||||
#define __MODE_T_TYPE __U32_TYPE
|
||||
#define __NLINK_T_TYPE __UWORD_TYPE
|
||||
#define __OFF_T_TYPE __SLONGWORD_TYPE
|
||||
#define __OFF64_T_TYPE __SQUAD_TYPE
|
||||
#define __PID_T_TYPE __S32_TYPE
|
||||
#define __RLIM_T_TYPE __ULONGWORD_TYPE
|
||||
#define __RLIM64_T_TYPE __UQUAD_TYPE
|
||||
#define __BLKCNT_T_TYPE __SLONGWORD_TYPE
|
||||
#define __BLKCNT64_T_TYPE __SQUAD_TYPE
|
||||
#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE
|
||||
#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
|
||||
#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE
|
||||
#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
|
||||
#define __ID_T_TYPE __U32_TYPE
|
||||
#define __CLOCK_T_TYPE __SLONGWORD_TYPE
|
||||
#define __TIME_T_TYPE __SLONGWORD_TYPE
|
||||
#define __USECONDS_T_TYPE __U32_TYPE
|
||||
#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE
|
||||
#define __DADDR_T_TYPE __S32_TYPE
|
||||
#define __SWBLK_T_TYPE __SLONGWORD_TYPE
|
||||
#define __KEY_T_TYPE __S32_TYPE
|
||||
#define __CLOCKID_T_TYPE __S32_TYPE
|
||||
#define __TIMER_T_TYPE __S32_TYPE
|
||||
#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
|
||||
#define __FSID_T_TYPE struct { int __val[2]; }
|
||||
|
||||
/* Number of descriptors that can fit in an `fd_set'. */
|
||||
#define __FD_SETSIZE 1024
|
||||
|
||||
|
||||
#endif /* bits/typesizes.h */
|
27
src/kernel/libroot/posix/glibc/include/bits/waitflags.h
Normal file
27
src/kernel/libroot/posix/glibc/include/bits/waitflags.h
Normal file
@ -0,0 +1,27 @@
|
||||
/* Definitions of flag bits for `waitpid' et al.
|
||||
Copyright (C) 1992, 1996, 1997, 2000 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. */
|
||||
|
||||
#if !defined _SYS_WAIT_H && !defined _STDLIB_H
|
||||
# error "Never include <bits/waitflags.h> directly; use <sys/wait.h> instead."
|
||||
#endif
|
||||
|
||||
|
||||
/* Bits in the third argument to `waitpid'. */
|
||||
#define WNOHANG 1 /* Don't block waiting. */
|
||||
#define WUNTRACED 2 /* Report status of stopped children. */
|
104
src/kernel/libroot/posix/glibc/include/bits/waitstatus.h
Normal file
104
src/kernel/libroot/posix/glibc/include/bits/waitstatus.h
Normal file
@ -0,0 +1,104 @@
|
||||
/* Definitions of status bits for `wait' et al.
|
||||
Copyright (C) 1992, 1994, 1996, 1997, 2000 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. */
|
||||
|
||||
#if !defined _SYS_WAIT_H && !defined _STDLIB_H
|
||||
# error "Never include <bits/waitstatus.h> directly; use <sys/wait.h> instead."
|
||||
#endif
|
||||
|
||||
|
||||
/* Everything extant so far uses these same bits. */
|
||||
|
||||
|
||||
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */
|
||||
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
|
||||
|
||||
/* If WIFSIGNALED(STATUS), the terminating signal. */
|
||||
#define __WTERMSIG(status) ((status) & 0x7f)
|
||||
|
||||
/* If WIFSTOPPED(STATUS), the signal that stopped the child. */
|
||||
#define __WSTOPSIG(status) __WEXITSTATUS(status)
|
||||
|
||||
/* Nonzero if STATUS indicates normal termination. */
|
||||
#define __WIFEXITED(status) (__WTERMSIG(status) == 0)
|
||||
|
||||
/* Nonzero if STATUS indicates termination by a signal. */
|
||||
#ifdef __GNUC__
|
||||
# define __WIFSIGNALED(status) \
|
||||
(__extension__ ({ int __status = (status); \
|
||||
!__WIFSTOPPED(__status) && !__WIFEXITED(__status); }))
|
||||
#else /* Not GCC. */
|
||||
# define __WIFSIGNALED(status) (!__WIFSTOPPED(status) && !__WIFEXITED(status))
|
||||
#endif /* GCC. */
|
||||
|
||||
/* Nonzero if STATUS indicates the child is stopped. */
|
||||
#define __WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
|
||||
|
||||
/* Nonzero if STATUS indicates the child dumped core. */
|
||||
#define __WCOREDUMP(status) ((status) & __WCOREFLAG)
|
||||
|
||||
/* Macros for constructing status values. */
|
||||
#define __W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
|
||||
#define __W_STOPCODE(sig) ((sig) << 8 | 0x7f)
|
||||
#define __WCOREFLAG 0x80
|
||||
|
||||
|
||||
#ifdef __USE_BSD
|
||||
|
||||
# include <endian.h>
|
||||
|
||||
union wait
|
||||
{
|
||||
int w_status;
|
||||
struct
|
||||
{
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
unsigned int __w_termsig:7; /* Terminating signal. */
|
||||
unsigned int __w_coredump:1; /* Set if dumped core. */
|
||||
unsigned int __w_retcode:8; /* Return code if exited normally. */
|
||||
unsigned int:16;
|
||||
# endif /* Little endian. */
|
||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
||||
unsigned int:16;
|
||||
unsigned int __w_retcode:8;
|
||||
unsigned int __w_coredump:1;
|
||||
unsigned int __w_termsig:7;
|
||||
# endif /* Big endian. */
|
||||
} __wait_terminated;
|
||||
struct
|
||||
{
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
unsigned int __w_stopval:8; /* W_STOPPED if stopped. */
|
||||
unsigned int __w_stopsig:8; /* Stopping signal. */
|
||||
unsigned int:16;
|
||||
# endif /* Little endian. */
|
||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
||||
unsigned int:16;
|
||||
unsigned int __w_stopsig:8; /* Stopping signal. */
|
||||
unsigned int __w_stopval:8; /* W_STOPPED if stopped. */
|
||||
# endif /* Big endian. */
|
||||
} __wait_stopped;
|
||||
};
|
||||
|
||||
# define w_termsig __wait_terminated.__w_termsig
|
||||
# define w_coredump __wait_terminated.__w_coredump
|
||||
# define w_retcode __wait_terminated.__w_retcode
|
||||
# define w_stopsig __wait_stopped.__w_stopsig
|
||||
# define w_stopval __wait_stopped.__w_stopval
|
||||
|
||||
#endif /* Use BSD. */
|
26
src/kernel/libroot/posix/glibc/include/bits/wchar.h
Normal file
26
src/kernel/libroot/posix/glibc/include/bits/wchar.h
Normal file
@ -0,0 +1,26 @@
|
||||
/* wchar_t type related definitions.
|
||||
Copyright (C) 2000 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 _BITS_WCHAR_H
|
||||
#define _BITS_WCHAR_H 1
|
||||
|
||||
#define __WCHAR_MIN (-2147483647 - 1)
|
||||
#define __WCHAR_MAX (2147483647)
|
||||
|
||||
#endif /* bits/wchar.h */
|
59
src/kernel/libroot/posix/glibc/include/ctype.h
Normal file
59
src/kernel/libroot/posix/glibc/include/ctype.h
Normal file
@ -0,0 +1,59 @@
|
||||
#ifndef _CTYPE_H
|
||||
|
||||
extern int __isctype (int __c, int __mask);
|
||||
|
||||
# ifndef NOT_IN_libc
|
||||
|
||||
/* These accessors are used by the optimized macros to find the
|
||||
thread-local cache of ctype information from the current thread's
|
||||
locale. For inside libc, define them as inlines using the _NL_CURRENT
|
||||
accessors. We don't use _NL_CURRENT_LOCALE->__ctype_b here because we
|
||||
want to cause a link-time ref to _nl_current_LC_CTYPE under
|
||||
NL_CURRENT_INDIRECT. */
|
||||
|
||||
# include "../locale/localeinfo.h"
|
||||
# include <bits/libc-tsd.h>
|
||||
|
||||
# ifndef CTYPE_EXTERN_INLINE /* Used by ctype/ctype-info.c, which see. */
|
||||
# define CTYPE_EXTERN_INLINE static inline
|
||||
# endif
|
||||
|
||||
__libc_tsd_define (extern, CTYPE_B)
|
||||
__libc_tsd_define (extern, CTYPE_TOUPPER)
|
||||
__libc_tsd_define (extern, CTYPE_TOLOWER)
|
||||
|
||||
CTYPE_EXTERN_INLINE const uint16_t ** __attribute__ ((const))
|
||||
__ctype_b_loc (void)
|
||||
{
|
||||
const uint16_t **tablep =
|
||||
(const uint16_t **) __libc_tsd_address (CTYPE_B);
|
||||
if (__builtin_expect (*tablep == NULL, 0))
|
||||
*tablep = (const uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128;
|
||||
return tablep;
|
||||
}
|
||||
|
||||
CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const))
|
||||
__ctype_toupper_loc (void)
|
||||
{
|
||||
const int32_t **tablep =
|
||||
(const int32_t **) __libc_tsd_address (CTYPE_TOUPPER);
|
||||
if (__builtin_expect (*tablep == NULL, 0))
|
||||
*tablep = ((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128);
|
||||
return tablep;
|
||||
}
|
||||
|
||||
CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const))
|
||||
__ctype_tolower_loc (void)
|
||||
{
|
||||
const int32_t **tablep =
|
||||
(const int32_t **) __libc_tsd_address (CTYPE_TOLOWER);
|
||||
if (__builtin_expect (*tablep == NULL, 0))
|
||||
*tablep = ((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128);
|
||||
return tablep;
|
||||
}
|
||||
|
||||
# endif /* Not NOT_IN_libc. */
|
||||
|
||||
# include <ctype/ctype.h>
|
||||
|
||||
#endif /* ctype.h */
|
7
src/kernel/libroot/posix/glibc/include/device-nrs.h
Normal file
7
src/kernel/libroot/posix/glibc/include/device-nrs.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef _DEVICE_NRS_H_
|
||||
#define _DEVICE_NRS_H_
|
||||
|
||||
// ToDo: do something nice here, perhaps reusing the new stat->st_type field
|
||||
#define DEV_TTY_P(stat) (0)
|
||||
|
||||
#endif /* _DEVICE_NRS_H_ */
|
17
src/kernel/libroot/posix/glibc/include/endian.h
Normal file
17
src/kernel/libroot/posix/glibc/include/endian.h
Normal file
@ -0,0 +1,17 @@
|
||||
#include <string/endian.h>
|
||||
|
||||
#if defined _LIBC && !defined _ISOMAC
|
||||
# if __FLOAT_WORD_ORDER == __BIG_ENDIAN
|
||||
# define BIG_ENDI 1
|
||||
# undef LITTLE_ENDI
|
||||
# define HIGH_HALF 0
|
||||
# define LOW_HALF 1
|
||||
# else
|
||||
# if __FLOAT_WORD_ORDER == __LITTLE_ENDIAN
|
||||
# undef BIG_ENDI
|
||||
# define LITTLE_ENDI 1
|
||||
# define HIGH_HALF 1
|
||||
# define LOW_HALF 0
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
18
src/kernel/libroot/posix/glibc/include/fcntl.h
Normal file
18
src/kernel/libroot/posix/glibc/include/fcntl.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _FCNTL_H
|
||||
#include_next <fcntl.h>
|
||||
|
||||
/* Now define the internal interfaces. */
|
||||
extern int __open64 (__const char *__file, int __oflag, ...);
|
||||
libc_hidden_proto (__open64)
|
||||
extern int __libc_open64 (const char *file, int oflag, ...);
|
||||
extern int __libc_open (const char *file, int oflag, ...);
|
||||
libc_hidden_proto (__libc_open)
|
||||
extern int __libc_creat (const char *file, mode_t mode);
|
||||
extern int __libc_fcntl (int fd, int cmd, ...);
|
||||
libc_hidden_proto (__libc_fcntl)
|
||||
extern int __open (__const char *__file, int __oflag, ...);
|
||||
libc_hidden_proto (__open)
|
||||
extern int __fcntl (int __fd, int __cmd, ...);
|
||||
libc_hidden_proto (__fcntl)
|
||||
|
||||
#endif
|
317
src/kernel/libroot/posix/glibc/include/features.h
Normal file
317
src/kernel/libroot/posix/glibc/include/features.h
Normal file
@ -0,0 +1,317 @@
|
||||
/* Copyright (C) 1991-1993,1995-2000,2001,2002 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 _FEATURES_H
|
||||
#define _FEATURES_H 1
|
||||
|
||||
/* These are defined by the user (or the compiler)
|
||||
to specify the desired environment:
|
||||
|
||||
__STRICT_ANSI__ ISO Standard C.
|
||||
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
|
||||
_POSIX_SOURCE IEEE Std 1003.1.
|
||||
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
|
||||
if >=199309L, add IEEE Std 1003.1b-1993;
|
||||
if >=199506L, add IEEE Std 1003.1c-1995
|
||||
_XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if
|
||||
Single Unix conformance is wanted, to 600 for the
|
||||
upcoming sixth revision.
|
||||
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
|
||||
_LARGEFILE_SOURCE Some more functions for correct standard I/O.
|
||||
_LARGEFILE64_SOURCE Additional functionality from LFS for large files.
|
||||
_FILE_OFFSET_BITS=N Select default filesystem interface.
|
||||
_BSD_SOURCE ISO C, POSIX, and 4.3BSD things.
|
||||
_SVID_SOURCE ISO C, POSIX, and SVID things.
|
||||
_GNU_SOURCE All of the above, plus GNU extensions.
|
||||
_REENTRANT Select additionally reentrant object.
|
||||
_THREAD_SAFE Same as _REENTRANT, often used by other systems.
|
||||
|
||||
The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
|
||||
If none of these are defined, the default is to have _SVID_SOURCE,
|
||||
_BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to
|
||||
199506L. If more than one of these are defined, they accumulate.
|
||||
For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE
|
||||
together give you ISO C, 1003.1, and 1003.2, but nothing else.
|
||||
|
||||
These are defined by this file and are used by the
|
||||
header files to decide what to declare or define:
|
||||
|
||||
__USE_ISOC99 Define ISO C99 things.
|
||||
__USE_POSIX Define IEEE Std 1003.1 things.
|
||||
__USE_POSIX2 Define IEEE Std 1003.2 things.
|
||||
__USE_POSIX199309 Define IEEE Std 1003.1, and .1b things.
|
||||
__USE_POSIX199506 Define IEEE Std 1003.1, .1b, .1c and .1i things.
|
||||
__USE_XOPEN Define XPG things.
|
||||
__USE_XOPEN_EXTENDED Define X/Open Unix things.
|
||||
__USE_UNIX98 Define Single Unix V2 things.
|
||||
__USE_XOPEN2K Define XPG6 things.
|
||||
__USE_LARGEFILE Define correct standard I/O things.
|
||||
__USE_LARGEFILE64 Define LFS things with separate names.
|
||||
__USE_FILE_OFFSET64 Define 64bit interface as default.
|
||||
__USE_BSD Define 4.3BSD things.
|
||||
__USE_SVID Define SVID things.
|
||||
__USE_MISC Define things common to BSD and System V Unix.
|
||||
__USE_GNU Define GNU extensions.
|
||||
__USE_REENTRANT Define reentrant/thread-safe *_r functions.
|
||||
__FAVOR_BSD Favor 4.3BSD things in cases of conflict.
|
||||
|
||||
The macros `__GNU_LIBRARY__', `__GLIBC__', and `__GLIBC_MINOR__' are
|
||||
defined by this file unconditionally. `__GNU_LIBRARY__' is provided
|
||||
only for compatibility. All new code should use the other symbols
|
||||
to test for features.
|
||||
|
||||
All macros listed above as possibly being defined by this file are
|
||||
explicitly undefined if they are not explicitly defined.
|
||||
Feature-test macros that are not defined by the user or compiler
|
||||
but are implied by the other feature-test macros defined (or by the
|
||||
lack of any definitions) are defined by the file. */
|
||||
|
||||
|
||||
/* Undefine everything, so we get a clean slate. */
|
||||
#undef __USE_ISOC99
|
||||
#undef __USE_POSIX
|
||||
#undef __USE_POSIX2
|
||||
#undef __USE_POSIX199309
|
||||
#undef __USE_POSIX199506
|
||||
#undef __USE_XOPEN
|
||||
#undef __USE_XOPEN_EXTENDED
|
||||
#undef __USE_UNIX98
|
||||
#undef __USE_XOPEN2K
|
||||
#undef __USE_LARGEFILE
|
||||
#undef __USE_LARGEFILE64
|
||||
#undef __USE_FILE_OFFSET64
|
||||
#undef __USE_BSD
|
||||
#undef __USE_SVID
|
||||
#undef __USE_MISC
|
||||
#undef __USE_GNU
|
||||
#undef __USE_REENTRANT
|
||||
#undef __FAVOR_BSD
|
||||
#undef __KERNEL_STRICT_NAMES
|
||||
|
||||
/* Suppress kernel-name space pollution unless user expressedly asks
|
||||
for it. */
|
||||
#ifndef _LOOSE_KERNEL_NAMES
|
||||
# define __KERNEL_STRICT_NAMES
|
||||
#endif
|
||||
|
||||
/* Always use ISO C things. */
|
||||
#define __USE_ANSI 1
|
||||
|
||||
|
||||
/* If _BSD_SOURCE was defined by the user, favor BSD over POSIX. */
|
||||
#if defined _BSD_SOURCE && \
|
||||
!(defined _POSIX_SOURCE || defined _POSIX_C_SOURCE || \
|
||||
defined _XOPEN_SOURCE || defined _XOPEN_SOURCE_EXTENDED || \
|
||||
defined _GNU_SOURCE || defined _SVID_SOURCE)
|
||||
# define __FAVOR_BSD 1
|
||||
#endif
|
||||
|
||||
/* If _GNU_SOURCE was defined by the user, turn on all the other features. */
|
||||
#ifdef _GNU_SOURCE
|
||||
# undef _ISOC99_SOURCE
|
||||
# define _ISOC99_SOURCE 1
|
||||
# undef _POSIX_SOURCE
|
||||
# define _POSIX_SOURCE 1
|
||||
# undef _POSIX_C_SOURCE
|
||||
# define _POSIX_C_SOURCE 199506L
|
||||
# undef _XOPEN_SOURCE
|
||||
# define _XOPEN_SOURCE 600
|
||||
# undef _XOPEN_SOURCE_EXTENDED
|
||||
# define _XOPEN_SOURCE_EXTENDED 1
|
||||
# undef _LARGEFILE64_SOURCE
|
||||
# define _LARGEFILE64_SOURCE 1
|
||||
# undef _BSD_SOURCE
|
||||
# define _BSD_SOURCE 1
|
||||
# undef _SVID_SOURCE
|
||||
# define _SVID_SOURCE 1
|
||||
#endif
|
||||
|
||||
/* If nothing (other than _GNU_SOURCE) is defined,
|
||||
define _BSD_SOURCE and _SVID_SOURCE. */
|
||||
#if (!defined __STRICT_ANSI__ && !defined _ISOC99_SOURCE && \
|
||||
!defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \
|
||||
!defined _XOPEN_SOURCE && !defined _XOPEN_SOURCE_EXTENDED && \
|
||||
!defined _BSD_SOURCE && !defined _SVID_SOURCE)
|
||||
# define _BSD_SOURCE 1
|
||||
# define _SVID_SOURCE 1
|
||||
#endif
|
||||
|
||||
/* This is to enable the ISO C99 extension. Also recognize the old macro
|
||||
which was used prior to the standard acceptance. This macro will
|
||||
eventually go away and the features enabled by default once the ISO C99
|
||||
standard is widely adopted. */
|
||||
#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \
|
||||
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
|
||||
# define __USE_ISOC99 1
|
||||
#endif
|
||||
|
||||
/* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2
|
||||
(and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */
|
||||
#if (!defined __STRICT_ANSI__ && !defined _POSIX_SOURCE && \
|
||||
!defined _POSIX_C_SOURCE)
|
||||
# define _POSIX_SOURCE 1
|
||||
# if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500
|
||||
# define _POSIX_C_SOURCE 2
|
||||
# else
|
||||
# define _POSIX_C_SOURCE 199506L
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined _POSIX_SOURCE || _POSIX_C_SOURCE >= 1 || defined _XOPEN_SOURCE
|
||||
# define __USE_POSIX 1
|
||||
#endif
|
||||
|
||||
#if defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 2 || defined _XOPEN_SOURCE
|
||||
# define __USE_POSIX2 1
|
||||
#endif
|
||||
|
||||
#if (_POSIX_C_SOURCE - 0) >= 199309L
|
||||
# define __USE_POSIX199309 1
|
||||
#endif
|
||||
|
||||
#if (_POSIX_C_SOURCE - 0) >= 199506L
|
||||
# define __USE_POSIX199506 1
|
||||
#endif
|
||||
|
||||
#ifdef _XOPEN_SOURCE
|
||||
# define __USE_XOPEN 1
|
||||
# if (_XOPEN_SOURCE - 0) >= 500
|
||||
# define __USE_XOPEN_EXTENDED 1
|
||||
# define __USE_UNIX98 1
|
||||
# undef _LARGEFILE_SOURCE
|
||||
# define _LARGEFILE_SOURCE 1
|
||||
# if (_XOPEN_SOURCE - 0) >= 600
|
||||
# define __USE_XOPEN2K 1
|
||||
# undef __USE_ISOC99
|
||||
# define __USE_ISOC99 1
|
||||
# endif
|
||||
# else
|
||||
# ifdef _XOPEN_SOURCE_EXTENDED
|
||||
# define __USE_XOPEN_EXTENDED 1
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _LARGEFILE_SOURCE
|
||||
# define __USE_LARGEFILE 1
|
||||
#endif
|
||||
|
||||
#ifdef _LARGEFILE64_SOURCE
|
||||
# define __USE_LARGEFILE64 1
|
||||
#endif
|
||||
|
||||
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
|
||||
# define __USE_FILE_OFFSET64 1
|
||||
#endif
|
||||
|
||||
#if defined _BSD_SOURCE || defined _SVID_SOURCE
|
||||
# define __USE_MISC 1
|
||||
#endif
|
||||
|
||||
#ifdef _BSD_SOURCE
|
||||
# define __USE_BSD 1
|
||||
#endif
|
||||
|
||||
#ifdef _SVID_SOURCE
|
||||
# define __USE_SVID 1
|
||||
#endif
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
# define __USE_GNU 1
|
||||
#endif
|
||||
|
||||
#if defined _REENTRANT || defined _THREAD_SAFE
|
||||
# define __USE_REENTRANT 1
|
||||
#endif
|
||||
|
||||
/* We do support the IEC 559 math functionality, real and complex. */
|
||||
#define __STDC_IEC_559__ 1
|
||||
#define __STDC_IEC_559_COMPLEX__ 1
|
||||
|
||||
/* wchar_t uses ISO 10646-1 (2nd ed., published 2000-09-15) / Unicode 3.1. */
|
||||
#define __STDC_ISO_10646__ 200009L
|
||||
|
||||
/* This macro indicates that the installed library is the GNU C Library.
|
||||
For historic reasons the value now is 6 and this will stay from now
|
||||
on. The use of this variable is deprecated. Use __GLIBC__ and
|
||||
__GLIBC_MINOR__ now (see below) when you want to test for a specific
|
||||
GNU C library version and use the values in <gnu/lib-names.h> to get
|
||||
the sonames of the shared libraries. */
|
||||
#undef __GNU_LIBRARY__
|
||||
#define __GNU_LIBRARY__ 6
|
||||
|
||||
/* Major and minor version number of the GNU C library package. Use
|
||||
these macros to test for features in specific releases. */
|
||||
#define __GLIBC__ 2
|
||||
#define __GLIBC_MINOR__ 3
|
||||
|
||||
/* Convenience macros to test the versions of glibc and gcc.
|
||||
Use them like this:
|
||||
#if __GNUC_PREREQ (2,8)
|
||||
... code requiring gcc 2.8 or later ...
|
||||
#endif
|
||||
Note - they won't work for gcc1 or glibc1, since the _MINOR macros
|
||||
were not defined then. */
|
||||
#if defined __GNUC__ && defined __GNUC_MINOR__
|
||||
# define __GNUC_PREREQ(maj, min) \
|
||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||
#else
|
||||
# define __GNUC_PREREQ(maj, min) 0
|
||||
#endif
|
||||
|
||||
#define __GLIBC_PREREQ(maj, min) \
|
||||
((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
|
||||
|
||||
/* Decide whether a compiler supports the long long datatypes. */
|
||||
#if defined __GNUC__ \
|
||||
|| (defined __PGI && defined __i386__ ) \
|
||||
|| (defined __INTEL_COMPILER && (defined __i386__ || defined __ia64__)) \
|
||||
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
|
||||
# define __GLIBC_HAVE_LONG_LONG 1
|
||||
#endif
|
||||
|
||||
/* This is here only because every header file already includes this one. */
|
||||
#ifndef __ASSEMBLER__
|
||||
# ifndef _SYS_CDEFS_H
|
||||
# include <sys/cdefs.h>
|
||||
# endif
|
||||
|
||||
/* If we don't have __REDIRECT, prototypes will be missing if
|
||||
__USE_FILE_OFFSET64 but not __USE_LARGEFILE[64]. */
|
||||
# if defined __USE_FILE_OFFSET64 && !defined __REDIRECT
|
||||
# define __USE_LARGEFILE 1
|
||||
# define __USE_LARGEFILE64 1
|
||||
# endif
|
||||
|
||||
#endif /* !ASSEMBLER */
|
||||
|
||||
/* Decide whether we can define 'extern inline' functions in headers. */
|
||||
#if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \
|
||||
&& !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__
|
||||
# define __USE_EXTERN_INLINES 1
|
||||
#endif
|
||||
|
||||
|
||||
/* This is here only because every header file already includes this one.
|
||||
Get the definitions of all the appropriate `__stub_FUNCTION' symbols.
|
||||
<gnu/stubs.h> contains `#define __stub_FUNCTION' when FUNCTION is a stub
|
||||
that will always return failure (and set errno to ENOSYS). */
|
||||
#include <gnu/stubs.h>
|
||||
|
||||
|
||||
#endif /* features.h */
|
2
src/kernel/libroot/posix/glibc/include/gnu/stubs.h
Normal file
2
src/kernel/libroot/posix/glibc/include/gnu/stubs.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* This is a placeholder used only while compiling libc.
|
||||
The installed gnu/stubs.h file is created by make install. */
|
9
src/kernel/libroot/posix/glibc/include/langinfo.h
Normal file
9
src/kernel/libroot/posix/glibc/include/langinfo.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef _LANGINFO_H
|
||||
|
||||
#include <locale/langinfo.h>
|
||||
|
||||
libc_hidden_proto (nl_langinfo)
|
||||
|
||||
extern __typeof (nl_langinfo_l) __nl_langinfo_l;
|
||||
|
||||
#endif
|
723
src/kernel/libroot/posix/glibc/include/libc-symbols.h
Normal file
723
src/kernel/libroot/posix/glibc/include/libc-symbols.h
Normal file
@ -0,0 +1,723 @@
|
||||
/* Support macros for making weak and strong aliases for symbols,
|
||||
and for using symbol sets and linker warnings with GNU ld.
|
||||
Copyright (C) 1995-1998,2000,2001,2002,2003 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 _LIBC_SYMBOLS_H
|
||||
#define _LIBC_SYMBOLS_H 1
|
||||
|
||||
/* This file's macros are included implicitly in the compilation of every
|
||||
file in the C library by -imacros.
|
||||
|
||||
We include config.h which is generated by configure.
|
||||
It should define for us the following symbols:
|
||||
|
||||
* HAVE_ASM_SET_DIRECTIVE if we have `.set B, A' instead of `A = B'.
|
||||
* ASM_GLOBAL_DIRECTIVE with `.globl' or `.global'.
|
||||
* ASM_TYPE_DIRECTIVE_PREFIX with `@' or `#' or whatever for .type,
|
||||
or leave it undefined if there is no .type directive.
|
||||
* HAVE_GNU_LD if using GNU ld, with support for weak symbols in a.out,
|
||||
and for symbol set and warning messages extensions in a.out and ELF.
|
||||
* HAVE_ELF if using ELF, which supports weak symbols using `.weak'.
|
||||
* HAVE_ASM_WEAK_DIRECTIVE if we have weak symbols using `.weak'.
|
||||
* HAVE_ASM_WEAKEXT_DIRECTIVE if we have weak symbols using `.weakext'.
|
||||
|
||||
*/
|
||||
|
||||
/* This is defined for the compilation of all C library code. features.h
|
||||
tests this to avoid inclusion of stubs.h while compiling the library,
|
||||
before stubs.h has been generated. Some library code that is shared
|
||||
with other packages also tests this symbol to see if it is being
|
||||
compiled as part of the C library. We must define this before including
|
||||
config.h, because it makes some definitions conditional on whether libc
|
||||
itself is being compiled, or just some generator program. */
|
||||
#define _LIBC 1
|
||||
|
||||
/* Enable declarations of GNU extensions, since we are compiling them. */
|
||||
#define _GNU_SOURCE 1
|
||||
/* And we also need the data for the reentrant functions. */
|
||||
#define _REENTRANT 1
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* The symbols in all the user (non-_) macros are C symbols.
|
||||
HAVE_GNU_LD without HAVE_ELF implies a.out. */
|
||||
|
||||
#if defined HAVE_ASM_WEAK_DIRECTIVE || defined HAVE_ASM_WEAKEXT_DIRECTIVE
|
||||
# define HAVE_WEAK_SYMBOLS
|
||||
#endif
|
||||
|
||||
#ifndef __SYMBOL_PREFIX
|
||||
# ifdef NO_UNDERSCORES
|
||||
# define __SYMBOL_PREFIX
|
||||
# else
|
||||
# define __SYMBOL_PREFIX "_"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef C_SYMBOL_NAME
|
||||
# ifdef NO_UNDERSCORES
|
||||
# define C_SYMBOL_NAME(name) name
|
||||
# else
|
||||
# define C_SYMBOL_NAME(name) _##name
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ASM_LINE_SEP
|
||||
# define ASM_LINE_SEP ;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# ifndef C_SYMBOL_DOT_NAME
|
||||
# if defined __GNUC__ && defined __GNUC_MINOR__ \
|
||||
&& (__GNUC__ << 16) + __GNUC_MINOR__ >= (3 << 16) + 1
|
||||
# define C_SYMBOL_DOT_NAME(name) .name
|
||||
# else
|
||||
# define C_SYMBOL_DOT_NAME(name) .##name
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
/* GCC understands weak symbols and aliases; use its interface where
|
||||
possible, instead of embedded assembly language. */
|
||||
|
||||
/* Define ALIASNAME as a strong alias for NAME. */
|
||||
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
|
||||
# define _strong_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||
|
||||
/* This comes between the return type and function name in
|
||||
a function definition to make that definition weak. */
|
||||
# define weak_function __attribute__ ((weak))
|
||||
# define weak_const_function __attribute__ ((weak, __const__))
|
||||
|
||||
# ifdef HAVE_WEAK_SYMBOLS
|
||||
|
||||
/* Define ALIASNAME as a weak alias for NAME.
|
||||
If weak aliases are not available, this defines a strong alias. */
|
||||
# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
|
||||
# define _weak_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
||||
|
||||
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
|
||||
# define weak_extern(symbol) _weak_extern (weak symbol)
|
||||
# define _weak_extern(expr) _Pragma (#expr)
|
||||
|
||||
# else
|
||||
|
||||
# define weak_alias(name, aliasname) strong_alias(name, aliasname)
|
||||
# define weak_extern(symbol) /* Nothing. */
|
||||
|
||||
# endif
|
||||
|
||||
#else /* __ASSEMBLER__ */
|
||||
|
||||
# ifdef HAVE_ASM_SET_DIRECTIVE
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define strong_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_DOT_NAME (alias),C_SYMBOL_DOT_NAME (original)
|
||||
# define strong_data_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
|
||||
# else
|
||||
# define strong_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
|
||||
# define strong_data_alias(original, alias) strong_alias(original, alias)
|
||||
# endif
|
||||
# else
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define strong_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
||||
# define strong_data_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||
# else
|
||||
# define strong_alias(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||
# define strong_data_alias(original, alias) strong_alias(original, alias)
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_WEAK_SYMBOLS
|
||||
# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define weak_alias(original, alias) \
|
||||
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
||||
.weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define weak_alias(original, alias) \
|
||||
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
||||
# endif
|
||||
# define weak_extern(symbol) \
|
||||
.weakext C_SYMBOL_NAME (symbol)
|
||||
|
||||
# else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define weak_alias(original, alias) \
|
||||
.weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
||||
.weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define weak_alias(original, alias) \
|
||||
.weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||
# endif
|
||||
|
||||
# define weak_extern(symbol) \
|
||||
.weak C_SYMBOL_NAME (symbol)
|
||||
|
||||
# endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||
|
||||
# else /* ! HAVE_WEAK_SYMBOLS */
|
||||
|
||||
# define weak_alias(original, alias) strong_alias(original, alias)
|
||||
# define weak_extern(symbol) /* Nothing */
|
||||
# endif /* ! HAVE_WEAK_SYMBOLS */
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
/* On some platforms we can make internal function calls (i.e., calls of
|
||||
functions not exported) a bit faster by using a different calling
|
||||
convention. */
|
||||
#ifndef internal_function
|
||||
# define internal_function /* empty */
|
||||
#endif
|
||||
|
||||
/* Prepare for the case that `__builtin_expect' is not available. */
|
||||
#ifndef HAVE_BUILTIN_EXPECT
|
||||
# define __builtin_expect(expr, val) (expr)
|
||||
#endif
|
||||
|
||||
/* Determine the return address. */
|
||||
#define RETURN_ADDRESS(nr) \
|
||||
__builtin_extract_return_addr (__builtin_return_address (nr))
|
||||
|
||||
/* When a reference to SYMBOL is encountered, the linker will emit a
|
||||
warning message MSG. */
|
||||
#ifdef HAVE_GNU_LD
|
||||
# ifdef HAVE_ELF
|
||||
|
||||
/* We want the .gnu.warning.SYMBOL section to be unallocated. */
|
||||
# ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
|
||||
# define __make_section_unallocated(section_string) \
|
||||
asm (".section " section_string "\n\t.previous");
|
||||
# elif defined HAVE_ASM_POPSECTION_DIRECTIVE
|
||||
# define __make_section_unallocated(section_string) \
|
||||
asm (".pushsection " section_string "\n\t.popsection");
|
||||
# else
|
||||
# define __make_section_unallocated(section_string)
|
||||
# endif
|
||||
|
||||
/* Tacking on "\n\t#" to the section name makes gcc put it's bogus
|
||||
section attributes on what looks like a comment to the assembler. */
|
||||
# ifdef HAVE_SECTION_QUOTES
|
||||
# define __sec_comment "\"\n\t#\""
|
||||
# else
|
||||
# define __sec_comment "\n\t#"
|
||||
# endif
|
||||
# define link_warning(symbol, msg) \
|
||||
__make_section_unallocated (".gnu.warning." #symbol) \
|
||||
static const char __evoke_link_warning_##symbol[] \
|
||||
__attribute__ ((unused, section (".gnu.warning." #symbol __sec_comment))) \
|
||||
= msg;
|
||||
# define libc_freeres_ptr(decl) \
|
||||
__make_section_unallocated ("__libc_freeres_ptrs, \"aw\", @nobits") \
|
||||
decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
|
||||
# define __libc_freeres_fn_section \
|
||||
__attribute__ ((section ("__libc_freeres_fn")))
|
||||
# else /* Not ELF: a.out */
|
||||
# ifdef HAVE_XCOFF
|
||||
/* XCOFF does not support .stabs.
|
||||
The native aix linker will remove the .stab and .stabstr sections
|
||||
The gnu linker will have a fatal error if there is a relocation for
|
||||
symbol in the .stab section. Silently disable this macro. */
|
||||
# define link_warning(symbol, msg)
|
||||
# else
|
||||
# define link_warning(symbol, msg) \
|
||||
asm (".stabs \"" msg "\",30,0,0,0\n\t" \
|
||||
".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
|
||||
# endif /* XCOFF */
|
||||
# define libc_freeres_ptr(decl) decl
|
||||
# define __libc_freeres_fn_section
|
||||
# endif
|
||||
#else
|
||||
/* We will never be heard; they will all die horribly. */
|
||||
# define link_warning(symbol, msg)
|
||||
# define libc_freeres_ptr(decl) decl
|
||||
# define __libc_freeres_fn_section
|
||||
#endif
|
||||
#define libc_freeres_fn(name) \
|
||||
static void name (void) __attribute_used__ __libc_freeres_fn_section; \
|
||||
text_set_element (__libc_subfreeres, name); \
|
||||
static void name (void)
|
||||
|
||||
/* A canned warning for sysdeps/stub functions. */
|
||||
#define stub_warning(name) \
|
||||
link_warning (name, \
|
||||
"warning: " #name " is not implemented and will always fail")
|
||||
|
||||
|
||||
/* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes,
|
||||
when the assembler supports such declarations (such as in ELF).
|
||||
This is only necessary when defining something in assembly, or playing
|
||||
funny alias games where the size should be other than what the compiler
|
||||
thinks it is. */
|
||||
#define declare_symbol(symbol, type, size) \
|
||||
declare_symbol_1 (symbol, type, size)
|
||||
#ifdef ASM_TYPE_DIRECTIVE_PREFIX
|
||||
# ifdef __ASSEMBLER__
|
||||
# define declare_symbol_1(symbol, type, size) \
|
||||
.type C_SYMBOL_NAME (symbol), \
|
||||
declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size
|
||||
# define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b)
|
||||
# define declare_symbol_1_paste_1(a,b) a##b
|
||||
# else /* Not __ASSEMBLER__. */
|
||||
# define declare_symbol_1(symbol, type, size) \
|
||||
asm (".type " __SYMBOL_PREFIX #symbol ", " \
|
||||
declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
|
||||
"\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
|
||||
# define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x)
|
||||
# define declare_symbol_1_stringify_1(x) #x
|
||||
# endif /* __ASSEMBLER__ */
|
||||
#else
|
||||
# define declare_symbol_1(symbol, type, size) /* Nothing. */
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_GNU_LD
|
||||
|
||||
/* Symbol set support macros. */
|
||||
|
||||
# ifdef HAVE_ELF
|
||||
|
||||
/* Make SYMBOL, which is in the text segment, an element of SET. */
|
||||
# define text_set_element(set, symbol) _elf_set_element(set, symbol)
|
||||
/* Make SYMBOL, which is in the data segment, an element of SET. */
|
||||
# define data_set_element(set, symbol) _elf_set_element(set, symbol)
|
||||
/* Make SYMBOL, which is in the bss segment, an element of SET. */
|
||||
# define bss_set_element(set, symbol) _elf_set_element(set, symbol)
|
||||
|
||||
/* These are all done the same way in ELF.
|
||||
There is a new section created for each set. */
|
||||
# ifdef SHARED
|
||||
/* When building a shared library, make the set section writable,
|
||||
because it will need to be relocated at run time anyway. */
|
||||
# define _elf_set_element(set, symbol) \
|
||||
static const void *__elf_set_##set##_element_##symbol##__ \
|
||||
__attribute__ ((unused, section (#set))) = &(symbol)
|
||||
# else
|
||||
# define _elf_set_element(set, symbol) \
|
||||
static const void *const __elf_set_##set##_element_##symbol##__ \
|
||||
__attribute__ ((unused, section (#set))) = &(symbol)
|
||||
# endif
|
||||
|
||||
/* Define SET as a symbol set. This may be required (it is in a.out) to
|
||||
be able to use the set's contents. */
|
||||
# define symbol_set_define(set) symbol_set_declare(set)
|
||||
|
||||
/* Declare SET for use in this module, if defined in another module. */
|
||||
# define symbol_set_declare(set) \
|
||||
extern void *const __start_##set __attribute__ ((__weak__)); \
|
||||
extern void *const __stop_##set __attribute__ ((__weak__)); \
|
||||
weak_extern (__start_##set) weak_extern (__stop_##set)
|
||||
|
||||
/* Return a pointer (void *const *) to the first element of SET. */
|
||||
# define symbol_set_first_element(set) (&__start_##set)
|
||||
|
||||
/* Return true iff PTR (a void *const *) has been incremented
|
||||
past the last element in SET. */
|
||||
# define symbol_set_end_p(set, ptr) ((ptr) >= &__stop_##set)
|
||||
|
||||
# else /* Not ELF: a.out. */
|
||||
|
||||
# ifdef HAVE_XCOFF
|
||||
/* XCOFF does not support .stabs.
|
||||
The native aix linker will remove the .stab and .stabstr sections
|
||||
The gnu linker will have a fatal error if there is a relocation for
|
||||
symbol in the .stab section. Silently disable these macros. */
|
||||
# define text_set_element(set, symbol)
|
||||
# define data_set_element(set, symbol)
|
||||
# define bss_set_element(set, symbol)
|
||||
# else
|
||||
# define text_set_element(set, symbol) \
|
||||
asm (".stabs \"" __SYMBOL_PREFIX #set "\",23,0,0," __SYMBOL_PREFIX #symbol)
|
||||
# define data_set_element(set, symbol) \
|
||||
asm (".stabs \"" __SYMBOL_PREFIX #set "\",25,0,0," __SYMBOL_PREFIX #symbol)
|
||||
# define bss_set_element(set, symbol) ?error Must use initialized data.
|
||||
# endif /* XCOFF */
|
||||
# define symbol_set_define(set) void *const (set)[1];
|
||||
# define symbol_set_declare(set) extern void *const (set)[1];
|
||||
|
||||
# define symbol_set_first_element(set) &(set)[1]
|
||||
# define symbol_set_end_p(set, ptr) (*(ptr) == 0)
|
||||
|
||||
# endif /* ELF. */
|
||||
#else
|
||||
/* We cannot do anything in generial. */
|
||||
# define text_set_element(set, symbol) asm ("")
|
||||
# define data_set_element(set, symbol) asm ("")
|
||||
# define bss_set_element(set, symbol) asm ("")
|
||||
# define symbol_set_define(set) void *const (set)[1];
|
||||
# define symbol_set_declare(set) extern void *const (set)[1];
|
||||
|
||||
# define symbol_set_first_element(set) &(set)[1]
|
||||
# define symbol_set_end_p(set, ptr) (*(ptr) == 0)
|
||||
#endif /* Have GNU ld. */
|
||||
|
||||
#if DO_VERSIONING
|
||||
# define symbol_version(real, name, version) \
|
||||
_symbol_version(real, name, version)
|
||||
# define default_symbol_version(real, name, version) \
|
||||
_default_symbol_version(real, name, version)
|
||||
# ifdef __ASSEMBLER__
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define _symbol_version(real, name, version) \
|
||||
.symver real, name##@##version ASM_LINE_SEP \
|
||||
.symver .##real, .##name##@##version
|
||||
# define _default_symbol_version(real, name, version) \
|
||||
.symver real, name##@##@##version ASM_LINE_SEP \
|
||||
.symver .##real, .##name##@##@##version
|
||||
# else
|
||||
# define _symbol_version(real, name, version) \
|
||||
.symver real, name##@##version
|
||||
# define _default_symbol_version(real, name, version) \
|
||||
.symver real, name##@##@##version
|
||||
# endif
|
||||
# else
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define _symbol_version(real, name, version) \
|
||||
__asm__ (".symver " #real "," #name "@" #version "\n\t" \
|
||||
".symver ." #real ",." #name "@" #version)
|
||||
# define _default_symbol_version(real, name, version) \
|
||||
__asm__ (".symver " #real "," #name "@@" #version "\n\t" \
|
||||
".symver ." #real ",." #name "@@" #version)
|
||||
# else
|
||||
# define _symbol_version(real, name, version) \
|
||||
__asm__ (".symver " #real "," #name "@" #version)
|
||||
# define _default_symbol_version(real, name, version) \
|
||||
__asm__ (".symver " #real "," #name "@@" #version)
|
||||
# endif
|
||||
# endif
|
||||
#else
|
||||
# define symbol_version(real, name, version)
|
||||
# define default_symbol_version(real, name, version) \
|
||||
strong_alias(real, name)
|
||||
#endif
|
||||
|
||||
#if defined HAVE_VISIBILITY_ATTRIBUTE && defined SHARED
|
||||
# define attribute_hidden __attribute__ ((visibility ("hidden")))
|
||||
#else
|
||||
# define attribute_hidden
|
||||
#endif
|
||||
|
||||
#if defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
# define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
|
||||
#else
|
||||
# define attribute_tls_model_ie
|
||||
#endif
|
||||
|
||||
/* Handling on non-exported internal names. We have to do this only
|
||||
for shared code. */
|
||||
#ifdef SHARED
|
||||
# define INTUSE(name) name##_internal
|
||||
# define INTDEF(name) strong_alias (name, name##_internal)
|
||||
# define INTVARDEF(name) \
|
||||
_INTVARDEF (name, name##_internal)
|
||||
# if defined HAVE_VISIBILITY_ATTRIBUTE
|
||||
# define _INTVARDEF(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name), \
|
||||
visibility ("hidden")));
|
||||
# else
|
||||
# define _INTVARDEF(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||
# endif
|
||||
# define INTDEF2(name, newname) strong_alias (name, newname##_internal)
|
||||
# define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal)
|
||||
#else
|
||||
# define INTUSE(name) name
|
||||
# define INTDEF(name)
|
||||
# define INTVARDEF(name)
|
||||
# define INTDEF2(name, newname)
|
||||
# define INTVARDEF2(name, newname)
|
||||
#endif
|
||||
|
||||
/* The following macros are used for PLT bypassing within libc.so
|
||||
(and if needed other libraries similarly).
|
||||
First of all, you need to have the function prototyped somewhere,
|
||||
say in foo/foo.h:
|
||||
|
||||
int foo (int __bar);
|
||||
|
||||
If calls to foo within libc.so should always go to foo defined in libc.so,
|
||||
then in include/foo.h you add:
|
||||
|
||||
libc_hidden_proto (foo)
|
||||
|
||||
line and after the foo function definition:
|
||||
|
||||
int foo (int __bar)
|
||||
{
|
||||
return __bar;
|
||||
}
|
||||
libc_hidden_def (foo)
|
||||
|
||||
or
|
||||
|
||||
int foo (int __bar)
|
||||
{
|
||||
return __bar;
|
||||
}
|
||||
libc_hidden_weak (foo)
|
||||
|
||||
Simularly for global data. If references to foo within libc.so should
|
||||
always go to foo defined in libc.so, then in include/foo.h you add:
|
||||
|
||||
libc_hidden_proto (foo)
|
||||
|
||||
line and after foo's definition:
|
||||
|
||||
int foo = INITIAL_FOO_VALUE;
|
||||
libc_hidden_data_def (foo)
|
||||
|
||||
or
|
||||
|
||||
int foo = INITIAL_FOO_VALUE;
|
||||
libc_hidden_data_weak (foo)
|
||||
|
||||
If foo is normally just an alias (strong or weak) of some other function,
|
||||
you should use the normal strong_alias first, then add libc_hidden_def
|
||||
or libc_hidden_weak:
|
||||
|
||||
int baz (int __bar)
|
||||
{
|
||||
return __bar;
|
||||
}
|
||||
strong_alias (baz, foo)
|
||||
libc_hidden_weak (foo)
|
||||
|
||||
If the function should be internal to multiple objects, say ld.so and
|
||||
libc.so, the best way is to use:
|
||||
|
||||
#if !defined NOT_IN_libc || defined IS_IN_rtld
|
||||
hidden_proto (foo)
|
||||
#endif
|
||||
|
||||
in include/foo.h and the normal macros at all function definitions
|
||||
depending on what DSO they belong to.
|
||||
|
||||
If versioned_symbol macro is used to define foo,
|
||||
libc_hidden_ver macro should be used, as in:
|
||||
|
||||
int __real_foo (int __bar)
|
||||
{
|
||||
return __bar;
|
||||
}
|
||||
versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
|
||||
libc_hidden_ver (__real_foo, foo) */
|
||||
|
||||
#if defined SHARED && defined DO_VERSIONING \
|
||||
&& !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
|
||||
# ifndef __ASSEMBLER__
|
||||
# if !defined HAVE_VISIBILITY_ATTRIBUTE \
|
||||
|| defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
||||
# define __hidden_proto_hiddenattr(attrs...)
|
||||
# else
|
||||
# define __hidden_proto_hiddenattr(attrs...) \
|
||||
__attribute__ ((visibility ("hidden"), ##attrs))
|
||||
# endif
|
||||
# define hidden_proto(name, attrs...) \
|
||||
__hidden_proto (name, __GI_##name, ##attrs)
|
||||
# define __hidden_proto(name, internal, attrs...) \
|
||||
extern __typeof (name) internal; \
|
||||
extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
|
||||
__hidden_proto_hiddenattr (attrs);
|
||||
# define __hidden_asmname(name) \
|
||||
__hidden_asmname1 (__USER_LABEL_PREFIX__, name)
|
||||
# define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
|
||||
# define __hidden_asmname2(prefix, name) #prefix name
|
||||
# ifdef HAVE_ASM_SET_DIRECTIVE
|
||||
# define __hidden_def1(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
.set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define __hidden_dot_def1(original, alias)
|
||||
# endif
|
||||
# else
|
||||
# define __hidden_def1(original, alias) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define __hidden_dot_def1(original, alias)
|
||||
# endif
|
||||
# endif
|
||||
# define __hidden_def2(...) #__VA_ARGS__
|
||||
# define __hidden_def3(...) __hidden_def2 (__VA_ARGS__)
|
||||
# define hidden_def(name) \
|
||||
__asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \
|
||||
__hidden_dot_def1 (__GI_##name, name)));
|
||||
# define hidden_data_def(name) \
|
||||
__asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name)));
|
||||
# define hidden_ver(local, name) \
|
||||
__asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \
|
||||
__hidden_dot_def1 (local, __GI_##name)));
|
||||
# define hidden_data_ver(local, name) \
|
||||
__asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name)));
|
||||
# ifdef HAVE_WEAK_SYMBOLS
|
||||
# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
|
||||
# define __hidden_weak1(original, alias) \
|
||||
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \
|
||||
.weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define __hidden_dot_weak1(original, alias)
|
||||
# endif
|
||||
# else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||
# define __hidden_weak1(original, alias) \
|
||||
.weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \
|
||||
.weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
||||
C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
||||
# else
|
||||
# define __hidden_dot_weak1(original, alias)
|
||||
# endif
|
||||
# endif
|
||||
# define hidden_weak(name) \
|
||||
__asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \
|
||||
__hidden_dot_weak1 (__GI_##name, name)));
|
||||
# define hidden_data_weak(name) \
|
||||
__asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name)));
|
||||
# else
|
||||
# define hidden_weak(name) hidden_def (name)
|
||||
# endif
|
||||
# else
|
||||
/* For assembly, we need to do the opposite of what we do in C:
|
||||
in assembly gcc __REDIRECT stuff is not in place, so functions
|
||||
are defined by its normal name and we need to create the
|
||||
__GI_* alias to it, in C __REDIRECT causes the function definition
|
||||
to use __GI_* name and we need to add alias to the real name.
|
||||
There is no reason to use hidden_weak over hidden_def in assembly,
|
||||
but we provide it for consistency with the C usage.
|
||||
hidden_proto doesn't make sense for assembly but the equivalent
|
||||
is to call via the HIDDEN_JUMPTARGET macro instead of JUMPTARGET. */
|
||||
# define hidden_def(name) strong_alias (name, __GI_##name)
|
||||
# define hidden_weak(name) hidden_def (name)
|
||||
# define hidden_ver(local, name) strong_alias (local, __GI_##name)
|
||||
# define hidden_data_def(name) strong_data_alias (name, __GI_##name)
|
||||
# define hidden_data_weak(name) hidden_data_def (name)
|
||||
# define hidden_data_ver(local, name) strong_data_alias (local, __GI_##name)
|
||||
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
||||
# define HIDDEN_JUMPTARGET(name) .__GI_##name
|
||||
# else
|
||||
# define HIDDEN_JUMPTARGET(name) __GI_##name
|
||||
# endif
|
||||
# endif
|
||||
#else
|
||||
# ifndef __ASSEMBLER__
|
||||
# define hidden_proto(name, attrs...)
|
||||
# else
|
||||
# define HIDDEN_JUMPTARGET(name) JUMPTARGET(name)
|
||||
# endif /* Not __ASSEMBLER__ */
|
||||
# define hidden_weak(name)
|
||||
# define hidden_def(name)
|
||||
# define hidden_ver(local, name)
|
||||
# define hidden_data_weak(name)
|
||||
# define hidden_data_def(name)
|
||||
# define hidden_data_ver(local, name)
|
||||
#endif
|
||||
|
||||
#if !defined NOT_IN_libc
|
||||
# define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
||||
# define libc_hidden_def(name) hidden_def (name)
|
||||
# define libc_hidden_weak(name) hidden_weak (name)
|
||||
# define libc_hidden_ver(local, name) hidden_ver (local, name)
|
||||
# define libc_hidden_data_def(name) hidden_data_def (name)
|
||||
# define libc_hidden_data_weak(name) hidden_data_weak (name)
|
||||
# define libc_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
||||
#else
|
||||
# define libc_hidden_proto(name, attrs...)
|
||||
# define libc_hidden_def(name)
|
||||
# define libc_hidden_weak(name)
|
||||
# define libc_hidden_ver(local, name)
|
||||
# define libc_hidden_data_def(name)
|
||||
# define libc_hidden_data_weak(name)
|
||||
# define libc_hidden_data_ver(local, name)
|
||||
#endif
|
||||
|
||||
#if defined NOT_IN_libc && defined IS_IN_rtld
|
||||
# define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
||||
# define rtld_hidden_def(name) hidden_def (name)
|
||||
# define rtld_hidden_weak(name) hidden_weak (name)
|
||||
# define rtld_hidden_ver(local, name) hidden_ver (local, name)
|
||||
# define rtld_hidden_data_def(name) hidden_data_def (name)
|
||||
# define rtld_hidden_data_weak(name) hidden_data_weak (name)
|
||||
# define rtld_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
||||
#else
|
||||
# define rtld_hidden_proto(name, attrs...)
|
||||
# define rtld_hidden_def(name)
|
||||
# define rtld_hidden_weak(name)
|
||||
# define rtld_hidden_ver(local, name)
|
||||
# define rtld_hidden_data_def(name)
|
||||
# define rtld_hidden_data_weak(name)
|
||||
# define rtld_hidden_data_ver(local, name)
|
||||
#endif
|
||||
|
||||
#if defined NOT_IN_libc && defined IS_IN_libm
|
||||
# define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
||||
# define libm_hidden_def(name) hidden_def (name)
|
||||
# define libm_hidden_weak(name) hidden_weak (name)
|
||||
# define libm_hidden_ver(local, name) hidden_ver (local, name)
|
||||
# define libm_hidden_data_def(name) hidden_data_def (name)
|
||||
# define libm_hidden_data_weak(name) hidden_data_weak (name)
|
||||
# define libm_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
||||
#else
|
||||
# define libm_hidden_proto(name, attrs...)
|
||||
# define libm_hidden_def(name)
|
||||
# define libm_hidden_weak(name)
|
||||
# define libm_hidden_ver(local, name)
|
||||
# define libm_hidden_data_def(name)
|
||||
# define libm_hidden_data_weak(name)
|
||||
# define libm_hidden_data_ver(local, name)
|
||||
#endif
|
||||
|
||||
#endif /* libc-symbols.h */
|
24
src/kernel/libroot/posix/glibc/include/libio.h
Normal file
24
src/kernel/libroot/posix/glibc/include/libio.h
Normal file
@ -0,0 +1,24 @@
|
||||
#include <libio/libio.h>
|
||||
|
||||
#ifndef _LIBC_LIBIO_H
|
||||
#define _LIBC_LIBIO_H
|
||||
|
||||
libc_hidden_proto (__overflow)
|
||||
libc_hidden_proto (__underflow)
|
||||
libc_hidden_proto (__uflow)
|
||||
libc_hidden_proto (__woverflow)
|
||||
libc_hidden_proto (__wunderflow)
|
||||
libc_hidden_proto (__wuflow)
|
||||
|
||||
#if defined _IO_MTSAFE_IO && _IO_lock_inexpensive
|
||||
# undef _IO_flockfile
|
||||
# define _IO_flockfile(_fp) \
|
||||
if (((_fp)->_flags & _IO_USER_LOCK) == 0) \
|
||||
_IO_lock_lock (*(_fp)->_lock)
|
||||
# undef _IO_funlockfile
|
||||
# define _IO_funlockfile(_fp) \
|
||||
if (((_fp)->_flags & _IO_USER_LOCK) == 0) \
|
||||
_IO_lock_unlock (*(_fp)->_lock)
|
||||
#endif
|
||||
|
||||
#endif
|
22
src/kernel/libroot/posix/glibc/include/locale.h
Normal file
22
src/kernel/libroot/posix/glibc/include/locale.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef _LOCALE_H
|
||||
#include <locale/locale.h>
|
||||
|
||||
extern __typeof (uselocale) __uselocale;
|
||||
|
||||
libc_hidden_proto (setlocale)
|
||||
|
||||
/* This has to be changed whenever a new locale is defined. */
|
||||
#define __LC_LAST 13
|
||||
|
||||
extern struct loaded_l10nfile *_nl_locale_file_list[] attribute_hidden;
|
||||
|
||||
/* Locale object for C locale. */
|
||||
extern struct __locale_struct _nl_C_locobj attribute_hidden;
|
||||
|
||||
/* Now define the internal interfaces. */
|
||||
extern struct lconv *__localeconv (void);
|
||||
|
||||
/* Fetch the name of the current locale set in the given category. */
|
||||
extern const char *__current_locale_name (int category) attribute_hidden;
|
||||
|
||||
#endif
|
260
src/kernel/libroot/posix/glibc/include/misc/sys/cdefs.h
Normal file
260
src/kernel/libroot/posix/glibc/include/misc/sys/cdefs.h
Normal file
@ -0,0 +1,260 @@
|
||||
/* Copyright (C) 1992-2001, 2002 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 _SYS_CDEFS_H
|
||||
#define _SYS_CDEFS_H 1
|
||||
|
||||
/* We are almost always included from features.h. */
|
||||
#ifndef _FEATURES_H
|
||||
# include <features.h>
|
||||
#endif
|
||||
|
||||
/* The GNU libc does not support any K&R compilers or the traditional mode
|
||||
of ISO C compilers anymore. Check for some of the combinations not
|
||||
anymore supported. */
|
||||
#if defined __GNUC__ && !defined __STDC__
|
||||
# error "You need a ISO C conforming compiler to use the glibc headers"
|
||||
#endif
|
||||
|
||||
/* Some user header file might have defined this before. */
|
||||
#undef __P
|
||||
#undef __PMT
|
||||
|
||||
#ifdef __GNUC__
|
||||
|
||||
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||
to help it optimize the function calls. But this works only with
|
||||
gcc 2.8.x and egcs. */
|
||||
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||
# define __THROW throw ()
|
||||
# else
|
||||
# define __THROW
|
||||
# endif
|
||||
# define __P(args) args __THROW
|
||||
/* This macro will be used for functions which might take C++ callback
|
||||
functions. */
|
||||
# define __PMT(args) args
|
||||
|
||||
#else /* Not GCC. */
|
||||
|
||||
# define __inline /* No inline functions. */
|
||||
|
||||
# define __THROW
|
||||
# define __P(args) args
|
||||
# define __PMT(args) args
|
||||
|
||||
# define __const const
|
||||
# define __signed signed
|
||||
# define __volatile volatile
|
||||
|
||||
#endif /* GCC. */
|
||||
|
||||
/* For these things, GCC behaves the ANSI way normally,
|
||||
and the non-ANSI way under -traditional. */
|
||||
|
||||
#define __CONCAT(x,y) x ## y
|
||||
#define __STRING(x) #x
|
||||
|
||||
/* This is not a typedef so `const __ptr_t' does the right thing. */
|
||||
#define __ptr_t void *
|
||||
#define __long_double_t long double
|
||||
|
||||
|
||||
/* C++ needs to know that types and declarations are C, not C++. */
|
||||
#ifdef __cplusplus
|
||||
# define __BEGIN_DECLS extern "C" {
|
||||
# define __END_DECLS }
|
||||
#else
|
||||
# define __BEGIN_DECLS
|
||||
# define __END_DECLS
|
||||
#endif
|
||||
|
||||
|
||||
/* The standard library needs the functions from the ISO C90 standard
|
||||
in the std namespace. At the same time we want to be safe for
|
||||
future changes and we include the ISO C99 code in the non-standard
|
||||
namespace __c99. The C++ wrapper header take case of adding the
|
||||
definitions to the global namespace. */
|
||||
#if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES
|
||||
# define __BEGIN_NAMESPACE_STD namespace std {
|
||||
# define __END_NAMESPACE_STD }
|
||||
# define __USING_NAMESPACE_STD(name) using std::name;
|
||||
# define __BEGIN_NAMESPACE_C99 namespace __c99 {
|
||||
# define __END_NAMESPACE_C99 }
|
||||
# define __USING_NAMESPACE_C99(name) using __c99::name;
|
||||
#else
|
||||
/* For compatibility we do not add the declarations into any
|
||||
namespace. They will end up in the global namespace which is what
|
||||
old code expects. */
|
||||
# define __BEGIN_NAMESPACE_STD
|
||||
# define __END_NAMESPACE_STD
|
||||
# define __USING_NAMESPACE_STD(name)
|
||||
# define __BEGIN_NAMESPACE_C99
|
||||
# define __END_NAMESPACE_C99
|
||||
# define __USING_NAMESPACE_C99(name)
|
||||
#endif
|
||||
|
||||
|
||||
/* Support for bounded pointers. */
|
||||
#ifndef __BOUNDED_POINTERS__
|
||||
# define __bounded /* nothing */
|
||||
# define __unbounded /* nothing */
|
||||
# define __ptrvalue /* nothing */
|
||||
#endif
|
||||
|
||||
|
||||
/* Support for flexible arrays. */
|
||||
#if __GNUC_PREREQ (2,97)
|
||||
/* GCC 2.97 supports C99 flexible array members. */
|
||||
# define __flexarr []
|
||||
#else
|
||||
# ifdef __GNUC__
|
||||
# define __flexarr [0]
|
||||
# else
|
||||
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
# define __flexarr []
|
||||
# else
|
||||
/* Some other non-C99 compiler. Approximate with [1]. */
|
||||
# define __flexarr [1]
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* __asm__ ("xyz") is used throughout the headers to rename functions
|
||||
at the assembly language level. This is wrapped by the __REDIRECT
|
||||
macro, in order to support compilers that can do this some other
|
||||
way. When compilers don't support asm-names at all, we have to do
|
||||
preprocessor tricks instead (which don't have exactly the right
|
||||
semantics, but it's the best we can do).
|
||||
|
||||
Example:
|
||||
int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
|
||||
# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
|
||||
# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
|
||||
# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
|
||||
|
||||
/*
|
||||
#elif __SOME_OTHER_COMPILER__
|
||||
|
||||
# define __REDIRECT(name, proto, alias) name proto; \
|
||||
_Pragma("let " #name " = " #alias)
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* GCC has various useful declarations that can be made with the
|
||||
`__attribute__' syntax. All of the ways we use this do fine if
|
||||
they are omitted for compilers that don't understand it. */
|
||||
#if !defined __GNUC__ || __GNUC__ < 2
|
||||
# define __attribute__(xyz) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `malloc' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96)
|
||||
# define __attribute_malloc__ __attribute__ ((__malloc__))
|
||||
#else
|
||||
# define __attribute_malloc__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `pure' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96)
|
||||
# define __attribute_pure__ __attribute__ ((__pure__))
|
||||
#else
|
||||
# define __attribute_pure__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 3.1 development the `used' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (3,1)
|
||||
# define __attribute_used__ __attribute__ ((__used__))
|
||||
# define __attribute_noinline__ __attribute__ ((__noinline__))
|
||||
#else
|
||||
# define __attribute_used__ __attribute__ ((__unused__))
|
||||
# define __attribute_noinline__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* gcc allows marking deprecated functions. */
|
||||
#if __GNUC_PREREQ (3,2)
|
||||
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
|
||||
#else
|
||||
# define __attribute_deprecated__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.8 development the `format_arg' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings.
|
||||
If several `format_arg' attributes are given for the same function, in
|
||||
gcc-3.0 and older, all but the last one are ignored. In newer gccs,
|
||||
all designated arguments are considered. */
|
||||
#if __GNUC_PREREQ (2,8)
|
||||
# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
|
||||
#else
|
||||
# define __attribute_format_arg__(x) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.97 development the `strfmon' format
|
||||
attribute for functions was introduced. We don't want to use it
|
||||
unconditionally (although this would be possible) since it
|
||||
generates warnings. */
|
||||
#if __GNUC_PREREQ (2,97)
|
||||
# define __attribute_format_strfmon__(a,b) \
|
||||
__attribute__ ((__format__ (__strfmon__, a, b)))
|
||||
#else
|
||||
# define __attribute_format_strfmon__(a,b) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* It is possible to compile containing GCC extensions even if GCC is
|
||||
run in pedantic mode if the uses are carefully marked using the
|
||||
`__extension__' keyword. But this is not generally available before
|
||||
version 2.8. */
|
||||
#if !__GNUC_PREREQ (2,8)
|
||||
# define __extension__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* __restrict is known in EGCS 1.2 and above. */
|
||||
#if !__GNUC_PREREQ (2,92)
|
||||
# define __restrict /* Ignore */
|
||||
#endif
|
||||
|
||||
/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
|
||||
array_name[restrict]
|
||||
GCC 3.1 supports this. */
|
||||
#if __GNUC_PREREQ (3,1) && !defined __GNUG__
|
||||
# define __restrict_arr __restrict
|
||||
#else
|
||||
# ifdef __GNUC__
|
||||
# define __restrict_arr /* Not supported in old GCC. */
|
||||
# else
|
||||
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
# define __restrict_arr restrict
|
||||
# else
|
||||
/* Some other non-C99 compiler. */
|
||||
# define __restrict_arr /* Not supported. */
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* sys/cdefs.h */
|
609
src/kernel/libroot/posix/glibc/include/obstack.h
Normal file
609
src/kernel/libroot/posix/glibc/include/obstack.h
Normal file
@ -0,0 +1,609 @@
|
||||
/* obstack.h - object stack macros
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
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. */
|
||||
|
||||
/* Summary:
|
||||
|
||||
All the apparent functions defined here are macros. The idea
|
||||
is that you would use these pre-tested macros to solve a
|
||||
very specific set of problems, and they would run fast.
|
||||
Caution: no side-effects in arguments please!! They may be
|
||||
evaluated MANY times!!
|
||||
|
||||
These macros operate a stack of objects. Each object starts life
|
||||
small, and may grow to maturity. (Consider building a word syllable
|
||||
by syllable.) An object can move while it is growing. Once it has
|
||||
been "finished" it never changes address again. So the "top of the
|
||||
stack" is typically an immature growing object, while the rest of the
|
||||
stack is of mature, fixed size and fixed address objects.
|
||||
|
||||
These routines grab large chunks of memory, using a function you
|
||||
supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
|
||||
by calling `obstack_chunk_free'. You must define them and declare
|
||||
them before using any obstack macros.
|
||||
|
||||
Each independent stack is represented by a `struct obstack'.
|
||||
Each of the obstack macros expects a pointer to such a structure
|
||||
as the first argument.
|
||||
|
||||
One motivation for this package is the problem of growing char strings
|
||||
in symbol tables. Unless you are "fascist pig with a read-only mind"
|
||||
--Gosper's immortal quote from HAKMEM item 154, out of context--you
|
||||
would not like to put any arbitrary upper limit on the length of your
|
||||
symbols.
|
||||
|
||||
In practice this often means you will build many short symbols and a
|
||||
few long symbols. At the time you are reading a symbol you don't know
|
||||
how long it is. One traditional method is to read a symbol into a
|
||||
buffer, realloc()ating the buffer every time you try to read a symbol
|
||||
that is longer than the buffer. This is beaut, but you still will
|
||||
want to copy the symbol from the buffer to a more permanent
|
||||
symbol-table entry say about half the time.
|
||||
|
||||
With obstacks, you can work differently. Use one obstack for all symbol
|
||||
names. As you read a symbol, grow the name in the obstack gradually.
|
||||
When the name is complete, finalize it. Then, if the symbol exists already,
|
||||
free the newly read name.
|
||||
|
||||
The way we do this is to take a large chunk, allocating memory from
|
||||
low addresses. When you want to build a symbol in the chunk you just
|
||||
add chars above the current "high water mark" in the chunk. When you
|
||||
have finished adding chars, because you got to the end of the symbol,
|
||||
you know how long the chars are, and you can create a new object.
|
||||
Mostly the chars will not burst over the highest address of the chunk,
|
||||
because you would typically expect a chunk to be (say) 100 times as
|
||||
long as an average object.
|
||||
|
||||
In case that isn't clear, when we have enough chars to make up
|
||||
the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
|
||||
so we just point to it where it lies. No moving of chars is
|
||||
needed and this is the second win: potentially long strings need
|
||||
never be explicitly shuffled. Once an object is formed, it does not
|
||||
change its address during its lifetime.
|
||||
|
||||
When the chars burst over a chunk boundary, we allocate a larger
|
||||
chunk, and then copy the partly formed object from the end of the old
|
||||
chunk to the beginning of the new larger chunk. We then carry on
|
||||
accreting characters to the end of the object as we normally would.
|
||||
|
||||
A special macro is provided to add a single char at a time to a
|
||||
growing object. This allows the use of register variables, which
|
||||
break the ordinary 'growth' macro.
|
||||
|
||||
Summary:
|
||||
We allocate large chunks.
|
||||
We carve out one object at a time from the current chunk.
|
||||
Once carved, an object never moves.
|
||||
We are free to append data of any size to the currently
|
||||
growing object.
|
||||
Exactly one object is growing in an obstack at any one time.
|
||||
You can run one obstack per control block.
|
||||
You may have as many control blocks as you dare.
|
||||
Because of the way we do it, you can `unwind' an obstack
|
||||
back to a previous state. (You may remove objects much
|
||||
as you would with a stack.)
|
||||
*/
|
||||
|
||||
|
||||
/* Don't do the contents of this file more than once. */
|
||||
|
||||
#ifndef _OBSTACK_H
|
||||
#define _OBSTACK_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* We use subtraction of (char *) 0 instead of casting to int
|
||||
because on word-addressable machines a simple cast to int
|
||||
may ignore the byte-within-word field of the pointer. */
|
||||
|
||||
#ifndef __PTR_TO_INT
|
||||
# define __PTR_TO_INT(P) ((P) - (char *) 0)
|
||||
#endif
|
||||
|
||||
#ifndef __INT_TO_PTR
|
||||
#if defined __STDC__ && __STDC__
|
||||
# define __INT_TO_PTR(P) ((void *) ((P) + (char *) 0))
|
||||
#else
|
||||
# define __INT_TO_PTR(P) ((P) + (char *) 0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* We need the type of the resulting object. If __PTRDIFF_TYPE__ is
|
||||
defined, as with GNU C, use that; that way we don't pollute the
|
||||
namespace with <stddef.h>'s symbols. Otherwise, if <stddef.h> is
|
||||
available, include it and use ptrdiff_t. In traditional C, long is
|
||||
the best that we can do. */
|
||||
|
||||
#ifdef __PTRDIFF_TYPE__
|
||||
# define PTR_INT_TYPE __PTRDIFF_TYPE__
|
||||
#else
|
||||
# ifdef HAVE_STDDEF_H
|
||||
# include <stddef.h>
|
||||
# define PTR_INT_TYPE ptrdiff_t
|
||||
# else
|
||||
# define PTR_INT_TYPE long
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined _LIBC || defined HAVE_STRING_H
|
||||
# include <string.h>
|
||||
# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
|
||||
#else
|
||||
# ifdef memcpy
|
||||
# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
|
||||
# else
|
||||
# define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
struct _obstack_chunk /* Lives at front of each chunk. */
|
||||
{
|
||||
char *limit; /* 1 past end of this chunk */
|
||||
struct _obstack_chunk *prev; /* address of prior chunk or NULL */
|
||||
char contents[4]; /* objects begin here */
|
||||
};
|
||||
|
||||
struct obstack /* control current object in current chunk */
|
||||
{
|
||||
long chunk_size; /* preferred size to allocate chunks in */
|
||||
struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
|
||||
char *object_base; /* address of object we are building */
|
||||
char *next_free; /* where to add next char to current object */
|
||||
char *chunk_limit; /* address of char after current chunk */
|
||||
PTR_INT_TYPE temp; /* Temporary for some macros. */
|
||||
int alignment_mask; /* Mask of alignment for each object. */
|
||||
#if defined __STDC__ && __STDC__
|
||||
/* These prototypes vary based on `use_extra_arg', and we use
|
||||
casts to the prototypeless function type in all assignments,
|
||||
but having prototypes here quiets -Wstrict-prototypes. */
|
||||
struct _obstack_chunk *(*chunkfun) (void *, long);
|
||||
void (*freefun) (void *, struct _obstack_chunk *);
|
||||
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
#else
|
||||
struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */
|
||||
void (*freefun) (); /* User's function to free a chunk. */
|
||||
char *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
#endif
|
||||
unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
|
||||
unsigned maybe_empty_object:1;/* There is a possibility that the current
|
||||
chunk contains a zero-length object. This
|
||||
prevents freeing the chunk if we allocate
|
||||
a bigger chunk to replace it. */
|
||||
unsigned alloc_failed:1; /* No longer used, as we now call the failed
|
||||
handler on error, but retained for binary
|
||||
compatibility. */
|
||||
};
|
||||
|
||||
/* Declare the external functions we use; they are in obstack.c. */
|
||||
|
||||
#if defined __STDC__ && __STDC__
|
||||
extern void _obstack_newchunk (struct obstack *, int);
|
||||
extern void _obstack_free (struct obstack *, void *);
|
||||
extern int _obstack_begin (struct obstack *, int, int,
|
||||
void *(*) (long), void (*) (void *));
|
||||
extern int _obstack_begin_1 (struct obstack *, int, int,
|
||||
void *(*) (void *, long),
|
||||
void (*) (void *, void *), void *);
|
||||
extern int _obstack_memory_used (struct obstack *);
|
||||
#else
|
||||
extern void _obstack_newchunk ();
|
||||
extern void _obstack_free ();
|
||||
extern int _obstack_begin ();
|
||||
extern int _obstack_begin_1 ();
|
||||
extern int _obstack_memory_used ();
|
||||
#endif
|
||||
|
||||
#if defined __STDC__ && __STDC__
|
||||
|
||||
/* Do the function-declarations after the structs
|
||||
but before defining the macros. */
|
||||
|
||||
void obstack_init (struct obstack *obstack);
|
||||
|
||||
void * obstack_alloc (struct obstack *obstack, int size);
|
||||
|
||||
void * obstack_copy (struct obstack *obstack, const void *address, int size);
|
||||
void * obstack_copy0 (struct obstack *obstack, const void *address, int size);
|
||||
|
||||
void obstack_free (struct obstack *obstack, void *block);
|
||||
|
||||
void obstack_blank (struct obstack *obstack, int size);
|
||||
|
||||
void obstack_grow (struct obstack *obstack, const void *data, int size);
|
||||
void obstack_grow0 (struct obstack *obstack, const void *data, int size);
|
||||
|
||||
void obstack_1grow (struct obstack *obstack, int data_char);
|
||||
void obstack_ptr_grow (struct obstack *obstack, const void *data);
|
||||
void obstack_int_grow (struct obstack *obstack, int data);
|
||||
|
||||
void * obstack_finish (struct obstack *obstack);
|
||||
|
||||
int obstack_object_size (struct obstack *obstack);
|
||||
|
||||
int obstack_room (struct obstack *obstack);
|
||||
void obstack_make_room (struct obstack *obstack, int size);
|
||||
void obstack_1grow_fast (struct obstack *obstack, int data_char);
|
||||
void obstack_ptr_grow_fast (struct obstack *obstack, const void *data);
|
||||
void obstack_int_grow_fast (struct obstack *obstack, int data);
|
||||
void obstack_blank_fast (struct obstack *obstack, int size);
|
||||
|
||||
void * obstack_base (struct obstack *obstack);
|
||||
void * obstack_next_free (struct obstack *obstack);
|
||||
int obstack_alignment_mask (struct obstack *obstack);
|
||||
int obstack_chunk_size (struct obstack *obstack);
|
||||
int obstack_memory_used (struct obstack *obstack);
|
||||
|
||||
#endif /* __STDC__ */
|
||||
|
||||
/* Non-ANSI C cannot really support alternative functions for these macros,
|
||||
so we do not declare them. */
|
||||
|
||||
/* Error handler called when `obstack_chunk_alloc' failed to allocate
|
||||
more memory. This can be set to a user defined function which
|
||||
should either abort gracefully or use longjump - but shouldn't
|
||||
return. The default action is to print a message and abort. */
|
||||
#if defined __STDC__ && __STDC__
|
||||
extern void (*obstack_alloc_failed_handler) (void);
|
||||
#else
|
||||
extern void (*obstack_alloc_failed_handler) ();
|
||||
#endif
|
||||
|
||||
/* Exit value used when `print_and_abort' is used. */
|
||||
extern int obstack_exit_failure;
|
||||
|
||||
/* Pointer to beginning of object being allocated or to be allocated next.
|
||||
Note that this might not be the final address of the object
|
||||
because a new chunk might be needed to hold the final size. */
|
||||
|
||||
#define obstack_base(h) ((h)->object_base)
|
||||
|
||||
/* Size for allocating ordinary chunks. */
|
||||
|
||||
#define obstack_chunk_size(h) ((h)->chunk_size)
|
||||
|
||||
/* Pointer to next byte not yet allocated in current chunk. */
|
||||
|
||||
#define obstack_next_free(h) ((h)->next_free)
|
||||
|
||||
/* Mask specifying low bits that should be clear in address of an object. */
|
||||
|
||||
#define obstack_alignment_mask(h) ((h)->alignment_mask)
|
||||
|
||||
/* To prevent prototype warnings provide complete argument list in
|
||||
standard C version. */
|
||||
#if defined __STDC__ && __STDC__
|
||||
|
||||
# define obstack_init(h) \
|
||||
_obstack_begin ((h), 0, 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, \
|
||||
(void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
# define obstack_begin(h, size) \
|
||||
_obstack_begin ((h), (size), 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, \
|
||||
(void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
|
||||
_obstack_begin ((h), (size), (alignment), \
|
||||
(void *(*) (long)) (chunkfun), \
|
||||
(void (*) (void *)) (freefun))
|
||||
|
||||
# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
|
||||
_obstack_begin_1 ((h), (size), (alignment), \
|
||||
(void *(*) (void *, long)) (chunkfun), \
|
||||
(void (*) (void *, void *)) (freefun), (arg))
|
||||
|
||||
# define obstack_chunkfun(h, newchunkfun) \
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
|
||||
|
||||
# define obstack_freefun(h, newfreefun) \
|
||||
((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
|
||||
|
||||
#else
|
||||
|
||||
# define obstack_init(h) \
|
||||
_obstack_begin ((h), 0, 0, \
|
||||
(void *(*) ()) obstack_chunk_alloc, \
|
||||
(void (*) ()) obstack_chunk_free)
|
||||
|
||||
# define obstack_begin(h, size) \
|
||||
_obstack_begin ((h), (size), 0, \
|
||||
(void *(*) ()) obstack_chunk_alloc, \
|
||||
(void (*) ()) obstack_chunk_free)
|
||||
|
||||
# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
|
||||
_obstack_begin ((h), (size), (alignment), \
|
||||
(void *(*) ()) (chunkfun), \
|
||||
(void (*) ()) (freefun))
|
||||
|
||||
# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
|
||||
_obstack_begin_1 ((h), (size), (alignment), \
|
||||
(void *(*) ()) (chunkfun), \
|
||||
(void (*) ()) (freefun), (arg))
|
||||
|
||||
# define obstack_chunkfun(h, newchunkfun) \
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
|
||||
|
||||
# define obstack_freefun(h, newfreefun) \
|
||||
((h) -> freefun = (void (*)()) (newfreefun))
|
||||
|
||||
#endif
|
||||
|
||||
#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
|
||||
|
||||
#define obstack_blank_fast(h,n) ((h)->next_free += (n))
|
||||
|
||||
#define obstack_memory_used(h) _obstack_memory_used (h)
|
||||
|
||||
#if defined __GNUC__ && defined __STDC__ && __STDC__
|
||||
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
||||
does not implement __extension__. But that compiler doesn't define
|
||||
__GNUC_MINOR__. */
|
||||
# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
|
||||
# define __extension__
|
||||
# endif
|
||||
|
||||
/* For GNU C, if not -traditional,
|
||||
we can define these macros to compute all args only once
|
||||
without using a global variable.
|
||||
Also, we can avoid using the `temp' slot, to make faster code. */
|
||||
|
||||
# define obstack_object_size(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(unsigned) (__o->next_free - __o->object_base); })
|
||||
|
||||
# define obstack_room(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(unsigned) (__o->chunk_limit - __o->next_free); })
|
||||
|
||||
# define obstack_make_room(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_empty_p(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
|
||||
|
||||
# define obstack_grow(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
_obstack_memcpy (__o->next_free, (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_grow0(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len + 1); \
|
||||
_obstack_memcpy (__o->next_free, (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
*(__o->next_free)++ = 0; \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_1grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, 1); \
|
||||
*(__o->next_free)++ = (datum); \
|
||||
(void) 0; })
|
||||
|
||||
/* These assume that the obstack alignment is good enough for pointers
|
||||
or ints, and that the data added so far to the current object
|
||||
shares that much alignment. */
|
||||
|
||||
# define obstack_ptr_grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (void *)); \
|
||||
*((void **)__o->next_free)++ = (datum); \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_int_grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (int) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (int)); \
|
||||
*((int *)__o->next_free)++ = (datum); \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_ptr_grow_fast(h,aptr) \
|
||||
(*((void **) (h)->next_free)++ = (aptr))
|
||||
|
||||
# define obstack_int_grow_fast(h,aint) \
|
||||
(*((int *) (h)->next_free)++ = (aint))
|
||||
|
||||
# define obstack_blank(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
# define obstack_alloc(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_blank (__h, (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
# define obstack_copy(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_grow (__h, (where), (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
# define obstack_copy0(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_grow0 (__h, (where), (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
/* The local variable is named __o1 to avoid a name conflict
|
||||
when obstack_blank is called. */
|
||||
# define obstack_finish(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o1 = (OBSTACK); \
|
||||
void *value; \
|
||||
value = (void *) __o1->object_base; \
|
||||
if (__o1->next_free == value) \
|
||||
__o1->maybe_empty_object = 1; \
|
||||
__o1->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
|
||||
& ~ (__o1->alignment_mask)); \
|
||||
if (__o1->next_free - (char *)__o1->chunk \
|
||||
> __o1->chunk_limit - (char *)__o1->chunk) \
|
||||
__o1->next_free = __o1->chunk_limit; \
|
||||
__o1->object_base = __o1->next_free; \
|
||||
value; })
|
||||
|
||||
# define obstack_free(OBSTACK, OBJ) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
void *__obj = (OBJ); \
|
||||
if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
|
||||
__o->next_free = __o->object_base = (char *)__obj; \
|
||||
else (obstack_free) (__o, __obj); })
|
||||
|
||||
#else /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
# define obstack_object_size(h) \
|
||||
(unsigned) ((h)->next_free - (h)->object_base)
|
||||
|
||||
# define obstack_room(h) \
|
||||
(unsigned) ((h)->chunk_limit - (h)->next_free)
|
||||
|
||||
# define obstack_empty_p(h) \
|
||||
((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
|
||||
|
||||
/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
|
||||
so that we can avoid having void expressions
|
||||
in the arms of the conditional expression.
|
||||
Casting the third operand to void was tried before,
|
||||
but some compilers won't accept it. */
|
||||
|
||||
# define obstack_make_room(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
|
||||
|
||||
# define obstack_grow(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
_obstack_memcpy ((h)->next_free, (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp)
|
||||
|
||||
# define obstack_grow0(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
|
||||
_obstack_memcpy ((h)->next_free, (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp, \
|
||||
*((h)->next_free)++ = 0)
|
||||
|
||||
# define obstack_1grow(h,datum) \
|
||||
( (((h)->next_free + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), 1), 0) : 0), \
|
||||
(*((h)->next_free)++ = (datum)))
|
||||
|
||||
# define obstack_ptr_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
|
||||
(*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum)))
|
||||
|
||||
# define obstack_int_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
|
||||
(*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum)))
|
||||
|
||||
# define obstack_ptr_grow_fast(h,aptr) \
|
||||
(*((const char **) (h)->next_free)++ = (aptr))
|
||||
|
||||
# define obstack_int_grow_fast(h,aint) \
|
||||
(*((int *) (h)->next_free)++ = (aint))
|
||||
|
||||
# define obstack_blank(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->chunk_limit - (h)->next_free < (h)->temp) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
((h)->next_free += (h)->temp))
|
||||
|
||||
# define obstack_alloc(h,length) \
|
||||
(obstack_blank ((h), (length)), obstack_finish ((h)))
|
||||
|
||||
# define obstack_copy(h,where,length) \
|
||||
(obstack_grow ((h), (where), (length)), obstack_finish ((h)))
|
||||
|
||||
# define obstack_copy0(h,where,length) \
|
||||
(obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
|
||||
|
||||
# define obstack_finish(h) \
|
||||
( ((h)->next_free == (h)->object_base \
|
||||
? (((h)->maybe_empty_object = 1), 0) \
|
||||
: 0), \
|
||||
(h)->temp = __PTR_TO_INT ((h)->object_base), \
|
||||
(h)->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
|
||||
& ~ ((h)->alignment_mask)), \
|
||||
(((h)->next_free - (char *) (h)->chunk \
|
||||
> (h)->chunk_limit - (char *) (h)->chunk) \
|
||||
? ((h)->next_free = (h)->chunk_limit) : 0), \
|
||||
(h)->object_base = (h)->next_free, \
|
||||
__INT_TO_PTR ((h)->temp))
|
||||
|
||||
# if defined __STDC__ && __STDC__
|
||||
# define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
: (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
|
||||
# else
|
||||
# define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
: (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
|
||||
# endif
|
||||
|
||||
#endif /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* C++ */
|
||||
#endif
|
||||
|
||||
#endif /* obstack.h */
|
89
src/kernel/libroot/posix/glibc/include/shlib-compat.h
Normal file
89
src/kernel/libroot/posix/glibc/include/shlib-compat.h
Normal file
@ -0,0 +1,89 @@
|
||||
/* Macros for managing ABI-compatibility definitions using ELF symbol versions.
|
||||
Copyright (C) 2000, 2002 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 _SHLIB_COMPAT_H
|
||||
#define _SHLIB_COMPAT_H 1
|
||||
|
||||
#if defined HAVE_ELF && defined DO_VERSIONING
|
||||
/* Since there is just one set of .d files generated, we need to
|
||||
include this unconditionally to have the dependency noticed properly. */
|
||||
#include <abi-versions.h> /* header generated by abi-versions.awk */
|
||||
#endif
|
||||
|
||||
#if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
|
||||
|
||||
/* The file abi-versions.h (generated by scripts/abi-versions.awk) defines
|
||||
symbols like `ABI_libm_GLIBC_2_0' for each version set in the source
|
||||
code for each library. For a version set that is subsumed by a later
|
||||
version set, the definition gives the subsuming set, i.e. if GLIBC_2_0
|
||||
is subsumed by GLIBC_2_1, then ABI_libm_GLIBC_2_0 == ABI_libm_GLIBC_2_1.
|
||||
Each version set that is to be distinctly defined in the output has an
|
||||
unique positive integer value, increasing with newer versions. Thus,
|
||||
evaluating two ABI_* symbols reduces to integer values that differ only
|
||||
when the two version sets named are in fact two different ABIs we are
|
||||
supporting. If these do not differ, then there is no need to compile in
|
||||
extra code to support this version set where it has been superseded by a
|
||||
newer version. The compatibility code should be conditionalized with
|
||||
e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced
|
||||
in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
|
||||
|
||||
# define SHLIB_COMPAT(lib, introduced, obsoleted) \
|
||||
((IS_IN_##lib - 0) \
|
||||
&& (!(ABI_##lib##_##obsoleted - 0) \
|
||||
|| ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0))))
|
||||
|
||||
# ifndef NOT_IN_libc
|
||||
# define IS_IN_libc 1
|
||||
# endif
|
||||
|
||||
/* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to
|
||||
the version set name to use for e.g. symbols first introduced into
|
||||
libm in the GLIBC_2.1 version. Definitions of symbols with explicit
|
||||
versions should look like:
|
||||
versioned_symbol (libm, new_foo, foo, GLIBC_2_1);
|
||||
This will define the symbol `foo' with the appropriate default version,
|
||||
i.e. either GLIBC_2.1 or the "earliest version" specified in
|
||||
shlib-versions if that is newer. */
|
||||
|
||||
# define versioned_symbol(lib, local, symbol, version) \
|
||||
versioned_symbol_1 (local, symbol, VERSION_##lib##_##version)
|
||||
# define versioned_symbol_1(local, symbol, name) \
|
||||
default_symbol_version (local, symbol, name)
|
||||
|
||||
# define compat_symbol(lib, local, symbol, version) \
|
||||
compat_symbol_1 (local, symbol, VERSION_##lib##_##version)
|
||||
# define compat_symbol_1(local, symbol, name) \
|
||||
symbol_version (local, symbol, name)
|
||||
|
||||
#else
|
||||
|
||||
/* Not compiling ELF shared libraries at all, so never any old versions. */
|
||||
# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
|
||||
|
||||
/* No versions to worry about, just make this the global definition. */
|
||||
# define versioned_symbol(lib, local, symbol, version) \
|
||||
weak_alias (local, symbol)
|
||||
|
||||
/* This should not appear outside `#if SHLIB_COMPAT (...)'. */
|
||||
# define compat_symbol(lib, local, symbol, version) ...
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* shlib-compat.h */
|
11
src/kernel/libroot/posix/glibc/include/stdio_ext.h
Normal file
11
src/kernel/libroot/posix/glibc/include/stdio_ext.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef _STDIO_EXT_H
|
||||
|
||||
# include <stdio-common/stdio_ext.h>
|
||||
|
||||
extern int __fsetlocking_internal (FILE *__fp, int __type) attribute_hidden;
|
||||
|
||||
#ifndef NOT_IN_libc
|
||||
# define __fsetlocking(fp, type) INTUSE(__fsetlocking) (fp, type)
|
||||
#endif
|
||||
|
||||
#endif
|
204
src/kernel/libroot/posix/glibc/include/stdlib.h
Normal file
204
src/kernel/libroot/posix/glibc/include/stdlib.h
Normal file
@ -0,0 +1,204 @@
|
||||
#ifndef _STDLIB_H
|
||||
|
||||
#ifdef __need_malloc_and_calloc
|
||||
#define __Need_M_And_C
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib/stdlib.h>
|
||||
|
||||
/* Now define the internal interfaces. */
|
||||
#ifndef __Need_M_And_C
|
||||
|
||||
extern __typeof (strtol_l) __strtol_l;
|
||||
extern __typeof (strtoul_l) __strtoul_l;
|
||||
extern __typeof (strtoll_l) __strtoll_l;
|
||||
extern __typeof (strtoull_l) __strtoull_l;
|
||||
extern __typeof (strtod_l) __strtod_l;
|
||||
extern __typeof (strtof_l) __strtof_l;
|
||||
extern __typeof (strtold_l) __strtold_l;
|
||||
|
||||
libc_hidden_proto (exit)
|
||||
libc_hidden_proto (abort)
|
||||
libc_hidden_proto (getenv)
|
||||
libc_hidden_proto (bsearch)
|
||||
libc_hidden_proto (qsort)
|
||||
libc_hidden_proto (ecvt_r)
|
||||
libc_hidden_proto (fcvt_r)
|
||||
libc_hidden_proto (qecvt_r)
|
||||
libc_hidden_proto (qfcvt_r)
|
||||
libc_hidden_proto (lrand48_r)
|
||||
libc_hidden_proto (wctomb)
|
||||
libc_hidden_proto (__secure_getenv)
|
||||
libc_hidden_proto (__strtof_internal)
|
||||
libc_hidden_proto (__strtod_internal)
|
||||
libc_hidden_proto (__strtold_internal)
|
||||
libc_hidden_proto (__strtol_internal)
|
||||
libc_hidden_proto (__strtoll_internal)
|
||||
libc_hidden_proto (__strtoul_internal)
|
||||
libc_hidden_proto (__strtoull_internal)
|
||||
|
||||
extern long int __random (void);
|
||||
extern void __srandom (unsigned int __seed);
|
||||
extern char *__initstate (unsigned int __seed, char *__statebuf,
|
||||
size_t __statelen);
|
||||
extern char *__setstate (char *__statebuf);
|
||||
extern int __random_r (struct random_data *__buf, int32_t *__result);
|
||||
extern int __srandom_r (unsigned int __seed, struct random_data *__buf);
|
||||
extern int __initstate_r (unsigned int __seed, char *__statebuf,
|
||||
size_t __statelen, struct random_data *__buf);
|
||||
extern int __setstate_r (char *__statebuf, struct random_data *__buf);
|
||||
extern int __rand_r (unsigned int *__seed);
|
||||
extern int __erand48_r (unsigned short int __xsubi[3],
|
||||
struct drand48_data *__buffer, double *__result);
|
||||
extern int __nrand48_r (unsigned short int __xsubi[3],
|
||||
struct drand48_data *__buffer,
|
||||
long int *__result);
|
||||
extern int __jrand48_r (unsigned short int __xsubi[3],
|
||||
struct drand48_data *__buffer,
|
||||
long int *__result);
|
||||
extern int __srand48_r (long int __seedval,
|
||||
struct drand48_data *__buffer);
|
||||
extern int __seed48_r (unsigned short int __seed16v[3],
|
||||
struct drand48_data *__buffer);
|
||||
extern int __lcong48_r (unsigned short int __param[7],
|
||||
struct drand48_data *__buffer);
|
||||
|
||||
/* Internal function to compute next state of the generator. */
|
||||
extern int __drand48_iterate (unsigned short int __xsubi[3],
|
||||
struct drand48_data *__buffer);
|
||||
|
||||
/* Global state for non-reentrant functions. Defined in drand48-iter.c. */
|
||||
extern struct drand48_data __libc_drand48_data attribute_hidden;
|
||||
|
||||
extern int __setenv (__const char *__name, __const char *__value,
|
||||
int __replace);
|
||||
extern int __unsetenv (__const char *__name);
|
||||
extern int __clearenv (void);
|
||||
extern char *__canonicalize_file_name (__const char *__name);
|
||||
extern char *__realpath (__const char *__name, char *__resolved);
|
||||
extern int __ptsname_r (int __fd, char *__buf, size_t __buflen);
|
||||
extern int __getpt (void);
|
||||
extern int __posix_openpt (int __oflag);
|
||||
|
||||
extern int __add_to_environ (const char *name, const char *value,
|
||||
const char *combines, int replace);
|
||||
|
||||
extern void _quicksort (void *const pbase, size_t total_elems,
|
||||
size_t size, __compar_fn_t cmp);
|
||||
|
||||
extern int __on_exit (void (*__func) (int __status, void *__arg), void *__arg);
|
||||
|
||||
extern int __cxa_atexit (void (*func) (void *), void *arg, void *d);
|
||||
extern int __cxa_atexit_internal (void (*func) (void *), void *arg, void *d)
|
||||
attribute_hidden;
|
||||
|
||||
extern void __cxa_finalize (void *d);
|
||||
|
||||
extern int __posix_memalign (void **memptr, size_t alignment, size_t size)
|
||||
__attribute_malloc__;
|
||||
extern void *__libc_memalign (size_t alignment, size_t size)
|
||||
__attribute_malloc__;
|
||||
|
||||
extern int __libc_system (const char *line);
|
||||
|
||||
extern double ____strtod_l_internal (__const char *__restrict __nptr,
|
||||
char **__restrict __endptr, int __group,
|
||||
__locale_t __loc) __THROW;
|
||||
extern float ____strtof_l_internal (__const char *__restrict __nptr,
|
||||
char **__restrict __endptr, int __group,
|
||||
__locale_t __loc) __THROW;
|
||||
extern long double ____strtold_l_internal (__const char *__restrict __nptr,
|
||||
char **__restrict __endptr,
|
||||
int __group, __locale_t __loc)
|
||||
__THROW;
|
||||
extern long int ____strtol_l_internal (__const char *__restrict __nptr,
|
||||
char **__restrict __endptr,
|
||||
int __base, int __group,
|
||||
__locale_t __loc) __THROW;
|
||||
extern unsigned long int ____strtoul_l_internal (__const char *
|
||||
__restrict __nptr,
|
||||
char **__restrict __endptr,
|
||||
int __base, int __group,
|
||||
__locale_t __loc) __THROW;
|
||||
__extension__
|
||||
extern long long int ____strtoll_l_internal (__const char *__restrict __nptr,
|
||||
char **__restrict __endptr,
|
||||
int __base, int __group,
|
||||
__locale_t __loc) __THROW;
|
||||
__extension__
|
||||
extern unsigned long long int ____strtoull_l_internal (__const char *
|
||||
__restrict __nptr,
|
||||
char **
|
||||
__restrict __endptr,
|
||||
int __base, int __group,
|
||||
__locale_t __loc)
|
||||
__THROW;
|
||||
|
||||
libc_hidden_proto (____strtof_l_internal)
|
||||
libc_hidden_proto (____strtod_l_internal)
|
||||
libc_hidden_proto (____strtold_l_internal)
|
||||
libc_hidden_proto (____strtol_l_internal)
|
||||
libc_hidden_proto (____strtoll_l_internal)
|
||||
libc_hidden_proto (____strtoul_l_internal)
|
||||
libc_hidden_proto (____strtoull_l_internal)
|
||||
|
||||
extern __inline double
|
||||
__strtod_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
__locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtod_l_internal (__nptr, __endptr, 0, __loc);
|
||||
}
|
||||
extern __inline long int
|
||||
__strtol_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
int __base, __locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtol_l_internal (__nptr, __endptr, __base, 0, __loc);
|
||||
}
|
||||
extern __inline unsigned long int
|
||||
__strtoul_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
int __base, __locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtoul_l_internal (__nptr, __endptr, __base, 0, __loc);
|
||||
}
|
||||
extern __inline float
|
||||
__strtof_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
__locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtof_l_internal (__nptr, __endptr, 0, __loc);
|
||||
}
|
||||
extern __inline long double
|
||||
__strtold_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
__locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtold_l_internal (__nptr, __endptr, 0, __loc);
|
||||
}
|
||||
__extension__ extern __inline long long int
|
||||
__strtoll_l (__const char *__restrict __nptr, char **__restrict __endptr,
|
||||
int __base, __locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtoll_l_internal (__nptr, __endptr, __base, 0, __loc);
|
||||
}
|
||||
__extension__ extern __inline unsigned long long int
|
||||
__strtoull_l (__const char * __restrict __nptr, char **__restrict __endptr,
|
||||
int __base, __locale_t __loc) __THROW
|
||||
{
|
||||
return ____strtoull_l_internal (__nptr, __endptr, __base, 0, __loc);
|
||||
}
|
||||
|
||||
|
||||
# ifndef NOT_IN_libc
|
||||
# undef MB_CUR_MAX
|
||||
# define MB_CUR_MAX (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX))
|
||||
|
||||
# define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d)
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
extern void * __default_morecore (ptrdiff_t);
|
||||
libc_hidden_proto (__default_morecore)
|
||||
|
||||
#undef __Need_M_And_C
|
||||
|
||||
#endif /* include/stdlib.h */
|
17
src/kernel/libroot/posix/glibc/include/string.h
Normal file
17
src/kernel/libroot/posix/glibc/include/string.h
Normal file
@ -0,0 +1,17 @@
|
||||
#ifndef _LIBC_STRING_H
|
||||
#define _LIBC_STRING_H
|
||||
|
||||
#include_next <string.h>
|
||||
|
||||
/* map the internal glibc interface to the public one */
|
||||
#define __memcpy(to, from, size) memcpy(to, from, size)
|
||||
#define __strchrnul(string, character) strchrnul(string, character)
|
||||
|
||||
static inline void *
|
||||
__mempcpy(void *to, const void *from, size_t size)
|
||||
{
|
||||
memcpy(to, from, size);
|
||||
return (unsigned char *)to + size;
|
||||
}
|
||||
|
||||
#endif /* _LIBC_STRING_H */
|
2
src/kernel/libroot/posix/glibc/include/sys/cdefs.h
Normal file
2
src/kernel/libroot/posix/glibc/include/sys/cdefs.h
Normal file
@ -0,0 +1,2 @@
|
||||
#include <libc-symbols.h>
|
||||
#include <misc/sys/cdefs.h>
|
22
src/kernel/libroot/posix/glibc/include/unistd.h
Normal file
22
src/kernel/libroot/posix/glibc/include/unistd.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef _LIBC_UNISTD_H
|
||||
#define _LIBC_UNISTD_H
|
||||
|
||||
#include_next <unistd.h>
|
||||
|
||||
/* map the internal glibc interface to the public one */
|
||||
#define __isatty(fd) \
|
||||
isatty(fd)
|
||||
|
||||
#define __close(fd) \
|
||||
close(fd)
|
||||
|
||||
#define __read(fd, buffer, size) \
|
||||
read(fd, buffer, size)
|
||||
|
||||
#define __write(fd, buffer, size) \
|
||||
write(fd, buffer, size)
|
||||
|
||||
#define __lseek(fd, pos, whence) \
|
||||
lseek(fd, pos, whence)
|
||||
|
||||
#endif /* _LIBC_UNISTD_H */
|
117
src/kernel/libroot/posix/glibc/include/wchar.h
Normal file
117
src/kernel/libroot/posix/glibc/include/wchar.h
Normal file
@ -0,0 +1,117 @@
|
||||
#ifndef _WCHAR_H
|
||||
#include <wcsmbs/wchar.h>
|
||||
|
||||
# ifdef _WCHAR_H
|
||||
|
||||
extern __typeof (wcscasecmp_l) __wcscasecmp_l;
|
||||
extern __typeof (wcsncasecmp_l) __wcsncasecmp_l;
|
||||
extern __typeof (wcscoll_l) __wcscoll_l;
|
||||
extern __typeof (wcsxfrm_l) __wcsxfrm_l;
|
||||
extern __typeof (wcstol_l) __wcstol_l;
|
||||
extern __typeof (wcstoul_l) __wcstoul_l;
|
||||
extern __typeof (wcstoll_l) __wcstoll_l;
|
||||
extern __typeof (wcstoull_l) __wcstoull_l;
|
||||
extern __typeof (wcstod_l) __wcstod_l;
|
||||
extern __typeof (wcstof_l) __wcstof_l;
|
||||
extern __typeof (wcstold_l) __wcstold_l;
|
||||
extern __typeof (wcsftime_l) __wcsftime_l;
|
||||
libc_hidden_proto (__wcsftime_l)
|
||||
|
||||
|
||||
libc_hidden_proto (__wcstof_internal)
|
||||
libc_hidden_proto (__wcstod_internal)
|
||||
libc_hidden_proto (__wcstold_internal)
|
||||
libc_hidden_proto (__wcstol_internal)
|
||||
libc_hidden_proto (__wcstoll_internal)
|
||||
libc_hidden_proto (__wcstoul_internal)
|
||||
libc_hidden_proto (__wcstoull_internal)
|
||||
|
||||
libc_hidden_proto (__wcscasecmp_l)
|
||||
libc_hidden_proto (__wcsncasecmp_l)
|
||||
|
||||
libc_hidden_proto (fputws_unlocked)
|
||||
libc_hidden_proto (putwc_unlocked)
|
||||
libc_hidden_proto (putwc)
|
||||
|
||||
libc_hidden_proto (vswscanf)
|
||||
|
||||
libc_hidden_proto (mbrtowc)
|
||||
libc_hidden_proto (wcrtomb)
|
||||
libc_hidden_proto (wcscmp)
|
||||
libc_hidden_proto (wcsftime)
|
||||
libc_hidden_proto (wcsspn)
|
||||
libc_hidden_proto (wcschr)
|
||||
libc_hidden_proto (wcscoll)
|
||||
libc_hidden_proto (wcspbrk)
|
||||
|
||||
libc_hidden_proto (wmemchr)
|
||||
libc_hidden_proto (wmemset)
|
||||
|
||||
/* Now define the internal interfaces. */
|
||||
extern int __wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2)
|
||||
__attribute_pure__;
|
||||
extern int __wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
|
||||
size_t __n)
|
||||
__attribute_pure__;
|
||||
extern int __wcscoll (__const wchar_t *__s1, __const wchar_t *__s2);
|
||||
extern size_t __wcslen (__const wchar_t *__s) __attribute_pure__;
|
||||
extern size_t __wcsnlen (__const wchar_t *__s, size_t __maxlen)
|
||||
__attribute_pure__;
|
||||
extern wchar_t *__wcscat (wchar_t *dest, const wchar_t *src);
|
||||
extern wint_t __btowc (int __c);
|
||||
extern int __mbsinit (__const __mbstate_t *__ps);
|
||||
extern size_t __mbrtowc (wchar_t *__restrict __pwc,
|
||||
__const char *__restrict __s, size_t __n,
|
||||
__mbstate_t *__restrict __p);
|
||||
libc_hidden_proto (__mbrtowc)
|
||||
libc_hidden_proto (__mbrlen)
|
||||
extern size_t __wcrtomb (char *__restrict __s, wchar_t __wc,
|
||||
__mbstate_t *__restrict __ps);
|
||||
extern size_t __mbsrtowcs (wchar_t *__restrict __dst,
|
||||
__const char **__restrict __src,
|
||||
size_t __len, __mbstate_t *__restrict __ps);
|
||||
extern size_t __wcsrtombs (char *__restrict __dst,
|
||||
__const wchar_t **__restrict __src,
|
||||
size_t __len, __mbstate_t *__restrict __ps);
|
||||
extern size_t __mbsnrtowcs (wchar_t *__restrict __dst,
|
||||
__const char **__restrict __src, size_t __nmc,
|
||||
size_t __len, __mbstate_t *__restrict __ps);
|
||||
extern size_t __wcsnrtombs (char *__restrict __dst,
|
||||
__const wchar_t **__restrict __src,
|
||||
size_t __nwc, size_t __len,
|
||||
__mbstate_t *__restrict __ps);
|
||||
extern wchar_t *__wcpcpy (wchar_t *__dest, __const wchar_t *__src);
|
||||
extern wchar_t *__wcpncpy (wchar_t *__dest, __const wchar_t *__src,
|
||||
size_t __n);
|
||||
extern wchar_t *__wmemcpy (wchar_t *__s1, __const wchar_t *s2,
|
||||
size_t __n);
|
||||
extern wchar_t *__wmempcpy (wchar_t *__restrict __s1,
|
||||
__const wchar_t *__restrict __s2,
|
||||
size_t __n);
|
||||
extern wchar_t *__wmemmove (wchar_t *__s1, __const wchar_t *__s2,
|
||||
size_t __n);
|
||||
extern wchar_t *__wcschrnul (__const wchar_t *__s, wchar_t __wc)
|
||||
__attribute_pure__;
|
||||
|
||||
extern int __vfwscanf (__FILE *__restrict __s,
|
||||
__const wchar_t *__restrict __format,
|
||||
__gnuc_va_list __arg)
|
||||
/* __attribute__ ((__format__ (__wscanf__, 2, 0)) */;
|
||||
extern int __vswprintf (wchar_t *__restrict __s, size_t __n,
|
||||
__const wchar_t *__restrict __format,
|
||||
__gnuc_va_list __arg)
|
||||
/* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
|
||||
extern int __fwprintf (__FILE *__restrict __s,
|
||||
__const wchar_t *__restrict __format, ...)
|
||||
/* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
|
||||
extern int __vfwprintf (__FILE *__restrict __s,
|
||||
__const wchar_t *__restrict __format,
|
||||
__gnuc_va_list __arg)
|
||||
/* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
|
||||
|
||||
|
||||
/* Internal functions. */
|
||||
extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
|
||||
mbstate_t *ps, __locale_t l) attribute_hidden;
|
||||
# endif
|
||||
#endif
|
1
src/kernel/libroot/posix/glibc/include/xlocale.h
Normal file
1
src/kernel/libroot/posix/glibc/include/xlocale.h
Normal file
@ -0,0 +1 @@
|
||||
#include <locale/xlocale.h>
|
Loading…
Reference in New Issue
Block a user