Type.cpp revision 1674b12bbc3dae7b9543b8c5f958e90ddc767fa4
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#include "clang/AST/ASTConsumer.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
13eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "clang/AST/Decl.h"
14eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "clang/AST/DeclCXX.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/DeclGroup.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "clang/Basic/Builtins.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/IdentifierTable.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/LangOptions.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/Basic/TargetInfo.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/Support/FormattedStream.h"
25427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "llvm/Support/raw_ostream.h"
26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/DataBufferHeap.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Core/Scalar.h"
31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Core/StreamString.h"
321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTType.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
364ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Symbol/SymbolContextScope.h"
37b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Symbol/SymbolFile.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
40eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::Type
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t uid,
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile* symbol_file,
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t byte_size,
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *context,
51fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    lldb::user_id_t encoding_uid,
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EncodingUIDType encoding_uid_type,
53fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    const Declaration& decl,
54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    void *clang_type
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (uid),
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (name),
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_byte_size (byte_size),
5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_symbol_file (symbol_file),
6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_context (context),
6117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_encoding_uid (encoding_uid),
6217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_encoding_uid_type (encoding_uid_type),
634ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_decl (decl),
6447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_clang_qual_type (clang_type)
6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton{
6617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton}
6747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
6847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Inghamlldb_private::Type::Type () :
6911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    UserID (0),
7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_name ("<INVALID TYPE>"),
7117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_byte_size (0),
7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_symbol_file (NULL),
73427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_context (),
7400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_encoding_uid (0),
751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_encoding_uid_type (eTypeInvalid),
761391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_decl (),
771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_clang_qual_type (NULL)
781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::Type&
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::operator= (const Type& rhs)
84fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
87fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        UserID::operator= (rhs);
88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_name = rhs.m_name;
89dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson        m_byte_size = rhs.m_byte_size;
90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_symbol_file = rhs.m_symbol_file;
91fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_context = rhs.m_context;
92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_encoding_uid = rhs.m_encoding_uid;
93fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_decl = rhs.m_decl;
94fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_clang_qual_type = rhs.m_clang_qual_type;
95fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
96fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return *this;
97fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
98fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
9947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid
101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb_private::Type::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name)
10247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
10347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (show_name)
104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_name)
106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            *s << '\"' << m_name << "\", ";
107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    *s << "id = " << (const UserID&)*this;
1101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (m_byte_size != 0)
1121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s->Printf(", byte-size = %zu", m_byte_size);
1131391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_decl.Dump(s);
11547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
11647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(m_clang_qual_type));
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type.getTypePtr())
119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        *s << ", type = ";
121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        clang::TagDecl *tag_decl = NULL;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (tag_type)
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            tag_decl = tag_type->getDecl();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (tag_decl)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            s->EOL();
1301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            s->EOL();
1311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            tag_decl->print(llvm::fouts(), 0);
132d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton            s->EOL();
133d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        }
134d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        else
135d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        {
136d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton            const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (typedef_type)
138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (!clang_typedef_name.empty())
142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    *s << ' ' << clang_typedef_name.c_str();
143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We have a clang type, lets show it
147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                clang::ASTContext *ast_context = GetClangAST();
148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (ast_context)
149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    std::string clang_type_name(qual_type.getAsString());
151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (!clang_type_name.empty())
152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        *s << ' ' << clang_type_name.c_str();
153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else if (m_encoding_uid != LLDB_INVALID_UID)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        *s << ", type_uid = " << m_encoding_uid;
160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        switch (m_encoding_uid_type)
161ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton        {
162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eIsTypeWithUID: s->PutCString(" (unresolved type)"); break;
163ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton        case eIsConstTypeWithUID: s->PutCString(" (unresolved const type)"); break;
164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eIsRestrictTypeWithUID: s->PutCString(" (unresolved restrict type)"); break;
165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eIsVolatileTypeWithUID: s->PutCString(" (unresolved volatile type)"); break;
166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eTypedefToTypeWithUID: s->PutCString(" (unresolved typedef)"); break;
167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case ePointerToTypeWithUID: s->PutCString(" (unresolved pointer)"); break;
168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eLValueReferenceToTypeWithUID: s->PutCString(" (unresolved L value reference)"); break;
169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        case eRValueReferenceToTypeWithUID: s->PutCString(" (unresolved R value reference)"); break;
170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::Dump (Stream *s, bool show_context)
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Type" << (const UserID&)*this << ' ';
1811391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (m_name)
1821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        *s << ", name = \"" << m_name << "\"";
1831391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1841391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (m_byte_size != 0)
1851391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s->Printf(", size = %zu", m_byte_size);
1861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (show_context && m_context != NULL)
1881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
1891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s->PutCString(", context = ( ");
1901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        m_context->DumpSymbolContext(s);
1911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s->PutCString(" )");
1921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_decl.Dump(s);
1951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(m_clang_qual_type));
1971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (qual_type.getTypePtr())
1991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
2001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        *s << ", clang_type = ";
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        clang::TagDecl *tag_decl = NULL;
204e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (tag_type)
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            tag_decl = tag_type->getDecl();
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (tag_decl)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->EOL();
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->EOL();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            tag_decl->print(llvm::fouts(), 0);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->EOL();
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (typedef_type)
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (!clang_typedef_name.empty())
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    *s << " (" << clang_typedef_name.c_str() << ')';
223fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We have a clang type, lets show it
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                clang::ASTContext *ast_context = GetClangAST();
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ast_context)
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string clang_type_name(qual_type.getAsString());
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!clang_type_name.empty())
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        *s << " (" << clang_type_name.c_str() << ')';
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
2356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        }
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (m_encoding_uid != LLDB_INVALID_UID)
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", type_uid = " << m_encoding_uid;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_encoding_uid_type)
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eIsTypeWithUID: s->PutCString(" (unresolved type)"); break;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eIsConstTypeWithUID: s->PutCString(" (unresolved const type)"); break;
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eIsRestrictTypeWithUID: s->PutCString(" (unresolved restrict type)"); break;
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eIsVolatileTypeWithUID: s->PutCString(" (unresolved volatile type)"); break;
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eTypedefToTypeWithUID: s->PutCString(" (unresolved typedef)"); break;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case ePointerToTypeWithUID: s->PutCString(" (unresolved pointer)"); break;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eLValueReferenceToTypeWithUID: s->PutCString(" (unresolved L value reference)"); break;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eRValueReferenceToTypeWithUID: s->PutCString(" (unresolved R value reference)"); break;
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (m_access)
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      s->Printf(", access = %u", m_access);
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::ConstString &
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::GetName()
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!(m_name))
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ResolveClangType())
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string type_name = ClangASTContext::GetTypeName (m_clang_qual_type);
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!type_name.empty())
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_name.SetCString (type_name.c_str());
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::DumpTypeName(Stream *s)
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName().Dump(s, "<invalid-type-name>");
278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
2790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
2800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid
282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb_private::Type::DumpValue
283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham(
2840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    lldb_private::ExecutionContext *exe_ctx,
2850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    lldb_private::Stream *s,
2860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    const lldb_private::DataExtractor &data,
2870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    uint32_t data_byte_offset,
2880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    bool show_types,
28917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    bool show_summary,
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose,
29117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    lldb::Format format
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ResolveClangType())
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_types)
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            s->PutChar('(');
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("Type{0x%8.8x} ", GetID());
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpTypeName (s);
302fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            s->PutCString(") ");
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
304fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
30517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton        lldb_private::ClangASTType::DumpValue (GetClangAST (),
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   m_clang_qual_type,
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   exe_ctx,
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   s,
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   format == lldb::eFormatDefault ? GetFormat() : format,
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   data,
31117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                                                   data_byte_offset,
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   GetByteSize(),
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   0, // Bitfield bit size
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   0, // Bitfield bit offset
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   show_types,
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   show_summary,
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   verbose,
318917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                   0);
319917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
320917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
321917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
323917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::Type::GetByteSize()
324917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_byte_size == 0)
326917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
327917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        switch (m_encoding_uid_type)
328917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
329e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        case eIsTypeWithUID:
330917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        case eIsConstTypeWithUID:
331917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        case eIsRestrictTypeWithUID:
332917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        case eIsVolatileTypeWithUID:
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eTypedefToTypeWithUID:
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_encoding_uid != LLDB_INVALID_UID)
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Type *encoding_type = m_symbol_file->ResolveTypeUID (m_encoding_uid);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (encoding_type)
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_byte_size = encoding_type->GetByteSize();
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_byte_size == 0)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
342462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                uint64_t bit_width = GetClangAST()->getTypeSize(clang::QualType::getFromOpaquePtr(GetOpaqueClangQualType()));
343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                m_byte_size = (bit_width + 7 ) / 8;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we are a pointer or reference, then this is just a pointer size;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case ePointerToTypeWithUID:
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eLValueReferenceToTypeWithUID:
3505d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton        case eRValueReferenceToTypeWithUID:
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_byte_size = GetTypeList()->GetClangASTContext().GetPointerBitSize() / 8;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
355917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return m_byte_size;
356917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
357917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
358917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
359917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonuint32_t
360917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::Type::GetNumChildren (bool omit_empty_base_classes)
361917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
362917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (!ResolveClangType())
363917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        return 0;
364917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::GetNumChildren (m_clang_qual_type, omit_empty_base_classes);
365917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
366917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
367917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
368917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
369e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb_private::Type::IsAggregateType ()
370917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
371917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (ResolveClangType())
372e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return ClangASTContext::IsAggregateType (m_clang_qual_type);
373917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return false;
374917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
375917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
376917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb::Format
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::GetFormat ()
378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
379917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // Make sure we resolve our type if it already hasn't been.
380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (!ResolveClangType())
381917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        return lldb::eFormatInvalid;
382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return lldb_private::ClangASTType::GetFormat (m_clang_qual_type);
383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
384e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Encoding
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::GetEncoding (uint32_t &count)
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure we resolve our type if it already hasn't been.
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ResolveClangType())
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lldb::eEncodingInvalid;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return lldb_private::ClangASTType::GetEncoding (m_clang_qual_type, count);
39517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton}
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::DumpValueInMemory
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::ExecutionContext *exe_ctx,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Stream *s,
40417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    lldb::addr_t address,
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::AddressType address_type,
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_types,
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_summary,
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address != LLDB_INVALID_ADDRESS)
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb_private::DataExtractor data;
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetByteOrder (exe_ctx->process->GetByteOrder());
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ReadFromMemory (exe_ctx, address, address_type, data))
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpValue(exe_ctx, s, data, 0, show_types, show_summary, verbose);
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    }
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
423bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham
424e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
425917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
426917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::Type::ReadFromMemory (lldb_private::ExecutionContext *exe_ctx, lldb::addr_t addr, lldb::AddressType address_type, lldb_private::DataExtractor &data)
427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
428917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (address_type == lldb::eAddressTypeFile)
429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Can't convert a file address to anything valid without more
431917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // context (which Module it came from)
432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        return false;
433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const uint32_t byte_size = GetByteSize();
436917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (data.GetByteSize() < byte_size)
437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        data.SetData(data_sp);
440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
443917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (dst != NULL)
444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
445917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (address_type == lldb::eAddressTypeHost)
446917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
447917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // The address is an address in this process, so just copy it
448917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            memcpy (dst, (uint8_t*)NULL + addr, byte_size);
449917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return true;
450917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
451917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        else
452917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
453917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (exe_ctx && exe_ctx->process)
454917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
455917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                Error error;
456917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                return exe_ctx->process->ReadMemory(addr, dst, byte_size, error) == byte_size;
457917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
459917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
460917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return false;
461917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
462917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
463917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
464917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
465917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::Type::WriteToMemory (lldb_private::ExecutionContext *exe_ctx, lldb::addr_t addr, lldb::AddressType address_type, lldb_private::DataExtractor &data)
466917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
467917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return false;
468917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
469917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
470917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
471917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::TypeList*
472917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonlldb_private::Type::GetTypeList()
473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return GetSymbolFile()->GetObjectFile()->GetModule()->GetTypeList();
475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
479e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb_private::Type::ResolveClangType()
48047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(m_clang_qual_type));
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type.getTypePtr() == NULL)
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
484fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        clang::QualType resolved_qual_type;
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypeList *type_list = GetTypeList();
486fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_encoding_uid != LLDB_INVALID_UID)
4871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        {
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Type *encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (encoding_type)
4901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
4911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
4921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                switch (m_encoding_uid_type)
4931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                {
4941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                case eIsTypeWithUID:
4951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    resolved_qual_type = clang::QualType::getFromOpaquePtr(encoding_type->GetOpaqueClangQualType());
4961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    break;
4971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
4981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                case eIsConstTypeWithUID:
4991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    resolved_qual_type = clang::QualType::getFromOpaquePtr(ClangASTContext::AddConstModifier (encoding_type->GetOpaqueClangQualType()));
5001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    break;
5011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
5021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                case eIsRestrictTypeWithUID:
5031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    resolved_qual_type = clang::QualType::getFromOpaquePtr(ClangASTContext::AddRestrictModifier (encoding_type->GetOpaqueClangQualType()));
504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    break;
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case eIsVolatileTypeWithUID:
50703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    resolved_qual_type = clang::QualType::getFromOpaquePtr(ClangASTContext::AddVolatileModifier (encoding_type->GetOpaqueClangQualType()));
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
50903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                case eTypedefToTypeWithUID:
511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->CreateClangTypedefType (this, encoding_type));
512427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    // Clear the name so it can get fully qualified in case the
513427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    // typedef is in a namespace.
51403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    m_name.Clear();
515fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    break;
516fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case ePointerToTypeWithUID:
518fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->CreateClangPointerType (encoding_type));
519fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    break;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
521fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                case eLValueReferenceToTypeWithUID:
522fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->CreateClangLValueReferenceType (encoding_type));
523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    break;
524fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
525fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                case eRValueReferenceToTypeWithUID:
526fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->CreateClangRValueReferenceType (encoding_type));
527fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    break;
528fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
52903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                default:
530fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    assert(!"Unhandled encoding_uid_type.");
531fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    break;
532fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
53303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
53403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
53503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        else
536fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
537fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // We have no encoding type, return void?
538fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            void *void_clang_type = type_list->GetClangASTContext().GetVoidBuiltInType();
539fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            switch (m_encoding_uid_type)
540fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
541fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eIsTypeWithUID:
542fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr(void_clang_type);
543fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
544fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
545fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eIsConstTypeWithUID:
546fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr (ClangASTContext::AddConstModifier (void_clang_type));
547fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
548fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
549fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eIsRestrictTypeWithUID:
550fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr (ClangASTContext::AddRestrictModifier (void_clang_type));
551fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
552fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
553fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eIsVolatileTypeWithUID:
554fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr (ClangASTContext::AddVolatileModifier (void_clang_type));
555307fa07606d519d427c812802aff5f9727e7047cGreg Clayton                break;
556fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
557fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eTypedefToTypeWithUID:
558fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->GetClangASTContext().CreateTypedefType (m_name.AsCString(), void_clang_type, NULL));
559fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
560fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
561fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case ePointerToTypeWithUID:
562fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->GetClangASTContext().CreatePointerType (void_clang_type));
563fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
564fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
565fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eLValueReferenceToTypeWithUID:
566fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->GetClangASTContext().CreateLValueReferenceType (void_clang_type));
567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
568fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
569fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            case eRValueReferenceToTypeWithUID:
570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                resolved_qual_type = clang::QualType::getFromOpaquePtr(type_list->GetClangASTContext().CreateRValueReferenceType (void_clang_type));
5715c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                break;
572fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
57303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            default:
574fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                assert(!"Unhandled encoding_uid_type.");
575fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                break;
576fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
577fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
578fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (resolved_qual_type.getTypePtr())
579fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
580fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_clang_qual_type = resolved_qual_type.getAsOpaquePtr();
581fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
582fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
583fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_clang_qual_type != NULL;
585307fa07606d519d427c812802aff5f9727e7047cGreg Clayton}
586fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid *
588fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb_private::Type::GetChildClangTypeAtIndex
589fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham(
590fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    const char *parent_name,
591fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    uint32_t idx,
592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool transparent_pointers,
593fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool omit_empty_base_classes,
594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ConstString& name,
595fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    uint32_t &child_byte_size,
596fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    int32_t &child_byte_offset,
597fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    uint32_t &child_bitfield_bit_size,
59803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    uint32_t &child_bitfield_bit_offset
59903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton)
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
601fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!ResolveClangType())
602fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
603fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string name_str;
605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    void *child_qual_type = GetClangASTContext().GetChildClangTypeAtIndex (
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            parent_name,
607fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_clang_qual_type,
608fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            idx,
60903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            transparent_pointers,
610fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            omit_empty_base_classes,
611fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            name_str,
612fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            child_byte_size,
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            child_byte_offset,
614fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            child_bitfield_bit_size,
615fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            child_bitfield_bit_offset);
616fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
617fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (child_qual_type)
618fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
61903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (!name_str.empty())
620fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            name.SetCString(name_str.c_str());
621fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            name.Clear();
62303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
624fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return child_qual_type;
625fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
626fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
627fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
628fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
629fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid *
630fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb_private::Type::GetOpaqueClangQualType ()
63103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
63203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    ResolveClangType();
633fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_clang_qual_type;
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
635fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
636fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamclang::ASTContext *
637fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb_private::Type::GetClangAST ()
638fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
639fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    TypeList *type_list = GetTypeList();
640fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (type_list)
641fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return type_list->GetClangASTContext().getASTContext();
642fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return NULL;
643fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::ClangASTContext &
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::GetClangASTContext ()
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetTypeList()->GetClangASTContext();
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::Type::Compare(const Type &a, const Type &b)
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Just compare the UID values for now...
6554ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    lldb::user_id_t a_uid = a.GetID();
656fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    lldb::user_id_t b_uid = b.GetID();
6574ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (a_uid < b_uid)
6584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return -1;
6594ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (a_uid > b_uid)
6604ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return 1;
661fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return 0;
6624ae519666628cca07c194bf677163009cc2e5a8bJim Ingham//  if (a.getQualType() == b.getQualType())
663fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//      return 0;
664fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
665fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
666fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham