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