1*404b540aSrobert // Control various target specific ABI tweaks. ARM version. 2*404b540aSrobert 3*404b540aSrobert // Copyright (C) 2004, 2006 Free Software Foundation, Inc. 4*404b540aSrobert // 5*404b540aSrobert // This file is part of the GNU ISO C++ Library. This library is free 6*404b540aSrobert // software; you can redistribute it and/or modify it under the 7*404b540aSrobert // terms of the GNU General Public License as published by the 8*404b540aSrobert // Free Software Foundation; either version 2, or (at your option) 9*404b540aSrobert // any later version. 10*404b540aSrobert 11*404b540aSrobert // This library is distributed in the hope that it will be useful, 12*404b540aSrobert // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*404b540aSrobert // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*404b540aSrobert // GNU General Public License for more details. 15*404b540aSrobert 16*404b540aSrobert // You should have received a copy of the GNU General Public License along 17*404b540aSrobert // with this library; see the file COPYING. If not, write to the Free 18*404b540aSrobert // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19*404b540aSrobert // USA. 20*404b540aSrobert 21*404b540aSrobert // As a special exception, you may use this file as part of a free software 22*404b540aSrobert // library without restriction. Specifically, if other files instantiate 23*404b540aSrobert // templates or use macros or inline functions from this file, or you compile 24*404b540aSrobert // this file and link it with other files to produce an executable, this 25*404b540aSrobert // file does not by itself cause the resulting executable to be covered by 26*404b540aSrobert // the GNU General Public License. This exception does not however 27*404b540aSrobert // invalidate any other reasons why the executable file might be covered by 28*404b540aSrobert // the GNU General Public License. 29*404b540aSrobert 30*404b540aSrobert /** @file cxxabi_tweaks.h 31*404b540aSrobert * The header provides an CPU-variable interface to the C++ ABI. 32*404b540aSrobert */ 33*404b540aSrobert 34*404b540aSrobert #ifndef _CXXABI_TWEAKS_H 35*404b540aSrobert #define _CXXABI_TWEAKS_H 1 36*404b540aSrobert 37*404b540aSrobert #ifdef __cplusplus 38*404b540aSrobert namespace __cxxabiv1 39*404b540aSrobert { 40*404b540aSrobert extern "C" 41*404b540aSrobert { 42*404b540aSrobert #endif 43*404b540aSrobert 44*404b540aSrobert #ifdef __ARM_EABI__ 45*404b540aSrobert // The ARM EABI uses the least significant bit of a 32-bit 46*404b540aSrobert // guard variable. */ 47*404b540aSrobert #define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) 48*404b540aSrobert #define _GLIBCXX_GUARD_SET(x) *(x) = 1 49*404b540aSrobert typedef int __guard; 50*404b540aSrobert 51*404b540aSrobert // We also want the element size in array cookies. 52*404b540aSrobert #define _GLIBCXX_ELTSIZE_IN_COOKIE 1 53*404b540aSrobert 54*404b540aSrobert // __cxa_vec_ctor should return a pointer to the array. 55*404b540aSrobert typedef void * __cxa_vec_ctor_return_type; 56*404b540aSrobert #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x 57*404b540aSrobert // Constructors and destructors return the "this" pointer. 58*404b540aSrobert typedef void * __cxa_cdtor_return_type; 59*404b540aSrobert 60*404b540aSrobert #else // __ARM_EABI__ 61*404b540aSrobert 62*404b540aSrobert // The generic ABI uses the first byte of a 64-bit guard variable. 63*404b540aSrobert #define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) 64*404b540aSrobert #define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 65*404b540aSrobert __extension__ typedef int __guard __attribute__((mode (__DI__))); 66*404b540aSrobert 67*404b540aSrobert // __cxa_vec_ctor has void return type. 68*404b540aSrobert typedef void __cxa_vec_ctor_return_type; 69*404b540aSrobert #define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return 70*404b540aSrobert // Constructors and destructors do not return a value. 71*404b540aSrobert typedef void __cxa_cdtor_return_type; 72*404b540aSrobert 73*404b540aSrobert #endif //!__ARM_EABI__ 74*404b540aSrobert 75*404b540aSrobert #ifdef __cplusplus 76*404b540aSrobert } 77*404b540aSrobert } // namespace __cxxabiv1 78*404b540aSrobert #endif 79*404b540aSrobert 80*404b540aSrobert #endif 81