]> git.alsa-project.org Git - alsa-lib.git/commitdiff
add support for hosts that have custom symbol prefixes
authorTakashi Iwai <tiwai@suse.de>
Tue, 19 Sep 2006 16:07:51 +0000 (18:07 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 19 Sep 2006 16:07:51 +0000 (18:07 +0200)
From: Mike Frysinger <vapier@gentoo.org>

some architectures, like Blackfin, have a prefix added to all symbols (in our
case it's historical baggage)

while normally packages shouldnt care, when code starts mixing assembler with
C (like symbol versioning), you need to dip down into the inner details.
find attached a patch which queries gcc for the prefix (all gcc toolchains
have a builtin define of __USER_LABEL_PREFIX__) and then automatically has
asm() constructs utilize this

since most targets define __USER_LABEL_PREFIX__ to nothing, hopefully this
shouldnt cause any problems :)

configure.in
include/alsa-symbols.h
include/local.h

index d9ace7bfce4f4dea5060728a981a3e58c4c6daf9..788044b2b729752f2092365fc824bfbc0435d743 100644 (file)
@@ -34,6 +34,7 @@ fi
            
 
 AC_PROG_CC
+AC_PROG_CPP
 AC_PROG_INSTALL
 AC_PROG_LN_S 
 AC_DISABLE_STATIC
@@ -105,6 +106,16 @@ else
 fi
 AM_CONDITIONAL(VERSIONED_SYMBOLS, test x$versioned = xyes)
 
+dnl See if toolchain has a custom prefix for symbols ...
+AC_MSG_CHECKING(for custom symbol prefixes)
+SYMBOL_PREFIX=` \
+       echo "PREFIX=__USER_LABEL_PREFIX__" \
+               | ${CPP-${CC-gcc} -E} - 2>&1 \
+               | ${EGREP-grep} "^PREFIX=" \
+               | ${SED-sed} "s:^PREFIX=::"`
+AC_DEFINE_UNQUOTED([__SYMBOL_PREFIX], "$SYMBOL_PREFIX", [Toolchain Symbol Prefix])
+AC_MSG_RESULT($SYMBOL_PREFIX)
+
 dnl Check for debug...
 AC_MSG_CHECKING(for debug)
 AC_ARG_WITH(debug,
index 6f10ebed1d41e1e8012e8bea8b737c8ea359f68e..8d316120aeb5e9700061c16fcf983f8d3b4402f3 100644 (file)
 
 #ifdef __powerpc64__
 # define symbol_version(real, name, version)                   \
-       __asm__ (".symver " #real "," #name "@" #version);      \
-       __asm__ (".symver ." #real ",." #name "@" #version)
+       __asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@" #version);  \
+       __asm__ (".symver ." ASM_NAME(#real) ",." ASM_NAME(#name) "@" #version)
 # define default_symbol_version(real, name, version)           \
-       __asm__ (".symver " #real "," #name "@@" #version);     \
-       __asm__ (".symver ." #real ",." #name "@@" #version)
+       __asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@@" #version); \
+       __asm__ (".symver ." ASM_NAME(#real) ",." ASM_NAME(#name) "@@" #version)
 #else
 # define symbol_version(real, name, version) \
-       __asm__ (".symver " #real "," #name "@" #version)
+       __asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@" #version)
 # define default_symbol_version(real, name, version) \
-       __asm__ (".symver " #real "," #name "@@" #version)
+       __asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@@" #version)
 #endif
 
 #ifdef USE_VERSIONED_SYMBOLS
 #define use_symbol_version(real, name, version) /* nothing */
 #ifdef __powerpc64__
 #define use_default_symbol_version(real, name, version) \
-       __asm__ (".weak " #name);                       \
-       __asm__ (".weak ." #name);                      \
-       __asm__ (".set " #name "," #real);              \
-       __asm__ (".set ." #name ",." #real)
+       __asm__ (".weak " ASM_NAME(#name));                     \
+       __asm__ (".weak ." ASM_NAME(#name));                    \
+       __asm__ (".set " ASM_NAME(#name) "," ASM_NAME(#real));          \
+       __asm__ (".set ." ASM_NAME(#name) ",." ASM_NAME(#real))
 #else
 #if defined(__alpha__) || defined(__mips__)
 #define use_default_symbol_version(real, name, version) \
-        __asm__ (".weak " #name); \
-        __asm__ (#name " = " #real)
+        __asm__ (".weak " ASM_NAME(#name)); \
+        __asm__ (ASM_NAME(#name) " = " ASM_NAME(#real))
 #else
 #define use_default_symbol_version(real, name, version) \
-       __asm__ (".weak " #name); \
-       __asm__ (".set " #name "," #real)
+       __asm__ (".weak " ASM_NAME(#name)); \
+       __asm__ (".set " ASM_NAME(#name) "," ASM_NAME(#real))
 #endif
 #endif
 #endif
index 01b79ca2accdb192583c2086ffb194aa826d4bf3..488203760a26fc1407c1a44752b6a4ad497f301e 100644 (file)
@@ -192,6 +192,9 @@ extern snd_lib_error_handler_t snd_err_msg;
 
 /* When a reference to SYMBOL is encountered, the linker will emit a
    warning message MSG.  */
+
+#define ASM_NAME(name) __SYMBOL_PREFIX name
+
 #ifdef HAVE_GNU_LD
 # ifdef HAVE_ELF
 
@@ -210,19 +213,19 @@ extern snd_lib_error_handler_t snd_err_msg;
    section attributes on what looks like a comment to the assembler.  */
 #  ifdef HAVE_SECTION_QUOTES
 #   define link_warning(symbol, msg) \
-  __make_section_unallocated (".gnu.warning." #symbol) \
+  __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \
   static const char __evoke_link_warning_##symbol[]    \
-    __attribute__ ((section (".gnu.warning." #symbol "\"\n\t#\""))) = msg;
+    __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\"\n\t#\""))) = msg;
 #  else
 #   define link_warning(symbol, msg) \
-  __make_section_unallocated (".gnu.warning." #symbol) \
+  __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \
   static const char __evoke_link_warning_##symbol[]    \
-    __attribute__ ((section (".gnu.warning." #symbol "\n\t#"))) = msg;
+    __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\n\t#"))) = msg;
 #  endif
 # else
 #  define link_warning(symbol, msg)            \
   asm (".stabs \"" msg "\",30,0,0,0\n\t"       \
-       ".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
+       ".stabs \"" ASM_NAME(#symbol) "\",1,0,0,0\n");
 # endif
 #else
 /* We will never be heard; they will all die horribly.  */