xref: /OK3568_Linux_fs/kernel/tools/perf/util/include/linux/linkage.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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