Mangled.cpp revision 251de2acc7c269a1168ce906a269f4ab1b999f09
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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <cxxabi.h>
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton#include "llvm/ADT/DenseMap.h"
13e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Mangled.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
18a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <ctype.h>
19a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Mangled () :
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled(),
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_demangled()
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor with an optional string and a boolean indicating if it is
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled version.
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Mangled (const char *s, bool mangled) :
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled(),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_demangled()
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (s && s[0])
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetValue(s, mangled);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::~Mangled ()
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Convert to pointer operator. This allows code to check any Mangled
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they contain anything valid using code such as:
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Mangled mangled(...);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (mangled)
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  { ...
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator void* () const
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (m_mangled) ? const_cast<Mangled*>(this) : NULL;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Logical NOT operator. This allows code to check any Mangled
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// objects to see if they are invalid using code such as:
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Mangled mangled(...);
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (!file_spec)
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  { ...
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::operator! () const
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return !m_mangled;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear the mangled and demangled values.
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Clear ()
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled.Clear();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_demangled.Clear();
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compare the the string values.
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Compare (const Mangled& a, const Mangled& b)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    return ConstString::Compare(a.GetName(ePreferDemangled), a.GetName(ePreferDemangled));
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the string value in this objects. If "mangled" is true, then
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the mangled named is set with the new value in "s", else the
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name is set.
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::SetValue (const char *s, bool mangled)
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled.Clear();
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_demangled.Clear();
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (s)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (mangled)
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_mangled.SetCString (s);
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_demangled.SetCString(s);
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Generate the demangled name on demand using this accessor. Code in
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// this class will need to use this accessor if it wishes to decode
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the demangled name. The result is cached and will be kept until a
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// new string value is supplied to this object, or until the end of the
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object's lifetime.
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString&
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetDemangledName () const
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Check to make sure we have a valid mangled name and that we
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // haven't already decoded our mangled name.
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_mangled && !m_demangled)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We need to generate and cache the demangled name.
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer (__PRETTY_FUNCTION__,
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "Mangled::GetDemangledName (m_mangled = %s)",
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_mangled.GetCString());
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We already know mangled is valid from the above check,
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // lets just make sure it isn't empty...
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char * mangled = m_mangled.AsCString();
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (mangled[0])
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
147e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // Since demangling can be a costly, and since all names that go
148e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // into a ConstString (like our m_mangled and m_demangled members)
149e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // end up being unique "const char *" values, we can use a DenseMap
150e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // to speed up our lookup. We do this because often our symbol table
151e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // and our debug information both have the mangled names which they
152e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // would each need to demangle. Also, with GCC we end up with the one
153e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // definition rule where a lot of STL code produces symbols that are
154e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // in multiple compile units and the mangled names end up being in
155e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // the same binary multiple times. The performance win isn't huge,
156e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // but we showed a 20% improvement on darwin.
157e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            typedef llvm::DenseMap<const char *, const char *> MangledToDemangledMap;
158e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            static MangledToDemangledMap g_mangled_to_demangled;
159e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton
160e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            // Check our mangled string pointer to demangled string pointer map first
161e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            MangledToDemangledMap::const_iterator pos = g_mangled_to_demangled.find (mangled);
162e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton            if (pos != g_mangled_to_demangled.end())
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
164e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                // We have already demangled this string, we can just use our saved result!
165e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                m_demangled.SetCString(pos->second);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
169e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                // We didn't already mangle this name, demangle it and if all goes well
170e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                // add it to our map.
171e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                char *demangled_name = abi::__cxa_demangle (mangled, NULL, NULL, NULL);
172e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton
173e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                if (demangled_name)
174e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                {
175e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    m_demangled.SetCString (demangled_name);
176e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    // Now that the name has been uniqued, add the uniqued C string
177e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    // pointer from m_mangled as the key to the uniqued C string
178e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    // pointer in m_demangled.
179e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    g_mangled_to_demangled.insert (std::make_pair (mangled, m_demangled.GetCString()));
180e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    free (demangled_name);
181e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                }
182e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                else
183e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                {
184e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    // Set the demangled string to the empty string to indicate we
185e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    // tried to parse it once and failed.
186e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                    m_demangled.SetCString("");
187e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton                }
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_demangled;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled name get accessor
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString&
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetMangledName ()
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mangled;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled name const get accessor
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString&
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetMangledName () const
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mangled;
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the demangled name if there is one, else return the mangled name.
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString&
21717454cfc6a757305a7d9d4c31313c38981b57b01Jim InghamMangled::GetName (Mangled::NamePreference preference) const
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
219251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton    if (preference == ePreferDemangled)
22017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    {
221251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        const ConstString& name = GetDemangledName();
222251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        if (name && !name.IsEmpty())
223251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton            return name;
224251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        return m_mangled;
225251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton    }
226251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton    else
227251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton    {
228251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        const ConstString& name = GetMangledName();
229251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        if (name && !name.IsEmpty())
230251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton            return name;
231251de2acc7c269a1168ce906a269f4ab1b999f09Greg Clayton        return m_demangled;
23217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    }
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Generate the tokens from the demangled name.
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the number of tokens that were parsed.
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::GetTokens (Mangled::TokenList &tokens) const
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    tokens.Clear();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString& demangled = GetDemangledName();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (demangled && !demangled.IsEmpty())
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        tokens.Parse(demangled.AsCString());
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return tokens.Size();
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a Mangled object to stream "s". We don't force our
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// demangled name to be computed currently (we don't use the accessor).
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Dump (Stream *s) const
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_mangled)
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", mangled = " << m_mangled;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_demangled)
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char * demangled = m_demangled.AsCString();
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf(", demangled = %s", demangled[0] ? demangled : "<error>");
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dumps a debug version of this string with extra object and state
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// information to stream "s".
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::DumpDebug (Stream *s) const
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("%*p: Mangled mangled = ", (int)sizeof(void*) * 2, this);
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mangled.DumpDebug(s);
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf(", demangled = ");
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_demangled.DumpDebug(s);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the size in byte that this object takes in memory. The size
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// includes the size of the objects it owns, and not the strings that
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// it references because they are shared strings.
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::MemorySize () const
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mangled.MemorySize() + m_demangled.MemorySize();
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump OBJ to the supplied stream S.
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneroperator << (Stream& s, const Mangled& obj)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (obj.GetMangledName())
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s << "mangled = '" << obj.GetMangledName() << "'";
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString& demangled = obj.GetDemangledName();
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (demangled)
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s << ", demangled = '" << demangled << '\'';
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s << ", demangled = <error>";
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return s;
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled::Token
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::Token () :
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    type(eInvalid),
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    value()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Equal to operator
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::operator== (const Token& rhs) const
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return type == rhs.type && value == rhs.value;
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the token to a stream "s"
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::Dump (Stream *s) const
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (type)
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eInvalid:      s->PutCString("invalid    "); break;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eNameSpace:    s->PutCString("namespace  "); break;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eMethodName:   s->PutCString("method     "); break;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eType:         s->PutCString("type       "); break;
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eTemplate:     s->PutCString("template   "); break;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eTemplateBeg:  s->PutCString("template < "); break;
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eTemplateEnd:  s->PutCString("template > "); break;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eParamsBeg:    s->PutCString("params   ( "); break;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eParamsEnd:    s->PutCString("params   ) "); break;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eQualifier:    s->PutCString("qualifier  "); break;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eError:        s->PutCString("ERROR      "); break;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf("type = %i", type);
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    value.DumpDebug(s);
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if this token is a wildcard
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::Token::IsWildcard () const
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static ConstString g_wildcard_str("*");
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return value == g_wildcard_str;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump "obj" to the supplied stream "s"
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator << (Stream& s, const Mangled::Token& obj)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    obj.Dump(&s);
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return s;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Mangled::TokenList
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mangled::TokenList
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor. If demangled is non-NULL and not-empty
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the token list will parse up the demangled string it is
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// given, else the object will initialize an empty token list.
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//--------------------------------------------------------------
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::TokenList (const char *demangled) :
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_tokens()
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (demangled && demangled[0])
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Parse(demangled);
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::~TokenList ()
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Parses "demangled" into tokens. This allows complex
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// comparisons to be done. Comparisons can include wildcards at
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the namespace, method name, template, and template and
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// parameter type levels.
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Example queries include:
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "std::basic_string<*>"   // Find all std::basic_string variants
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "std::basic_string<*>::erase(*)" // Find all std::basic_string::erase variants with any number of parameters
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "*::clear()"             // Find all functions with a method name of
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                          // "clear" that are in any namespace that
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                          // have no parameters
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "::printf"               // Find the printf function in the global namespace
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "printf"                 // Ditto
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "foo::*(int)"            // Find all functions in the class or namespace "foo" that take a single integer argument
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the number of tokens that were decoded, or zero when
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// we fail.
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Parse (const char *s)
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_tokens.clear();
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Token token;
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    token.type = eNameSpace;
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TokenType max_type = eInvalid;
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *p = s;
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t span = 0;
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t sep_size = 0;
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (*p != '\0')
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        p = p + span + sep_size;
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (isspace(*p))
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++p;
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (*p == '\0')
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        span = strcspn(p, ":<>(),");
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sep_size = 1;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        token.type = eInvalid;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (p[span])
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case '\0':
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case ':':
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (p[span+1] == ':')
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sep_size = 2;
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (span > 0)
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    token.type = eNameSpace;
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    token.value.SetCStringWithLength (p, span);
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_tokens.push_back(token);
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case '(':
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (span > 0)
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eMethodName;
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCStringWithLength (p, span);
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.type = eParamsBeg;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.value.Clear();
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_tokens.push_back(token);
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case ',':
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (span > 0)
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eType;
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCStringWithLength (p, span);
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                continue;
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case ')':
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (span > 0)
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eType;
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCStringWithLength (p, span);
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.type = eParamsEnd;
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.value.Clear();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_tokens.push_back(token);
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case '<':
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (span > 0)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eTemplate;
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCStringWithLength (p, span);
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.type = eTemplateBeg;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.value.Clear();
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_tokens.push_back(token);
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case '>':
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (span > 0)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eType;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCStringWithLength (p, span);
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.type = eTemplateEnd;
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            token.value.Clear();
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_tokens.push_back(token);
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (max_type < token.type)
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            max_type = token.type;
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (token.type == eInvalid)
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (max_type >= eParamsEnd)
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eQualifier;
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCString(p);
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (max_type >= eParamsBeg)
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eType;
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCString(p);
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.type = eMethodName;
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                token.value.SetCString(p);
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_tokens.push_back(token);
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_tokens.size();
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear the token list.
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Clear ()
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_tokens.clear();
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the token list to the stream "s"
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Dump (Stream *s) const
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator pos;
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator beg = m_tokens.begin();
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator end = m_tokens.end();
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = beg; pos != end; ++pos)
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Indent("token[");
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << (uint32_t)std::distance(beg, pos) << "] = " << *pos << "\n";
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Find the first token in the list that has "token_type" as its
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// type
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Mangled::Token *
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Find (TokenType token_type) const
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator pos;
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator beg = m_tokens.begin();
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator end = m_tokens.end();
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = beg; pos != end; ++pos)
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos->type == token_type)
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &(*pos);
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the token at index "idx", or NULL if the index is
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of range.
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Mangled::Token *
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::GetTokenAtIndex (uint32_t idx) const
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < m_tokens.size())
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_tokens[idx];
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Given a token list, see if it matches this object's tokens.
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "token_list" can contain wild card values to enable powerful
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matching. Matching the std::string::erase(*) example that was
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// tokenized above we could use a token list such as:
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      token           name
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      -----------     ----------------------------------------
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eNameSpace      "std"
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eTemplate       "basic_string"
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eTemplateBeg
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eInvalid        "*"
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eTemplateEnd
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eMethodName     "erase"
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eParamsBeg
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eInvalid        "*"
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      eParamsEnd
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if it "token_list" matches this object's tokens,
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// false otherwise.
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::MatchesQuery (const Mangled::TokenList &match) const
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t match_count = 0;
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator pos;
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator pos_end = m_tokens.end();
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator match_pos;
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator match_pos_end = match.m_tokens.end();
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator match_wildcard_pos = match_pos_end;
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator match_next_pos = match_pos_end;
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t template_scope_depth = 0;
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_tokens.begin(), match_pos = match.m_tokens.begin();
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         pos != pos_end && match_pos != match_pos_end;
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++match_pos)
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        match_next_pos = match_pos + 1;
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Is this a wildcard?
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (match_pos->IsWildcard())
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_wildcard_pos != match_pos_end)
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;   // Can't have two wildcards in effect at once.
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            match_wildcard_pos = match_pos;
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Are we at the end of the MATCH token list?
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_next_pos == match_pos_end)
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // There is nothing more to match, return if we have any matches so far...
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return match_count > 0;
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (match_pos->type == eInvalid || match_pos->type == eError)
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_pos->type == eTemplateBeg)
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++template_scope_depth;
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (match_pos->type == eTemplateEnd)
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(template_scope_depth > 0);
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                --template_scope_depth;
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Do we have a wildcard going right now?
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_wildcard_pos == match_pos_end)
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // No wildcard matching right now, just check and see if things match
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (*pos == *match_pos)
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++match_count;
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We have a wildcard match going
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // For template types we need to make sure to match the template depths...
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t start_wildcard_template_scope_depth = template_scope_depth;
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                size_t curr_wildcard_template_scope_depth = template_scope_depth;
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (pos != pos_end)
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (match_wildcard_pos->type == eNameSpace && pos->type == eParamsBeg)
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return false;
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (start_wildcard_template_scope_depth == curr_wildcard_template_scope_depth)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (*pos == *match_next_pos)
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            ++match_count;
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            match_pos = match_next_pos;
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            match_wildcard_pos = match_pos_end;
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (pos->type == eTemplateBeg)
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++curr_wildcard_template_scope_depth;
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (pos->type == eTemplateEnd)
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        --curr_wildcard_template_scope_depth;
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++pos;
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != pos_end)
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++pos;
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (match_pos != match_pos_end)
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return match_count > 0;
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the number of tokens in the token collection
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMangled::TokenList::Size () const
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_tokens.size();
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream out the tokens
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator << (Stream& s, const Mangled::TokenList& obj)
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    obj.Dump(&s);
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return s;
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
765