Path: blob/main/contrib/llvm-project/libunwind/src/assembly.h
35148 views
/* ===-- assembly.h - libUnwind assembler support macros -------------------===1*2* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3* See https://llvm.org/LICENSE.txt for license information.4* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5*6* ===----------------------------------------------------------------------===7*8* This file defines macros for use in libUnwind assembler source.9* This file is not part of the interface of this library.10*11* ===----------------------------------------------------------------------===12*/1314#ifndef UNWIND_ASSEMBLY_H15#define UNWIND_ASSEMBLY_H1617#if defined(__linux__) && defined(__CET__)18#include <cet.h>19#define _LIBUNWIND_CET_ENDBR _CET_ENDBR20#else21#define _LIBUNWIND_CET_ENDBR22#endif2324#if defined(__powerpc64__)25#define SEPARATOR ;26#define PPC64_OFFS_SRR0 027#define PPC64_OFFS_CR 27228#define PPC64_OFFS_XER 28029#define PPC64_OFFS_LR 28830#define PPC64_OFFS_CTR 29631#define PPC64_OFFS_VRSAVE 30432#define PPC64_OFFS_FP 31233#define PPC64_OFFS_V 82434#elif defined(__APPLE__) && defined(__aarch64__)35#define SEPARATOR %%36#elif defined(__riscv)37# define RISCV_ISIZE (__riscv_xlen / 8)38# define RISCV_FOFFSET (RISCV_ISIZE * 32)39# if defined(__riscv_flen)40# define RISCV_FSIZE (__riscv_flen / 8)41# endif4243# if __riscv_xlen == 6444# define ILOAD ld45# define ISTORE sd46# elif __riscv_xlen == 3247# define ILOAD lw48# define ISTORE sw49# else50# error "Unsupported __riscv_xlen"51# endif5253# if defined(__riscv_flen)54# if __riscv_flen == 6455# define FLOAD fld56# define FSTORE fsd57# elif __riscv_flen == 3258# define FLOAD flw59# define FSTORE fsw60# else61# error "Unsupported __riscv_flen"62# endif63# endif64# define SEPARATOR ;65#else66#define SEPARATOR ;67#endif6869#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) && \70!defined(_AIX)71#define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR72#define PPC64_OPD2 SEPARATOR \73.p2align 3 SEPARATOR \74.quad .Lfunc_begin0 SEPARATOR \75.quad .TOC.@tocbase SEPARATOR \76.quad 0 SEPARATOR \77.text SEPARATOR \78.Lfunc_begin0:79#else80#define PPC64_OPD181#define PPC64_OPD282#endif8384#if defined(__aarch64__)85#if defined(__ARM_FEATURE_GCS_DEFAULT) && defined(__ARM_FEATURE_BTI_DEFAULT)86// Set BTI, PAC, and GCS gnu property bits87#define GNU_PROPERTY 788// We indirectly branch to __libunwind_Registers_arm64_jumpto from89// __unw_phase2_resume, so we need to use bti jc.90#define AARCH64_BTI bti jc91#elif defined(__ARM_FEATURE_GCS_DEFAULT)92// Set GCS gnu property bit93#define GNU_PROPERTY 494#elif defined(__ARM_FEATURE_BTI_DEFAULT)95// Set BTI and PAC gnu property bits96#define GNU_PROPERTY 397#define AARCH64_BTI bti c98#endif99#ifdef GNU_PROPERTY100.pushsection ".note.gnu.property", "a" SEPARATOR \101.balign 8 SEPARATOR \102.long 4 SEPARATOR \103.long 0x10 SEPARATOR \104.long 0x5 SEPARATOR \105.asciz "GNU" SEPARATOR \106.long 0xc0000000 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ \107.long 4 SEPARATOR \108.long GNU_PROPERTY SEPARATOR \109.long 0 SEPARATOR \110.popsection SEPARATOR111#endif112#endif113#if !defined(AARCH64_BTI)114#define AARCH64_BTI115#endif116117#if !defined(__aarch64__)118#ifdef __ARM_FEATURE_PAC_DEFAULT119.eabi_attribute Tag_PAC_extension, 2120.eabi_attribute Tag_PACRET_use, 1121#endif122#ifdef __ARM_FEATURE_BTI_DEFAULT123.eabi_attribute Tag_BTI_extension, 1124.eabi_attribute Tag_BTI_use, 1125#endif126#endif127128#define GLUE2(a, b) a ## b129#define GLUE(a, b) GLUE2(a, b)130#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)131132#if defined(__APPLE__)133134#define SYMBOL_IS_FUNC(name)135#define HIDDEN_SYMBOL(name) .private_extern name136#if defined(_LIBUNWIND_HIDE_SYMBOLS)137#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)138#else139#define EXPORT_SYMBOL(name)140#endif141#define WEAK_ALIAS(name, aliasname) \142.globl SYMBOL_NAME(aliasname) SEPARATOR \143EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \144SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)145146#define NO_EXEC_STACK_DIRECTIVE147148#elif defined(__ELF__)149150#if defined(__arm__)151#define SYMBOL_IS_FUNC(name) .type name,%function152#else153#define SYMBOL_IS_FUNC(name) .type name,@function154#endif155#define HIDDEN_SYMBOL(name) .hidden name156#if defined(_LIBUNWIND_HIDE_SYMBOLS)157#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)158#else159#define EXPORT_SYMBOL(name)160#endif161#define WEAK_SYMBOL(name) .weak name162163#if defined(__hexagon__)164#define WEAK_ALIAS(name, aliasname) \165EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \166WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \167.equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)168#else169#define WEAK_ALIAS(name, aliasname) \170EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \171WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \172SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)173#endif174175#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \176defined(__linux__)177#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits178#else179#define NO_EXEC_STACK_DIRECTIVE180#endif181182#elif defined(_WIN32)183184#define SYMBOL_IS_FUNC(name) \185.def name SEPARATOR \186.scl 2 SEPARATOR \187.type 32 SEPARATOR \188.endef189#define EXPORT_SYMBOL2(name) \190.section .drectve,"yn" SEPARATOR \191.ascii "-export:", #name, "\0" SEPARATOR \192.text193#if defined(_LIBUNWIND_HIDE_SYMBOLS)194#define EXPORT_SYMBOL(name)195#else196#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)197#endif198#define HIDDEN_SYMBOL(name)199200#if defined(__MINGW32__)201#define WEAK_ALIAS(name, aliasname) \202.globl SYMBOL_NAME(aliasname) SEPARATOR \203EXPORT_SYMBOL(aliasname) SEPARATOR \204SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)205#else206#define WEAK_ALIAS3(name, aliasname) \207.section .drectve,"yn" SEPARATOR \208.ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \209.text210#define WEAK_ALIAS2(name, aliasname) \211WEAK_ALIAS3(name, aliasname)212#define WEAK_ALIAS(name, aliasname) \213EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \214WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname))215#endif216217#define NO_EXEC_STACK_DIRECTIVE218219#elif defined(__sparc__)220221#elif defined(_AIX)222223#if defined(__powerpc64__)224#define VBYTE_LEN 8225#define CSECT_ALIGN 3226#else227#define VBYTE_LEN 4228#define CSECT_ALIGN 2229#endif230231// clang-format off232#define DEFINE_LIBUNWIND_FUNCTION_AND_WEAK_ALIAS(name, aliasname) \233.csect .text[PR], 2 SEPARATOR \234.csect .name[PR], 2 SEPARATOR \235.globl name[DS] SEPARATOR \236.globl .name[PR] SEPARATOR \237.align 4 SEPARATOR \238.csect name[DS], CSECT_ALIGN SEPARATOR \239aliasname: \240.vbyte VBYTE_LEN, .name[PR] SEPARATOR \241.vbyte VBYTE_LEN, TOC[TC0] SEPARATOR \242.vbyte VBYTE_LEN, 0 SEPARATOR \243.weak aliasname SEPARATOR \244.weak .aliasname SEPARATOR \245.csect .name[PR], 2 SEPARATOR \246.aliasname: \247248#define WEAK_ALIAS(name, aliasname)249#define NO_EXEC_STACK_DIRECTIVE250251// clang-format on252#else253254#error Unsupported target255256#endif257258#if defined(_AIX)259// clang-format off260#define DEFINE_LIBUNWIND_FUNCTION(name) \261.globl name[DS] SEPARATOR \262.globl .name SEPARATOR \263.align 4 SEPARATOR \264.csect name[DS], CSECT_ALIGN SEPARATOR \265.vbyte VBYTE_LEN, .name SEPARATOR \266.vbyte VBYTE_LEN, TOC[TC0] SEPARATOR \267.vbyte VBYTE_LEN, 0 SEPARATOR \268.csect .text[PR], 2 SEPARATOR \269.name:270// clang-format on271#else272#define DEFINE_LIBUNWIND_FUNCTION(name) \273.globl SYMBOL_NAME(name) SEPARATOR \274HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \275SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \276PPC64_OPD1 \277SYMBOL_NAME(name): \278PPC64_OPD2 \279AARCH64_BTI280#endif281282#if defined(__arm__)283#if !defined(__ARM_ARCH)284#define __ARM_ARCH 4285#endif286287#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5288#define ARM_HAS_BX289#endif290291#ifdef ARM_HAS_BX292#define JMP(r) bx r293#else294#define JMP(r) mov pc, r295#endif296#endif /* __arm__ */297298#if defined(__powerpc__)299#define PPC_LEFT_SHIFT(index) << (index)300#endif301302#endif /* UNWIND_ASSEMBLY_H */303304305