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::GetDereferencedType()
193 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetDereferencedType())));
197 SBType::IsFunctionType ()
201 return m_opaque_sp->GetClangASTType(true).IsFunctionType();
205 SBType::IsPolymorphicClass ()
209 return m_opaque_sp->GetClangASTType(true).IsPolymorphicClass();
215 SBType::GetFunctionReturnType ()
219 ClangASTType return_clang_type (m_opaque_sp->GetClangASTType(true).GetFunctionReturnType());
220 if (return_clang_type.IsValid())
221 return SBType(return_clang_type);
223 return lldb::SBType();
227 SBType::GetFunctionArgumentTypes ()
229 SBTypeList sb_type_list;
232 ClangASTType func_type(m_opaque_sp->GetClangASTType(true));
233 size_t count = func_type.GetNumberOfFunctionArguments();
238 sb_type_list.Append(SBType(func_type.GetFunctionArgumentAtIndex(i)));
245 SBType::GetUnqualifiedType()
249 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetUnqualifiedType())));
253 SBType::GetCanonicalType()
256 return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetCanonicalType())));
262 SBType::GetBasicType()
265 return m_opaque_sp->GetClangASTType(false).GetBasicTypeEnumeration ();
266 return eBasicTypeInvalid;
270 SBType::GetBasicType(lldb::BasicType basic_type)
273 return SBType (ClangASTContext::GetBasicType (m_opaque_sp->GetClangASTContext(false), basic_type));
278 SBType::GetNumberOfDirectBaseClasses ()
281 return m_opaque_sp->GetClangASTType(true).GetNumDirectBaseClasses();
286 SBType::GetNumberOfVirtualBaseClasses ()
289 return m_opaque_sp->GetClangASTType(true).GetNumVirtualBaseClasses();
294 SBType::GetNumberOfFields ()
297 return m_opaque_sp->GetClangASTType(false).GetNumFields();
302 SBType::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
304 Stream &strm = description.ref();
308 m_opaque_sp->GetDescription (strm, description_level);
311 strm.PutCString ("No value");
319 SBType::GetDirectBaseClassAtIndex (uint32_t idx)
321 SBTypeMember sb_type_member;
324 ClangASTType this_type (m_opaque_sp->GetClangASTType (true));
325 if (this_type.IsValid())
327 uint32_t bit_offset = 0;
328 ClangASTType base_class_type (this_type.GetDirectBaseClassAtIndex(idx, &bit_offset));
329 if (base_class_type.IsValid())
331 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
335 return sb_type_member;
340 SBType::GetVirtualBaseClassAtIndex (uint32_t idx)
342 SBTypeMember sb_type_member;
345 ClangASTType this_type (m_opaque_sp->GetClangASTType (true));
346 if (this_type.IsValid())
348 uint32_t bit_offset = 0;
349 ClangASTType base_class_type (this_type.GetVirtualBaseClassAtIndex(idx, &bit_offset));
350 if (base_class_type.IsValid())
352 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
356 return sb_type_member;
360 SBType::GetFieldAtIndex (uint32_t idx)
362 SBTypeMember sb_type_member;
365 ClangASTType this_type (m_opaque_sp->GetClangASTType (false));
366 if (this_type.IsValid())
368 uint64_t bit_offset = 0;
369 uint32_t bitfield_bit_size = 0;
370 bool is_bitfield = false;
371 std::string name_sstr;
372 ClangASTType field_type (this_type.GetFieldAtIndex (idx,
377 if (field_type.IsValid())
380 if (!name_sstr.empty())
381 name.SetCString(name_sstr.c_str());
382 sb_type_member.reset (new TypeMemberImpl (TypeImplSP (new TypeImpl(field_type)),
390 return sb_type_member;
394 SBType::IsTypeComplete()
398 return m_opaque_sp->GetClangASTType(false).IsCompleteType();
406 return m_opaque_sp->GetName().GetCString();
410 SBType::GetTypeClass ()
413 return m_opaque_sp->GetClangASTType(false).GetTypeClass();
414 return lldb::eTypeClassInvalid;
418 SBType::GetNumberOfTemplateArguments ()
421 return m_opaque_sp->GetClangASTType(false).GetNumTemplateArguments();
426 SBType::GetTemplateArgumentType (uint32_t idx)
430 TemplateArgumentKind kind = eTemplateArgumentKindNull;
431 ClangASTType template_arg_type = m_opaque_sp->GetClangASTType(false).GetTemplateArgument (idx, kind);
432 if (template_arg_type.IsValid())
433 return SBType(template_arg_type);
439 lldb::TemplateArgumentKind
440 SBType::GetTemplateArgumentKind (uint32_t idx)
442 TemplateArgumentKind kind = eTemplateArgumentKindNull;
444 m_opaque_sp->GetClangASTType(false).GetTemplateArgument (idx, kind);
449 SBTypeList::SBTypeList() :
450 m_opaque_ap(new TypeListImpl())
454 SBTypeList::SBTypeList(const SBTypeList& rhs) :
455 m_opaque_ap(new TypeListImpl())
457 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
458 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
462 SBTypeList::IsValid ()
464 return (m_opaque_ap.get() != NULL);
468 SBTypeList::operator = (const SBTypeList& rhs)
472 m_opaque_ap.reset (new TypeListImpl());
473 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
474 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
480 SBTypeList::Append (SBType type)
483 m_opaque_ap->Append (type.m_opaque_sp);
487 SBTypeList::GetTypeAtIndex(uint32_t index)
489 if (m_opaque_ap.get())
490 return SBType(m_opaque_ap->GetTypeAtIndex(index));
495 SBTypeList::GetSize()
497 return m_opaque_ap->GetSize();
500 SBTypeList::~SBTypeList()
504 SBTypeMember::SBTypeMember() :
509 SBTypeMember::~SBTypeMember()
513 SBTypeMember::SBTypeMember (const SBTypeMember& rhs) :
519 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
524 SBTypeMember::operator = (const lldb::SBTypeMember& rhs)
529 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
535 SBTypeMember::IsValid() const
537 return m_opaque_ap.get();
541 SBTypeMember::GetName ()
543 if (m_opaque_ap.get())
544 return m_opaque_ap->GetName().GetCString();
549 SBTypeMember::GetType ()
552 if (m_opaque_ap.get())
554 sb_type.SetSP (m_opaque_ap->GetTypeImpl());
561 SBTypeMember::GetOffsetInBytes()
563 if (m_opaque_ap.get())
564 return m_opaque_ap->GetBitOffset() / 8u;
569 SBTypeMember::GetOffsetInBits()
571 if (m_opaque_ap.get())
572 return m_opaque_ap->GetBitOffset();
577 SBTypeMember::IsBitfield()
579 if (m_opaque_ap.get())
580 return m_opaque_ap->GetIsBitfield();
585 SBTypeMember::GetBitfieldSizeInBits()
587 if (m_opaque_ap.get())
588 return m_opaque_ap->GetBitfieldBitSize();
594 SBTypeMember::GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level)
596 Stream &strm = description.ref();
598 if (m_opaque_ap.get())
600 const uint32_t bit_offset = m_opaque_ap->GetBitOffset();
601 const uint32_t byte_offset = bit_offset / 8u;
602 const uint32_t byte_bit_offset = bit_offset % 8u;
603 const char *name = m_opaque_ap->GetName().GetCString();
605 strm.Printf ("+%u + %u bits: (", byte_offset, byte_bit_offset);
607 strm.Printf ("+%u: (", byte_offset);
609 TypeImplSP type_impl_sp (m_opaque_ap->GetTypeImpl());
611 type_impl_sp->GetDescription(strm, description_level);
613 strm.Printf (") %s", name);
614 if (m_opaque_ap->GetIsBitfield())
616 const uint32_t bitfield_bit_size = m_opaque_ap->GetBitfieldBitSize();
617 strm.Printf (" : %u", bitfield_bit_size);
622 strm.PutCString ("No value");
629 SBTypeMember::reset(TypeMemberImpl *type_member_impl)
631 m_opaque_ap.reset(type_member_impl);
637 if (m_opaque_ap.get() == NULL)
638 m_opaque_ap.reset (new TypeMemberImpl());
639 return *m_opaque_ap.get();
642 const TypeMemberImpl &
643 SBTypeMember::ref () const
645 return *m_opaque_ap.get();