1//===-- sanitizer_asm.h -----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Various support for assemebler.
10//
11//===----------------------------------------------------------------------===//
12
13// Some toolchains do not support .cfi asm directives, so we have to hide
14// them inside macros.
15#if defined(__clang__) ||                                                      \
16    (defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM))
17  // GCC defined __GCC_HAVE_DWARF2_CFI_ASM if it supports CFI.
18  // Clang seems to support CFI by default (or not?).
19  // We need two versions of macros: for inline asm and standalone asm files.
20# define CFI_INL_ADJUST_CFA_OFFSET(n) ".cfi_adjust_cfa_offset " #n ";"
21
22# define CFI_STARTPROC .cfi_startproc
23# define CFI_ENDPROC .cfi_endproc
24# define CFI_ADJUST_CFA_OFFSET(n) .cfi_adjust_cfa_offset n
25# define CFI_DEF_CFA_OFFSET(n) .cfi_def_cfa_offset n
26# define CFI_REL_OFFSET(reg, n) .cfi_rel_offset reg, n
27# define CFI_OFFSET(reg, n) .cfi_offset reg, n
28# define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg
29# define CFI_DEF_CFA(reg, n) .cfi_def_cfa reg, n
30# define CFI_RESTORE(reg) .cfi_restore reg
31
32#else  // No CFI
33# define CFI_INL_ADJUST_CFA_OFFSET(n)
34# define CFI_STARTPROC
35# define CFI_ENDPROC
36# define CFI_ADJUST_CFA_OFFSET(n)
37# define CFI_DEF_CFA_OFFSET(n)
38# define CFI_REL_OFFSET(reg, n)
39# define CFI_OFFSET(reg, n)
40# define CFI_DEF_CFA_REGISTER(reg)
41# define CFI_DEF_CFA(reg, n)
42# define CFI_RESTORE(reg)
43#endif
44
45#if !defined(__APPLE__)
46# define ASM_HIDDEN(symbol) .hidden symbol
47# define ASM_TYPE_FUNCTION(symbol) .type symbol, %function
48# define ASM_SIZE(symbol) .size symbol, .-symbol
49# define ASM_SYMBOL(symbol) symbol
50# define ASM_SYMBOL_INTERCEPTOR(symbol) symbol
51# define ASM_WRAPPER_NAME(symbol) __interceptor_##symbol
52#else
53# define ASM_HIDDEN(symbol)
54# define ASM_TYPE_FUNCTION(symbol)
55# define ASM_SIZE(symbol)
56# define ASM_SYMBOL(symbol) _##symbol
57# define ASM_SYMBOL_INTERCEPTOR(symbol) _wrap_##symbol
58# define ASM_WRAPPER_NAME(symbol) __interceptor_##symbol
59#endif
60
61#if defined(__ELF__) && (defined(__GNU__) || defined(__FreeBSD__) || \
62                         defined(__Fuchsia__) || defined(__linux__))
63// clang-format off
64#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits  // NOLINT
65// clang-format on
66#else
67#define NO_EXEC_STACK_DIRECTIVE
68#endif
69