typeinfo.cc revision 278017
1145519Sdarrenr/* 2145510Sdarrenr * Copyright 2010-2012 PathScale, Inc. All rights reserved. 3145510Sdarrenr * 4255332Scy * Redistribution and use in source and binary forms, with or without 5145510Sdarrenr * modification, are permitted provided that the following conditions are met: 6145510Sdarrenr * 7145510Sdarrenr * 1. Redistributions of source code must retain the above copyright notice, 8255332Scy * this list of conditions and the following disclaimer. 9255332Scy * 10255332Scy * 2. Redistributions in binary form must reproduce the above copyright notice, 11145510Sdarrenr * this list of conditions and the following disclaimer in the documentation 12255332Scy * and/or other materials provided with the distribution. 13255332Scy * 14145510Sdarrenr * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS 15145510Sdarrenr * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16145510Sdarrenr * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17145510Sdarrenr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 18145510Sdarrenr * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19255332Scy * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20145510Sdarrenr * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21145510Sdarrenr * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22145510Sdarrenr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23145510Sdarrenr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24145510Sdarrenr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25145510Sdarrenr */ 26145510Sdarrenr 27145510Sdarrenr#include "typeinfo.h" 28145510Sdarrenr#include <string.h> 29145510Sdarrenr#include <stdlib.h> 30255332Scy#include <stdio.h> 31255332Scy 32145510Sdarrenrusing std::type_info; 33255332Scy 34255332Scytype_info::~type_info() {} 35255332Scy 36255332Scybool type_info::operator==(const type_info &other) const 37255332Scy{ 38255332Scy return __type_name == other.__type_name; 39255332Scy} 40255332Scybool type_info::operator!=(const type_info &other) const 41145510Sdarrenr{ 42145510Sdarrenr return __type_name != other.__type_name; 43145510Sdarrenr} 44145510Sdarrenrbool type_info::before(const type_info &other) const 45145510Sdarrenr{ 46255332Scy return __type_name < other.__type_name; 47255332Scy} 48255332Scyconst char* type_info::name() const 49255332Scy{ 50255332Scy return __type_name; 51255332Scy} 52255332Scytype_info::type_info (const type_info& rhs) 53145510Sdarrenr{ 54255332Scy __type_name = rhs.__type_name; 55255332Scy} 56255332Scytype_info& type_info::operator= (const type_info& rhs) 57255332Scy{ 58255332Scy return *new type_info(rhs); 59255332Scy} 60255332Scy 61255332ScyABI_NAMESPACE::__fundamental_type_info::~__fundamental_type_info() {} 62255332ScyABI_NAMESPACE::__array_type_info::~__array_type_info() {} 63255332ScyABI_NAMESPACE::__function_type_info::~__function_type_info() {} 64255332ScyABI_NAMESPACE::__enum_type_info::~__enum_type_info() {} 65255332ScyABI_NAMESPACE::__class_type_info::~__class_type_info() {} 66145510SdarrenrABI_NAMESPACE::__si_class_type_info::~__si_class_type_info() {} 67145510SdarrenrABI_NAMESPACE::__vmi_class_type_info::~__vmi_class_type_info() {} 68145510SdarrenrABI_NAMESPACE::__pbase_type_info::~__pbase_type_info() {} 69145510SdarrenrABI_NAMESPACE::__pointer_type_info::~__pointer_type_info() {} 70145510SdarrenrABI_NAMESPACE::__pointer_to_member_type_info::~__pointer_to_member_type_info() {} 71145510Sdarrenr 72145510Sdarrenr// From libelftc 73145510Sdarrenrextern "C" char *__cxa_demangle_gnu3(const char *); 74145510Sdarrenr 75145510Sdarrenrextern "C" char* __cxa_demangle(const char* mangled_name, 76145510Sdarrenr char* buf, 77145510Sdarrenr size_t* n, 78145510Sdarrenr int* status) 79145510Sdarrenr{ 80145510Sdarrenr // TODO: We should probably just be linking against libelf-tc, rather than 81145510Sdarrenr // copying their code. This requires them to do an actual release, 82145510Sdarrenr // however, and for our changes to be pushed upstream. We also need to 83145510Sdarrenr // call a different demangling function here depending on the ABI (e.g. 84145510Sdarrenr // ARM). 85145510Sdarrenr char *demangled = __cxa_demangle_gnu3(mangled_name); 86145510Sdarrenr if (NULL != demangled) 87145510Sdarrenr { 88145510Sdarrenr size_t len = strlen(demangled); 89145510Sdarrenr if (buf == NULL) 90145510Sdarrenr { 91145510Sdarrenr if (n) 92145510Sdarrenr { 93145510Sdarrenr *n = len; 94255332Scy } 95255332Scy return demangled; 96255332Scy } 97255332Scy if (*n < len+1) 98255332Scy { 99255332Scy buf = static_cast<char*>(realloc(buf, len+1)); 100255332Scy } 101255332Scy if (0 != buf) 102255332Scy { 103255332Scy memcpy(buf, demangled, len); 104255332Scy buf[len] = 0; 105255332Scy if (n) 106255332Scy { 107255332Scy *n = len; 108255332Scy } 109255332Scy if (status) 110255332Scy { 111255332Scy *status = 0; 112255332Scy } 113255332Scy } 114255332Scy else 115255332Scy { 116145510Sdarrenr if (status) 117145510Sdarrenr { 118145510Sdarrenr *status = -1; 119145510Sdarrenr } 120145510Sdarrenr } 121145510Sdarrenr free(demangled); 122145510Sdarrenr } 123145510Sdarrenr else 124145510Sdarrenr { 125145510Sdarrenr if (status) 126145510Sdarrenr { 127145510Sdarrenr *status = -2; 128145510Sdarrenr } 129145510Sdarrenr return NULL; 130145510Sdarrenr } 131255332Scy return buf; 132255332Scy} 133255332Scy