Added the ability to introspect types thourgh the public SBType interface.

Fixed up many API calls to not be "const" as const doesn't mean anything to
most of our lldb::SB objects since they contain a shared pointer, auto_ptr, or
pointer to the types which circumvent the constness anyway.

llvm-svn: 139428
This commit is contained in:
Greg Clayton 2011-09-09 23:04:00 +00:00
parent b3722e2223
commit bf2331c491
15 changed files with 1031 additions and 220 deletions

View File

@ -200,8 +200,8 @@ private:
lldb_private::StackFrame * lldb_private::StackFrame *
get() const; get() const;
const lldb::StackFrameSP & lldb::StackFrameSP &
get_sp() const; get_sp();
#endif #endif

View File

@ -16,23 +16,125 @@ namespace lldb {
class SBTypeList; class SBTypeList;
class SBTypeMember
{
public:
SBTypeMember ();
SBTypeMember (const lldb::SBTypeMember& rhs);
~SBTypeMember();
#ifndef SWIG
lldb::SBTypeMember&
operator = (const lldb::SBTypeMember& rhs);
#endif
bool
IsValid() const;
const char *
GetName ();
lldb::SBType
GetType ();
uint64_t
GetOffsetByteSize();
protected:
friend class SBType;
#ifndef SWIG
void
reset (lldb_private::TypeMemberImpl *);
lldb_private::TypeMemberImpl &
ref ();
const lldb_private::TypeMemberImpl &
ref () const;
#endif
std::auto_ptr<lldb_private::TypeMemberImpl> m_opaque_ap;
};
class SBType class SBType
{ {
public: public:
SBType (const SBType &rhs); SBType();
SBType (const lldb::SBType &rhs);
~SBType (); ~SBType ();
bool
IsValid() const;
size_t
GetByteSize();
bool
IsPointerType();
bool
IsReferenceType();
lldb::SBType
GetPointerType();
lldb::SBType
GetPointeeType();
lldb::SBType
GetReferenceType();
lldb::SBType
GetDereferencedType();
lldb::SBType
GetBasicType(lldb::BasicType type);
uint32_t
GetNumberOfFields ();
uint32_t
GetNumberOfDirectBaseClasses ();
uint32_t
GetNumberOfVirtualBaseClasses ();
lldb::SBTypeMember
GetFieldAtIndex (uint32_t idx);
lldb::SBTypeMember
GetDirectBaseClassAtIndex (uint32_t idx);
lldb::SBTypeMember
GetVirtualBaseClassAtIndex (uint32_t idx);
const char*
GetName();
lldb::TypeClass
GetTypeClass ();
// DEPRECATED: but needed for Xcode right now
static bool
IsPointerType (void * clang_type);
protected:
#ifndef SWIG #ifndef SWIG
const lldb::SBType & lldb::SBType &
operator = (const lldb::SBType &rhs); operator = (const lldb::SBType &rhs);
bool bool
operator == (const lldb::SBType &rhs) const; operator == (lldb::SBType &rhs);
bool bool
operator != (const lldb::SBType &rhs) const; operator != (lldb::SBType &rhs);
lldb_private::TypeImpl & lldb_private::TypeImpl &
ref (); ref ();
@ -40,54 +142,22 @@ public:
const lldb_private::TypeImpl & const lldb_private::TypeImpl &
ref () const; ref () const;
void
reset(const lldb::TypeImplSP &type_impl_sp);
#endif #endif
bool
IsValid() const;
size_t
GetByteSize() const;
bool
IsPointerType() const;
bool
IsReferenceType() const;
SBType
GetPointerType() const;
SBType
GetPointeeType() const;
SBType
GetReferenceType() const;
SBType
GetDereferencedType() const;
SBType
GetBasicType(lldb::BasicType type) const;
const char*
GetName();
// DEPRECATED: but needed for Xcode right now
static bool
IsPointerType (void * clang_type);
protected:
lldb::TypeImplSP m_opaque_sp; lldb::TypeImplSP m_opaque_sp;
friend class SBModule; friend class SBModule;
friend class SBTarget; friend class SBTarget;
friend class SBValue; friend class SBValue;
friend class SBTypeMember;
friend class SBTypeList; friend class SBTypeList;
SBType (const lldb_private::ClangASTType &); SBType (const lldb_private::ClangASTType &);
SBType (const lldb::TypeSP &); SBType (const lldb::TypeSP &);
SBType (const lldb::TypeImplSP &); SBType (const lldb::TypeImplSP &);
SBType();
}; };
@ -96,29 +166,31 @@ class SBTypeList
public: public:
SBTypeList(); SBTypeList();
SBTypeList(const SBTypeList& rhs); SBTypeList(const lldb::SBTypeList& rhs);
SBTypeList&
operator = (const SBTypeList& rhs);
bool
IsValid() const;
void
Append (const SBType& type);
SBType
GetTypeAtIndex(int index) const;
int
GetSize() const;
~SBTypeList(); ~SBTypeList();
lldb::SBTypeList&
operator = (const lldb::SBTypeList& rhs);
bool
IsValid();
void
Append (lldb::SBType type);
lldb::SBType
GetTypeAtIndex (uint32_t index);
uint32_t
GetSize();
private: private:
std::auto_ptr<lldb_private::TypeListImpl> m_opaque_ap; std::auto_ptr<lldb_private::TypeListImpl> m_opaque_ap;
}; };
} // namespace lldb } // namespace lldb
#endif // LLDB_SBType_h_ #endif // LLDB_SBType_h_

View File

@ -22,17 +22,17 @@ class SBValue
public: public:
SBValue (); SBValue ();
SBValue (const SBValue &rhs); SBValue (const lldb::SBValue &rhs);
#ifndef SWIG #ifndef SWIG
const SBValue & lldb::SBValue &
operator =(const SBValue &rhs); operator =(const lldb::SBValue &rhs);
#endif #endif
~SBValue (); ~SBValue ();
bool bool
IsValid() const; IsValid();
SBError SBError
GetError(); GetError();
@ -49,29 +49,23 @@ public:
size_t size_t
GetByteSize (); GetByteSize ();
bool
IsInScope (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
bool bool
IsInScope (); IsInScope ();
lldb::Format lldb::Format
GetFormat () const; GetFormat ();
void void
SetFormat (lldb::Format format); SetFormat (lldb::Format format);
const char *
GetValue (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
const char * const char *
GetValue (); GetValue ();
int64_t int64_t
GetValueAsSigned(SBError& error, int64_t fail_value=0); GetValueAsSigned (lldb::SBError& error, int64_t fail_value=0);
uint64_t uint64_t
GetValueAsUnsigned(SBError& error, uint64_t fail_value=0); GetValueAsUnsigned (lldb::SBError& error, uint64_t fail_value=0);
int64_t int64_t
GetValueAsSigned(int64_t fail_value=0); GetValueAsSigned(int64_t fail_value=0);
@ -82,33 +76,18 @@ public:
ValueType ValueType
GetValueType (); GetValueType ();
bool
GetValueDidChange (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
bool bool
GetValueDidChange (); GetValueDidChange ();
const char *
GetSummary (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
const char * const char *
GetSummary (); GetSummary ();
const char *
GetObjectDescription (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
const char * const char *
GetObjectDescription (); GetObjectDescription ();
const char *
GetLocation (const lldb::SBFrame &frame); // DEPRECATED - SBValues know their own frames.
const char * const char *
GetLocation (); GetLocation ();
bool
SetValueFromCString (const lldb::SBFrame &frame, const char *value_str); // DEPRECATED - SBValues know their own frames.
bool bool
SetValueFromCString (const char *value_str); SetValueFromCString (const char *value_str);
@ -116,23 +95,25 @@ public:
GetChildAtIndex (uint32_t idx); GetChildAtIndex (uint32_t idx);
lldb::SBValue lldb::SBValue
CreateChildAtOffset (const char *name, uint32_t offset, const SBType& type); CreateChildAtOffset (const char *name, uint32_t offset, lldb::SBType type);
lldb::SBValue lldb::SBValue
Cast(const SBType& type); Cast (lldb::SBType type);
lldb::SBValue lldb::SBValue
CreateValueFromExpression (const char *name, const char* expression); CreateValueFromExpression (const char *name, const char* expression);
lldb::SBValue lldb::SBValue
CreateValueFromAddress(const char* name, lldb::addr_t address, const SBType& type); CreateValueFromAddress (const char* name,
lldb::addr_t address,
lldb::SBType type);
// this has no address! GetAddress() and GetLoadAddress() as well as AddressOf() // this has no address! GetAddress() and GetLoadAddress() as well as AddressOf()
// on the return of this call all return invalid // on the return of this call all return invalid
lldb::SBValue lldb::SBValue
CreateValueFromData (const char* name, CreateValueFromData (const char* name,
const SBData& data, lldb::SBData data,
const SBType& type); lldb::SBType type);
//------------------------------------------------------------------ //------------------------------------------------------------------
/// Get a child value by index from a value. /// Get a child value by index from a value.
@ -279,7 +260,7 @@ public:
bool bool
TypeIsPointerType (); TypeIsPointerType ();
SBType lldb::SBType
GetType(); GetType();
bool bool
@ -289,7 +270,8 @@ public:
GetExpressionPath (lldb::SBStream &description); GetExpressionPath (lldb::SBStream &description);
bool bool
GetExpressionPath (lldb::SBStream &description, bool qualify_cxx_base_classes); GetExpressionPath (lldb::SBStream &description,
bool qualify_cxx_base_classes);
SBValue (const lldb::ValueObjectSP &value_sp); SBValue (const lldb::ValueObjectSP &value_sp);
@ -298,8 +280,8 @@ public:
// currently rely on being able to extract the SharedPointer out of an SBValue. if the implementation // currently rely on being able to extract the SharedPointer out of an SBValue. if the implementation
// is deferred to the .cpp file instead of being inlined here, the platform will fail to link // is deferred to the .cpp file instead of being inlined here, the platform will fail to link
// correctly. however, this is temporary till a better general solution is found. FIXME // correctly. however, this is temporary till a better general solution is found. FIXME
const lldb::ValueObjectSP& lldb::ValueObjectSP&
get_sp() const get_sp()
{ {
return m_opaque_sp; return m_opaque_sp;
} }

View File

@ -413,6 +413,37 @@ public:
lldb::clang_type_t clang_type, lldb::clang_type_t clang_type,
bool omit_empty_base_classes); bool omit_empty_base_classes);
static uint32_t
GetNumDirectBaseClasses (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static uint32_t
GetNumVirtualBaseClasses (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static uint32_t
GetNumFields (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static lldb::clang_type_t
GetDirectBaseClassAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
uint32_t *byte_offset_ptr);
static lldb::clang_type_t
GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
uint32_t *byte_offset_ptr);
static lldb::clang_type_t
GetFieldAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
std::string& name,
uint32_t *byte_offset_ptr);
static uint32_t static uint32_t
GetNumPointeeChildren (lldb::clang_type_t clang_type); GetNumPointeeChildren (lldb::clang_type_t clang_type);

View File

@ -107,6 +107,10 @@ public:
GetMinimumLanguage (clang::ASTContext *ctx, GetMinimumLanguage (clang::ASTContext *ctx,
lldb::clang_type_t clang_type); lldb::clang_type_t clang_type);
static lldb::TypeClass
GetTypeClass (clang::ASTContext *ast_context,
lldb::clang_type_t clang_type);
void void
DumpValue (ExecutionContext *exe_ctx, DumpValue (ExecutionContext *exe_ctx,
Stream *s, Stream *s,

View File

@ -391,6 +391,57 @@ private:
std::vector<lldb::TypeImplSP> m_content; std::vector<lldb::TypeImplSP> m_content;
}; };
class TypeMemberImpl
{
public:
TypeMemberImpl () :
m_type_impl_sp (),
m_bit_offset (0),
m_name ()
{
}
TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
uint64_t bit_offset,
const ConstString &name) :
m_type_impl_sp (type_impl_sp),
m_bit_offset (bit_offset),
m_name (name)
{
}
TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
uint64_t bit_offset):
m_type_impl_sp (type_impl_sp),
m_bit_offset (bit_offset),
m_name ()
{
}
const lldb::TypeImplSP &
GetTypeImpl ()
{
return m_type_impl_sp;
}
const ConstString &
GetName () const
{
return m_name;
}
uint64_t
GetBitOffset () const
{
return m_bit_offset;
}
protected:
lldb::TypeImplSP m_type_impl_sp;
uint64_t m_bit_offset;
ConstString m_name;
};
} // namespace lldb_private } // namespace lldb_private

View File

@ -551,6 +551,33 @@ namespace lldb {
eBasicTypeObjCSel eBasicTypeObjCSel
} BasicType; } BasicType;
typedef enum TypeClass
{
eTypeClassInvalid = (0u),
eTypeClassArray = (1u << 0),
eTypeClassBlockPointer = (1u << 1),
eTypeClassBuiltin = (1u << 2),
eTypeClassClass = (1u << 3),
eTypeClassComplexFloat = (1u << 4),
eTypeClassComplexInteger = (1u << 5),
eTypeClassEnumeration = (1u << 6),
eTypeClassFunction = (1u << 7),
eTypeClassMemberPointer = (1u << 8),
eTypeClassObjCObject = (1u << 9),
eTypeClassObjCInterface = (1u << 10),
eTypeClassObjCObjectPointer = (1u << 11),
eTypeClassPointer = (1u << 12),
eTypeClassReference = (1u << 13),
eTypeClassStruct = (1u << 14),
eTypeClassTypedef = (1u << 15),
eTypeClassUnion = (1u << 16),
eTypeClassVector = (1u << 17),
// Define the last type class as the MSBit of a 32 bit value
eTypeClassOther = (1u << 31),
// Define a mask that can be used for any type when finding types
eTypeClassAny = (0xffffffffu)
}TypeClass;
} // namespace lldb } // namespace lldb

View File

@ -170,6 +170,7 @@ class TypeImpl;
class TypeAndOrName; class TypeAndOrName;
class TypeList; class TypeList;
class TypeListImpl; class TypeListImpl;
class TypeMemberImpl;
class UUID; class UUID;
class Unwind; class Unwind;
class UnwindAssembly; class UnwindAssembly;

View File

@ -9,6 +9,35 @@
namespace lldb { namespace lldb {
%feature("docstring",
"Represents a member of a type in lldb.
") SBTypeMember;
class SBTypeMember
{
public:
SBTypeMember ();
SBTypeMember (const lldb::SBTypeMember& rhs);
~SBTypeMember();
bool
IsValid() const;
const char *
GetName ();
lldb::SBType
GetType ();
uint64_t
GetOffsetByteSize();
protected:
std::auto_ptr<lldb_private::TypeMemberImpl> m_opaque_ap;
};
%feature("docstring", %feature("docstring",
"Represents a data type in lldb. The FindFirstType() method of SBTarget/SBModule "Represents a data type in lldb. The FindFirstType() method of SBTarget/SBModule
returns a SBType. returns a SBType.
@ -85,39 +114,60 @@ find_type.py:
class SBType class SBType
{ {
public: public:
SBType (const SBType &rhs); SBType (const lldb::SBType &rhs);
~SBType (); ~SBType ();
bool bool
IsValid() const; IsValid();
size_t size_t
GetByteSize() const; GetByteSize();
bool bool
IsPointerType() const; IsPointerType();
bool bool
IsReferenceType() const; IsReferenceType();
SBType lldb::SBType
GetPointerType() const; GetPointerType();
SBType lldb::SBType
GetPointeeType() const; GetPointeeType();
SBType lldb::SBType
GetReferenceType() const; GetReferenceType();
SBType lldb::SBType
GetDereferencedType() const; GetDereferencedType();
SBType lldb::SBType
GetBasicType(lldb::BasicType type) const; GetBasicType (lldb::BasicType type);
uint32_t
GetNumberOfFields ();
uint32_t
GetNumberOfDirectBaseClasses ();
uint32_t
GetNumberOfVirtualBaseClasses ();
lldb::SBTypeMember
GetFieldAtIndex (uint32_t idx);
lldb::SBTypeMember
GetDirectBaseClassAtIndex (uint32_t idx);
lldb::SBTypeMember
GetVirtualBaseClassAtIndex (uint32_t idx);
const char* const char*
GetName(); GetName();
lldb::TypeClass
GetTypeClass ();
}; };
%feature("docstring", %feature("docstring",
@ -157,15 +207,15 @@ public:
SBTypeList(); SBTypeList();
bool bool
IsValid() const; IsValid();
void void
Append(const SBType& type); Append (lldb::SBType type);
SBType lldb::SBType
GetTypeAtIndex(int index); GetTypeAtIndex (uint32_t index);
int uint32_t
GetSize(); GetSize();
~SBTypeList(); ~SBTypeList();

View File

@ -65,7 +65,7 @@ public:
~SBValue (); ~SBValue ();
bool bool
IsValid() const; IsValid();
SBError SBError
GetError(); GetError();
@ -86,7 +86,7 @@ public:
IsInScope (); IsInScope ();
lldb::Format lldb::Format
GetFormat () const; GetFormat ();
void void
SetFormat (lldb::Format format); SetFormat (lldb::Format format);
@ -185,21 +185,21 @@ public:
bool can_create_synthetic); bool can_create_synthetic);
lldb::SBValue lldb::SBValue
CreateChildAtOffset (const char *name, uint32_t offset, const SBType& type); CreateChildAtOffset (const char *name, uint32_t offset, lldb::SBType type);
lldb::SBValue lldb::SBValue
SBValue::Cast(const SBType& type); SBValue::Cast (lldb::SBType type);
lldb::SBValue lldb::SBValue
CreateValueFromExpression (const char *name, const char* expression); CreateValueFromExpression (const char *name, const char* expression);
lldb::SBValue lldb::SBValue
CreateValueFromAddress(const char* name, lldb::addr_t address, const SBType& type); CreateValueFromAddress(const char* name, lldb::addr_t address, lldb::SBType type);
lldb::SBValue lldb::SBValue
CreateValueFromData (const char* name, CreateValueFromData (const char* name,
const SBData& data, lldb::SBData data,
const SBType& type); lldb::SBType type);
lldb::SBType lldb::SBType
GetType(); GetType();

View File

@ -538,8 +538,8 @@ SBFrame::get() const
return m_opaque_sp.get(); return m_opaque_sp.get();
} }
const lldb::StackFrameSP & lldb::StackFrameSP &
SBFrame::get_sp() const SBFrame::get_sp()
{ {
return m_opaque_sp; return m_opaque_sp;
} }

View File

@ -31,7 +31,7 @@ SBType::SBType() :
{ {
} }
SBType::SBType (const lldb_private::ClangASTType &type) : SBType::SBType (const ClangASTType &type) :
m_opaque_sp(new TypeImpl(ClangASTType(type.GetASTContext(), m_opaque_sp(new TypeImpl(ClangASTType(type.GetASTContext(),
type.GetOpaqueQualType()))) type.GetOpaqueQualType())))
{ {
@ -63,7 +63,7 @@ SBType::SBType (const SBType &rhs) :
//{} //{}
// //
bool bool
SBType::operator == (const lldb::SBType &rhs) const SBType::operator == (SBType &rhs)
{ {
if (IsValid() == false) if (IsValid() == false)
return !rhs.IsValid(); return !rhs.IsValid();
@ -73,7 +73,7 @@ SBType::operator == (const lldb::SBType &rhs) const
} }
bool bool
SBType::operator != (const lldb::SBType &rhs) const SBType::operator != (SBType &rhs)
{ {
if (IsValid() == false) if (IsValid() == false)
return rhs.IsValid(); return rhs.IsValid();
@ -82,11 +82,16 @@ SBType::operator != (const lldb::SBType &rhs) const
(rhs.m_opaque_sp->GetOpaqueQualType() != m_opaque_sp->GetOpaqueQualType()); (rhs.m_opaque_sp->GetOpaqueQualType() != m_opaque_sp->GetOpaqueQualType());
} }
void
const lldb::SBType & SBType::reset(const lldb::TypeImplSP &type_impl_sp)
SBType::operator = (const lldb::SBType &rhs)
{ {
if (*this != rhs) m_opaque_sp = type_impl_sp;
}
SBType &
SBType::operator = (const SBType &rhs)
{
if (this != &rhs)
{ {
m_opaque_sp = rhs.m_opaque_sp; m_opaque_sp = rhs.m_opaque_sp;
} }
@ -96,15 +101,15 @@ SBType::operator = (const lldb::SBType &rhs)
SBType::~SBType () SBType::~SBType ()
{} {}
lldb_private::TypeImpl & TypeImpl &
SBType::ref () SBType::ref ()
{ {
if (m_opaque_sp.get() == NULL) if (m_opaque_sp.get() == NULL)
m_opaque_sp.reset (new lldb_private::TypeImpl()); m_opaque_sp.reset (new TypeImpl());
return *m_opaque_sp; return *m_opaque_sp;
} }
const lldb_private::TypeImpl & const TypeImpl &
SBType::ref () const SBType::ref () const
{ {
// "const SBAddress &addr" should already have checked "addr.IsValid()" // "const SBAddress &addr" should already have checked "addr.IsValid()"
@ -124,7 +129,7 @@ SBType::IsValid() const
} }
size_t size_t
SBType::GetByteSize() const SBType::GetByteSize()
{ {
if (!IsValid()) if (!IsValid())
return 0; return 0;
@ -134,7 +139,7 @@ SBType::GetByteSize() const
} }
bool bool
SBType::IsPointerType() const SBType::IsPointerType()
{ {
if (!IsValid()) if (!IsValid())
return false; return false;
@ -148,7 +153,7 @@ SBType::IsPointerType() const
} }
bool bool
SBType::IsReferenceType() const SBType::IsReferenceType()
{ {
if (!IsValid()) if (!IsValid())
return false; return false;
@ -162,7 +167,7 @@ SBType::IsReferenceType() const
} }
SBType SBType
SBType::GetPointerType() const SBType::GetPointerType()
{ {
if (!IsValid()) if (!IsValid())
return SBType(); return SBType();
@ -172,7 +177,7 @@ SBType::GetPointerType() const
} }
SBType SBType
SBType::GetPointeeType() const SBType::GetPointeeType()
{ {
if (!IsValid()) if (!IsValid())
return SBType(); return SBType();
@ -186,7 +191,7 @@ SBType::GetPointeeType() const
} }
SBType SBType
SBType::GetReferenceType() const SBType::GetReferenceType()
{ {
if (!IsValid()) if (!IsValid())
return SBType(); return SBType();
@ -196,7 +201,7 @@ SBType::GetReferenceType() const
} }
SBType SBType
SBType::GetDereferencedType() const SBType::GetDereferencedType()
{ {
if (!IsValid()) if (!IsValid())
return SBType(); return SBType();
@ -207,7 +212,7 @@ SBType::GetDereferencedType() const
} }
SBType SBType
SBType::GetBasicType(lldb::BasicType type) const SBType::GetBasicType(lldb::BasicType type)
{ {
if (!IsValid()) if (!IsValid())
@ -302,6 +307,89 @@ SBType::GetBasicType(lldb::BasicType type) const
return SBType(ClangASTType(m_opaque_sp->GetASTContext(), base_type_qual.getAsOpaquePtr())); return SBType(ClangASTType(m_opaque_sp->GetASTContext(), base_type_qual.getAsOpaquePtr()));
} }
uint32_t
SBType::GetNumberOfDirectBaseClasses ()
{
if (IsValid())
return ClangASTContext::GetNumDirectBaseClasses(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
return 0;
}
uint32_t
SBType::GetNumberOfVirtualBaseClasses ()
{
if (IsValid())
return ClangASTContext::GetNumVirtualBaseClasses(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
return 0;
}
uint32_t
SBType::GetNumberOfFields ()
{
if (IsValid())
return ClangASTContext::GetNumFields(m_opaque_sp->GetASTContext(), m_opaque_sp->GetOpaqueQualType());
return 0;
}
SBTypeMember
SBType::GetDirectBaseClassAtIndex (uint32_t idx)
{
SBTypeMember sb_type_member;
if (IsValid())
{
clang::ASTContext* ast = m_opaque_sp->GetASTContext();
uint32_t byte_offset = 0;
clang_type_t clang_type = ClangASTContext::GetDirectBaseClassAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, &byte_offset);
if (clang_type)
{
TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset));
}
}
return sb_type_member;
}
SBTypeMember
SBType::GetVirtualBaseClassAtIndex (uint32_t idx)
{
SBTypeMember sb_type_member;
if (IsValid())
{
uint32_t byte_offset = 0;
clang::ASTContext* ast = m_opaque_sp->GetASTContext();
clang_type_t clang_type = ClangASTContext::GetVirtualBaseClassAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, &byte_offset);
if (clang_type)
{
TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset));
}
}
return sb_type_member;
}
SBTypeMember
SBType::GetFieldAtIndex (uint32_t idx)
{
SBTypeMember sb_type_member;
if (IsValid())
{
uint32_t byte_offset = 0;
clang::ASTContext* ast = m_opaque_sp->GetASTContext();
std::string name_sstr;
clang_type_t clang_type = ClangASTContext::GetFieldAtIndex (ast, m_opaque_sp->GetOpaqueQualType(), idx, name_sstr, &byte_offset);
if (clang_type)
{
ConstString name;
if (!name_sstr.empty())
name.SetCString(name_sstr.c_str());
TypeImplSP type_impl_sp (new TypeImpl(ClangASTType (ast, clang_type)));
sb_type_member.reset (new TypeMemberImpl (type_impl_sp, byte_offset, name));
}
}
return sb_type_member;
}
const char* const char*
SBType::GetName() SBType::GetName()
{ {
@ -311,6 +399,15 @@ SBType::GetName()
return ClangASTType::GetConstTypeName(m_opaque_sp->GetOpaqueQualType()).GetCString(); return ClangASTType::GetConstTypeName(m_opaque_sp->GetOpaqueQualType()).GetCString();
} }
lldb::TypeClass
SBType::GetTypeClass ()
{
if (IsValid())
return ClangASTType::GetTypeClass (m_opaque_sp->GetASTContext(),
m_opaque_sp->GetOpaqueQualType());
return lldb::eTypeClassInvalid;
}
SBTypeList::SBTypeList() : SBTypeList::SBTypeList() :
m_opaque_ap(new TypeListImpl()) m_opaque_ap(new TypeListImpl())
{ {
@ -319,12 +416,12 @@ SBTypeList::SBTypeList() :
SBTypeList::SBTypeList(const SBTypeList& rhs) : SBTypeList::SBTypeList(const SBTypeList& rhs) :
m_opaque_ap(new TypeListImpl()) m_opaque_ap(new TypeListImpl())
{ {
for (uint32_t i = 0, rhs_size = rhs.GetSize(); i < rhs_size; i++) for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
Append(rhs.GetTypeAtIndex(i)); Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
} }
bool bool
SBTypeList::IsValid () const SBTypeList::IsValid ()
{ {
return (m_opaque_ap.get() != NULL); return (m_opaque_ap.get() != NULL);
} }
@ -332,30 +429,32 @@ SBTypeList::IsValid () const
SBTypeList& SBTypeList&
SBTypeList::operator = (const SBTypeList& rhs) SBTypeList::operator = (const SBTypeList& rhs)
{ {
if (this != &rhs && m_opaque_ap.get() != rhs.m_opaque_ap.get()) if (this != &rhs)
{ {
m_opaque_ap.reset(new TypeListImpl()); m_opaque_ap.reset (new TypeListImpl());
for (uint32_t i = 0, rhs_size = rhs.GetSize(); i < rhs_size; i++) for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
Append(rhs.GetTypeAtIndex(i)); Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
} }
return *this; return *this;
} }
void void
SBTypeList::Append (const SBType& type) SBTypeList::Append (SBType type)
{ {
if (type.IsValid()) if (type.IsValid())
m_opaque_ap->Append (type.m_opaque_sp); m_opaque_ap->Append (type.m_opaque_sp);
} }
SBType SBType
SBTypeList::GetTypeAtIndex(int index) const SBTypeList::GetTypeAtIndex(uint32_t index)
{ {
return SBType(m_opaque_ap->GetTypeAtIndex(index)); if (m_opaque_ap.get())
return SBType(m_opaque_ap->GetTypeAtIndex(index));
return SBType();
} }
int uint32_t
SBTypeList::GetSize() const SBTypeList::GetSize()
{ {
return m_opaque_ap->GetSize(); return m_opaque_ap->GetSize();
} }
@ -367,7 +466,7 @@ SBTypeList::~SBTypeList()
bool bool
SBType::IsPointerType (void *opaque_type) SBType::IsPointerType (void *opaque_type)
{ {
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
bool ret_value = ClangASTContext::IsPointerType (opaque_type); bool ret_value = ClangASTContext::IsPointerType (opaque_type);
@ -376,3 +475,89 @@ SBType::IsPointerType (void *opaque_type)
return ret_value; return ret_value;
} }
SBTypeMember::SBTypeMember() :
m_opaque_ap()
{
}
SBTypeMember::~SBTypeMember()
{
}
SBTypeMember::SBTypeMember (const SBTypeMember& rhs) :
m_opaque_ap()
{
if (this != &rhs)
{
if (rhs.IsValid())
m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
}
}
lldb::SBTypeMember&
SBTypeMember::operator = (const lldb::SBTypeMember& rhs)
{
if (this != &rhs)
{
if (rhs.IsValid())
m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
}
return *this;
}
bool
SBTypeMember::IsValid() const
{
return m_opaque_ap.get();
}
const char *
SBTypeMember::GetName ()
{
if (m_opaque_ap.get())
return m_opaque_ap->GetName().GetCString();
return NULL;
}
SBType
SBTypeMember::GetType ()
{
SBType sb_type;
if (m_opaque_ap.get())
{
sb_type.reset (m_opaque_ap->GetTypeImpl());
}
return sb_type;
}
uint64_t
SBTypeMember::GetOffsetByteSize()
{
if (m_opaque_ap.get())
return (m_opaque_ap->GetBitOffset() + 7) / 8u;
return 0;
}
void
SBTypeMember::reset(TypeMemberImpl *type_member_impl)
{
m_opaque_ap.reset(type_member_impl);
}
TypeMemberImpl &
SBTypeMember::ref ()
{
if (m_opaque_ap.get() == NULL)
m_opaque_ap.reset (new TypeMemberImpl());
return *m_opaque_ap.get();
}
const TypeMemberImpl &
SBTypeMember::ref () const
{
return *m_opaque_ap.get();
}

View File

@ -52,7 +52,7 @@ SBValue::SBValue(const SBValue &rhs) :
{ {
} }
const SBValue & SBValue &
SBValue::operator = (const SBValue &rhs) SBValue::operator = (const SBValue &rhs)
{ {
if (this != &rhs) if (this != &rhs)
@ -65,7 +65,7 @@ SBValue::~SBValue()
} }
bool bool
SBValue::IsValid () const SBValue::IsValid ()
{ {
// If this function ever changes to anything that does more than just // If this function ever changes to anything that does more than just
// check if the opaque shared pointer is non NULL, then we need to update // check if the opaque shared pointer is non NULL, then we need to update
@ -145,12 +145,6 @@ SBValue::GetByteSize ()
return result; return result;
} }
bool
SBValue::IsInScope (const SBFrame &sb_frame)
{
return IsInScope();
}
bool bool
SBValue::IsInScope () SBValue::IsInScope ()
{ {
@ -172,12 +166,6 @@ SBValue::IsInScope ()
return result; return result;
} }
const char *
SBValue::GetValue (const SBFrame &sb_frame)
{
return GetValue();
}
const char * const char *
SBValue::GetValue () SBValue::GetValue ()
{ {
@ -227,12 +215,6 @@ SBValue::GetValueType ()
return result; return result;
} }
const char *
SBValue::GetObjectDescription (const SBFrame &sb_frame)
{
return GetObjectDescription ();
}
const char * const char *
SBValue::GetObjectDescription () SBValue::GetObjectDescription ()
{ {
@ -256,12 +238,6 @@ SBValue::GetObjectDescription ()
return cstr; return cstr;
} }
bool
SBValue::GetValueDidChange (const SBFrame &sb_frame)
{
return GetValueDidChange ();
}
SBType SBType
SBValue::GetType() SBValue::GetType()
{ {
@ -304,12 +280,6 @@ SBValue::GetValueDidChange ()
return result; return result;
} }
const char *
SBValue::GetSummary (const SBFrame &sb_frame)
{
return GetSummary ();
}
const char * const char *
SBValue::GetSummary () SBValue::GetSummary ()
{ {
@ -333,12 +303,6 @@ SBValue::GetSummary ()
return cstr; return cstr;
} }
const char *
SBValue::GetLocation (const SBFrame &sb_frame)
{
return GetLocation ();
}
const char * const char *
SBValue::GetLocation () SBValue::GetLocation ()
{ {
@ -362,12 +326,6 @@ SBValue::GetLocation ()
return cstr; return cstr;
} }
bool
SBValue::SetValueFromCString (const SBFrame &sb_frame, const char *value_str)
{
return SetValueFromCString (value_str);
}
bool bool
SBValue::SetValueFromCString (const char *value_str) SBValue::SetValueFromCString (const char *value_str)
{ {
@ -384,7 +342,7 @@ SBValue::SetValueFromCString (const char *value_str)
} }
lldb::SBValue lldb::SBValue
SBValue::CreateChildAtOffset (const char *name, uint32_t offset, const SBType& type) SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
{ {
lldb::SBValue result; lldb::SBValue result;
if (m_opaque_sp) if (m_opaque_sp)
@ -407,7 +365,7 @@ SBValue::CreateChildAtOffset (const char *name, uint32_t offset, const SBType& t
} }
lldb::SBValue lldb::SBValue
SBValue::Cast(const SBType& type) SBValue::Cast (SBType type)
{ {
return CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type); return CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type);
} }
@ -419,10 +377,10 @@ SBValue::CreateValueFromExpression (const char *name, const char* expression)
if (m_opaque_sp) if (m_opaque_sp)
{ {
ValueObjectSP result_valobj_sp; ValueObjectSP result_valobj_sp;
m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression(expression, m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame(), m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame(),
true, true, eNoDynamicValues, true, true, eNoDynamicValues,
result_valobj_sp); result_valobj_sp);
result_valobj_sp->SetName(ConstString(name)); result_valobj_sp->SetName(ConstString(name));
result = SBValue(result_valobj_sp); result = SBValue(result_valobj_sp);
} }
@ -438,7 +396,7 @@ SBValue::CreateValueFromExpression (const char *name, const char* expression)
} }
lldb::SBValue lldb::SBValue
SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, const SBType& type) SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType type)
{ {
lldb::SBValue result; lldb::SBValue result;
if (m_opaque_sp) if (m_opaque_sp)
@ -448,13 +406,13 @@ SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, const SB
lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope(), ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope(),
real_type.m_opaque_sp->GetASTContext(), real_type.m_opaque_sp->GetASTContext(),
real_type.m_opaque_sp->GetOpaqueQualType(), real_type.m_opaque_sp->GetOpaqueQualType(),
ConstString(name), ConstString(name),
buffer, buffer,
lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder(),
GetTarget().GetProcess().GetAddressByteSize())); GetTarget().GetProcess().GetAddressByteSize()));
ValueObjectSP result_valobj_sp; ValueObjectSP result_valobj_sp;
@ -480,9 +438,7 @@ SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, const SB
} }
lldb::SBValue lldb::SBValue
SBValue::CreateValueFromData (const char* name, SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
const SBData& data,
const SBType& type)
{ {
SBValue result; SBValue result;
@ -869,7 +825,7 @@ SBValue::GetThread()
{ {
if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()) if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope())
{ {
result = SBThread(lldb::ThreadSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateThread())); result = SBThread(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateThread()->GetSP());
} }
} }
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@ -891,7 +847,7 @@ SBValue::GetFrame()
{ {
if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()) if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope())
{ {
result = SBFrame(lldb::StackFrameSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame())); result.SetFrame (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame()->GetSP());
} }
} }
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@ -980,7 +936,7 @@ SBValue::GetDescription (SBStream &description)
} }
lldb::Format lldb::Format
SBValue::GetFormat () const SBValue::GetFormat ()
{ {
if (m_opaque_sp) if (m_opaque_sp)
return m_opaque_sp->GetFormat(); return m_opaque_sp->GetFormat();

View File

@ -2397,6 +2397,386 @@ ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type
return num_children; return num_children;
} }
uint32_t
ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
{
if (clang_type == NULL)
return 0;
uint32_t count = 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
if (cxx_record_decl)
count = cxx_record_decl->getNumBases();
}
break;
case clang::Type::ObjCObject:
case clang::Type::ObjCInterface:
if (GetCompleteQualType (ast, qual_type))
{
const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
if (objc_class_type)
{
ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
if (class_interface_decl && class_interface_decl->getSuperClass())
count = 1;
}
}
break;
case clang::Type::Typedef:
count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
break;
case clang::Type::Elaborated:
count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
break;
default:
break;
}
return count;
}
uint32_t
ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
clang_type_t clang_type)
{
if (clang_type == NULL)
return 0;
uint32_t count = 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
if (cxx_record_decl)
count = cxx_record_decl->getNumVBases();
}
break;
case clang::Type::Typedef:
count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
break;
case clang::Type::Elaborated:
count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
break;
default:
break;
}
return count;
}
uint32_t
ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
{
if (clang_type == NULL)
return 0;
uint32_t count = 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
if (record_type)
{
RecordDecl *record_decl = record_type->getDecl();
if (record_decl)
{
uint32_t field_idx = 0;
RecordDecl::field_iterator field, field_end;
for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
++field_idx;
count = field_idx;
}
}
}
break;
case clang::Type::Typedef:
count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
break;
case clang::Type::Elaborated:
count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
break;
default:
break;
}
return count;
}
clang_type_t
ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
clang_type_t clang_type,
uint32_t idx,
uint32_t *byte_offset_ptr)
{
if (clang_type == NULL)
return 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
if (cxx_record_decl)
{
uint32_t curr_idx = 0;
CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
base_class != base_class_end;
++base_class, ++curr_idx)
{
if (curr_idx == idx)
{
if (byte_offset_ptr)
{
const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
// if (base_class->isVirtual())
// *byte_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
// else
*byte_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
}
return base_class->getType().getAsOpaquePtr();
}
}
}
}
break;
case clang::Type::ObjCObject:
case clang::Type::ObjCInterface:
if (idx == 0 && GetCompleteQualType (ast, qual_type))
{
const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
if (objc_class_type)
{
ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
if (class_interface_decl)
{
ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
if (superclass_interface_decl)
{
if (byte_offset_ptr)
*byte_offset_ptr = 0;
return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
}
}
}
}
break;
case clang::Type::Typedef:
return ClangASTContext::GetDirectBaseClassAtIndex (ast,
cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
idx,
byte_offset_ptr);
case clang::Type::Elaborated:
return ClangASTContext::GetDirectBaseClassAtIndex (ast,
cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
idx,
byte_offset_ptr);
default:
break;
}
return NULL;
}
clang_type_t
ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
clang_type_t clang_type,
uint32_t idx,
uint32_t *byte_offset_ptr)
{
if (clang_type == NULL)
return 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
if (cxx_record_decl)
{
uint32_t curr_idx = 0;
CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
base_class != base_class_end;
++base_class, ++curr_idx)
{
if (curr_idx == idx)
{
if (byte_offset_ptr)
{
const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
*byte_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
}
return base_class->getType().getAsOpaquePtr();
}
}
}
}
break;
case clang::Type::Typedef:
return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
idx,
byte_offset_ptr);
case clang::Type::Elaborated:
return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
idx,
byte_offset_ptr);
default:
break;
}
return NULL;
}
clang_type_t
ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
clang_type_t clang_type,
uint32_t idx,
std::string& name,
uint32_t *byte_offset_ptr)
{
if (clang_type == NULL)
return 0;
QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
case clang::Type::Record:
if (GetCompleteQualType (ast, qual_type))
{
const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
const RecordDecl *record_decl = record_type->getDecl();
uint32_t field_idx = 0;
RecordDecl::field_iterator field, field_end;
for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
{
if (idx == field_idx)
{
// Print the member type if requested
// Print the member name and equal sign
name.assign(field->getNameAsString());
// Figure out the type byte size (field_type_info.first) and
// alignment (field_type_info.second) from the AST context.
if (byte_offset_ptr)
{
const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
*byte_offset_ptr = (record_layout.getFieldOffset (field_idx) + 7) / 8;
}
return field->getType().getAsOpaquePtr();
}
}
}
break;
case clang::Type::ObjCObject:
case clang::Type::ObjCInterface:
if (GetCompleteQualType (ast, qual_type))
{
const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
assert (objc_class_type);
if (objc_class_type)
{
ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
if (class_interface_decl)
{
if (idx < (class_interface_decl->ivar_size()))
{
ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
uint32_t ivar_idx = 0;
for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
{
if (ivar_idx == idx)
{
const ObjCIvarDecl* ivar_decl = *ivar_pos;
QualType ivar_qual_type(ivar_decl->getType());
name.assign(ivar_decl->getNameAsString());
if (byte_offset_ptr)
{
const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
*byte_offset_ptr = (interface_layout.getFieldOffset (ivar_idx) + 7)/8;
}
return ivar_qual_type.getAsOpaquePtr();
}
}
}
}
}
}
break;
case clang::Type::Typedef:
return ClangASTContext::GetFieldAtIndex (ast,
cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
idx,
name,
byte_offset_ptr);
case clang::Type::Elaborated:
return ClangASTContext::GetFieldAtIndex (ast,
cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
idx,
name,
byte_offset_ptr);
default:
break;
}
return NULL;
}
// If a pointer to a pointee type (the clang_type arg) says that it has no // If a pointer to a pointee type (the clang_type arg) says that it has no
// children, then we either need to trust it, or override it and return a // children, then we either need to trust it, or override it and return a
// different result. For example, an "int *" has one child that is an integer, // different result. For example, an "int *" has one child that is an integer,
@ -2616,7 +2996,6 @@ ClangASTContext::GetChildClangTypeAtIndex
bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
// Base classes should be a multiple of 8 bits in size // Base classes should be a multiple of 8 bits in size
assert (bit_offset % 8 == 0);
child_byte_offset = bit_offset/8; child_byte_offset = bit_offset/8;
child_name = ClangASTType::GetTypeNameForQualType(base_class->getType()); child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());

View File

@ -215,6 +215,79 @@ ClangASTType::GetMinimumLanguage ()
m_type); m_type);
} }
lldb::TypeClass
ClangASTType::GetTypeClass (clang::ASTContext *ast_context, lldb::clang_type_t clang_type)
{
if (clang_type == NULL)
return lldb::eTypeClassInvalid;
clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
switch (qual_type->getTypeClass())
{
case clang::Type::UnaryTransform: break;
case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
case clang::Type::VariableArray: return lldb::eTypeClassArray;
case clang::Type::ConstantArray: return lldb::eTypeClassArray;
case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
case clang::Type::ExtVector: return lldb::eTypeClassVector;
case clang::Type::Vector: return lldb::eTypeClassVector;
case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
case clang::Type::Pointer: return lldb::eTypeClassPointer;
case clang::Type::LValueReference: return lldb::eTypeClassReference;
case clang::Type::RValueReference: return lldb::eTypeClassReference;
case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
case clang::Type::Complex:
if (qual_type->isComplexType())
return lldb::eTypeClassComplexFloat;
else
return lldb::eTypeClassComplexInteger;
case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
case clang::Type::Record:
if (ClangASTContext::GetCompleteType (ast_context, clang_type))
{
const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
const clang::RecordDecl *record_decl = record_type->getDecl();
if (record_decl->isUnion())
return lldb::eTypeClassUnion;
else if (record_decl->isStruct())
return lldb::eTypeClassStruct;
else
return lldb::eTypeClassClass;
}
break;
case clang::Type::Enum: return lldb::eTypeClassEnumeration;
case clang::Type::Typedef: return lldb::eTypeClassTypedef;
case clang::Type::UnresolvedUsing: break;
case clang::Type::Paren: break;
case clang::Type::Elaborated: break;
case clang::Type::Attributed: break;
case clang::Type::TemplateTypeParm: break;
case clang::Type::SubstTemplateTypeParm: break;
case clang::Type::SubstTemplateTypeParmPack:break;
case clang::Type::Auto: break;
case clang::Type::InjectedClassName: break;
case clang::Type::DependentName: break;
case clang::Type::DependentTemplateSpecialization: break;
case clang::Type::PackExpansion: break;
case clang::Type::TypeOfExpr: break;
case clang::Type::TypeOf: break;
case clang::Type::Decltype: break;
case clang::Type::TemplateSpecialization: break;
}
// We don't know hot to display this type...
return lldb::eTypeClassOther;
}
lldb::LanguageType lldb::LanguageType
ClangASTType::GetMinimumLanguage (clang::ASTContext *ctx, ClangASTType::GetMinimumLanguage (clang::ASTContext *ctx,
lldb::clang_type_t clang_type) lldb::clang_type_t clang_type)