linux/tools/perf/util/include/linux/linkage.h
<<
>>
Prefs
   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        .size name, .-name
  54#endif
  55
  56/*
  57 * SYM_FUNC_START_ALIAS -- use where there are two global names for one
  58 * function
  59 */
  60#ifndef SYM_FUNC_START_ALIAS
  61#define SYM_FUNC_START_ALIAS(name)                      \
  62        SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
  63#endif
  64
  65/* SYM_FUNC_START -- use for global functions */
  66#ifndef SYM_FUNC_START
  67/*
  68 * The same as SYM_FUNC_START_ALIAS, but we will need to distinguish these two
  69 * later.
  70 */
  71#define SYM_FUNC_START(name)                            \
  72        SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
  73#endif
  74
  75/* SYM_FUNC_START_LOCAL -- use for local functions */
  76#ifndef SYM_FUNC_START_LOCAL
  77/* the same as SYM_FUNC_START_LOCAL_ALIAS, see comment near SYM_FUNC_START */
  78#define SYM_FUNC_START_LOCAL(name)                      \
  79        SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
  80#endif
  81
  82/* SYM_FUNC_END_ALIAS -- the end of LOCAL_ALIASed or ALIASed function */
  83#ifndef SYM_FUNC_END_ALIAS
  84#define SYM_FUNC_END_ALIAS(name)                        \
  85        SYM_END(name, SYM_T_FUNC)
  86#endif
  87
  88/* SYM_FUNC_START_WEAK -- use for weak functions */
  89#ifndef SYM_FUNC_START_WEAK
  90#define SYM_FUNC_START_WEAK(name)                       \
  91        SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)
  92#endif
  93
  94/*
  95 * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
  96 * SYM_FUNC_START_WEAK, ...
  97 */
  98#ifndef SYM_FUNC_END
  99/* the same as SYM_FUNC_END_ALIAS, see comment near SYM_FUNC_START */
 100#define SYM_FUNC_END(name)                              \
 101        SYM_END(name, SYM_T_FUNC)
 102#endif
 103
 104#endif  /* PERF_LINUX_LINKAGE_H_ */
 105