Sat Jun 15 18:13:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
[kopensolaris-gnu/glibc.git] / libc-symbols.h
index c895fe4..aaf9f2a 100644 (file)
@@ -1,6 +1,6 @@
 /* Support macros for making weak and strong aliases for symbols,
    and for using symbol sets and linker warnings with GNU ld.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 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
@@ -27,34 +27,43 @@ Cambridge, MA 02139, USA.  */
    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'.
    * 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.
-   This implies HAVE_WEAK_SYMBOLS; set by --with-gnu-ld.
-   * HAVE_ELF if using ELF, which supports weak symbols.
-   This implies HAVE_WEAK_SYMBOLS; set by --with-elf.
-
-   * HAVE_WEAK_SYMBOLS if weak symbols are available in the assembler and
-   linker being used.  Set by --with-weak-symbols.
+   * 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'.
 
    */
-#include <config.h>
 
-/* 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.  */
+/* 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
+
+#include <config.h>
 /*
 \f
 */
 
 #ifndef        ASSEMBLER
-/*  Define the macro `_' for conveniently marking translatable strings
-    in the libc source code.  */
+
+/* Define the macros `_' and `N_' for conveniently marking translatable
+   strings in the libc source code.  */
+
+#define N_(msgid)      msgid
+
 #include <libintl.h>
 extern const char _libc_intl_domainname[];
+
 #ifdef dgettext
 /* This is defined as an optimizing macro, so use it.  */
 #define        _(msgid)        dgettext (_libc_intl_domainname, (msgid))
@@ -63,28 +72,20 @@ extern const char _libc_intl_domainname[];
    instead of an optimizing macro.  */
 #define        _(msgid)        __dgettext (_libc_intl_domainname, (msgid))
 #endif
+
 #endif
 
 /*
 \f
 */
-/* The symbols in all the user (non-_) macros are C symbols.  Predefined
-   should be HAVE_WEAK_SYMBOLS and/or HAVE_ELF and/or HAVE_GNU_LD.
-   HAVE_WEAK_SYMBOLS is implied by the other two.  HAVE_GNU_LD without
-   HAVE_ELF implies a.out.  */
+/* The symbols in all the user (non-_) macros are C symbols.
+   HAVE_GNU_LD without HAVE_ELF implies a.out.  */
 
-#ifndef HAVE_WEAK_SYMBOLS
-#if defined (HAVE_ELF) || defined (HAVE_GNU_LD)
+#if defined (HAVE_ASM_WEAK_DIRECTIVE) || defined (HAVE_ASM_WEAKEXT_DIRECTIVE)
 #define HAVE_WEAK_SYMBOLS
 #endif
-#endif
 
 #ifndef __SYMBOL_PREFIX
-#ifdef HAVE_ELF
-#define NO_UNDERSCORES
-#else
-#include <sysdep.h>            /* Should define NO_UNDERSCORES.  */
-#endif
 #ifdef NO_UNDERSCORES
 #define __SYMBOL_PREFIX
 #else
@@ -132,8 +133,21 @@ extern const char _libc_intl_domainname[];
 
 
 #ifdef HAVE_WEAK_SYMBOLS
+
 #ifdef ASSEMBLER
 
+#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+
+/* Define ALIAS as a weak alias for ORIGINAL.
+   If weak aliases are not available, this defines a strong alias.  */
+#define weak_alias(original, alias)    \
+  .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+
+/* Declare SYMBOL to be weak.  */
+#define weak_symbol(symbol)    .weakext C_SYMBOL_NAME (symbol)
+
+#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+
 /* Define ALIAS as a weak alias for ORIGINAL.
    If weak aliases are not available, this defines a strong alias.  */
 #define weak_alias(original, alias)    \
@@ -143,12 +157,21 @@ extern const char _libc_intl_domainname[];
 /* Declare SYMBOL to be weak.  */
 #define weak_symbol(symbol)    .weak C_SYMBOL_NAME (symbol)
 
-#else
+#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+
+#else /* ! ASSEMBLER */
+
+#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+#define weak_symbol(symbol)    asm (".weakext " __SYMBOL_PREFIX #symbol);
+#define weak_alias(original, alias) \
+  asm (".weakext " __SYMBOL_PREFIX #alias ", " __SYMBOL_PREFIX #original);
+#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
 #define weak_symbol(symbol)    asm (".weak " __SYMBOL_PREFIX #symbol);
 #define weak_alias(original, alias) \
   asm (".weak " __SYMBOL_PREFIX #alias "\n" \
        __SYMBOL_PREFIX #alias " = " __SYMBOL_PREFIX #original);
-#endif
+#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+#endif /* ! ASSEMBLER */
 #else
 #define        weak_alias(original, alias) strong_alias(original, alias)
 #define weak_symbol(symbol)    /* Do nothing.  */
@@ -162,7 +185,7 @@ extern const char _libc_intl_domainname[];
    are better clued in to what we are doing.  */
 #undef strong_alias
 #define strong_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+  __typeof (name) aliasname __attribute__ ((alias (#name)));
 
 #ifdef HAVE_WEAK_SYMBOLS
 #undef weak_symbol
@@ -170,7 +193,7 @@ extern const char _libc_intl_domainname[];
   extern __typeof (name) name __attribute__ ((weak));
 #undef weak_alias
 #define weak_alias(name, aliasname) \
-  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
+  __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
 #endif /* HAVE_WEAK_SYMBOLS.  */
 #endif /* Not ASSEMBLER, and GCC 2.8 or later.  */