124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Type.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// Other libraries and framework includes
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContextScope.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
23931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
29395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Target/Target.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton#include "llvm/ADT/StringRef.h"
32b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton
33462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonusing namespace lldb;
34bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonusing namespace lldb_private;
35462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
36a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonclass TypeAppendVisitor
37a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{
38a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonpublic:
39a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    TypeAppendVisitor(TypeListImpl &type_list) :
40a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        m_type_list(type_list)
41a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
42a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    }
43a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
44a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    bool
45a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    operator() (const lldb::TypeSP& type)
46a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
47a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        m_type_list.Append(TypeImplSP(new TypeImpl(type)));
48a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        return true;
49a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    }
50a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
51a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonprivate:
52a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    TypeListImpl &m_type_list;
53a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton};
54a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
55a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonvoid
56a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonTypeListImpl::Append (const lldb_private::TypeList &type_list)
57a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{
58a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    TypeAppendVisitor cb(*this);
59a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    type_list.ForEach(cb);
60a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton}
61a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
62a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
6337bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonType *
6437bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonSymbolFileType::GetType ()
6537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{
6637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    if (!m_type_sp)
673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    {
683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        Type *resolved_type = m_symbol_file.ResolveTypeUID (GetID());
693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        if (resolved_type)
703508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            m_type_sp = resolved_type->shared_from_this();
713508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    }
7237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    return m_type_sp.get();
7337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton}
7437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
7537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
76bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t uid,
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile* symbol_file,
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
81fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t byte_size,
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *context,
83bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    user_id_t encoding_uid,
84bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    EncodingDataType encoding_uid_type,
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration& decl,
8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ClangASTType &clang_type,
876916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveState clang_type_resolve_state
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
89d387b462eecb908af265ecc7006781b4532073adGreg Clayton    std::enable_shared_from_this<Type> (),
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (uid),
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (name),
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_file (symbol_file),
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_context (context),
94ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_type (NULL),
95bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid (encoding_uid),
96bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid_type (encoding_uid_type),
974b40711e7950310afb74835820eb669004cd8c44Greg Clayton    m_byte_size (byte_size),
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_decl (decl),
99931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_clang_type (clang_type)
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
101931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_flags.clang_type_resolve_state = (clang_type ? clang_type_resolve_state : eResolveStateUnresolved);
102931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_flags.is_complete_objc_class = false;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type () :
106d387b462eecb908af265ecc7006781b4532073adGreg Clayton    std::enable_shared_from_this<Type> (),
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (0),
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name ("<INVALID TYPE>"),
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_file (NULL),
110ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_context (NULL),
111ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_type (NULL),
1121b888f8af37eb363d5026ee1bd3eea409be8eae3Greg Clayton    m_encoding_uid (LLDB_INVALID_UID),
113dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_encoding_uid_type (eEncodingInvalid),
114ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_byte_size (0),
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_decl (),
11652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type ()
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
118931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_flags.clang_type_resolve_state = eResolveStateUnresolved;
119931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_flags.is_complete_objc_class = false;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type (const Type &rhs) :
124d387b462eecb908af265ecc7006781b4532073adGreg Clayton    std::enable_shared_from_this<Type> (rhs),
125bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    UserID (rhs),
126bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_name (rhs.m_name),
127bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_symbol_file (rhs.m_symbol_file),
128bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_context (rhs.m_context),
129bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_type (rhs.m_encoding_type),
130bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid (rhs.m_encoding_uid),
131dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_encoding_uid_type (rhs.m_encoding_uid_type),
132bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_byte_size (rhs.m_byte_size),
133bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_decl (rhs.m_decl),
134bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_clang_type (rhs.m_clang_type),
135931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    m_flags (rhs.m_flags)
136bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton{
137bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton}
138bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
139bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst Type&
140bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::operator= (const Type& rhs)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
150bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name)
15112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{
15212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "id = " << (const UserID&)*this;
15312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
1541924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    // Call the name accessor to make sure we resolve the type name
155dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    if (show_name)
156dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
157dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        const ConstString &type_name = GetName();
158dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (type_name)
159dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
160dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            *s << ", name = \"" << type_name << '"';
161dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            ConstString qualified_type_name (GetQualifiedName());
162dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            if (qualified_type_name != type_name)
163dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            {
164dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                *s << ", qualified = \"" << qualified_type_name << '"';
165dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            }
166dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
167dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
168c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton
1691924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    // Call the get byte size accesor so we resolve our byte size
1701924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (GetByteSize())
171fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton        s->Printf(", byte-size = %" PRIu64, m_byte_size);
1721924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool show_fullpaths = (level == lldb::eDescriptionLevelVerbose);
1731924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_decl.Dump(s, show_fullpaths);
17412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
17552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_clang_type.IsValid())
17612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
177c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << ", clang_type = \"";
17852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        GetClangForwardType().DumpTypeDescription(s);
179c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << '"';
18012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
181ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    else if (m_encoding_uid != LLDB_INVALID_UID)
18212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
1835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        s->Printf(", type_uid = 0x%8.8" PRIx64, m_encoding_uid);
184ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
18512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
1864fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid: break;
1874b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
1884b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
1894b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
1904b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
1914b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
1924b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
1934b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
1944b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
1954b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
19612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
197c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    }
19812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton}
19912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
20012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
20112bec71b323dc520f0e985a86e09c4712559e115Greg Claytonvoid
202bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Dump (Stream *s, bool show_context)
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2047e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf("%p: ", this);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Type" << (const UserID&)*this << ' ';
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_name)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", name = \"" << m_name << "\"";
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_byte_size != 0)
211fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton        s->Printf(", size = %" PRIu64, m_byte_size);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (show_context && m_context != NULL)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", context = ( ");
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context->DumpSymbolContext(s);
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(" )");
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2201924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool show_fullpaths = false;
2211924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_decl.Dump (s,show_fullpaths);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_clang_type.IsValid())
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        *s << ", clang_type = " << m_clang_type.GetOpaqueQualType() << ' ';
22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        GetClangForwardType().DumpTypeDescription (s);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
228ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    else if (m_encoding_uid != LLDB_INVALID_UID)
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
230ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        *s << ", type_data = " << (uint64_t)m_encoding_uid;
231ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2334fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid: break;
2344b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
2354b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
2364b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
2374b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
2384b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
2394b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
2404b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
2414b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
2424b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (m_access)
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      s->Printf(", access = %u", m_access);
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst ConstString &
253bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetName()
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
255b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton    if (!m_name)
25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_name = GetClangForwardType().GetConstTypeName();
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
261bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpTypeName(Stream *s)
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName().Dump(s, "<invalid-type-name>");
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
268bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpValue
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
270bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ExecutionContext *exe_ctx,
271bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Stream *s,
272bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    const DataExtractor &data,
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t data_byte_offset,
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_types,
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_summary,
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose,
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format format
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2806916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (ResolveClangType(eResolveStateForward))
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_types)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->PutChar('(');
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
2865f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                s->Printf("Type{0x%8.8" PRIx64 "} ", GetID());
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpTypeName (s);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->PutCString(") ");
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        GetClangForwardType().DumpValue (exe_ctx,
29252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         s,
29352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         format == lldb::eFormatDefault ? GetFormat() : format,
29452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         data,
29552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         data_byte_offset,
29652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         GetByteSize(),
29752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         0, // Bitfield bit size
29852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         0, // Bitfield bit offset
29952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         show_types,
30052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         show_summary,
30152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         verbose,
30252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         0);
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
306bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType *
307bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetEncodingType ()
308ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton{
3096916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_encoding_type == NULL && m_encoding_uid != LLDB_INVALID_UID)
3106916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
311ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    return m_encoding_type;
312ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton}
313ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
314ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
315ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
316fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
317bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetByteSize()
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_byte_size == 0)
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
321ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3234fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid:
3244fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingIsSyntheticUID:
3254fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            break;
3264b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID:
3274b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID:
3284b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID:
3294b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID:
3304b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID:
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
332ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                Type *encoding_type = GetEncodingType ();
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (encoding_type)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_byte_size = encoding_type->GetByteSize();
335ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                if (m_byte_size == 0)
33652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    m_byte_size = GetClangLayoutType().GetByteSize();
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we are a pointer or reference, then this is just a pointer size;
3414b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID:
3424b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID:
3434b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID:
34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            m_byte_size = m_symbol_file->GetClangASTContext().GetPointerByteSize();
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_byte_size;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
353bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetNumChildren (bool omit_empty_base_classes)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangForwardType().GetNumChildren(omit_empty_base_classes);
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
359bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::IsAggregateType ()
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangForwardType().IsAggregateType();
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3640cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Claytonlldb::TypeSP
3650cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg ClaytonType::GetTypedefType()
3660cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton{
3670cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    lldb::TypeSP type_sp;
3680cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    if (IsTypedef())
3690cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    {
3700cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton        Type *typedef_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
3710cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton        if (typedef_type)
3720cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton            type_sp = typedef_type->shared_from_this();
3730cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    }
3740cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    return type_sp;
3750cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton}
3760cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
3770cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
3780cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Format
380bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetFormat ()
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangForwardType().GetFormat();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Encoding
388fe6dc6e241c52822710380cec0931351a1d7b2d3Greg ClaytonType::GetEncoding (uint64_t &count)
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure we resolve our type if it already hasn't been.
39152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangForwardType().GetEncoding(count);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
395bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpValueInMemory
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
397bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ExecutionContext *exe_ctx,
398bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Stream *s,
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t address,
400b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type,
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_types,
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_summary,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address != LLDB_INVALID_ADDRESS)
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
408bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        DataExtractor data;
409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = NULL;
410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (exe_ctx)
411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            target = exe_ctx->GetTargetPtr();
412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            data.SetByteOrder (target->GetArchitecture().GetByteOrder());
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ReadFromMemory (exe_ctx, address, address_type, data))
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpValue(exe_ctx, s, data, 0, show_types, show_summary, verbose);
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
425b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonType::ReadFromMemory (ExecutionContext *exe_ctx, lldb::addr_t addr, AddressType address_type, DataExtractor &data)
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
427b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    if (address_type == eAddressTypeFile)
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Can't convert a file address to anything valid without more
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // context (which Module it came from)
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
434fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    const uint64_t byte_size = GetByteSize();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data.GetByteSize() < byte_size)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetData(data_sp);
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst != NULL)
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
444b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        if (address_type == eAddressTypeHost)
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The address is an address in this process, so just copy it
44772374e3009feb87332542f60d72b92343c9b35faEnrico Granata            if (addr == 0)
44872374e3009feb87332542f60d72b92343c9b35faEnrico Granata                return false;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            memcpy (dst, (uint8_t*)NULL + addr, byte_size);
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (exe_ctx)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Process *process = exe_ctx->GetProcessPtr();
457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process)
458567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                {
459567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error error;
460567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    return exe_ctx->GetProcessPtr()->ReadMemory(addr, dst, byte_size, error) == byte_size;
461567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                }
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
470b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonType::WriteToMemory (ExecutionContext *exe_ctx, lldb::addr_t addr, AddressType address_type, DataExtractor &data)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
476bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonTypeList*
477bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetTypeList()
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
479e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    return GetSymbolFile()->GetTypeList();
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
482bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst Declaration &
483bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetDeclaration () const
4840bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham{
4850bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    return m_decl;
4860bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham}
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
489bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::ResolveClangType (ResolveState clang_type_resolve_state)
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    Type *encoding_type = NULL;
49252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!m_clang_type.IsValid())
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4946916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        encoding_type = GetEncodingType();
495ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        if (encoding_type)
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
497ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            switch (m_encoding_uid_type)
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
499ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsUID:
5006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                {
50152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType encoding_clang_type = encoding_type->GetClangForwardType();
50252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (encoding_clang_type.IsValid())
50352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
50452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        m_clang_type = encoding_clang_type;
50552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        m_flags.clang_type_resolve_state = encoding_type->m_flags.clang_type_resolve_state;
50652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
5076916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                }
508ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
509ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
510ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsConstUID:
51152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().AddConstModifier();
512ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
513ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
514ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsRestrictUID:
51552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().AddRestrictModifier();
516ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
517ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
518ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsVolatileUID:
51952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().AddVolatileModifier();
520ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
521ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
522ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsTypedefUID:
52352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().CreateTypedefType (GetName().AsCString(),
52452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                       GetSymbolFile()->GetClangDeclContextContainingTypeUID(GetID()));
525ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                m_name.Clear();
526ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
527ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
528ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsPointerUID:
52952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().GetPointerType();
530ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
531ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
532ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsLValueReferenceUID:
53352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().GetLValueReferenceType();
534ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
535ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
536ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsRValueReferenceUID:
53752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = encoding_type->GetClangForwardType().GetRValueReferenceType();
538ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
539ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
540ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            default:
541ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                assert(!"Unhandled encoding_data_type.");
542ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We have no encoding type, return void?
54852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType void_clang_type (ClangASTContext::GetBasicType(GetClangASTContext().getASTContext(), eBasicTypeVoid));
549ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            switch (m_encoding_uid_type)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5514b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsUID:
552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = void_clang_type;
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5554b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsConstUID:
55652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.AddConstModifier ();
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5594b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsRestrictUID:
56052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.AddRestrictModifier ();
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5634b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsVolatileUID:
56452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.AddVolatileModifier ();
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5674b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsTypedefUID:
56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.CreateTypedefType (GetName().AsCString(),
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  GetSymbolFile()->GetClangDeclContextContainingTypeUID(GetID()));
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsPointerUID:
57352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.GetPointerType ();
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5764b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsLValueReferenceUID:
57752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.GetLValueReferenceType ();
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5804b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsRValueReferenceUID:
58152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_clang_type = void_clang_type.GetRValueReferenceType ();
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
5854b40711e7950310afb74835820eb669004cd8c44Greg Clayton                assert(!"Unhandled encoding_data_type.");
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
590462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
591462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    // Check if we have a forward reference to a class/struct/union/enum?
59252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_clang_type.IsValid() && m_flags.clang_type_resolve_state < clang_type_resolve_state)
593462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
594931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        m_flags.clang_type_resolve_state = eResolveStateFull;
59552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!m_clang_type.IsDefined ())
5964b40711e7950310afb74835820eb669004cd8c44Greg Clayton        {
59752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // We have a forward declaration, we need to resolve it to a complete definition.
598bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            m_symbol_file->ResolveClangOpaqueTypeDefinition (m_clang_type);
5994b40711e7950310afb74835820eb669004cd8c44Greg Clayton        }
600462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
601306edcaab871503192162272c147aef89d0ee719Greg Clayton
602306edcaab871503192162272c147aef89d0ee719Greg Clayton    // If we have an encoding type, then we need to make sure it is
603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    // resolved appropriately.
6046916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_encoding_uid != LLDB_INVALID_UID)
605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
6066916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        if (encoding_type == NULL)
6076916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            encoding_type = GetEncodingType();
6086916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        if (encoding_type)
609bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
610034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton            ResolveState encoding_clang_type_resolve_state = clang_type_resolve_state;
611034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton
612034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton            if (clang_type_resolve_state == eResolveStateLayout)
613bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
614034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                switch (m_encoding_uid_type)
615034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                {
616034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsPointerUID:
617034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsLValueReferenceUID:
618034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsRValueReferenceUID:
6196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                    encoding_clang_type_resolve_state = eResolveStateForward;
620034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                    break;
621034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                default:
622034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                    break;
623034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                }
624bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
6256916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            encoding_type->ResolveClangType (encoding_clang_type_resolve_state);
626bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
627bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
62852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type.IsValid();
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6302403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Claytonuint32_t
631bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetEncodingMask ()
6322403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton{
6332403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    uint32_t encoding_mask = 1u << m_encoding_uid_type;
6342403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    Type *encoding_type = GetEncodingType();
6352403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    assert (encoding_type != this);
6362403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    if (encoding_type)
6372403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton        encoding_mask |= encoding_type->GetEncodingMask ();
6382403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    return encoding_mask;
6392403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton}
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
64204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg ClaytonType::GetClangFullType ()
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType(eResolveStateFull);
6456916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return m_clang_type;
6466916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
6476916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
64852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
649bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangLayoutType ()
6506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
6516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType(eResolveStateLayout);
652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return m_clang_type;
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
656bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangForwardType ()
657b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton{
6586916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType (eResolveStateForward);
659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return m_clang_type;
660b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton}
661b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton
662bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonClangASTContext &
663bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangASTContext ()
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
665b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_symbol_file->GetClangASTContext();
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
669bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Compare(const Type &a, const Type &b)
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Just compare the UID values for now...
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t a_uid = a.GetID();
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t b_uid = b.GetID();
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_uid < b_uid)
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_uid > b_uid)
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 1;
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (a.getQualType() == b.getQualType())
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return 0;
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
683b01000fd063629facd45044f137446fb748ee179Greg Clayton
68452f792329be5db8e38961350589e97e8f2823acdGreg Clayton#if 0  // START REMOVE
68552f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Move this into ClangASTType
686b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
687bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangPointerType (Type *type)
688b01000fd063629facd45044f137446fb748ee179Greg Clayton{
689b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
690b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreatePointerType(type->GetClangForwardType());
691b01000fd063629facd45044f137446fb748ee179Greg Clayton}
692b01000fd063629facd45044f137446fb748ee179Greg Clayton
693b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
694bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangTypedefType (Type *typedef_type, Type *base_type)
695b01000fd063629facd45044f137446fb748ee179Greg Clayton{
696b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(typedef_type && base_type);
697b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateTypedefType (typedef_type->GetName().AsCString(),
698b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                   base_type->GetClangForwardType(),
699c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                                                   typedef_type->GetSymbolFile()->GetClangDeclContextContainingTypeUID(typedef_type->GetID()));
700b01000fd063629facd45044f137446fb748ee179Greg Clayton}
701b01000fd063629facd45044f137446fb748ee179Greg Clayton
702b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
703bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangLValueReferenceType (Type *type)
704b01000fd063629facd45044f137446fb748ee179Greg Clayton{
705b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
706b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateLValueReferenceType(type->GetClangForwardType());
707b01000fd063629facd45044f137446fb748ee179Greg Clayton}
708b01000fd063629facd45044f137446fb748ee179Greg Clayton
709b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
710bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangRValueReferenceType (Type *type)
711b01000fd063629facd45044f137446fb748ee179Greg Clayton{
712b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
713b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateRValueReferenceType (type->GetClangForwardType());
714b01000fd063629facd45044f137446fb748ee179Greg Clayton}
71552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif // END REMOVE
716b01000fd063629facd45044f137446fb748ee179Greg Clayton
717f03d97e519811a029578cc120a7a2725cdf2aad1Jim Inghambool
718f03d97e519811a029578cc120a7a2725cdf2aad1Jim InghamType::IsRealObjCClass()
719f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham{
720f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    // For now we are just skipping ObjC classes that get made by hand from the runtime, because
721f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    // those don't have any information.  We could extend this to only return true for "full
722f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    // definitions" if we can figure that out.
723f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham
72452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_clang_type.IsObjCObjectOrInterfaceType() && GetByteSize() != 0)
725f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham        return true;
726f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    else
727f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham        return false;
728f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham}
729b01000fd063629facd45044f137446fb748ee179Greg Clayton
730dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString
731dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonType::GetQualifiedName ()
732dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{
73352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangForwardType().GetConstTypeName();
734dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton}
735dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
736dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
737dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Claytonbool
738b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg ClaytonType::GetTypeScopeAndBasename (const char* &name_cstr,
739dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                               std::string &scope,
740b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                               std::string &basename,
741b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                               TypeClass &type_class)
742dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{
743dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // Protect against null c string.
744dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
745b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    type_class = eTypeClassAny;
746b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton
747dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    if (name_cstr && name_cstr[0])
748dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
749b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        llvm::StringRef name_strref(name_cstr);
750b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        if (name_strref.startswith("struct "))
751b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
752b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            name_cstr += 7;
753b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            type_class = eTypeClassStruct;
754b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
755b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else if (name_strref.startswith("class "))
756b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
757b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            name_cstr += 6;
758b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            type_class = eTypeClassClass;
759b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
760b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else if (name_strref.startswith("union "))
761b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
762b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            name_cstr += 6;
763b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            type_class = eTypeClassUnion;
764b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
765b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else if (name_strref.startswith("enum "))
766b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
767b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            name_cstr += 5;
768b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            type_class = eTypeClassEnumeration;
769b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
770b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else if (name_strref.startswith("typedef "))
771b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
772b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            name_cstr += 8;
773b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            type_class = eTypeClassTypedef;
774b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
775dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        const char *basename_cstr = name_cstr;
776dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        const char* namespace_separator = ::strstr (basename_cstr, "::");
777dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (namespace_separator)
778dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
779dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            const char* template_arg_char = ::strchr (basename_cstr, '<');
780dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            while (namespace_separator != NULL)
781dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            {
782dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                if (template_arg_char && namespace_separator > template_arg_char) // but namespace'd template arguments are still good to go
783dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                    break;
784dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                basename_cstr = namespace_separator + 2;
785dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                namespace_separator = strstr(basename_cstr, "::");
786dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            }
787dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            if (basename_cstr > name_cstr)
788dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            {
789dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                scope.assign (name_cstr, basename_cstr - name_cstr);
790dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                basename.assign (basename_cstr);
791dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                return true;
792dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            }
793dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
794dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
795dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return false;
796dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton}
797dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
798dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
799dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
800dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
801ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::TypeAndOrName () : m_type_sp(), m_type_name()
802ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
803ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
804ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
805ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
806ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::TypeAndOrName (TypeSP &in_type_sp) : m_type_sp(in_type_sp)
807ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
808ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (in_type_sp)
809ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_type_name = in_type_sp->GetName();
810ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
811ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
812ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::TypeAndOrName (const char *in_type_str) : m_type_name(in_type_str)
813ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
814ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
815ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
816ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::TypeAndOrName (const TypeAndOrName &rhs) : m_type_sp (rhs.m_type_sp), m_type_name (rhs.m_type_name)
817ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
818ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
819ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
820ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
821ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::TypeAndOrName (ConstString &in_type_const_string) : m_type_name (in_type_const_string)
822ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
823ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
824ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
825ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName &
826ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::operator= (const TypeAndOrName &rhs)
827ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
828ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (this != &rhs)
829ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    {
830ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_type_name = rhs.m_type_name;
831ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_type_sp = rhs.m_type_sp;
832ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    }
833ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    return *this;
834ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
835ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
8361a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granatabool
8371a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataTypeAndOrName::operator==(const TypeAndOrName &other) const
8381a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
8391a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_type_sp != other.m_type_sp)
8401a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return false;
8411a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_type_name != other.m_type_name)
8421a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return false;
8431a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return true;
8441a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
8451a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
8461a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granatabool
8471a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataTypeAndOrName::operator!=(const TypeAndOrName &other) const
8481a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
8491a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_type_sp != other.m_type_sp)
8501a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return true;
8511a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_type_name != other.m_type_name)
8521a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return true;
8531a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return false;
8541a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
8551a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
856ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamConstString
857ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::GetName () const
858ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
859ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_type_sp)
860ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return m_type_sp->GetName();
861ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    else
862ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return m_type_name;
863ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
864ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
865ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
866ef22b90240618ed8056dac14a756dff574f8218aGreg ClaytonTypeAndOrName::SetName (const ConstString &type_name)
867ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
868ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    m_type_name = type_name;
869ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
870ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
871ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
872ef22b90240618ed8056dac14a756dff574f8218aGreg ClaytonTypeAndOrName::SetName (const char *type_name_cstr)
873ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
874ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    m_type_name.SetCString (type_name_cstr);
875ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
876ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
877ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
878ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::SetTypeSP (lldb::TypeSP type_sp)
879ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
880ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_type_sp = type_sp;
881ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (type_sp)
882ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_type_name = type_sp->GetName();
883ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
884ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
885ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghambool
886ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName::IsEmpty()
887ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
888ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_type_name || m_type_sp)
889ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return false;
890ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    else
891ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return true;
892ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
893979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
8941a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granatavoid
8951a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataTypeAndOrName::Clear ()
8961a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
8971a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    m_type_name.Clear();
8981a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    m_type_sp.reset();
8991a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
9001a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
9011a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granatabool
9021a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataTypeAndOrName::HasName ()
9031a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
9041a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return (bool)m_type_name;
9051a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
9061a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
9071a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granatabool
9081a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataTypeAndOrName::HasTypeSP ()
9091a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
9101a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return m_type_sp.get() != NULL;
9111a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
9121a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
9130fb0bcc9d4e951145e1b8c783652224c09b23af4Greg ClaytonTypeImpl::TypeImpl(const lldb_private::ClangASTType& clang_ast_type) :
91452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_ast_type(clang_ast_type),
9150fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    m_type_sp()
91652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
91752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
918979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
9190fb0bcc9d4e951145e1b8c783652224c09b23af4Greg ClaytonTypeImpl::TypeImpl(const lldb::TypeSP& type) :
92052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_ast_type(type->GetClangForwardType()),
9210fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    m_type_sp(type)
9220fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton{
9230fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton}
924979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
9257dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Claytonvoid
9267dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg ClaytonTypeImpl::SetType (const lldb::TypeSP &type_sp)
9277dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton{
9287dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    if (type_sp)
9297dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    {
93052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_clang_ast_type = type_sp->GetClangForwardType();
9317dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_type_sp = type_sp;
9327dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    }
9337dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    else
9347dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    {
9357dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_clang_ast_type.Clear();
9367dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_type_sp.reset();
9377dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    }
9387dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton}
9397dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
940979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataTypeImpl&
941979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataTypeImpl::operator = (const TypeImpl& rhs)
942979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
943979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (*this != rhs)
944979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
9450fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type = rhs.m_clang_ast_type;
9460fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp = rhs.m_type_sp;
947979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
948979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return *this;
949979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
950979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
951979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclang::ASTContext*
952979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataTypeImpl::GetASTContext()
953979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
954979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (!IsValid())
955979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return NULL;
956979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
9570fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    return m_clang_ast_type.GetASTContext();
958979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
959979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
960979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::clang_type_t
961979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataTypeImpl::GetOpaqueQualType()
962979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
963979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (!IsValid())
964979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return NULL;
965979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
9660fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    return m_clang_ast_type.GetOpaqueQualType();
967979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
96896154be69fa240a662419183ed08e1cfc5418164Greg Clayton
96996154be69fa240a662419183ed08e1cfc5418164Greg Claytonbool
97096154be69fa240a662419183ed08e1cfc5418164Greg ClaytonTypeImpl::GetDescription (lldb_private::Stream &strm,
97196154be69fa240a662419183ed08e1cfc5418164Greg Clayton                          lldb::DescriptionLevel description_level)
97296154be69fa240a662419183ed08e1cfc5418164Greg Clayton{
97396154be69fa240a662419183ed08e1cfc5418164Greg Clayton    if (m_clang_ast_type.IsValid())
97496154be69fa240a662419183ed08e1cfc5418164Greg Clayton    {
97552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_clang_ast_type.DumpTypeDescription (&strm);
97696154be69fa240a662419183ed08e1cfc5418164Greg Clayton    }
97796154be69fa240a662419183ed08e1cfc5418164Greg Clayton    else
97896154be69fa240a662419183ed08e1cfc5418164Greg Clayton    {
97996154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
98096154be69fa240a662419183ed08e1cfc5418164Greg Clayton    }
98196154be69fa240a662419183ed08e1cfc5418164Greg Clayton    return true;
98296154be69fa240a662419183ed08e1cfc5418164Greg Clayton}
98396154be69fa240a662419183ed08e1cfc5418164Greg Clayton
9848c3391ba76c5e3440a0cc10296dbde1b44300509Enrico GranataConstString
9858c3391ba76c5e3440a0cc10296dbde1b44300509Enrico GranataTypeImpl::GetName ()
9868c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata{
9878c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    if (m_clang_ast_type.IsValid())
98852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_clang_ast_type.GetConstTypeName();
9898c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    return ConstString();
9908c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata}
991