[Lldb-commits] [lldb] r110297 - in /lldb/trunk: include/lldb/API/SBType.h source/API/SBType.cpp

Greg Clayton gclayton at apple.com
Wed Aug 4 18:56:31 PDT 2010


Author: gclayton
Date: Wed Aug  4 20:56:31 2010
New Revision: 110297

URL: http://llvm.org/viewvc/llvm-project?rev=110297&view=rev
Log:
Added functionality to our API for SBType. This will allow users to eventually find and peruse static type information from modules.

Modified:
    lldb/trunk/include/lldb/API/SBType.h
    lldb/trunk/source/API/SBType.cpp

Modified: lldb/trunk/include/lldb/API/SBType.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBType.h?rev=110297&r1=110296&r2=110297&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBType.h (original)
+++ lldb/trunk/include/lldb/API/SBType.h Wed Aug  4 20:56:31 2010
@@ -14,14 +14,99 @@
 
 namespace lldb {
 
+class SBTypeMember;
+
 class SBType
 {
 public:
 
+    SBType (void *ast = NULL, void *clang_type = NULL);
+    
+    ~SBType ();
+
+    bool
+    IsValid();
+
+    const char *
+    GetName();
+
+    uint64_t
+    GetByteSize();
+
+    Encoding
+    GetEncoding (uint32_t &count);
+
+    uint64_t
+    GetNumberChildren (bool omit_empty_base_classes);
+
+    bool
+    GetChildAtIndex (bool omit_empty_base_classes, uint32_t idx, SBTypeMember &member);
+
+    uint32_t
+    GetChildIndexForName (bool omit_empty_base_classes, const char *name);
+
+    bool
+    IsPointerType ();
+
+    SBType
+    GetPointeeType ();
+
     static bool
     IsPointerType (void *opaque_type);
 
-private:
+protected:
+    void *m_ast;
+    void *m_type;
+};
+
+class SBTypeMember
+{
+public:
+
+    SBTypeMember ();
+    
+    ~SBTypeMember ();
+
+    bool
+    IsValid ();
+
+    void
+    Clear();
+
+    bool
+    IsBitfield ();
+    
+    size_t
+    GetBitfieldWidth ();
+    
+    size_t
+    GetBitfieldOffset ();
+
+    size_t
+    GetOffset ();
+
+    const char *
+    GetName ();
+
+    SBType
+    GetType();
+
+    SBType
+    GetParentType();
+
+    void
+    SetName (const char *name);
+
+protected:
+    friend class SBType;
+        
+    void *m_ast;
+    void *m_parent_type;
+    void *m_member_type;
+    char *m_member_name;
+    int32_t m_offset;
+    uint32_t m_bit_size;
+    uint32_t m_bit_offset;
 
 };
 

Modified: lldb/trunk/source/API/SBType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBType.cpp?rev=110297&r1=110296&r2=110297&view=diff
==============================================================================
--- lldb/trunk/source/API/SBType.cpp (original)
+++ lldb/trunk/source/API/SBType.cpp Wed Aug  4 20:56:31 2010
@@ -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::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;
+}
+





More information about the lldb-commits mailing list