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