diff options
-rw-r--r-- | lldb/include/lldb/Expression/ClangFunction.h | 2 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ClangASTContext.h | 3 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ClangASTType.h | 13 | ||||
-rw-r--r-- | lldb/source/API/SBType.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectChild.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectConstResult.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectDynamicValue.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectMemory.cpp | 6 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectRegister.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Expression/ClangFunction.cpp | 8 | ||||
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 30 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTType.cpp | 95 | ||||
-rw-r--r-- | lldb/source/Symbol/Type.cpp | 8 | ||||
-rw-r--r-- | lldb/test/lang/c/forward/TestForwardDeclaration.py | 4 | ||||
-rw-r--r-- | lldb/test/lang/cpp/dynamic-value/TestDynamicValue.py | 2 | ||||
-rw-r--r-- | lldb/test/lang/objc/foundation/TestObjCMethods.py | 2 |
18 files changed, 94 insertions, 93 deletions
diff --git a/lldb/include/lldb/Expression/ClangFunction.h b/lldb/include/lldb/Expression/ClangFunction.h index 4a0397d5ecd..111b29ae892 100644 --- a/lldb/include/lldb/Expression/ClangFunction.h +++ b/lldb/include/lldb/Expression/ClangFunction.h @@ -612,7 +612,7 @@ private: Function *m_function_ptr; ///< The function we're going to call. May be NULL if we don't have debug info for the function. Address m_function_addr; ///< If we don't have the FunctionSP, we at least need the address & return type. - void *m_function_return_qual_type; ///< The opaque clang qual type for the function return type. + lldb::clang_type_t m_function_return_qual_type; ///< The opaque clang qual type for the function return type. ClangASTContext *m_clang_ast_context; ///< This is the clang_ast_context that we're getting types from the and value, and the function return the function pointer is NULL. std::string m_wrapper_function_name; ///< The name of the wrapper function. diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index 00f27d28ad4..3e503fa8f46 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -659,9 +659,6 @@ public: //------------------------------------------------------------------ // Type names //------------------------------------------------------------------ - static std::string - GetTypeName(lldb::clang_type_t clang_type); - static bool IsFloatingPointType (lldb::clang_type_t clang_type, uint32_t &count, bool &is_complex); diff --git a/lldb/include/lldb/Symbol/ClangASTType.h b/lldb/include/lldb/Symbol/ClangASTType.h index cc75f6106cb..86bef932843 100644 --- a/lldb/include/lldb/Symbol/ClangASTType.h +++ b/lldb/include/lldb/Symbol/ClangASTType.h @@ -69,14 +69,17 @@ public: } ConstString - GetClangTypeName (); + GetConstTypeName (); static ConstString - GetClangTypeName (lldb::clang_type_t clang_type); - - static ConstString - GetClangTypeName (clang::QualType qual_type); + GetConstTypeName (lldb::clang_type_t clang_type); + static std::string + GetTypeNameForQualType (clang::QualType qual_type); + + static std::string + GetTypeNameForOpaqueQualType (lldb::clang_type_t opaque_qual_type); + uint32_t GetClangTypeBitWidth (); diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp index 4f20124d22f..c49f61b7f37 100644 --- a/lldb/source/API/SBType.cpp +++ b/lldb/source/API/SBType.cpp @@ -71,7 +71,7 @@ const char * SBType::GetName () { if (IsValid ()) - return ClangASTType::GetClangTypeName (m_type).AsCString(NULL); + return ClangASTType::GetConstTypeName (m_type).AsCString(NULL); return NULL; } diff --git a/lldb/source/Core/ValueObjectChild.cpp b/lldb/source/Core/ValueObjectChild.cpp index 509852f4b3a..dcbb90a99ea 100644 --- a/lldb/source/Core/ValueObjectChild.cpp +++ b/lldb/source/Core/ValueObjectChild.cpp @@ -71,7 +71,7 @@ ValueObjectChild::GetTypeName() { if (m_type_name.IsEmpty()) { - m_type_name = ClangASTType::GetClangTypeName (GetClangType()); + m_type_name = ClangASTType::GetConstTypeName (GetClangType()); if (m_type_name) { if (m_bitfield_bit_size > 0) diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp index fbb35eb42aa..7ceddc99607 100644 --- a/lldb/source/Core/ValueObjectConstResult.cpp +++ b/lldb/source/Core/ValueObjectConstResult.cpp @@ -273,7 +273,7 @@ ConstString ValueObjectConstResult::GetTypeName() { if (m_type_name.IsEmpty()) - m_type_name = ClangASTType::GetClangTypeName (GetClangType()); + m_type_name = ClangASTType::GetConstTypeName (GetClangType()); return m_type_name; } diff --git a/lldb/source/Core/ValueObjectDynamicValue.cpp b/lldb/source/Core/ValueObjectDynamicValue.cpp index 0188ad2099f..0a90b85bfdd 100644 --- a/lldb/source/Core/ValueObjectDynamicValue.cpp +++ b/lldb/source/Core/ValueObjectDynamicValue.cpp @@ -62,7 +62,7 @@ ValueObjectDynamicValue::GetTypeName() { const bool success = UpdateValueIfNeeded(); if (success && m_type_sp) - return ClangASTType::GetClangTypeName (GetClangType()); + return ClangASTType::GetConstTypeName (GetClangType()); else return m_parent->GetTypeName(); } diff --git a/lldb/source/Core/ValueObjectMemory.cpp b/lldb/source/Core/ValueObjectMemory.cpp index ad8c8f011da..900d27fbb1a 100644 --- a/lldb/source/Core/ValueObjectMemory.cpp +++ b/lldb/source/Core/ValueObjectMemory.cpp @@ -140,11 +140,7 @@ ValueObjectMemory::GetTypeName() { if (m_type_sp) return m_type_sp->GetName(); - ConstString name; - std::string type_name (ClangASTContext::GetTypeName (m_clang_type.GetOpaqueQualType())); - if (!type_name.empty()) - name.SetCString (type_name.c_str()); - return name; + return ClangASTType::GetConstTypeName (m_clang_type.GetOpaqueQualType()); } uint32_t diff --git a/lldb/source/Core/ValueObjectRegister.cpp b/lldb/source/Core/ValueObjectRegister.cpp index bcefc3064d7..db3d559efa3 100644 --- a/lldb/source/Core/ValueObjectRegister.cpp +++ b/lldb/source/Core/ValueObjectRegister.cpp @@ -322,7 +322,7 @@ ConstString ValueObjectRegister::GetTypeName() { if (m_type_name.IsEmpty()) - m_type_name = ClangASTType::GetClangTypeName (GetClangType()); + m_type_name = ClangASTType::GetConstTypeName (GetClangType()); return m_type_name; } diff --git a/lldb/source/Expression/ClangFunction.cpp b/lldb/source/Expression/ClangFunction.cpp index f3a57d5e9ee..21e2cd2e652 100644 --- a/lldb/source/Expression/ClangFunction.cpp +++ b/lldb/source/Expression/ClangFunction.cpp @@ -118,7 +118,7 @@ ClangFunction::CompileFunction (Stream &errors) // FIXME: How does clang tell us there's no return value? We need to handle that case. unsigned num_errors = 0; - std::string return_type_str = ClangASTContext::GetTypeName(m_function_return_qual_type); + std::string return_type_str (ClangASTType::GetTypeNameForOpaqueQualType (m_function_return_qual_type)); // Cons up the function we're going to wrap our call in, then compile it... // We declare the function "extern "C"" because the compiler might be in C++ @@ -164,15 +164,15 @@ ClangFunction::CompileFunction (Stream &errors) if (trust_function) { lldb::clang_type_t arg_clang_type = m_function_ptr->GetArgumentTypeAtIndex(i); - type_name = ClangASTContext::GetTypeName(arg_clang_type); + type_name = ClangASTType::GetTypeNameForOpaqueQualType (arg_clang_type); } else { Value *arg_value = m_arg_values.GetValueAtIndex(i); - void *clang_qual_type = arg_value->GetClangType (); + lldb::clang_type_t clang_qual_type = arg_value->GetClangType (); if (clang_qual_type != NULL) { - type_name = ClangASTContext::GetTypeName(clang_qual_type); + type_name = ClangASTType::GetTypeNameForOpaqueQualType (clang_qual_type); } else { diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp index fd7fc50b493..3cbdc7946ac 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -528,7 +528,7 @@ AppleObjCRuntimeV2::CreateObjectChecker(const char *name) size_t AppleObjCRuntimeV2::GetByteOffsetForIvar (ClangASTType &parent_ast_type, const char *ivar_name) { - const char *class_name = parent_ast_type.GetClangTypeName().AsCString(); + const char *class_name = parent_ast_type.GetConstTypeName().AsCString(); if (!class_name || *class_name == '\0' || !ivar_name || *ivar_name == '\0') return LLDB_INVALID_IVAR_OFFSET; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 9a7e7fdfc3b..7740d6fd70b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1493,7 +1493,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type if (class_language == eLanguageTypeObjC) { - std::string class_str (ClangASTContext::GetTypeName (clang_type)); + std::string class_str (ClangASTType::GetTypeNameForOpaqueQualType(clang_type)); if (!class_str.empty()) { diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index fb55a51344f..9da3c703ac8 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2571,9 +2571,8 @@ ClangASTContext::GetChildClangTypeAtIndex // Base classes should be a multiple of 8 bits in size assert (bit_offset % 8 == 0); child_byte_offset = bit_offset/8; - std::string base_class_type_name(base_class->getType().getAsString()); - - child_name.assign(base_class_type_name.c_str()); + + child_name = ClangASTType::GetTypeNameForQualType(base_class->getType()); uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); @@ -3401,7 +3400,8 @@ ClangASTContext::GetIndexOfChildWithName if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) continue; - if (base_class->getType().getAsString().compare (name) == 0) + std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType())); + if (base_class_type_name.compare (name) == 0) return child_idx; ++child_idx; } @@ -4660,28 +4660,6 @@ ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, D return NULL; } - -std::string -ClangASTContext::GetTypeName (clang_type_t opaque_qual_type) -{ - std::string return_name; - - QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); - - const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); - if (typedef_type) - { - const TypedefNameDecl *typedef_decl = typedef_type->getDecl(); - return_name = typedef_decl->getQualifiedNameAsString(); - } - else - { - return_name = qual_type.getAsString(); - } - - return return_name; -} - // Disable this for now since I can't seem to get a nicely formatted float // out of the APFloat class without just getting the float, double or quad // and then using a formatted print on it which defeats the purpose. We ideally diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp index 53011f00fb4..c94d605b25c 100644 --- a/lldb/source/Symbol/ClangASTType.cpp +++ b/lldb/source/Symbol/ClangASTType.cpp @@ -38,57 +38,88 @@ #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" - using namespace lldb; using namespace lldb_private; -ClangASTType::~ClangASTType() -{ -} -ConstString -ClangASTType::GetClangTypeName () +ClangASTType::~ClangASTType() { - return GetClangTypeName (m_type); } -ConstString -ClangASTType::GetClangTypeName (clang_type_t clang_type) +std::string +ClangASTType::GetTypeNameForQualType (clang::QualType qual_type) { - ConstString clang_type_name; - if (clang_type) + std::string type_name; + + const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); + if (typedef_type) { - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - return GetClangTypeName(qual_type); - + const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); + type_name = typedef_decl->getQualifiedNameAsString(); } else { - clang_type_name.SetCString ("<invalid>"); + type_name = qual_type.getAsString(); + } + + // There is no call to a clang type to get the type name without the + // class/struct/union on the front, so lets strip it here + const char *type_name_cstr = type_name.c_str(); + if (type_name_cstr[0] == 'c' && + type_name_cstr[1] == 'l' && + type_name_cstr[2] == 'a' && + type_name_cstr[3] == 's' && + type_name_cstr[4] == 's' && + type_name_cstr[5] == ' ') + { + type_name.erase (0, 6); + } + else if (type_name_cstr[0] == 's' && + type_name_cstr[1] == 't' && + type_name_cstr[2] == 'r' && + type_name_cstr[3] == 'u' && + type_name_cstr[4] == 'c' && + type_name_cstr[5] == 't' && + type_name_cstr[6] == ' ') + { + type_name.erase (0, 7); } + else if (type_name_cstr[0] == 'u' && + type_name_cstr[1] == 'n' && + type_name_cstr[2] == 'i' && + type_name_cstr[3] == 'o' && + type_name_cstr[4] == 'n' && + type_name_cstr[5] == ' ') + { + type_name.erase (0, 6); + } + return type_name; +} - return clang_type_name; +std::string +ClangASTType::GetTypeNameForOpaqueQualType (clang_type_t opaque_qual_type) +{ + return GetTypeNameForQualType (clang::QualType::getFromOpaquePtr(opaque_qual_type)); } + ConstString -ClangASTType::GetClangTypeName (clang::QualType qual_type) +ClangASTType::GetConstTypeName () { - ConstString clang_type_name; - const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); - if (typedef_type) - { - const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); - std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString()); - if (!clang_typedef_name.empty()) - clang_type_name.SetCString (clang_typedef_name.c_str()); - } + return GetConstTypeName (m_type); +} + +ConstString +ClangASTType::GetConstTypeName (clang_type_t clang_type) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); + std::string type_name (GetTypeNameForQualType (qual_type)); + ConstString const_type_name; + if (type_name.empty()) + const_type_name.SetCString ("<invalid>"); else - { - std::string type_name(qual_type.getAsString()); - if (!type_name.empty()) - clang_type_name.SetCString (type_name.c_str()); - } - return clang_type_name; + const_type_name.SetCString(type_name.c_str()); + return const_type_name; } clang_type_t diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp index 71cbcdd2953..f9cd1015aba 100644 --- a/lldb/source/Symbol/Type.cpp +++ b/lldb/source/Symbol/Type.cpp @@ -194,14 +194,10 @@ Type::Dump (Stream *s, bool show_context) const ConstString & Type::GetName() { - if (!(m_name)) + if (!m_name) { if (ResolveClangType(eResolveStateForward)) - { - std::string type_name = ClangASTContext::GetTypeName (m_clang_type); - if (!type_name.empty()) - m_name.SetCString (type_name.c_str()); - } + m_name = ClangASTType::GetConstTypeName (m_clang_type); } return m_name; } diff --git a/lldb/test/lang/c/forward/TestForwardDeclaration.py b/lldb/test/lang/c/forward/TestForwardDeclaration.py index d336e5a5614..2270e56f9f5 100644 --- a/lldb/test/lang/c/forward/TestForwardDeclaration.py +++ b/lldb/test/lang/c/forward/TestForwardDeclaration.py @@ -47,13 +47,13 @@ class ForwardDeclarationTestCase(TestBase): # This should display correctly. # Note that the member fields of a = 1 and b = 2 is by design. self.expect("frame variable -T *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY, - substrs = ['(struct bar) *bar_ptr = ', + substrs = ['(bar) *bar_ptr = ', '(int) a = 1', '(int) b = 2']) # And so should this. self.expect("expression *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY, - substrs = ['(struct bar)', + substrs = ['(bar)', '(int) a = 1', '(int) b = 2']) diff --git a/lldb/test/lang/cpp/dynamic-value/TestDynamicValue.py b/lldb/test/lang/cpp/dynamic-value/TestDynamicValue.py index d44f52dd8b0..dd6cf221303 100644 --- a/lldb/test/lang/cpp/dynamic-value/TestDynamicValue.py +++ b/lldb/test/lang/cpp/dynamic-value/TestDynamicValue.py @@ -168,7 +168,7 @@ class DynamicValueTestCase(TestBase): # make sure that works as well: self.expect('frame var -d run-target anotherA.m_client_A._M_ptr', 'frame var finds its way into a child member', - patterns = ['\(.* B \*\)']) + patterns = ['\(B \*\)']) # Now make sure we also get it right for a reference as well: diff --git a/lldb/test/lang/objc/foundation/TestObjCMethods.py b/lldb/test/lang/objc/foundation/TestObjCMethods.py index 0bcff3c21d5..6e6f3ac58bc 100644 --- a/lldb/test/lang/objc/foundation/TestObjCMethods.py +++ b/lldb/test/lang/objc/foundation/TestObjCMethods.py @@ -143,7 +143,7 @@ class FoundationTestCase(TestBase): self.expect("frame variable -T -s", VARIABLES_DISPLAYED_CORRECTLY, substrs = ["ARG: (MyString *) self"], patterns = ["ARG: \(.*\) _cmd", - "(struct objc_selector *)|(SEL)"]) + "(objc_selector *)|(SEL)"]) # rdar://problem/8651752 # don't crash trying to ask clang how many children an empty record has |