summaryrefslogtreecommitdiffstats
path: root/lldb/source/Symbol
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Symbol')
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp30
-rw-r--r--lldb/source/Symbol/ClangASTType.cpp95
-rw-r--r--lldb/source/Symbol/Type.cpp8
3 files changed, 69 insertions, 64 deletions
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;
}
OpenPOWER on IntegriCloud