mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 04:27:37 +00:00
184 lines
5.1 KiB
C++
184 lines
5.1 KiB
C++
// Copyright (C) 2011 The Android Open Source Project
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions
|
|
// are met:
|
|
// 1. Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// 2. Redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution.
|
|
// 3. Neither the name of the project nor the names of its contributors
|
|
// may be used to endorse or promote products derived from this software
|
|
// without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
// SUCH DAMAGE.
|
|
//
|
|
|
|
#ifndef __GABIXX_CXXABI_H__
|
|
#define __GABIXX_CXXABI_H__
|
|
|
|
#include <typeinfo>
|
|
|
|
namespace __cxxabiv1
|
|
{
|
|
extern "C" void __cxa_pure_virtual();
|
|
|
|
// Derived types of type_info below are based on 2.9.5 of C++ ABI.
|
|
|
|
// Typeinfo for fundamental types.
|
|
class __fundamental_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__fundamental_type_info();
|
|
};
|
|
|
|
// Typeinfo for array types.
|
|
class __array_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__array_type_info();
|
|
};
|
|
|
|
// Typeinfo for function types.
|
|
class __function_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__function_type_info();
|
|
};
|
|
|
|
// Typeinfo for enum types.
|
|
class __enum_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__enum_type_info();
|
|
};
|
|
|
|
// Typeinfo for classes with no bases.
|
|
class __class_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__class_type_info();
|
|
|
|
enum class_type_info_code
|
|
{
|
|
CLASS_TYPE_INFO_CODE,
|
|
SI_CLASS_TYPE_INFO_CODE,
|
|
VMI_CLASS_TYPE_INFO_CODE
|
|
};
|
|
|
|
virtual class_type_info_code
|
|
code() const { return CLASS_TYPE_INFO_CODE; }
|
|
};
|
|
|
|
// Typeinfo for classes containing only a single, public, non-virtual base at
|
|
// offset zero.
|
|
class __si_class_type_info : public __class_type_info
|
|
{
|
|
public:
|
|
~__si_class_type_info();
|
|
const __class_type_info *__base_type;
|
|
|
|
virtual __class_type_info::class_type_info_code
|
|
code() const { return SI_CLASS_TYPE_INFO_CODE; }
|
|
};
|
|
|
|
struct __base_class_type_info
|
|
{
|
|
public:
|
|
const __class_type_info *__base_type;
|
|
|
|
// All but the lower __offset_shift bits of __offset_flags are a signed
|
|
// offset. For a non-virtual base, this is the offset in the object of the
|
|
// base subobject. For a virtual base, this is the offset in the virtual
|
|
// table of the virtual base offset for the virtual base referenced
|
|
// (negative).
|
|
long __offset_flags;
|
|
|
|
enum __offset_flags_masks
|
|
{
|
|
__virtual_mask = 0x1,
|
|
__public_mask = 0x2,
|
|
__offset_shift = 8
|
|
};
|
|
|
|
bool inline
|
|
is_virtual() const { return (__offset_flags & __virtual_mask) != 0; }
|
|
|
|
bool inline
|
|
is_public() const { return (__offset_flags & __public_mask) != 0; }
|
|
|
|
// FIXME: Right-shift of signed integer is implementation dependent.
|
|
long inline
|
|
offset() const { return __offset_flags >> __offset_shift; }
|
|
|
|
long inline
|
|
flags() const { return __offset_flags & ((1L << __offset_shift) - 1); }
|
|
};
|
|
|
|
// Typeinfo for classes with bases that do not satisfy the
|
|
// __si_class_type_info constraints.
|
|
class __vmi_class_type_info : public __class_type_info
|
|
{
|
|
public:
|
|
~__vmi_class_type_info();
|
|
unsigned int __flags;
|
|
unsigned int __base_count;
|
|
__base_class_type_info __base_info[1];
|
|
|
|
enum __flags_masks
|
|
{
|
|
__non_diamond_repeat_mask = 0x1,
|
|
__diamond_shaped_mask = 0x2
|
|
};
|
|
|
|
virtual __class_type_info::class_type_info_code
|
|
code() const { return VMI_CLASS_TYPE_INFO_CODE; }
|
|
};
|
|
|
|
class __pbase_type_info : public std::type_info
|
|
{
|
|
public:
|
|
~__pbase_type_info();
|
|
unsigned int __flags;
|
|
const std::type_info *__pointee;
|
|
|
|
enum __masks
|
|
{
|
|
__const_mask = 0x1,
|
|
__volatile_mask = 0x2,
|
|
__restrict_mask = 0x4,
|
|
__incomplete_mask = 0x8,
|
|
__incomplete_class_mask = 0x10
|
|
};
|
|
};
|
|
|
|
class __pointer_type_info : public __pbase_type_info
|
|
{
|
|
public:
|
|
~__pointer_type_info();
|
|
};
|
|
|
|
class __pointer_to_member_type_info : public __pbase_type_info
|
|
{
|
|
public:
|
|
~__pointer_to_member_type_info();
|
|
};
|
|
}
|
|
|
|
namespace abi = __cxxabiv1;
|
|
|
|
#endif /* defined(__GABIXX_CXXABI_H__) */
|
|
|