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