1276789Sdim//===-- sanitizer_asm.h -----------------------------------------*- C++ -*-===// 2276789Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6276789Sdim// 7276789Sdim//===----------------------------------------------------------------------===// 8276789Sdim// 9276789Sdim// Various support for assemebler. 10276789Sdim// 11276789Sdim//===----------------------------------------------------------------------===// 12276789Sdim 13276789Sdim// Some toolchains do not support .cfi asm directives, so we have to hide 14276789Sdim// them inside macros. 15276789Sdim#if defined(__clang__) || \ 16276789Sdim (defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)) 17276789Sdim // GCC defined __GCC_HAVE_DWARF2_CFI_ASM if it supports CFI. 18276789Sdim // Clang seems to support CFI by default (or not?). 19276789Sdim // We need two versions of macros: for inline asm and standalone asm files. 20276789Sdim# define CFI_INL_ADJUST_CFA_OFFSET(n) ".cfi_adjust_cfa_offset " #n ";" 21276789Sdim 22276789Sdim# define CFI_STARTPROC .cfi_startproc 23276789Sdim# define CFI_ENDPROC .cfi_endproc 24276789Sdim# define CFI_ADJUST_CFA_OFFSET(n) .cfi_adjust_cfa_offset n 25296417Sdim# define CFI_DEF_CFA_OFFSET(n) .cfi_def_cfa_offset n 26276789Sdim# define CFI_REL_OFFSET(reg, n) .cfi_rel_offset reg, n 27296417Sdim# define CFI_OFFSET(reg, n) .cfi_offset reg, n 28276789Sdim# define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg 29296417Sdim# define CFI_DEF_CFA(reg, n) .cfi_def_cfa reg, n 30276789Sdim# define CFI_RESTORE(reg) .cfi_restore reg 31276789Sdim 32276789Sdim#else // No CFI 33276789Sdim# define CFI_INL_ADJUST_CFA_OFFSET(n) 34276789Sdim# define CFI_STARTPROC 35276789Sdim# define CFI_ENDPROC 36276789Sdim# define CFI_ADJUST_CFA_OFFSET(n) 37296417Sdim# define CFI_DEF_CFA_OFFSET(n) 38276789Sdim# define CFI_REL_OFFSET(reg, n) 39296417Sdim# define CFI_OFFSET(reg, n) 40276789Sdim# define CFI_DEF_CFA_REGISTER(reg) 41296417Sdim# define CFI_DEF_CFA(reg, n) 42276789Sdim# define CFI_RESTORE(reg) 43276789Sdim#endif 44276789Sdim 45296417Sdim#if !defined(__APPLE__) 46296417Sdim# define ASM_HIDDEN(symbol) .hidden symbol 47353358Sdim# define ASM_TYPE_FUNCTION(symbol) .type symbol, %function 48296417Sdim# define ASM_SIZE(symbol) .size symbol, .-symbol 49327952Sdim# define ASM_SYMBOL(symbol) symbol 50327952Sdim# define ASM_SYMBOL_INTERCEPTOR(symbol) symbol 51353358Sdim# define ASM_WRAPPER_NAME(symbol) __interceptor_##symbol 52296417Sdim#else 53296417Sdim# define ASM_HIDDEN(symbol) 54296417Sdim# define ASM_TYPE_FUNCTION(symbol) 55296417Sdim# define ASM_SIZE(symbol) 56327952Sdim# define ASM_SYMBOL(symbol) _##symbol 57327952Sdim# define ASM_SYMBOL_INTERCEPTOR(symbol) _wrap_##symbol 58353358Sdim# define ASM_WRAPPER_NAME(symbol) __interceptor_##symbol 59296417Sdim#endif 60353358Sdim 61353358Sdim#if defined(__ELF__) && (defined(__GNU__) || defined(__FreeBSD__) || \ 62353358Sdim defined(__Fuchsia__) || defined(__linux__)) 63360784Sdim// clang-format off 64360784Sdim#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits // NOLINT 65360784Sdim// clang-format on 66353358Sdim#else 67353358Sdim#define NO_EXEC_STACK_DIRECTIVE 68353358Sdim#endif 69