124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Mangled.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10e8c020c0b9a19ea088c473d502e8ffa7236e7d1fGreg Clayton 114e17f306c144419eb4ec2c14e17a11dca89895b2Filipe Cabecinhas// FreeBSD9-STABLE requires this to know about size_t in cxxabi.h 124e17f306c144419eb4ec2c14e17a11dca89895b2Filipe Cabecinhas#include <cstddef> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <cxxabi.h> 14e8c020c0b9a19ea088c473d502e8ffa7236e7d1fGreg Clayton 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton#include "llvm/ADT/DenseMap.h" 17e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Mangled.h" 203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton#include "lldb/Core/RegularExpression.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 23a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <ctype.h> 24a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h> 25ae8c27bd66a5c8aaafff262209abd09095808b07Daniel Malea#include <stdlib.h> 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Claytonstatic inline bool 309b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Claytoncstring_is_mangled (const char *s) 319b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton{ 329b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (s) 339b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton return s[0] == '_' && s[1] == 'Z'; 349b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton return false; 359b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton} 369b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Mangled () : 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled(), 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled() 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor with an optional string and a boolean indicating if it is 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled version. 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 519b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg ClaytonMangled::Mangled (const ConstString &s, bool mangled) : 529b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled(), 539b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled() 549b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton{ 559b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (s) 569b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton SetValue(s, mangled); 579b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton} 589b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 59c02400422d5e644a2a486bce5517d46d435a3f02Greg ClaytonMangled::Mangled (const ConstString &s) : 609b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled(), 619b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled() 629b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton{ 639b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (s) 649b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton SetValue(s); 659b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton} 669b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 679b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton//---------------------------------------------------------------------- 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::~Mangled () 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Convert to pointer operator. This allows code to check any Mangled 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they contain anything valid using code such as: 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled mangled(...); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (mangled) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { ... 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator void* () const 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (m_mangled) ? const_cast<Mangled*>(this) : NULL; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Logical NOT operator. This allows code to check any Mangled 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they are invalid using code such as: 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled mangled(...); 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (!file_spec) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { ... 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator! () const 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !m_mangled; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear the mangled and demangled values. 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Clear () 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.Clear(); 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.Clear(); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compare the the string values. 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Compare (const Mangled& a, const Mangled& b) 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118beea05256239bec8be05786fbd2a432bdc11b5daJim Ingham return ConstString::Compare(a.GetName(ePreferMangled), a.GetName(ePreferMangled)); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the string value in this objects. If "mangled" is true, then 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled named is set with the new value in "s", else the 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name is set. 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1299b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg ClaytonMangled::SetValue (const ConstString &s, bool mangled) 1309b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton{ 1319b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (s) 1329b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1339b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (mangled) 1349b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1359b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled.Clear(); 1369b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled = s; 1379b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1389b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton else 1399b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1409b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled = s; 1419b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled.Clear(); 1429b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1439b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1449b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton else 1459b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1469b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled.Clear(); 1479b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled.Clear(); 1489b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1499b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton} 1509b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 1519b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Claytonvoid 1529b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg ClaytonMangled::SetValue (const ConstString &name) 1539b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton{ 1549b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (name) 1559b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1569b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (cstring_is_mangled(name.GetCString())) 1579b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1589b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled.Clear(); 1599b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled = name; 1609b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1619b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton else 1629b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1639b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled = name; 1649b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled.Clear(); 1659b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1669b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1679b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton else 1689b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton { 1699b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_demangled.Clear(); 1709b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton m_mangled.Clear(); 1719b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton } 1729b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton} 1739b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 1749b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Generate the demangled name on demand using this accessor. Code in 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// this class will need to use this accessor if it wishes to decode 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the demangled name. The result is cached and will be kept until a 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// new string value is supplied to this object, or until the end of the 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object's lifetime. 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString& 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetDemangledName () const 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check to make sure we have a valid mangled name and that we 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // haven't already decoded our mangled name. 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_mangled && !m_demangled) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to generate and cache the demangled name. 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Mangled::GetDemangledName (m_mangled = %s)", 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.GetCString()); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1949b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton // Don't bother running anything that isn't mangled 1959b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton const char *mangled_cstr = m_mangled.GetCString(); 1969b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton if (cstring_is_mangled(mangled_cstr)) 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1989d479442c0a521983328faa799883e967a6d5252Greg Clayton if (!m_mangled.GetMangledCounterpart(m_demangled)) 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 200e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // We didn't already mangle this name, demangle it and if all goes well 201e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton // add it to our map. 2029b98ffdf151138af70f184c8b5b0b32c8e5c3e31Greg Clayton char *demangled_name = abi::__cxa_demangle (mangled_cstr, NULL, NULL, NULL); 203e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton 204e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton if (demangled_name) 205e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton { 2069d479442c0a521983328faa799883e967a6d5252Greg Clayton m_demangled.SetCStringWithMangledCounterpart(demangled_name, m_mangled); 207e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton free (demangled_name); 208e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton } 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2115d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda if (!m_demangled) 2125d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda { 2135d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda // Set the demangled string to the empty string to indicate we 2145d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda // tried to parse it once and failed. 2155d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda m_demangled.SetCString(""); 2165d1ff1451fedb9c89b17ba5cf9cfccc73e145513Jason Molenda } 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_demangled; 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2223bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2233bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonbool 2243bc52d0a96c18be384028a90914f534ac252fbe4Greg ClaytonMangled::NameMatches (const RegularExpression& regex) const 2253bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton{ 2263bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (m_mangled && regex.Execute (m_mangled.AsCString())) 2273bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return true; 2283bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2293bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (GetDemangledName() && regex.Execute (m_demangled.AsCString())) 2303bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return true; 2313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return false; 2323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton} 2333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the demangled name if there is one, else return the mangled name. 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString& 23817454cfc6a757305a7d9d4c31313c38981b57b01Jim InghamMangled::GetName (Mangled::NamePreference preference) const 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 240251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton if (preference == ePreferDemangled) 24117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham { 2420298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton // Call the accessor to make sure we get a demangled name in case 2430298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton // it hasn't been demangled yet... 2440298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton if (GetDemangledName()) 2450298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton return m_demangled; 246251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton return m_mangled; 247251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton } 248251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton else 249251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton { 2500298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton if (m_mangled) 2510298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton return m_mangled; 2520298782b17345e3f30c3fc9d6bc1fd8aec4ec8a7Greg Clayton return GetDemangledName(); 25317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham } 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a Mangled object to stream "s". We don't force our 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name to be computed currently (we don't use the accessor). 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Dump (Stream *s) const 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_mangled) 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *s << ", mangled = " << m_mangled; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_demangled) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * demangled = m_demangled.AsCString(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", demangled = %s", demangled[0] ? demangled : "<error>"); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dumps a debug version of this string with extra object and state 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// information to stream "s". 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::DumpDebug (Stream *s) const 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("%*p: Mangled mangled = ", (int)sizeof(void*) * 2, this); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mangled.DumpDebug(s); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", demangled = "); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_demangled.DumpDebug(s); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the size in byte that this object takes in memory. The size 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// includes the size of the objects it owns, and not the strings that 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// it references because they are shared strings. 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::MemorySize () const 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mangled.MemorySize() + m_demangled.MemorySize(); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump OBJ to the supplied stream S. 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneroperator << (Stream& s, const Mangled& obj) 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj.GetMangledName()) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "mangled = '" << obj.GetMangledName() << "'"; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString& demangled = obj.GetDemangledName(); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (demangled) 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << ", demangled = '" << demangled << '\''; 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << ", demangled = <error>"; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return s; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 314