aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/API
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2010-08-05 01:56:31 +0000
committerGreg Clayton <gclayton@apple.com>2010-08-05 01:56:31 +0000
commitba9fbbb88032f2c16a561ac35cd8549d5fef7f22 (patch)
tree2f2754a263751ceeacf7762aaca3e0825a6abed5 /lldb/source/API
parent396cc7d47734be55682c358594123273c89cb274 (diff)
downloadllvm-ba9fbbb88032f2c16a561ac35cd8549d5fef7f22.tar.gz
llvm-ba9fbbb88032f2c16a561ac35cd8549d5fef7f22.tar.bz2
llvm-ba9fbbb88032f2c16a561ac35cd8549d5fef7f22.zip
Added functionality to our API for SBType. This will allow users to eventually find and peruse static type information from modules.
llvm-svn: 110297
Diffstat (limited to 'lldb/source/API')
-rw-r--r--lldb/source/API/SBType.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp
index d8e836e3a8c7..1a44633d16b8 100644
--- a/lldb/source/API/SBType.cpp
+++ b/lldb/source/API/SBType.cpp
@@ -8,7 +8,9 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBType.h"
+#include "lldb/Core/ConstString.h"
#include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/ClangASTType.h"
using namespace lldb;
using namespace lldb_private;
@@ -21,3 +23,213 @@ SBType::IsPointerType (void *opaque_type)
}
+SBType::SBType (void *ast, void *clang_type) :
+ m_ast (ast),
+ m_type (clang_type)
+{
+}
+
+SBType::~SBType ()
+{
+}
+
+bool
+SBType::IsValid ()
+{
+ return m_ast != NULL && m_type != NULL;
+}
+
+const char *
+SBType::GetName ()
+{
+ if (IsValid ())
+ return ClangASTType::GetClangTypeName (m_type).AsCString(NULL);
+ return NULL;
+}
+
+uint64_t
+SBType::GetByteSize()
+{
+ if (IsValid ())
+ return ClangASTType::GetClangTypeBitWidth (static_cast<clang::ASTContext *>(m_ast), m_type);
+ return NULL;
+}
+
+Encoding
+SBType::GetEncoding (uint32_t &count)
+{
+ if (IsValid ())
+ return ClangASTType::GetEncoding (m_type, count);
+ count = 0;
+ return eEncodingInvalid;
+}
+
+uint64_t
+SBType::GetNumberChildren (bool omit_empty_base_classes)
+{
+ if (IsValid ())
+ return ClangASTContext::GetNumChildren(m_type, omit_empty_base_classes);
+ return 0;
+}
+
+
+bool
+SBType::GetChildAtIndex (bool omit_empty_base_classes, uint32_t idx, SBTypeMember &member)
+{
+ void *child_clang_type = NULL;
+ std::string child_name;
+ uint32_t child_byte_size = 0;
+ int32_t child_byte_offset = 0;
+ uint32_t child_bitfield_bit_size = 0;
+ uint32_t child_bitfield_bit_offset = 0;
+
+ if (IsValid ())
+ {
+
+ child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (static_cast<clang::ASTContext *>(m_ast),
+ NULL,
+ m_type,
+ idx,
+ false, // transparent pointers
+ omit_empty_base_classes,
+ child_name,
+ child_byte_size,
+ child_byte_offset,
+ child_bitfield_bit_size,
+ child_bitfield_bit_offset);
+
+ }
+
+ if (child_clang_type)
+ {
+ member.m_ast = m_ast;
+ member.m_parent_type = m_type;
+ member.m_member_type = child_clang_type,
+ member.SetName (child_name.c_str());
+ member.m_offset = child_byte_offset;
+ member.m_bit_size = child_bitfield_bit_size;
+ member.m_bit_offset = child_bitfield_bit_offset;
+ }
+ else
+ {
+ member.Clear();
+ }
+
+ return child_clang_type != NULL;
+}
+
+uint32_t
+SBType::GetChildIndexForName (bool omit_empty_base_classes, const char *name)
+{
+ return ClangASTContext::GetIndexOfChildWithName (static_cast<clang::ASTContext *>(m_ast),
+ m_type,
+ name,
+ omit_empty_base_classes);
+}
+
+bool
+SBType::IsPointerType ()
+{
+ return ClangASTContext::IsPointerType (m_type);
+}
+
+SBType
+SBType::GetPointeeType ()
+{
+ void *pointee_type = NULL;
+ if (IsPointerType ())
+ {
+ pointee_type = ClangASTType::GetPointeeType (m_type);
+ }
+ return SBType (pointee_type ? m_ast : NULL, pointee_type);
+}
+
+
+SBTypeMember::SBTypeMember () :
+ m_ast (NULL),
+ m_parent_type (NULL),
+ m_member_type (NULL),
+ m_member_name (NULL),
+ m_offset (0),
+ m_bit_size (0),
+ m_bit_offset (0)
+{
+}
+
+SBTypeMember::~SBTypeMember ()
+{
+ SetName (NULL);
+}
+
+void
+SBTypeMember::SetName (const char *name)
+{
+ if (m_member_name)
+ free (m_member_name);
+ if (name && name[0])
+ m_member_name = ::strdup (name);
+ else
+ m_member_name = NULL;
+}
+
+void
+SBTypeMember::Clear()
+{
+ m_ast = NULL;
+ m_parent_type = NULL;
+ m_member_type = NULL;
+ SetName (NULL);
+ m_offset = 0;
+ m_bit_size = 0;
+ m_bit_offset = 0;
+}
+
+bool
+SBTypeMember::IsValid ()
+{
+ return m_member_type != NULL;
+}
+
+bool
+SBTypeMember::IsBitfield ()
+{
+ return m_bit_size != 0;
+}
+
+size_t
+SBTypeMember::GetBitfieldWidth ()
+{
+ return m_bit_size;
+}
+
+size_t
+SBTypeMember::GetBitfieldOffset ()
+{
+ return m_bit_offset;
+}
+
+size_t
+SBTypeMember::GetOffset ()
+{
+ return m_offset;
+}
+
+SBType
+SBTypeMember::GetType()
+{
+ return SBType (m_ast, m_member_type);
+}
+
+SBType
+SBTypeMember::GetParentType()
+{
+ return SBType (m_ast, m_parent_type);
+}
+
+
+const char *
+SBTypeMember::GetName ()
+{
+ return m_member_name;
+}
+