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