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