xref: /openbmc/linux/tools/perf/util/include/linux/linkage.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  
3  #ifndef PERF_LINUX_LINKAGE_H_
4  #define PERF_LINUX_LINKAGE_H_
5  
6  /* linkage.h ... for including arch/x86/lib/memcpy_64.S */
7  
8  /* Some toolchains use other characters (e.g. '`') to mark new line in macro */
9  #ifndef ASM_NL
10  #define ASM_NL		 ;
11  #endif
12  
13  #ifndef __ALIGN
14  #define __ALIGN		.align 4,0x90
15  #define __ALIGN_STR	".align 4,0x90"
16  #endif
17  
18  /* SYM_T_FUNC -- type used by assembler to mark functions */
19  #ifndef SYM_T_FUNC
20  #define SYM_T_FUNC				STT_FUNC
21  #endif
22  
23  /* SYM_A_* -- align the symbol? */
24  #define SYM_A_ALIGN				ALIGN
25  
26  /* SYM_L_* -- linkage of symbols */
27  #define SYM_L_GLOBAL(name)			.globl name
28  #define SYM_L_WEAK(name)			.weak name
29  #define SYM_L_LOCAL(name)			/* nothing */
30  
31  #define ALIGN __ALIGN
32  
33  /* === generic annotations === */
34  
35  /* SYM_ENTRY -- use only if you have to for non-paired symbols */
36  #ifndef SYM_ENTRY
37  #define SYM_ENTRY(name, linkage, align...)		\
38  	linkage(name) ASM_NL				\
39  	align ASM_NL					\
40  	name:
41  #endif
42  
43  /* SYM_START -- use only if you have to */
44  #ifndef SYM_START
45  #define SYM_START(name, linkage, align...)		\
46  	SYM_ENTRY(name, linkage, align)
47  #endif
48  
49  /* SYM_END -- use only if you have to */
50  #ifndef SYM_END
51  #define SYM_END(name, sym_type)				\
52  	.type name sym_type ASM_NL			\
53  	.set .L__sym_size_##name, .-name ASM_NL		\
54  	.size name, .-name
55  #endif
56  
57  /* SYM_ALIAS -- use only if you have to */
58  #ifndef SYM_ALIAS
59  #define SYM_ALIAS(alias, name, sym_type, linkage)			\
60  	linkage(alias) ASM_NL						\
61  	.set alias, name ASM_NL						\
62  	.type alias sym_type ASM_NL					\
63  	.set .L__sym_size_##alias, .L__sym_size_##name ASM_NL		\
64  	.size alias, .L__sym_size_##alias
65  #endif
66  
67  /* SYM_FUNC_START -- use for global functions */
68  #ifndef SYM_FUNC_START
69  #define SYM_FUNC_START(name)				\
70  	SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
71  #endif
72  
73  /* SYM_FUNC_START_LOCAL -- use for local functions */
74  #ifndef SYM_FUNC_START_LOCAL
75  #define SYM_FUNC_START_LOCAL(name)			\
76  	SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
77  #endif
78  
79  /* SYM_FUNC_START_WEAK -- use for weak functions */
80  #ifndef SYM_FUNC_START_WEAK
81  #define SYM_FUNC_START_WEAK(name)			\
82  	SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)
83  #endif
84  
85  /*
86   * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
87   * SYM_FUNC_START_WEAK, ...
88   */
89  #ifndef SYM_FUNC_END
90  #define SYM_FUNC_END(name)				\
91  	SYM_END(name, SYM_T_FUNC)
92  #endif
93  
94  /*
95   * SYM_FUNC_ALIAS -- define a global alias for an existing function
96   */
97  #ifndef SYM_FUNC_ALIAS
98  #define SYM_FUNC_ALIAS(alias, name)					\
99  	SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_GLOBAL)
100  #endif
101  
102  /*
103   * SYM_FUNC_ALIAS_LOCAL -- define a local alias for an existing function
104   */
105  #ifndef SYM_FUNC_ALIAS_LOCAL
106  #define SYM_FUNC_ALIAS_LOCAL(alias, name)				\
107  	SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_LOCAL)
108  #endif
109  
110  /*
111   * SYM_FUNC_ALIAS_WEAK -- define a weak global alias for an existing function
112   */
113  #ifndef SYM_FUNC_ALIAS_WEAK
114  #define SYM_FUNC_ALIAS_WEAK(alias, name)				\
115  	SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_WEAK)
116  #endif
117  
118  // In the kernel sources (include/linux/cfi_types.h), this has a different
119  // definition when CONFIG_CFI_CLANG is used, for tools/ just use the !clang
120  // definition:
121  #ifndef SYM_TYPED_START
122  #define SYM_TYPED_START(name, linkage, align...)        \
123          SYM_START(name, linkage, align)
124  #endif
125  
126  #ifndef SYM_TYPED_FUNC_START
127  #define SYM_TYPED_FUNC_START(name)                      \
128          SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
129  #endif
130  
131  #endif	/* PERF_LINUX_LINKAGE_H_ */
132