Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 #ifndef PERF_LINUX_LINKAGE_H_
0004 #define PERF_LINUX_LINKAGE_H_
0005 
0006 /* linkage.h ... for including arch/x86/lib/memcpy_64.S */
0007 
0008 /* Some toolchains use other characters (e.g. '`') to mark new line in macro */
0009 #ifndef ASM_NL
0010 #define ASM_NL       ;
0011 #endif
0012 
0013 #ifndef __ALIGN
0014 #define __ALIGN     .align 4,0x90
0015 #define __ALIGN_STR ".align 4,0x90"
0016 #endif
0017 
0018 /* SYM_T_FUNC -- type used by assembler to mark functions */
0019 #ifndef SYM_T_FUNC
0020 #define SYM_T_FUNC              STT_FUNC
0021 #endif
0022 
0023 /* SYM_A_* -- align the symbol? */
0024 #define SYM_A_ALIGN             ALIGN
0025 
0026 /* SYM_L_* -- linkage of symbols */
0027 #define SYM_L_GLOBAL(name)          .globl name
0028 #define SYM_L_WEAK(name)            .weak name
0029 #define SYM_L_LOCAL(name)           /* nothing */
0030 
0031 #define ALIGN __ALIGN
0032 
0033 /* === generic annotations === */
0034 
0035 /* SYM_ENTRY -- use only if you have to for non-paired symbols */
0036 #ifndef SYM_ENTRY
0037 #define SYM_ENTRY(name, linkage, align...)      \
0038     linkage(name) ASM_NL                \
0039     align ASM_NL                    \
0040     name:
0041 #endif
0042 
0043 /* SYM_START -- use only if you have to */
0044 #ifndef SYM_START
0045 #define SYM_START(name, linkage, align...)      \
0046     SYM_ENTRY(name, linkage, align)
0047 #endif
0048 
0049 /* SYM_END -- use only if you have to */
0050 #ifndef SYM_END
0051 #define SYM_END(name, sym_type)             \
0052     .type name sym_type ASM_NL          \
0053     .set .L__sym_size_##name, .-name ASM_NL     \
0054     .size name, .-name
0055 #endif
0056 
0057 /* SYM_ALIAS -- use only if you have to */
0058 #ifndef SYM_ALIAS
0059 #define SYM_ALIAS(alias, name, sym_type, linkage)           \
0060     linkage(alias) ASM_NL                       \
0061     .set alias, name ASM_NL                     \
0062     .type alias sym_type ASM_NL                 \
0063     .set .L__sym_size_##alias, .L__sym_size_##name ASM_NL       \
0064     .size alias, .L__sym_size_##alias
0065 #endif
0066 
0067 /* SYM_FUNC_START -- use for global functions */
0068 #ifndef SYM_FUNC_START
0069 #define SYM_FUNC_START(name)                \
0070     SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
0071 #endif
0072 
0073 /* SYM_FUNC_START_LOCAL -- use for local functions */
0074 #ifndef SYM_FUNC_START_LOCAL
0075 #define SYM_FUNC_START_LOCAL(name)          \
0076     SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
0077 #endif
0078 
0079 /* SYM_FUNC_START_WEAK -- use for weak functions */
0080 #ifndef SYM_FUNC_START_WEAK
0081 #define SYM_FUNC_START_WEAK(name)           \
0082     SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)
0083 #endif
0084 
0085 /*
0086  * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
0087  * SYM_FUNC_START_WEAK, ...
0088  */
0089 #ifndef SYM_FUNC_END
0090 #define SYM_FUNC_END(name)              \
0091     SYM_END(name, SYM_T_FUNC)
0092 #endif
0093 
0094 /*
0095  * SYM_FUNC_ALIAS -- define a global alias for an existing function
0096  */
0097 #ifndef SYM_FUNC_ALIAS
0098 #define SYM_FUNC_ALIAS(alias, name)                 \
0099     SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_GLOBAL)
0100 #endif
0101 
0102 /*
0103  * SYM_FUNC_ALIAS_LOCAL -- define a local alias for an existing function
0104  */
0105 #ifndef SYM_FUNC_ALIAS_LOCAL
0106 #define SYM_FUNC_ALIAS_LOCAL(alias, name)               \
0107     SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_LOCAL)
0108 #endif
0109 
0110 /*
0111  * SYM_FUNC_ALIAS_WEAK -- define a weak global alias for an existing function
0112  */
0113 #ifndef SYM_FUNC_ALIAS_WEAK
0114 #define SYM_FUNC_ALIAS_WEAK(alias, name)                \
0115     SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_WEAK)
0116 #endif
0117 
0118 #endif  /* PERF_LINUX_LINKAGE_H_ */