1*0e14a7fbSdp-arm /* ===-- assembly.h - compiler-rt assembler support macros -----------------=== 2*0e14a7fbSdp-arm * 3*0e14a7fbSdp-arm * The LLVM Compiler Infrastructure 4*0e14a7fbSdp-arm * 5*0e14a7fbSdp-arm * This file is dual licensed under the MIT and the University of Illinois Open 6*0e14a7fbSdp-arm * Source Licenses. See LICENSE.TXT for details. 7*0e14a7fbSdp-arm * 8*0e14a7fbSdp-arm * ===----------------------------------------------------------------------=== 9*0e14a7fbSdp-arm * 10*0e14a7fbSdp-arm * This file defines macros for use in compiler-rt assembler source. 11*0e14a7fbSdp-arm * This file is not part of the interface of this library. 12*0e14a7fbSdp-arm * 13*0e14a7fbSdp-arm * ===----------------------------------------------------------------------=== 14*0e14a7fbSdp-arm */ 15*0e14a7fbSdp-arm 16*0e14a7fbSdp-arm #ifndef COMPILERRT_ASSEMBLY_H 17*0e14a7fbSdp-arm #define COMPILERRT_ASSEMBLY_H 18*0e14a7fbSdp-arm 19*0e14a7fbSdp-arm #if defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) 20*0e14a7fbSdp-arm #define SEPARATOR @ 21*0e14a7fbSdp-arm #else 22*0e14a7fbSdp-arm #define SEPARATOR ; 23*0e14a7fbSdp-arm #endif 24*0e14a7fbSdp-arm 25*0e14a7fbSdp-arm #if defined(__APPLE__) 26*0e14a7fbSdp-arm #define HIDDEN(name) .private_extern name 27*0e14a7fbSdp-arm #define LOCAL_LABEL(name) L_##name 28*0e14a7fbSdp-arm // tell linker it can break up file at label boundaries 29*0e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE .subsections_via_symbols 30*0e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) 31*0e14a7fbSdp-arm #define CONST_SECTION .const 32*0e14a7fbSdp-arm 33*0e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE 34*0e14a7fbSdp-arm 35*0e14a7fbSdp-arm #elif defined(__ELF__) 36*0e14a7fbSdp-arm 37*0e14a7fbSdp-arm #define HIDDEN(name) .hidden name 38*0e14a7fbSdp-arm #define LOCAL_LABEL(name) .L_##name 39*0e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE 40*0e14a7fbSdp-arm #if defined(__arm__) 41*0e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) .type name,%function 42*0e14a7fbSdp-arm #else 43*0e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) .type name,@function 44*0e14a7fbSdp-arm #endif 45*0e14a7fbSdp-arm #define CONST_SECTION .section .rodata 46*0e14a7fbSdp-arm 47*0e14a7fbSdp-arm #if defined(__GNU__) || defined(__ANDROID__) || defined(__FreeBSD__) 48*0e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits 49*0e14a7fbSdp-arm #else 50*0e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE 51*0e14a7fbSdp-arm #endif 52*0e14a7fbSdp-arm 53*0e14a7fbSdp-arm #else // !__APPLE__ && !__ELF__ 54*0e14a7fbSdp-arm 55*0e14a7fbSdp-arm #define HIDDEN(name) 56*0e14a7fbSdp-arm #define LOCAL_LABEL(name) .L ## name 57*0e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE 58*0e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) \ 59*0e14a7fbSdp-arm .def name SEPARATOR \ 60*0e14a7fbSdp-arm .scl 2 SEPARATOR \ 61*0e14a7fbSdp-arm .type 32 SEPARATOR \ 62*0e14a7fbSdp-arm .endef 63*0e14a7fbSdp-arm #define CONST_SECTION .section .rdata,"rd" 64*0e14a7fbSdp-arm 65*0e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE 66*0e14a7fbSdp-arm 67*0e14a7fbSdp-arm #endif 68*0e14a7fbSdp-arm 69*0e14a7fbSdp-arm #if defined(__arm__) 70*0e14a7fbSdp-arm #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 71*0e14a7fbSdp-arm #define ARM_HAS_BX 72*0e14a7fbSdp-arm #endif 73*0e14a7fbSdp-arm #if !defined(__ARM_FEATURE_CLZ) && __ARM_ARCH_ISA_THUMB != 1 && \ 74*0e14a7fbSdp-arm (__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__))) 75*0e14a7fbSdp-arm #define __ARM_FEATURE_CLZ 76*0e14a7fbSdp-arm #endif 77*0e14a7fbSdp-arm 78*0e14a7fbSdp-arm #ifdef ARM_HAS_BX 79*0e14a7fbSdp-arm #define JMP(r) bx r 80*0e14a7fbSdp-arm #define JMPc(r, c) bx##c r 81*0e14a7fbSdp-arm #else 82*0e14a7fbSdp-arm #define JMP(r) mov pc, r 83*0e14a7fbSdp-arm #define JMPc(r, c) mov##c pc, r 84*0e14a7fbSdp-arm #endif 85*0e14a7fbSdp-arm 86*0e14a7fbSdp-arm // pop {pc} can't switch Thumb mode on ARMv4T 87*0e14a7fbSdp-arm #if __ARM_ARCH >= 5 88*0e14a7fbSdp-arm #define POP_PC() pop {pc} 89*0e14a7fbSdp-arm #else 90*0e14a7fbSdp-arm #define POP_PC() \ 91*0e14a7fbSdp-arm pop {ip}; \ 92*0e14a7fbSdp-arm JMP(ip) 93*0e14a7fbSdp-arm #endif 94*0e14a7fbSdp-arm 95*0e14a7fbSdp-arm #if __ARM_ARCH_ISA_THUMB == 2 96*0e14a7fbSdp-arm #define IT(cond) it cond 97*0e14a7fbSdp-arm #define ITT(cond) itt cond 98*0e14a7fbSdp-arm #else 99*0e14a7fbSdp-arm #define IT(cond) 100*0e14a7fbSdp-arm #define ITT(cond) 101*0e14a7fbSdp-arm #endif 102*0e14a7fbSdp-arm 103*0e14a7fbSdp-arm #if __ARM_ARCH_ISA_THUMB == 2 104*0e14a7fbSdp-arm #define WIDE(op) op.w 105*0e14a7fbSdp-arm #else 106*0e14a7fbSdp-arm #define WIDE(op) op 107*0e14a7fbSdp-arm #endif 108*0e14a7fbSdp-arm #endif 109*0e14a7fbSdp-arm 110*0e14a7fbSdp-arm #define GLUE2(a, b) a##b 111*0e14a7fbSdp-arm #define GLUE(a, b) GLUE2(a, b) 112*0e14a7fbSdp-arm #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) 113*0e14a7fbSdp-arm 114*0e14a7fbSdp-arm #ifdef VISIBILITY_HIDDEN 115*0e14a7fbSdp-arm #define DECLARE_SYMBOL_VISIBILITY(name) \ 116*0e14a7fbSdp-arm HIDDEN(SYMBOL_NAME(name)) SEPARATOR 117*0e14a7fbSdp-arm #else 118*0e14a7fbSdp-arm #define DECLARE_SYMBOL_VISIBILITY(name) 119*0e14a7fbSdp-arm #endif 120*0e14a7fbSdp-arm 121*0e14a7fbSdp-arm #define DEFINE_COMPILERRT_FUNCTION(name) \ 122*0e14a7fbSdp-arm FILE_LEVEL_DIRECTIVE SEPARATOR \ 123*0e14a7fbSdp-arm .globl SYMBOL_NAME(name) SEPARATOR \ 124*0e14a7fbSdp-arm SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 125*0e14a7fbSdp-arm DECLARE_SYMBOL_VISIBILITY(name) \ 126*0e14a7fbSdp-arm SYMBOL_NAME(name): 127*0e14a7fbSdp-arm 128*0e14a7fbSdp-arm #define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \ 129*0e14a7fbSdp-arm FILE_LEVEL_DIRECTIVE SEPARATOR \ 130*0e14a7fbSdp-arm .globl SYMBOL_NAME(name) SEPARATOR \ 131*0e14a7fbSdp-arm SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 132*0e14a7fbSdp-arm DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ 133*0e14a7fbSdp-arm .thumb_func SEPARATOR \ 134*0e14a7fbSdp-arm SYMBOL_NAME(name): 135*0e14a7fbSdp-arm 136*0e14a7fbSdp-arm #define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \ 137*0e14a7fbSdp-arm FILE_LEVEL_DIRECTIVE SEPARATOR \ 138*0e14a7fbSdp-arm .globl SYMBOL_NAME(name) SEPARATOR \ 139*0e14a7fbSdp-arm SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 140*0e14a7fbSdp-arm HIDDEN(SYMBOL_NAME(name)) SEPARATOR \ 141*0e14a7fbSdp-arm SYMBOL_NAME(name): 142*0e14a7fbSdp-arm 143*0e14a7fbSdp-arm #define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \ 144*0e14a7fbSdp-arm .globl name SEPARATOR \ 145*0e14a7fbSdp-arm SYMBOL_IS_FUNC(name) SEPARATOR \ 146*0e14a7fbSdp-arm HIDDEN(name) SEPARATOR \ 147*0e14a7fbSdp-arm name: 148*0e14a7fbSdp-arm 149*0e14a7fbSdp-arm #define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \ 150*0e14a7fbSdp-arm .globl SYMBOL_NAME(name) SEPARATOR \ 151*0e14a7fbSdp-arm SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 152*0e14a7fbSdp-arm DECLARE_SYMBOL_VISIBILITY(SYMBOL_NAME(name)) SEPARATOR \ 153*0e14a7fbSdp-arm .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR 154*0e14a7fbSdp-arm 155*0e14a7fbSdp-arm #if defined(__ARM_EABI__) 156*0e14a7fbSdp-arm #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \ 157*0e14a7fbSdp-arm DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name) 158*0e14a7fbSdp-arm #else 159*0e14a7fbSdp-arm #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) 160*0e14a7fbSdp-arm #endif 161*0e14a7fbSdp-arm 162*0e14a7fbSdp-arm #ifdef __ELF__ 163*0e14a7fbSdp-arm #define END_COMPILERRT_FUNCTION(name) \ 164*0e14a7fbSdp-arm .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) 165*0e14a7fbSdp-arm #else 166*0e14a7fbSdp-arm #define END_COMPILERRT_FUNCTION(name) 167*0e14a7fbSdp-arm #endif 168*0e14a7fbSdp-arm 169*0e14a7fbSdp-arm #endif /* COMPILERRT_ASSEMBLY_H */ 170