Type.cpp revision 4fdf7602bedd8be648f3c549074cf13d90a05f03
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"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
28395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Target/Target.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonusing namespace lldb;
31bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonusing namespace lldb_private;
32462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
33bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t uid,
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile* symbol_file,
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
384b40711e7950310afb74835820eb669004cd8c44Greg Clayton    uint32_t byte_size,
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *context,
40bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    user_id_t encoding_uid,
41bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    EncodingDataType encoding_uid_type,
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration& decl,
434b40711e7950310afb74835820eb669004cd8c44Greg Clayton    clang_type_t clang_type,
446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveState clang_type_resolve_state
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (uid),
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (name),
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_file (symbol_file),
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_context (context),
50ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_type (NULL),
51bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid (encoding_uid),
52bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid_type (encoding_uid_type),
534b40711e7950310afb74835820eb669004cd8c44Greg Clayton    m_byte_size (byte_size),
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_decl (decl),
55bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    m_clang_type (clang_type),
566916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    m_clang_type_resolve_state (clang_type ? clang_type_resolve_state : eResolveStateUnresolved)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type () :
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (0),
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name ("<INVALID TYPE>"),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_file (NULL),
64ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_context (NULL),
65ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_type (NULL),
66ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_uid_type (eEncodingInvalid),
67ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_encoding_uid (0),
68ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    m_byte_size (0),
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_decl (),
706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    m_clang_type (NULL),
716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    m_clang_type_resolve_state (eResolveStateUnresolved)
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Type (const Type &rhs) :
77bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    UserID (rhs),
78bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_name (rhs.m_name),
79bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_symbol_file (rhs.m_symbol_file),
80bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_context (rhs.m_context),
81bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_type (rhs.m_encoding_type),
82bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid_type (rhs.m_encoding_uid_type),
83bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_encoding_uid (rhs.m_encoding_uid),
84bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_byte_size (rhs.m_byte_size),
85bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_decl (rhs.m_decl),
86bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_clang_type (rhs.m_clang_type),
87bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    m_clang_type_resolve_state (rhs.m_clang_type_resolve_state)
88bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton{
89bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton}
90bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
91bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst Type&
92bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::operator= (const Type& rhs)
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
102bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name)
10312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{
10412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "id = " << (const UserID&)*this;
10512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
1061924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    // Call the name accessor to make sure we resolve the type name
1071924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (show_name && GetName())
108c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << ", name = \"" << m_name << '"';
109c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton
1101924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    // Call the get byte size accesor so we resolve our byte size
1111924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (GetByteSize())
11212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Printf(", byte-size = %zu", m_byte_size);
1131924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool show_fullpaths = (level == lldb::eDescriptionLevelVerbose);
1141924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_decl.Dump(s, show_fullpaths);
11512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
116bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (m_clang_type)
11712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
118c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << ", clang_type = \"";
119bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        ClangASTType::DumpTypeDescription (GetClangAST(), m_clang_type, s);
120c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << '"';
12112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
122ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    else if (m_encoding_uid != LLDB_INVALID_UID)
12312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
124ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        s->Printf(", type_uid = 0x%8.8x", m_encoding_uid);
125ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
12612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
1274fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid: break;
1284b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
1294b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
1304b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
1314b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
1324b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
1334b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
1344b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
1354b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
1364b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
13712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
138c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    }
13912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton}
14012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
14112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
14212bec71b323dc520f0e985a86e09c4712559e115Greg Claytonvoid
143bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Dump (Stream *s, bool show_context)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Type" << (const UserID&)*this << ' ';
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_name)
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", name = \"" << m_name << "\"";
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_byte_size != 0)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf(", size = %zu", m_byte_size);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (show_context && m_context != NULL)
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", context = ( ");
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context->DumpSymbolContext(s);
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(" )");
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1611924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool show_fullpaths = false;
1621924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_decl.Dump (s,show_fullpaths);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (m_clang_type)
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
166bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        *s << ", clang_type = " << m_clang_type << ' ';
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        ClangASTType::DumpTypeDescription (GetClangAST(), m_clang_type, s);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
170ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    else if (m_encoding_uid != LLDB_INVALID_UID)
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
172ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        *s << ", type_data = " << (uint64_t)m_encoding_uid;
173ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1754fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid: break;
1764b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
1774b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
1784b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
1794b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
1804b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
1814b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
1824b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
1834b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
1844b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (m_access)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      s->Printf(", access = %u", m_access);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst ConstString &
195bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetName()
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!(m_name))
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        if (ResolveClangType(eResolveStateForward))
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
201bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            std::string type_name = ClangASTContext::GetTypeName (m_clang_type);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!type_name.empty())
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_name.SetCString (type_name.c_str());
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
210bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpTypeName(Stream *s)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName().Dump(s, "<invalid-type-name>");
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
217bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpValue
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
219bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ExecutionContext *exe_ctx,
220bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Stream *s,
221bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    const DataExtractor &data,
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t data_byte_offset,
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_types,
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_summary,
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose,
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format format
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (ResolveClangType(eResolveStateForward))
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_types)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->PutChar('(');
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (verbose)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("Type{0x%8.8x} ", GetID());
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpTypeName (s);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->PutCString(") ");
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        ClangASTType::DumpValue (GetClangAST (),
241bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                               m_clang_type,
242960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               exe_ctx,
243960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               s,
244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               format == lldb::eFormatDefault ? GetFormat() : format,
245960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               data,
246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               data_byte_offset,
247960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               GetByteSize(),
248960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               0, // Bitfield bit size
249960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               0, // Bitfield bit offset
250960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               show_types,
251960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               show_summary,
252960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               verbose,
253960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                               0);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType *
258bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetEncodingType ()
259ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton{
2606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_encoding_type == NULL && m_encoding_uid != LLDB_INVALID_UID)
2616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
262ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    return m_encoding_type;
263ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton}
264ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
265ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
266ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
267bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t
268bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetByteSize()
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_byte_size == 0)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
272ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        switch (m_encoding_uid_type)
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2744fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingInvalid:
2754fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        case eEncodingIsSyntheticUID:
2764fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            break;
2774b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsUID:
2784b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsConstUID:
2794b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRestrictUID:
2804b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsVolatileUID:
2814b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsTypedefUID:
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
283ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                Type *encoding_type = GetEncodingType ();
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (encoding_type)
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_byte_size = encoding_type->GetByteSize();
286ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                if (m_byte_size == 0)
287ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                {
288bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton                    uint32_t bit_width = ClangASTType::GetClangTypeBitWidth (GetClangAST(), GetClangLayoutType());
289ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                    m_byte_size = (bit_width + 7 ) / 8;
290ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                }
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we are a pointer or reference, then this is just a pointer size;
2954b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsPointerUID:
2964b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsLValueReferenceUID:
2974b40711e7950310afb74835820eb669004cd8c44Greg Clayton        case eEncodingIsRValueReferenceUID:
298b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_byte_size = m_symbol_file->GetClangASTContext().GetPointerBitSize() / 8;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_byte_size;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
307bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetNumChildren (bool omit_empty_base_classes)
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
309b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ResolveClangType(eResolveStateForward))
310b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
311b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ClangASTContext::GetNumChildren (m_symbol_file->GetClangASTContext().getASTContext(),
312b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                m_clang_type,
313b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                omit_empty_base_classes);
314b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
315b01000fd063629facd45044f137446fb748ee179Greg Clayton    return 0;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
319bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::IsAggregateType ()
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3216916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (ResolveClangType(eResolveStateForward))
322bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        return ClangASTContext::IsAggregateType (m_clang_type);
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Format
327bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetFormat ()
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure we resolve our type if it already hasn't been.
3306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (!ResolveClangType(eResolveStateForward))
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lldb::eFormatInvalid;
332bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    return ClangASTType::GetFormat (m_clang_type);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Encoding
338bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetEncoding (uint32_t &count)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure we resolve our type if it already hasn't been.
3416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (!ResolveClangType(eResolveStateForward))
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lldb::eEncodingInvalid;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
344bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    return ClangASTType::GetEncoding (m_clang_type, count);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
350bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::DumpValueInMemory
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
352bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ExecutionContext *exe_ctx,
353bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Stream *s,
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t address,
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::AddressType address_type,
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_types,
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_summary,
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address != LLDB_INVALID_ADDRESS)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
363bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        DataExtractor data;
364395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (exe_ctx->target)
365395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            data.SetByteOrder (exe_ctx->target->GetArchitecture().GetByteOrder());
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ReadFromMemory (exe_ctx, address, address_type, data))
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DumpValue(exe_ctx, s, data, 0, show_types, show_summary, verbose);
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
377bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::ReadFromMemory (ExecutionContext *exe_ctx, lldb::addr_t addr, lldb::AddressType address_type, DataExtractor &data)
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address_type == lldb::eAddressTypeFile)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Can't convert a file address to anything valid without more
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // context (which Module it came from)
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t byte_size = GetByteSize();
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data.GetByteSize() < byte_size)
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetData(data_sp);
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst != NULL)
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (address_type == lldb::eAddressTypeHost)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The address is an address in this process, so just copy it
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            memcpy (dst, (uint8_t*)NULL + addr, byte_size);
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx && exe_ctx->process)
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Error error;
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return exe_ctx->process->ReadMemory(addr, dst, byte_size, error) == byte_size;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
416bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::WriteToMemory (ExecutionContext *exe_ctx, lldb::addr_t addr, lldb::AddressType address_type, DataExtractor &data)
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
422bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonTypeList*
423bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetTypeList()
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
425e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    return GetSymbolFile()->GetTypeList();
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
428bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonconst Declaration &
429bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetDeclaration () const
4300bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham{
4310bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    return m_decl;
4320bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham}
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
435bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::ResolveClangType (ResolveState clang_type_resolve_state)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    Type *encoding_type = NULL;
438bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (m_clang_type == NULL)
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4406916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        encoding_type = GetEncodingType();
441ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        if (encoding_type)
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
443ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            switch (m_encoding_uid_type)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
445ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsUID:
4466916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (encoding_type->ResolveClangType(clang_type_resolve_state))
4476916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                {
4486916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                    m_clang_type = encoding_type->m_clang_type;
4496916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                    m_clang_type_resolve_state = encoding_type->m_clang_type_resolve_state;
4506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                }
451ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
452ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
453ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsConstUID:
454bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddConstModifier (encoding_type->GetClangForwardType());
455ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
456ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
457ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsRestrictUID:
458bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddRestrictModifier (encoding_type->GetClangForwardType());
459ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
460ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
461ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsVolatileUID:
462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddVolatileModifier (encoding_type->GetClangForwardType());
463ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
464ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
465ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsTypedefUID:
466b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = CreateClangTypedefType (this, encoding_type);
467ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                // Clear the name so it can get fully qualified in case the
468ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                // typedef is in a namespace.
469ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                m_name.Clear();
470ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
471ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
472ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsPointerUID:
473b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = CreateClangPointerType (encoding_type);
474ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
475ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
476ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsLValueReferenceUID:
477b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = CreateClangLValueReferenceType (encoding_type);
478ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
479ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
480ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            case eEncodingIsRValueReferenceUID:
481b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = CreateClangRValueReferenceType (encoding_type);
482ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
483ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
484ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            default:
485ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                assert(!"Unhandled encoding_data_type.");
486ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton                break;
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We have no encoding type, return void?
492b01000fd063629facd45044f137446fb748ee179Greg Clayton            clang_type_t void_clang_type = GetClangASTContext().GetBuiltInType_void();
493ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton            switch (m_encoding_uid_type)
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4954b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsUID:
496bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = void_clang_type;
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4994b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsConstUID:
500bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddConstModifier (void_clang_type);
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5034b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsRestrictUID:
504bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddRestrictModifier (void_clang_type);
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5074b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsVolatileUID:
508bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                m_clang_type = ClangASTContext::AddVolatileModifier (void_clang_type);
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5114b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsTypedefUID:
512b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = GetClangASTContext().CreateTypedefType (m_name.AsCString(), void_clang_type, NULL);
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5154b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsPointerUID:
516b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = GetClangASTContext().CreatePointerType (void_clang_type);
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5194b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsLValueReferenceUID:
520b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = GetClangASTContext().CreateLValueReferenceType (void_clang_type);
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5234b40711e7950310afb74835820eb669004cd8c44Greg Clayton            case eEncodingIsRValueReferenceUID:
524b01000fd063629facd45044f137446fb748ee179Greg Clayton                m_clang_type = GetClangASTContext().CreateRValueReferenceType (void_clang_type);
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
5284b40711e7950310afb74835820eb669004cd8c44Greg Clayton                assert(!"Unhandled encoding_data_type.");
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
533462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
534462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    // Check if we have a forward reference to a class/struct/union/enum?
5356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_clang_type && m_clang_type_resolve_state < clang_type_resolve_state)
536462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
5376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_clang_type_resolve_state = eResolveStateFull;
538bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (!ClangASTType::IsDefined (m_clang_type))
5394b40711e7950310afb74835820eb669004cd8c44Greg Clayton        {
5404b40711e7950310afb74835820eb669004cd8c44Greg Clayton            // We have a forward declaration, we need to resolve it to a complete
5414b40711e7950310afb74835820eb669004cd8c44Greg Clayton            // definition.
542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            m_symbol_file->ResolveClangOpaqueTypeDefinition (m_clang_type);
5434b40711e7950310afb74835820eb669004cd8c44Greg Clayton        }
544462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
545306edcaab871503192162272c147aef89d0ee719Greg Clayton
546306edcaab871503192162272c147aef89d0ee719Greg Clayton    // If we have an encoding type, then we need to make sure it is
547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    // resolved appropriately.
5486916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_encoding_uid != LLDB_INVALID_UID)
549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
5506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        if (encoding_type == NULL)
5516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            encoding_type = GetEncodingType();
5526916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        if (encoding_type)
553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
554034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton            ResolveState encoding_clang_type_resolve_state = clang_type_resolve_state;
555034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton
556034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton            if (clang_type_resolve_state == eResolveStateLayout)
557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
558034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                switch (m_encoding_uid_type)
559034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                {
560034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsPointerUID:
561034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsLValueReferenceUID:
562034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                case eEncodingIsRValueReferenceUID:
5636916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                    encoding_clang_type_resolve_state = eResolveStateForward;
564034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                    break;
565034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                default:
566034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                    break;
567034c996d94fc8a2ec1021a1cf4db115bed8391c7Greg Clayton                }
568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
5696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            encoding_type->ResolveClangType (encoding_clang_type_resolve_state);
570bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
572bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return m_clang_type != NULL;
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5742403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Claytonuint32_t
575bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetEncodingMask ()
5762403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton{
5772403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    uint32_t encoding_mask = 1u << m_encoding_uid_type;
5782403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    Type *encoding_type = GetEncodingType();
5792403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    assert (encoding_type != this);
5802403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    if (encoding_type)
5812403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton        encoding_mask |= encoding_type->GetEncodingMask ();
5822403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    return encoding_mask;
5832403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton}
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
585462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
58604c9c7b03fbec6d0dcc6c848391147de2f129c66Greg ClaytonType::GetClangFullType ()
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5886916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType(eResolveStateFull);
5896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return m_clang_type;
5906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
5916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
5926916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang_type_t
593bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangLayoutType ()
5946916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
5956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType(eResolveStateLayout);
596bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return m_clang_type;
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
599b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Claytonclang_type_t
600bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangForwardType ()
601b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton{
6026916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ResolveClangType (eResolveStateForward);
603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return m_clang_type;
604b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton}
605b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclang::ASTContext *
607bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangAST ()
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
609b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().getASTContext();
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
612bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonClangASTContext &
613bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::GetClangASTContext ()
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
615b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_symbol_file->GetClangASTContext();
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
619bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::Compare(const Type &a, const Type &b)
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Just compare the UID values for now...
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t a_uid = a.GetID();
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t b_uid = b.GetID();
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_uid < b_uid)
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (a_uid > b_uid)
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 1;
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (a.getQualType() == b.getQualType())
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return 0;
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
633b01000fd063629facd45044f137446fb748ee179Greg Clayton
634b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
635bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangPointerType (Type *type)
636b01000fd063629facd45044f137446fb748ee179Greg Clayton{
637b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
638b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreatePointerType(type->GetClangForwardType());
639b01000fd063629facd45044f137446fb748ee179Greg Clayton}
640b01000fd063629facd45044f137446fb748ee179Greg Clayton
641b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
642bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangTypedefType (Type *typedef_type, Type *base_type)
643b01000fd063629facd45044f137446fb748ee179Greg Clayton{
644b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(typedef_type && base_type);
645b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateTypedefType (typedef_type->GetName().AsCString(),
646b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                   base_type->GetClangForwardType(),
647b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                   typedef_type->GetSymbolFile()->GetClangDeclContextForTypeUID(typedef_type->GetID()));
648b01000fd063629facd45044f137446fb748ee179Greg Clayton}
649b01000fd063629facd45044f137446fb748ee179Greg Clayton
650b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
651bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangLValueReferenceType (Type *type)
652b01000fd063629facd45044f137446fb748ee179Greg Clayton{
653b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
654b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateLValueReferenceType(type->GetClangForwardType());
655b01000fd063629facd45044f137446fb748ee179Greg Clayton}
656b01000fd063629facd45044f137446fb748ee179Greg Clayton
657b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid *
658bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonType::CreateClangRValueReferenceType (Type *type)
659b01000fd063629facd45044f137446fb748ee179Greg Clayton{
660b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(type);
661b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetClangASTContext().CreateRValueReferenceType (type->GetClangForwardType());
662b01000fd063629facd45044f137446fb748ee179Greg Clayton}
663b01000fd063629facd45044f137446fb748ee179Greg Clayton
664b01000fd063629facd45044f137446fb748ee179Greg Clayton
665