1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef PERF_LINUX_LINKAGE_H_ 4*4882a593Smuzhiyun #define PERF_LINUX_LINKAGE_H_ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /* linkage.h ... for including arch/x86/lib/memcpy_64.S */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* Some toolchains use other characters (e.g. '`') to mark new line in macro */ 9*4882a593Smuzhiyun #ifndef ASM_NL 10*4882a593Smuzhiyun #define ASM_NL ; 11*4882a593Smuzhiyun #endif 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef __ALIGN 14*4882a593Smuzhiyun #define __ALIGN .align 4,0x90 15*4882a593Smuzhiyun #define __ALIGN_STR ".align 4,0x90" 16*4882a593Smuzhiyun #endif 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* SYM_T_FUNC -- type used by assembler to mark functions */ 19*4882a593Smuzhiyun #ifndef SYM_T_FUNC 20*4882a593Smuzhiyun #define SYM_T_FUNC STT_FUNC 21*4882a593Smuzhiyun #endif 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* SYM_A_* -- align the symbol? */ 24*4882a593Smuzhiyun #define SYM_A_ALIGN ALIGN 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* SYM_L_* -- linkage of symbols */ 27*4882a593Smuzhiyun #define SYM_L_GLOBAL(name) .globl name 28*4882a593Smuzhiyun #define SYM_L_WEAK(name) .weak name 29*4882a593Smuzhiyun #define SYM_L_LOCAL(name) /* nothing */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define ALIGN __ALIGN 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* === generic annotations === */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* SYM_ENTRY -- use only if you have to for non-paired symbols */ 36*4882a593Smuzhiyun #ifndef SYM_ENTRY 37*4882a593Smuzhiyun #define SYM_ENTRY(name, linkage, align...) \ 38*4882a593Smuzhiyun linkage(name) ASM_NL \ 39*4882a593Smuzhiyun align ASM_NL \ 40*4882a593Smuzhiyun name: 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* SYM_START -- use only if you have to */ 44*4882a593Smuzhiyun #ifndef SYM_START 45*4882a593Smuzhiyun #define SYM_START(name, linkage, align...) \ 46*4882a593Smuzhiyun SYM_ENTRY(name, linkage, align) 47*4882a593Smuzhiyun #endif 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* SYM_END -- use only if you have to */ 50*4882a593Smuzhiyun #ifndef SYM_END 51*4882a593Smuzhiyun #define SYM_END(name, sym_type) \ 52*4882a593Smuzhiyun .type name sym_type ASM_NL \ 53*4882a593Smuzhiyun .size name, .-name 54*4882a593Smuzhiyun #endif 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* 57*4882a593Smuzhiyun * SYM_FUNC_START_ALIAS -- use where there are two global names for one 58*4882a593Smuzhiyun * function 59*4882a593Smuzhiyun */ 60*4882a593Smuzhiyun #ifndef SYM_FUNC_START_ALIAS 61*4882a593Smuzhiyun #define SYM_FUNC_START_ALIAS(name) \ 62*4882a593Smuzhiyun SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) 63*4882a593Smuzhiyun #endif 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* SYM_FUNC_START -- use for global functions */ 66*4882a593Smuzhiyun #ifndef SYM_FUNC_START 67*4882a593Smuzhiyun /* 68*4882a593Smuzhiyun * The same as SYM_FUNC_START_ALIAS, but we will need to distinguish these two 69*4882a593Smuzhiyun * later. 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun #define SYM_FUNC_START(name) \ 72*4882a593Smuzhiyun SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) 73*4882a593Smuzhiyun #endif 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* SYM_FUNC_START_LOCAL -- use for local functions */ 76*4882a593Smuzhiyun #ifndef SYM_FUNC_START_LOCAL 77*4882a593Smuzhiyun /* the same as SYM_FUNC_START_LOCAL_ALIAS, see comment near SYM_FUNC_START */ 78*4882a593Smuzhiyun #define SYM_FUNC_START_LOCAL(name) \ 79*4882a593Smuzhiyun SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) 80*4882a593Smuzhiyun #endif 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* SYM_FUNC_END_ALIAS -- the end of LOCAL_ALIASed or ALIASed function */ 83*4882a593Smuzhiyun #ifndef SYM_FUNC_END_ALIAS 84*4882a593Smuzhiyun #define SYM_FUNC_END_ALIAS(name) \ 85*4882a593Smuzhiyun SYM_END(name, SYM_T_FUNC) 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* SYM_FUNC_START_WEAK -- use for weak functions */ 89*4882a593Smuzhiyun #ifndef SYM_FUNC_START_WEAK 90*4882a593Smuzhiyun #define SYM_FUNC_START_WEAK(name) \ 91*4882a593Smuzhiyun SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) 92*4882a593Smuzhiyun #endif 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* 95*4882a593Smuzhiyun * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START, 96*4882a593Smuzhiyun * SYM_FUNC_START_WEAK, ... 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun #ifndef SYM_FUNC_END 99*4882a593Smuzhiyun /* the same as SYM_FUNC_END_ALIAS, see comment near SYM_FUNC_START */ 100*4882a593Smuzhiyun #define SYM_FUNC_END(name) \ 101*4882a593Smuzhiyun SYM_END(name, SYM_T_FUNC) 102*4882a593Smuzhiyun #endif 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #endif /* PERF_LINUX_LINKAGE_H_ */ 105