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 //===----------------------------------------------------------------------===//
12 #include "clang/AST/ASTContext.h"
13 #include "clang/AST/TemplateBase.h"
14 #include "clang/AST/Type.h"
16 #include "lldb/API/SBDefines.h"
17 #include "lldb/API/SBType.h"
18 #include "lldb/API/SBStream.h"
19 #include "lldb/Core/ConstString.h"
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/Stream.h"
22 #include "lldb/Symbol/ClangASTContext.h"
23 #include "lldb/Symbol/ClangASTType.h"
24 #include "lldb/Symbol/Type.h"
27 using namespace lldb_private;
28 using namespace clang;
35 SBType::SBType (const ClangASTType &type) :
36 m_opaque_sp(new TypeImpl(ClangASTType(type.GetASTContext(),
37 type.GetOpaqueQualType())))
41 SBType::SBType (const lldb::TypeSP &type_sp) :
42 m_opaque_sp(new TypeImpl(type_sp))
46 SBType::SBType (const lldb::TypeImplSP &type_impl_sp) :
47 m_opaque_sp(type_impl_sp)
52 SBType::SBType (const SBType &rhs) :
57 m_opaque_sp = rhs.m_opaque_sp;
62 //SBType::SBType (TypeImpl* impl) :
67 SBType::operator == (SBType &rhs)
69 if (IsValid() == false)
70 return !rhs.IsValid();
72 return (rhs.m_opaque_sp->GetASTContext() == m_opaque_sp->GetASTContext()) &&
73 (rhs.m_opaque_sp->GetOpaqueQualType() == m_opaque_sp->GetOpaqueQualType());
77 SBType::operator != (SBType &rhs)
79 if (IsValid() == false)
82 return (rhs.m_opaque_sp->GetASTContext() != m_opaque_sp->GetASTContext()) ||
83 (rhs.m_opaque_sp->GetOpaqueQualType() != m_opaque_sp->GetOpaqueQualType());
94 SBType::SetSP (const lldb::TypeImplSP &type_impl_sp)
96 m_opaque_sp = type_impl_sp;
100 SBType::operator = (const SBType &rhs)
104 m_opaque_sp = rhs.m_opaque_sp;
115 if (m_opaque_sp.get() == NULL)
116 m_opaque_sp.reset (new TypeImpl());
123 // "const SBAddress &addr" should already have checked "addr.IsValid()"
124 // prior to calling this function. In case you didn't we will assert
125 // and die to let you know.
126 assert (m_opaque_sp.get());
131 SBType::IsValid() const
133 if (m_opaque_sp.get() == NULL)
136 return m_opaque_sp->IsValid();
140 SBType::GetByteSize()
145 return m_opaque_sp->GetClangASTType().GetByteSize();
150 SBType::IsPointerType()
154 return m_opaque_sp->GetClangASTType().IsPointerType();
158 SBType::IsReferenceType()
162 return m_opaque_sp->GetClangASTType().IsReferenceType();
166 SBType::GetPointerType()
171 return SBType(ClangASTType(m_opaque_sp->GetClangASTType().GetPointerType()));
175 SBType::GetPointeeType()
179 return SBType(ClangASTType(m_opaque_sp->GetClangASTType().GetPointeeType()));
183 SBType::GetReferenceType()
187 return SBType(ClangASTType(m_opaque_sp->GetClangASTType().GetLValueReferenceType()));
191 SBType::GetDereferencedType()
195 return SBType(ClangASTType(m_opaque_sp->GetClangASTType().GetNonReferenceType()));
199 SBType::IsFunctionType ()
203 return m_opaque_sp->GetClangASTType().IsFunctionType();
207 SBType::IsPolymorphicClass ()
211 return m_opaque_sp->GetClangASTType().IsPolymorphicClass();
217 SBType::GetFunctionReturnType ()
221 ClangASTType return_clang_type (m_opaque_sp->GetClangASTType().GetFunctionReturnType());
222 if (return_clang_type.IsValid())
223 return SBType(return_clang_type);
225 return lldb::SBType();
229 SBType::GetFunctionArgumentTypes ()
231 SBTypeList sb_type_list;
234 QualType qual_type(QualType::getFromOpaquePtr(m_opaque_sp->GetOpaqueQualType()));
235 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
238 const uint32_t num_args = func->getNumArgs();
239 for (uint32_t i=0; i<num_args; ++i)
240 sb_type_list.Append (SBType(ClangASTType(m_opaque_sp->GetASTContext(), func->getArgType(i).getAsOpaquePtr())));
247 SBType::GetUnqualifiedType()
251 return SBType(m_opaque_sp->GetClangASTType().GetFullyUnqualifiedType());
255 SBType::GetCanonicalType()
258 return SBType(m_opaque_sp->GetClangASTType().GetCanonicalType());
264 SBType::GetBasicType()
267 return m_opaque_sp->GetClangASTType().GetBasicTypeEnumeration ();
268 return eBasicTypeInvalid;
272 SBType::GetBasicType(lldb::BasicType basic_type)
275 return SBType (ClangASTContext::GetBasicType (m_opaque_sp->GetASTContext(), basic_type));
280 SBType::GetNumberOfDirectBaseClasses ()
283 return m_opaque_sp->GetClangASTType().GetNumDirectBaseClasses();
288 SBType::GetNumberOfVirtualBaseClasses ()
291 return m_opaque_sp->GetClangASTType().GetNumVirtualBaseClasses();
296 SBType::GetNumberOfFields ()
299 return m_opaque_sp->GetClangASTType().GetNumFields();
304 SBType::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
306 Stream &strm = description.ref();
310 m_opaque_sp->GetDescription (strm, description_level);
313 strm.PutCString ("No value");
321 SBType::GetDirectBaseClassAtIndex (uint32_t idx)
323 SBTypeMember sb_type_member;
326 ClangASTType this_type (m_opaque_sp->GetClangASTType ());
327 if (this_type.IsValid())
329 uint32_t bit_offset = 0;
330 ClangASTType base_class_type (this_type.GetDirectBaseClassAtIndex(idx, &bit_offset));
331 if (base_class_type.IsValid())
333 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
337 return sb_type_member;
342 SBType::GetVirtualBaseClassAtIndex (uint32_t idx)
344 SBTypeMember sb_type_member;
347 ClangASTType this_type (m_opaque_sp->GetClangASTType ());
348 if (this_type.IsValid())
350 uint32_t bit_offset = 0;
351 ClangASTType base_class_type (this_type.GetVirtualBaseClassAtIndex(idx, &bit_offset));
352 if (base_class_type.IsValid())
354 sb_type_member.reset (new TypeMemberImpl (TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
358 return sb_type_member;
362 SBType::GetFieldAtIndex (uint32_t idx)
364 SBTypeMember sb_type_member;
367 ClangASTType this_type (m_opaque_sp->GetClangASTType ());
368 if (this_type.IsValid())
370 uint64_t bit_offset = 0;
371 uint32_t bitfield_bit_size = 0;
372 bool is_bitfield = false;
373 std::string name_sstr;
374 ClangASTType field_type (this_type.GetFieldAtIndex (idx,
379 if (field_type.IsValid())
382 if (!name_sstr.empty())
383 name.SetCString(name_sstr.c_str());
384 sb_type_member.reset (new TypeMemberImpl (TypeImplSP (new TypeImpl(field_type)),
392 return sb_type_member;
396 SBType::IsTypeComplete()
400 return m_opaque_sp->GetClangASTType().IsCompleteType();
408 return m_opaque_sp->GetClangASTType().GetConstTypeName().GetCString();
412 SBType::GetTypeClass ()
415 return m_opaque_sp->GetClangASTType().GetTypeClass();
416 return lldb::eTypeClassInvalid;
420 SBType::GetNumberOfTemplateArguments ()
423 return m_opaque_sp->GetClangASTType().GetNumTemplateArguments();
428 SBType::GetTemplateArgumentType (uint32_t idx)
432 TemplateArgumentKind kind = eTemplateArgumentKindNull;
433 ClangASTType template_arg_type = m_opaque_sp->GetClangASTType().GetTemplateArgument (idx, kind);
434 if (template_arg_type.IsValid())
435 return SBType(template_arg_type);
441 lldb::TemplateArgumentKind
442 SBType::GetTemplateArgumentKind (uint32_t idx)
444 TemplateArgumentKind kind = eTemplateArgumentKindNull;
446 m_opaque_sp->GetClangASTType().GetTemplateArgument (idx, kind);
451 SBTypeList::SBTypeList() :
452 m_opaque_ap(new TypeListImpl())
456 SBTypeList::SBTypeList(const SBTypeList& rhs) :
457 m_opaque_ap(new TypeListImpl())
459 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
460 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
464 SBTypeList::IsValid ()
466 return (m_opaque_ap.get() != NULL);
470 SBTypeList::operator = (const SBTypeList& rhs)
474 m_opaque_ap.reset (new TypeListImpl());
475 for (uint32_t i = 0, rhs_size = const_cast<SBTypeList&>(rhs).GetSize(); i < rhs_size; i++)
476 Append(const_cast<SBTypeList&>(rhs).GetTypeAtIndex(i));
482 SBTypeList::Append (SBType type)
485 m_opaque_ap->Append (type.m_opaque_sp);
489 SBTypeList::GetTypeAtIndex(uint32_t index)
491 if (m_opaque_ap.get())
492 return SBType(m_opaque_ap->GetTypeAtIndex(index));
497 SBTypeList::GetSize()
499 return m_opaque_ap->GetSize();
502 SBTypeList::~SBTypeList()
506 SBTypeMember::SBTypeMember() :
511 SBTypeMember::~SBTypeMember()
515 SBTypeMember::SBTypeMember (const SBTypeMember& rhs) :
521 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
526 SBTypeMember::operator = (const lldb::SBTypeMember& rhs)
531 m_opaque_ap.reset(new TypeMemberImpl(rhs.ref()));
537 SBTypeMember::IsValid() const
539 return m_opaque_ap.get();
543 SBTypeMember::GetName ()
545 if (m_opaque_ap.get())
546 return m_opaque_ap->GetName().GetCString();
551 SBTypeMember::GetType ()
554 if (m_opaque_ap.get())
556 sb_type.SetSP (m_opaque_ap->GetTypeImpl());
563 SBTypeMember::GetOffsetInBytes()
565 if (m_opaque_ap.get())
566 return m_opaque_ap->GetBitOffset() / 8u;
571 SBTypeMember::GetOffsetInBits()
573 if (m_opaque_ap.get())
574 return m_opaque_ap->GetBitOffset();
579 SBTypeMember::IsBitfield()
581 if (m_opaque_ap.get())
582 return m_opaque_ap->GetIsBitfield();
587 SBTypeMember::GetBitfieldSizeInBits()
589 if (m_opaque_ap.get())
590 return m_opaque_ap->GetBitfieldBitSize();
596 SBTypeMember::GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level)
598 Stream &strm = description.ref();
600 if (m_opaque_ap.get())
602 const uint32_t bit_offset = m_opaque_ap->GetBitOffset();
603 const uint32_t byte_offset = bit_offset / 8u;
604 const uint32_t byte_bit_offset = bit_offset % 8u;
605 const char *name = m_opaque_ap->GetName().GetCString();
607 strm.Printf ("+%u + %u bits: (", byte_offset, byte_bit_offset);
609 strm.Printf ("+%u: (", byte_offset);
611 TypeImplSP type_impl_sp (m_opaque_ap->GetTypeImpl());
613 type_impl_sp->GetDescription(strm, description_level);
615 strm.Printf (") %s", name);
616 if (m_opaque_ap->GetIsBitfield())
618 const uint32_t bitfield_bit_size = m_opaque_ap->GetBitfieldBitSize();
619 strm.Printf (" : %u", bitfield_bit_size);
624 strm.PutCString ("No value");
631 SBTypeMember::reset(TypeMemberImpl *type_member_impl)
633 m_opaque_ap.reset(type_member_impl);
639 if (m_opaque_ap.get() == NULL)
640 m_opaque_ap.reset (new TypeMemberImpl());
641 return *m_opaque_ap.get();
644 const TypeMemberImpl &
645 SBTypeMember::ref () const
647 return *m_opaque_ap.get();