1/*
2 *  ALSA lib - dynamic symbol versions
3 *  Copyright (c) 2002 by Jaroslav Kysela <perex@perex.cz>
4 *
5 *
6 *   This library is free software; you can redistribute it and/or modify
7 *   it under the terms of the GNU Lesser General Public License as
8 *   published by the Free Software Foundation; either version 2.1 of
9 *   the License, or (at your option) any later version.
10 *
11 *   This program is distributed in the hope that it will be useful,
12 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *   GNU Lesser General Public License for more details.
15 *
16 *   You should have received a copy of the GNU Lesser General Public
17 *   License along with this library; if not, write to the Free Software
18 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19 *
20 */
21
22#ifndef __ALSA_SYMBOLS_H
23#define __ALSA_SYMBOLS_H
24
25#if defined(PIC) && defined(VERSIONED_SYMBOLS) /* might be also configurable */
26#define USE_VERSIONED_SYMBOLS
27#endif
28
29#define INTERNAL_CONCAT2_2(Pre, Post) Pre##Post
30#define INTERNAL(Name) INTERNAL_CONCAT2_2(__, Name)
31
32#if HAVE_ATTRIBUTE_SYMVER && __GNUC__ > 10
33#define symbol_version(real, name, version) \
34	extern __typeof (real) real __attribute__((symver (#name "@" #version)))
35#define default_symbol_version(real, name, version) \
36	extern __typeof (real) real __attribute__((symver (#name "@@" #version)))
37#else
38#define symbol_version(real, name, version) \
39	__asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@" #version)
40#define default_symbol_version(real, name, version) \
41	__asm__ (".symver " ASM_NAME(#real) "," ASM_NAME(#name) "@@" #version)
42#endif
43
44#ifdef __clang__
45#define EXPORT_SYMBOL __attribute__((visibility("default")))
46#else
47#define EXPORT_SYMBOL __attribute__((visibility("default"),externally_visible))
48#endif
49
50#ifdef USE_VERSIONED_SYMBOLS
51#define use_symbol_version(real, name, version) \
52		symbol_version(real, name, version)
53#define use_default_symbol_version(real, name, version) \
54		default_symbol_version(real, name, version)
55#else
56#define use_symbol_version(real, name, version) /* nothing */
57#if defined(__alpha__) || defined(__mips__)
58#define use_default_symbol_version(real, name, version) \
59        __asm__ (".weak " ASM_NAME(#name)); \
60        __asm__ (ASM_NAME(#name) " = " ASM_NAME(#real))
61#else
62#define use_default_symbol_version(real, name, version) \
63	__asm__ (".weak " ASM_NAME(#name)); \
64	__asm__ (".set " ASM_NAME(#name) "," ASM_NAME(#real))
65#endif
66#endif
67
68#endif /* __ALSA_SYMBOLS_H */
69