Demangle.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
1//===- Demangle.cpp -------------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include "mcld/Config/Config.h" 10#include "mcld/Support/CXADemangle.tcc" 11#include "mcld/Support/Demangle.h" 12 13#ifdef HAVE_CXXABI_H 14#include <cxxabi.h> 15#endif 16 17namespace mcld { 18 19std::string demangleName(const std::string& pName) { 20#ifdef HAVE_CXXABI_H 21 // Spoil names of symbols with C linkage, so use an heuristic approach to 22 // check if the name should be demangled. 23 if (pName.substr(0, 2) != "_Z") 24 return pName; 25 // __cxa_demangle needs manually handle the memory release, so we wrap 26 // it into this helper function. 27 size_t output_leng; 28 int status; 29 char* buffer = 30 abi::__cxa_demangle(pName.c_str(), /*buffer=*/0, &output_leng, &status); 31 if (status != 0) { // Failed 32 return pName; 33 } 34 std::string result(buffer); 35 free(buffer); 36 37 return result; 38#else 39 return pName; 40#endif 41} 42 43bool isCtorOrDtor(const char* pName, size_t pLength) { 44 arena<bs> a; 45 Db db(a); 46 db.cv = 0; 47 db.ref = 0; 48 db.encoding_depth = 0; 49 db.parsed_ctor_dtor_cv = false; 50 db.tag_templates = true; 51 db.template_param.emplace_back(a); 52 db.fix_forward_references = false; 53 db.try_to_parse_template_args = true; 54 int internal_status = success; 55 demangle(pName, pName + pLength, db, internal_status); 56 if (internal_status == success && db.fix_forward_references && 57 !db.template_param.empty() && !db.template_param.front().empty()) { 58 db.fix_forward_references = false; 59 db.tag_templates = false; 60 db.names.clear(); 61 db.subs.clear(); 62 demangle(pName, pName + pLength, db, internal_status); 63 if (db.fix_forward_references) 64 internal_status = invalid_mangled_name; 65 } 66 67 if (internal_status != success) { 68 db.parsed_ctor_dtor_cv = false; 69 } 70 return db.parsed_ctor_dtor_cv; 71} 72 73} // namespace mcld 74