1 //===-- SBType.cpp ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/API/SBDefines.h"
11 #include "lldb/API/SBType.h"
12 #include "lldb/API/SBStream.h"
13 #include "lldb/Core/ConstString.h"
14 #include "lldb/Core/Log.h"
15 #include "lldb/Core/Stream.h"
16 #include "lldb/Symbol/ClangASTContext.h"
17 #include "lldb/Symbol/ClangASTType.h"
18 #include "lldb/Symbol/Type.h"
21 using namespace lldb_private;
22 using namespace clang;
29 SBType::SBType (const ClangASTType &type) :
30 m_opaque_sp(new TypeImpl(ClangASTType(type.GetASTContext(),
31 type.GetOpaqueQualType())))
35 SBType::SBType (const lldb::TypeSP &type_sp) :
36 m_opaque_sp(new TypeImpl(type_sp))
40 SBType::SBType (const lldb::TypeImplSP &type_impl_sp) :
41 m_opaque_sp(type_impl_sp)
46 SBType::SBType (const SBType &rhs) :
51 m_opaque_sp = rhs.m_opaque_sp;
56 //SBType::SBType (TypeImpl* impl) :
61 SBType::operator == (SBType &rhs)
63 if (IsValid() == false)
64 return !rhs.IsValid();
66 if (rhs.IsValid() == false)
69 return *m_opaque_sp.get() == *rhs.m_opaque_sp.get();
73 SBType::operator != (SBType &rhs)
75 if (IsValid() == false)
78 if (rhs.IsValid() == false)
81 return *m_opaque_sp.get() != *rhs.m_opaque_sp.get();
92 SBType::SetSP (const lldb::TypeImplSP &type_impl_sp)
94 m_opaque_sp = type_impl_sp;
98 SBType::operator = (const SBType &rhs)
102 m_opaque_sp = rhs.m_opaque_sp;
113 if (m_opaque_sp.get() == NULL)
114 m_opaque_sp.reset (new TypeImpl());
121 // "const SBAddress &addr" should already have checked "addr.IsValid()"
122 // prior to calling this function. In case you didn't we will assert
123 // and die to let you know.
124 assert (m_opaque_sp.get());
129 SBType::IsValid() const
131 if (m_opaque_sp.get() == NULL)
134 return m_opaque_sp->IsValid();
138 SBType::GetByteSize()
143 return m_opaque_sp->GetClangASTType(false).GetByteSize();
148 SBType::IsPointerType()
152 return m_opaque_sp->GetClangASTType(true).IsPointerType();
156 SBType::IsReferenceType()
160 return m_opaque_sp->GetClangASTType(true).IsReferenceType();
164 SBType::GetPointerType()
169 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetPointerType())));
173 SBType::GetPointeeType()
177 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetPointeeType())));
181 SBType::GetReferenceType()
185 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetReferenceType())));
189 SBType::GetTypedefedType()
193 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetTypedefedType())));
197 SBType::GetDereferencedType()
201 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetDereferencedType())));
205 SBType::IsFunctionType ()
209 return m_opaque_sp->GetClangASTType(true).IsFunctionType();
213 SBType::IsPolymorphicClass ()
217 return m_opaque_sp->GetClangASTType(true).IsPolymorphicClass();
223 SBType::GetFunctionReturnType ()
227 ClangASTType return_clang_type (m_opaque_sp->GetClangASTType(true).GetFunctionReturnType());
228 if (return_clang_type.IsValid())
229 return SBType(return_clang_type);
231 return lldb::SBType();
235 SBType::GetFunctionArgumentTypes ()
237 SBTypeList sb_type_list;
240 ClangASTType func_type(m_opaque_sp->GetClangASTType(true));
241 size_t count = func_type.GetNumberOfFunctionArguments();
246 sb_type_list.Append(SBType(func_type.GetFunctionArgumentAtIndex(i)));
253 SBType::GetUnqualifiedType()
257 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetUnqualifiedType())));
261 SBType::GetCanonicalType()
264 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetCanonicalType())));
270 SBType::GetBasicType()
273 return m_opaque_sp->GetClangASTType(false).GetBasicTypeEnumeration ();
274 return eBasicTypeInvalid;
278 SBType::GetBasicType(lldb::BasicType basic_type)
281 return SBType (ClangASTContext::GetBasicType (m_opaque_sp->GetClangASTContext(false), basic_type));
286 SBType::GetNumberOfDirectBaseClasses ()
289 return m_opaque_sp->GetClangASTType(true).GetNumDirectBaseClasses();
294 SBType::GetNumberOfVirtualBaseClasses ()
297 return m_opaque_sp->GetClangASTType(true).GetNumVirtualBaseClasses();
302 SBType::GetNumberOfFields ()
305 return m_opaque_sp->GetClangASTType(false).GetNumFields();
310 SBType::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
312 Stream &strm = description.ref();
316 m_opaque_sp->GetDescription (strm, description_level);
319 strm.PutCString ("No value");
327 SBType::GetDirectBaseClassAtIndex (uint32_t idx)
329 SBTypeMember sb_type_member;
332 ClangASTType this_type (m_opaque_sp->GetClangASTType (true));
333 if (this_type.IsValid())
335 uint32_t bit_offset = 0;
336 ClangASTType base_class_type (this_type.GetDirectBaseClassAtIndex(idx, &bit_offset));
337 if (base_class_type.IsValid())
339 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
343 return sb_type_member;
348 SBType::GetVirtualBaseClassAtIndex (uint32_t idx)
350 SBTypeMember sb_type_member;
353 ClangASTType this_type (m_opaque_sp->GetClangASTType (true));
354 if (this_type.IsValid())
356 uint32_t bit_offset = 0;
357 ClangASTType base_class_type (this_type.GetVirtualBaseClassAtIndex(idx, &bit_offset));
358 if (base_class_type.IsValid())
360 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
364 return sb_type_member;
368 SBType::GetFieldAtIndex (uint32_t idx)
370 SBTypeMember sb_type_member;
373 ClangASTType this_type (m_opaque_sp->GetClangASTType (false));
374 if (this_type.IsValid())
376 uint64_t bit_offset = 0;
377 uint32_t bitfield_bit_size = 0;
378 bool is_bitfield = false;
379 std::string name_sstr;
380 ClangASTType field_type (this_type.GetFieldAtIndex (idx,
385 if (field_type.IsValid())
388 if (!name_sstr.empty())
389 name.SetCString(name_sstr.c_str());
390 sb_type_member.reset (new TypeMemberImpl (TypeImplSP (new TypeImpl(field_type)),
398 return sb_type_member;
402 SBType::IsTypeComplete()
406 return m_opaque_sp->GetClangASTType(false).IsCompleteType();
414 return m_opaque_sp->GetName().GetCString();
418 SBType::GetTypeClass ()
421 return m_opaque_sp->GetClangASTType(false).GetTypeClass();
422 return lldb::eTypeClassInvalid;
426 SBType::GetNumberOfTemplateArguments ()
429 return m_opaque_sp->GetClangASTType(false).GetNumTemplateArguments();
434 SBType::GetTemplateArgumentType (uint32_t idx)
438 TemplateArgumentKind kind = eTemplateArgumentKindNull;
439 ClangASTType template_arg_type = m_opaque_sp->GetClangASTType(false).GetTemplateArgument (idx, kind);
440 if (template_arg_type.IsValid())
441 return SBType(template_arg_type);
447 lldb::TemplateArgumentKind
448 SBType::GetTemplateArgumentKind (uint32_t idx)
450 TemplateArgumentKind kind = eTemplateArgumentKindNull;
452 m_opaque_sp->GetClangASTType(false).GetTemplateArgument (idx, kind);
457 SBTypeList::SBTypeList() :
458 m_opaque_ap(new TypeListImpl())
462 SBTypeList::SBTypeList(const SBTypeList& rhs) :
463 m_opaque_ap(new TypeListImpl())
465 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
466 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
470 SBTypeList::IsValid ()
472 return (m_opaque_ap.get() != NULL);
476 SBTypeList::operator = (const SBTypeList& rhs)
480 m_opaque_ap.reset (new TypeListImpl());
481 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
482 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
488 SBTypeList::Append (SBType type)
491 m_opaque_ap->Append (type.m_opaque_sp);
495 SBTypeList::GetTypeAtIndex(uint32_t index)
497 if (m_opaque_ap.get())
498 return SBType(m_opaque_ap->GetTypeAtIndex(index));
503 SBTypeList::GetSize()
505 return m_opaque_ap->GetSize();
508 SBTypeList::~SBTypeList()
512 SBTypeMember::SBTypeMember() :
517 SBTypeMember::~SBTypeMember()
521 SBTypeMember::SBTypeMember (const SBTypeMember& rhs) :
527 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
532 SBTypeMember::operator = (const lldb::SBTypeMember& rhs)
537 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
543 SBTypeMember::IsValid() const
545 return m_opaque_ap.get();
549 SBTypeMember::GetName ()
551 if (m_opaque_ap.get())
552 return m_opaque_ap->GetName().GetCString();
557 SBTypeMember::GetType ()
560 if (m_opaque_ap.get())
562 sb_type.SetSP (m_opaque_ap->GetTypeImpl());
569 SBTypeMember::GetOffsetInBytes()
571 if (m_opaque_ap.get())
572 return m_opaque_ap->GetBitOffset() / 8u;
577 SBTypeMember::GetOffsetInBits()
579 if (m_opaque_ap.get())
580 return m_opaque_ap->GetBitOffset();
585 SBTypeMember::IsBitfield()
587 if (m_opaque_ap.get())
588 return m_opaque_ap->GetIsBitfield();
593 SBTypeMember::GetBitfieldSizeInBits()
595 if (m_opaque_ap.get())
596 return m_opaque_ap->GetBitfieldBitSize();
602 SBTypeMember::GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level)
604 Stream &strm = description.ref();
606 if (m_opaque_ap.get())
608 const uint32_t bit_offset = m_opaque_ap->GetBitOffset();
609 const uint32_t byte_offset = bit_offset / 8u;
610 const uint32_t byte_bit_offset = bit_offset % 8u;
611 const char *name = m_opaque_ap->GetName().GetCString();
613 strm.Printf ("+%u + %u bits: (", byte_offset, byte_bit_offset);
615 strm.Printf ("+%u: (", byte_offset);
617 TypeImplSP type_impl_sp (m_opaque_ap->GetTypeImpl());
619 type_impl_sp->GetDescription(strm, description_level);
621 strm.Printf (") %s", name);
622 if (m_opaque_ap->GetIsBitfield())
624 const uint32_t bitfield_bit_size = m_opaque_ap->GetBitfieldBitSize();
625 strm.Printf (" : %u", bitfield_bit_size);
630 strm.PutCString ("No value");
637 SBTypeMember::reset(TypeMemberImpl *type_member_impl)
639 m_opaque_ap.reset(type_member_impl);
645 if (m_opaque_ap.get() == NULL)
646 m_opaque_ap.reset (new TypeMemberImpl());
647 return *m_opaque_ap.get();
650 const TypeMemberImpl &
651 SBTypeMember::ref () const
653 return *m_opaque_ap.get();