(_): Define only #ifndef ASSEMBLER.
[kopensolaris-gnu/glibc.git] / libc-symbols.h
index f4d82a6..50631d1 100644 (file)
@@ -45,8 +45,29 @@ Cambridge, MA 02139, USA.  */
    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.  */
-#define _LIBC
+#define _LIBC  1
+/*
+\f
+*/
+
+#ifndef        ASSEMBLER
+/*  Define the macro `_' for conveniently marking translatable strings
+    in the libc source code.  */
+#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))
+#else
+/* Be sure to use only the __ name when `dgettext' is a plain function
+   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
@@ -134,28 +155,48 @@ Cambridge, MA 02139, USA.  */
 #endif
 
 
+#if (!defined (ASSEMBLER) && \
+     (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)))
+/* GCC 2.7 and later has special syntax for weak symbols and aliases.
+   Using that is better when possible, because the compiler and assembler
+   are better clued in to what we are doing.  */
+#undef strong_alias
+#define strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
+#ifdef HAVE_WEAK_SYMBOLS
+#undef weak_symbol
+#define weak_symbol(name) \
+  extern __typeof (name) name __attribute__ ((weak));
+#undef weak_alias
+#define weak_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
+#endif /* HAVE_WEAK_SYMBOLS.  */
+#endif /* Not ASSEMBLER, and GCC 2.7 or later.  */
+
+
 
-/* When the file using this macro is linked in, the linker
-   will emit a warning message MSG.  */
+/* When a reference to SYMBOL is encountered, the linker will emit a
+   warning message MSG.  */
 #ifdef HAVE_GNU_LD
 #ifdef HAVE_ELF
-#define link_warning(msg)                      \
-  static const char __evoke_link_warning__[]   \
-    __attribute__ ((section (".gnu.warning"))) = msg;
+#define link_warning(symbol, msg)                      \
+  static const char __evoke_link_warning_##symbol[]    \
+    __attribute__ ((section (".gnu.warning." #symbol))) = msg;
 #else
-#define link_warning(msg)              \
+#define link_warning(symbol, msg)              \
   asm(".stabs \"" msg "\",30,0,0,0\n"  \
-      ".stabs \"__evoke_link_warning__\",1,0,0,0\n"\
-      ".stabs \"__evoke_link_warning__\",2,0,0,0\n");
+      ".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
 #endif
 #else
 /* We will never be heard; they will all die horribly.  */
-#define link_warning(msg)
+#define link_warning(symbol, msg)
 #endif
 
 /* A canned warning for sysdeps/stub functions.  */
 #define        stub_warning(name) \
-  link_warning ("warning: " #name " is not implemented and will always fail")
+  link_warning (name, \
+               "warning: " #name " is not implemented and will always fail")
 
 /*
 \f
@@ -194,7 +235,8 @@ Cambridge, MA 02139, USA.  */
 
 /* Declare SET for use in this module, if defined in another module.  */
 #define symbol_set_declare(set)        \
-  extern void *const __start_##set, *const __stop_##set;
+  extern void *const __start_##set __attribute__ ((__weak__)); \
+  extern void *const __stop_##set __attribute__ ((__weak__));
 
 /* Return a pointer (void *const *) to the first element of SET.  */
 #define symbol_set_first_element(set)  (&__start_##set)