180814287SRaphael Isemann //===-- SBType.cpp --------------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBType.h"
10b9c1b51eSKate Stone #include "lldb/API/SBDefines.h"
112c0cbc47SIlya Bukonkin #include "lldb/API/SBModule.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
13b9c1b51eSKate Stone #include "lldb/API/SBTypeEnumMember.h"
14fe68904fSGreg Clayton #include "lldb/Core/Mangled.h"
15a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h"
16fe42ac4dSGreg Clayton #include "lldb/Symbol/Type.h"
1756939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
18bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
191755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2130fdc8d8SChris Lattner 
2299558cc4SGreg Clayton #include "llvm/ADT/APSInt.h"
23732215f9STodd Fiala 
24796ac80bSJonas Devlieghere #include <memory>
25796ac80bSJonas Devlieghere 
2630fdc8d8SChris Lattner using namespace lldb;
2730fdc8d8SChris Lattner using namespace lldb_private;
2830fdc8d8SChris Lattner 
SBType()291755f5b1SJonas Devlieghere SBType::SBType() { LLDB_INSTRUMENT_VA(this); }
30fe42ac4dSGreg Clayton 
SBType(const CompilerType & type)31b9c1b51eSKate Stone SBType::SBType(const CompilerType &type)
32b9c1b51eSKate Stone     : m_opaque_sp(new TypeImpl(
33b9c1b51eSKate Stone           CompilerType(type.GetTypeSystem(), type.GetOpaqueQualType()))) {}
346f3533fbSEnrico Granata 
SBType(const lldb::TypeSP & type_sp)35b9c1b51eSKate Stone SBType::SBType(const lldb::TypeSP &type_sp)
36b9c1b51eSKate Stone     : m_opaque_sp(new TypeImpl(type_sp)) {}
376f3533fbSEnrico Granata 
SBType(const lldb::TypeImplSP & type_impl_sp)38b9c1b51eSKate Stone SBType::SBType(const lldb::TypeImplSP &type_impl_sp)
39b9c1b51eSKate Stone     : m_opaque_sp(type_impl_sp) {}
406f3533fbSEnrico Granata 
SBType(const SBType & rhs)41a3436f73SKazu Hirata SBType::SBType(const SBType &rhs) {
421755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
43baf5664fSJonas Devlieghere 
44b9c1b51eSKate Stone   if (this != &rhs) {
45fe42ac4dSGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
46fe42ac4dSGreg Clayton   }
47fe42ac4dSGreg Clayton }
48fe42ac4dSGreg Clayton 
49fe42ac4dSGreg Clayton // SBType::SBType (TypeImpl* impl) :
50d5b44036SJonas Devlieghere //    m_opaque_up(impl)
51fe42ac4dSGreg Clayton //{}
52fe42ac4dSGreg Clayton //
operator ==(SBType & rhs)53b9c1b51eSKate Stone bool SBType::operator==(SBType &rhs) {
541755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
55baf5664fSJonas Devlieghere 
56a6682a41SJonas Devlieghere   if (!IsValid())
576f3533fbSEnrico Granata     return !rhs.IsValid();
58ceb6b139SCaroline Tice 
59a6682a41SJonas Devlieghere   if (!rhs.IsValid())
60dc4db5a6SEnrico Granata     return false;
61dc4db5a6SEnrico Granata 
62dc4db5a6SEnrico Granata   return *m_opaque_sp.get() == *rhs.m_opaque_sp.get();
636f3533fbSEnrico Granata }
64ceb6b139SCaroline Tice 
operator !=(SBType & rhs)65b9c1b51eSKate Stone bool SBType::operator!=(SBType &rhs) {
661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
67baf5664fSJonas Devlieghere 
68a6682a41SJonas Devlieghere   if (!IsValid())
696f3533fbSEnrico Granata     return rhs.IsValid();
70ceb6b139SCaroline Tice 
71a6682a41SJonas Devlieghere   if (!rhs.IsValid())
72dc4db5a6SEnrico Granata     return true;
73dc4db5a6SEnrico Granata 
74dc4db5a6SEnrico Granata   return *m_opaque_sp.get() != *rhs.m_opaque_sp.get();
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
GetSP()77b9c1b51eSKate Stone lldb::TypeImplSP SBType::GetSP() { return m_opaque_sp; }
7881e871edSGreg Clayton 
SetSP(const lldb::TypeImplSP & type_impl_sp)79b9c1b51eSKate Stone void SBType::SetSP(const lldb::TypeImplSP &type_impl_sp) {
80bf2331c4SGreg Clayton   m_opaque_sp = type_impl_sp;
81bf2331c4SGreg Clayton }
82bf2331c4SGreg Clayton 
operator =(const SBType & rhs)83b9c1b51eSKate Stone SBType &SBType::operator=(const SBType &rhs) {
841755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
85baf5664fSJonas Devlieghere 
86b9c1b51eSKate Stone   if (this != &rhs) {
87fe42ac4dSGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
88ba9fbbb8SGreg Clayton   }
89d232abc3SJonas Devlieghere   return *this;
90efabb123SGreg Clayton }
91efabb123SGreg Clayton 
92866b7a65SJonas Devlieghere SBType::~SBType() = default;
936f3533fbSEnrico Granata 
ref()94b9c1b51eSKate Stone TypeImpl &SBType::ref() {
95248a1305SKonrad Kleine   if (m_opaque_sp.get() == nullptr)
96796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<TypeImpl>();
97fe42ac4dSGreg Clayton   return *m_opaque_sp;
986f3533fbSEnrico Granata }
996f3533fbSEnrico Granata 
ref() const100b9c1b51eSKate Stone const TypeImpl &SBType::ref() const {
10105097246SAdrian Prantl   // "const SBAddress &addr" should already have checked "addr.IsValid()" prior
10205097246SAdrian Prantl   // to calling this function. In case you didn't we will assert and die to let
10305097246SAdrian Prantl   // you know.
104fe42ac4dSGreg Clayton   assert(m_opaque_sp.get());
105fe42ac4dSGreg Clayton   return *m_opaque_sp;
106ba9fbbb8SGreg Clayton }
107ba9fbbb8SGreg Clayton 
IsValid() const108b9c1b51eSKate Stone bool SBType::IsValid() const {
1091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1107f5237bcSPavel Labath   return this->operator bool();
1117f5237bcSPavel Labath }
operator bool() const1127f5237bcSPavel Labath SBType::operator bool() const {
1131755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
114baf5664fSJonas Devlieghere 
115248a1305SKonrad Kleine   if (m_opaque_sp.get() == nullptr)
1166f3533fbSEnrico Granata     return false;
1176f3533fbSEnrico Granata 
118fe42ac4dSGreg Clayton   return m_opaque_sp->IsValid();
1196f3533fbSEnrico Granata }
1206f3533fbSEnrico Granata 
GetByteSize()121b9c1b51eSKate Stone uint64_t SBType::GetByteSize() {
1221755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
123baf5664fSJonas Devlieghere 
124d963a7c3SAdrian Prantl   if (IsValid())
125d6a9bbf6SAdrian Prantl     if (llvm::Optional<uint64_t> size =
126d6a9bbf6SAdrian Prantl             m_opaque_sp->GetCompilerType(false).GetByteSize(nullptr))
127d963a7c3SAdrian Prantl       return *size;
1286f3533fbSEnrico Granata   return 0;
1296f3533fbSEnrico Granata }
1306f3533fbSEnrico Granata 
IsPointerType()131b9c1b51eSKate Stone bool SBType::IsPointerType() {
1321755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
133baf5664fSJonas Devlieghere 
1346f3533fbSEnrico Granata   if (!IsValid())
1356f3533fbSEnrico Granata     return false;
136a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsPointerType();
1376f3533fbSEnrico Granata }
1386f3533fbSEnrico Granata 
IsArrayType()139b9c1b51eSKate Stone bool SBType::IsArrayType() {
1401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
141baf5664fSJonas Devlieghere 
142e0afce76SEnrico Granata   if (!IsValid())
143e0afce76SEnrico Granata     return false;
144b9c1b51eSKate Stone   return m_opaque_sp->GetCompilerType(true).IsArrayType(nullptr, nullptr,
145b9c1b51eSKate Stone                                                         nullptr);
146e0afce76SEnrico Granata }
147e0afce76SEnrico Granata 
IsVectorType()148b9c1b51eSKate Stone bool SBType::IsVectorType() {
1491755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
150baf5664fSJonas Devlieghere 
1517684e6e1SEnrico Granata   if (!IsValid())
1527684e6e1SEnrico Granata     return false;
153a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsVectorType(nullptr, nullptr);
1547684e6e1SEnrico Granata }
1557684e6e1SEnrico Granata 
IsReferenceType()156b9c1b51eSKate Stone bool SBType::IsReferenceType() {
1571755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
158baf5664fSJonas Devlieghere 
1596f3533fbSEnrico Granata   if (!IsValid())
1606f3533fbSEnrico Granata     return false;
161a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsReferenceType();
1626f3533fbSEnrico Granata }
1636f3533fbSEnrico Granata 
GetPointerType()164b9c1b51eSKate Stone SBType SBType::GetPointerType() {
1651755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1666f3533fbSEnrico Granata 
167baf5664fSJonas Devlieghere   if (!IsValid())
168d232abc3SJonas Devlieghere     return SBType();
169baf5664fSJonas Devlieghere 
170d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetPointerType())));
1716f3533fbSEnrico Granata }
1726f3533fbSEnrico Granata 
GetPointeeType()173b9c1b51eSKate Stone SBType SBType::GetPointeeType() {
1741755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
175baf5664fSJonas Devlieghere 
1766f3533fbSEnrico Granata   if (!IsValid())
177d232abc3SJonas Devlieghere     return SBType();
178d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetPointeeType())));
1796f3533fbSEnrico Granata }
1806f3533fbSEnrico Granata 
GetReferenceType()181b9c1b51eSKate Stone SBType SBType::GetReferenceType() {
1821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
183baf5664fSJonas Devlieghere 
1846f3533fbSEnrico Granata   if (!IsValid())
185d232abc3SJonas Devlieghere     return SBType();
186d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetReferenceType())));
1876f3533fbSEnrico Granata }
1886f3533fbSEnrico Granata 
GetTypedefedType()189b9c1b51eSKate Stone SBType SBType::GetTypedefedType() {
1901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
191baf5664fSJonas Devlieghere 
1921f4db7daSGreg Clayton   if (!IsValid())
193d232abc3SJonas Devlieghere     return SBType();
194d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetTypedefedType())));
1951f4db7daSGreg Clayton }
1961f4db7daSGreg Clayton 
GetDereferencedType()197b9c1b51eSKate Stone SBType SBType::GetDereferencedType() {
1981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
199baf5664fSJonas Devlieghere 
2006f3533fbSEnrico Granata   if (!IsValid())
201d232abc3SJonas Devlieghere     return SBType();
202d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetDereferencedType())));
2036f3533fbSEnrico Granata }
2046f3533fbSEnrico Granata 
GetArrayElementType()205b9c1b51eSKate Stone SBType SBType::GetArrayElementType() {
2061755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
207baf5664fSJonas Devlieghere 
208e0afce76SEnrico Granata   if (!IsValid())
209d232abc3SJonas Devlieghere     return SBType();
210d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(
211d232abc3SJonas Devlieghere       m_opaque_sp->GetCompilerType(true).GetArrayElementType(nullptr))));
212e0afce76SEnrico Granata }
213e0afce76SEnrico Granata 
GetArrayType(uint64_t size)214b9c1b51eSKate Stone SBType SBType::GetArrayType(uint64_t size) {
2151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, size);
216baf5664fSJonas Devlieghere 
217639392feSEnrico Granata   if (!IsValid())
218d232abc3SJonas Devlieghere     return SBType();
219d232abc3SJonas Devlieghere   return SBType(TypeImplSP(
220d232abc3SJonas Devlieghere       new TypeImpl(m_opaque_sp->GetCompilerType(true).GetArrayType(size))));
221639392feSEnrico Granata }
222639392feSEnrico Granata 
GetVectorElementType()223b9c1b51eSKate Stone SBType SBType::GetVectorElementType() {
2241755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
225baf5664fSJonas Devlieghere 
2267684e6e1SEnrico Granata   SBType type_sb;
227b9c1b51eSKate Stone   if (IsValid()) {
228a1e5dc86SGreg Clayton     CompilerType vector_element_type;
229b9c1b51eSKate Stone     if (m_opaque_sp->GetCompilerType(true).IsVectorType(&vector_element_type,
230b9c1b51eSKate Stone                                                         nullptr))
2317684e6e1SEnrico Granata       type_sb.SetSP(TypeImplSP(new TypeImpl(vector_element_type)));
2327684e6e1SEnrico Granata   }
233d232abc3SJonas Devlieghere   return type_sb;
2347684e6e1SEnrico Granata }
2357684e6e1SEnrico Granata 
IsFunctionType()236b9c1b51eSKate Stone bool SBType::IsFunctionType() {
2371755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
238baf5664fSJonas Devlieghere 
23957ee3067SGreg Clayton   if (!IsValid())
240373670dfSGreg Clayton     return false;
241a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsFunctionType();
242373670dfSGreg Clayton }
243373670dfSGreg Clayton 
IsPolymorphicClass()244b9c1b51eSKate Stone bool SBType::IsPolymorphicClass() {
2451755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
246baf5664fSJonas Devlieghere 
24757ee3067SGreg Clayton   if (!IsValid())
248d8c3d4b1SGreg Clayton     return false;
249a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsPolymorphicClass();
250d8c3d4b1SGreg Clayton }
251d8c3d4b1SGreg Clayton 
IsTypedefType()252b9c1b51eSKate Stone bool SBType::IsTypedefType() {
2531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
254baf5664fSJonas Devlieghere 
255e0afce76SEnrico Granata   if (!IsValid())
256e0afce76SEnrico Granata     return false;
257a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).IsTypedefType();
258e0afce76SEnrico Granata }
259d8c3d4b1SGreg Clayton 
IsAnonymousType()260b9c1b51eSKate Stone bool SBType::IsAnonymousType() {
2611755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
262baf5664fSJonas Devlieghere 
2637123e2b5SEnrico Granata   if (!IsValid())
2647123e2b5SEnrico Granata     return false;
2657123e2b5SEnrico Granata   return m_opaque_sp->GetCompilerType(true).IsAnonymousType();
2667123e2b5SEnrico Granata }
2677123e2b5SEnrico Granata 
IsScopedEnumerationType()268e17a00fcSAndy Yankovsky bool SBType::IsScopedEnumerationType() {
2691755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
270e17a00fcSAndy Yankovsky 
271e17a00fcSAndy Yankovsky   if (!IsValid())
272e17a00fcSAndy Yankovsky     return false;
273e17a00fcSAndy Yankovsky   return m_opaque_sp->GetCompilerType(true).IsScopedEnumerationType();
274e17a00fcSAndy Yankovsky }
275e17a00fcSAndy Yankovsky 
IsAggregateType()276704001e9SDave Lee bool SBType::IsAggregateType() {
277704001e9SDave Lee   LLDB_INSTRUMENT_VA(this);
278704001e9SDave Lee 
279704001e9SDave Lee   if (!IsValid())
280704001e9SDave Lee     return false;
281704001e9SDave Lee   return m_opaque_sp->GetCompilerType(true).IsAggregateType();
282704001e9SDave Lee }
283704001e9SDave Lee 
GetFunctionReturnType()284b9c1b51eSKate Stone lldb::SBType SBType::GetFunctionReturnType() {
2851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
286baf5664fSJonas Devlieghere 
287b9c1b51eSKate Stone   if (IsValid()) {
288b9c1b51eSKate Stone     CompilerType return_type(
289b9c1b51eSKate Stone         m_opaque_sp->GetCompilerType(true).GetFunctionReturnType());
2903ad353f3SBruce Mitchener     if (return_type.IsValid())
291d232abc3SJonas Devlieghere       return SBType(return_type);
292373670dfSGreg Clayton   }
293d232abc3SJonas Devlieghere   return lldb::SBType();
294373670dfSGreg Clayton }
295373670dfSGreg Clayton 
GetFunctionArgumentTypes()296b9c1b51eSKate Stone lldb::SBTypeList SBType::GetFunctionArgumentTypes() {
2971755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
298baf5664fSJonas Devlieghere 
299373670dfSGreg Clayton   SBTypeList sb_type_list;
300b9c1b51eSKate Stone   if (IsValid()) {
301a1e5dc86SGreg Clayton     CompilerType func_type(m_opaque_sp->GetCompilerType(true));
302dc4db5a6SEnrico Granata     size_t count = func_type.GetNumberOfFunctionArguments();
303b9c1b51eSKate Stone     for (size_t i = 0; i < count; i++) {
304dc4db5a6SEnrico Granata       sb_type_list.Append(SBType(func_type.GetFunctionArgumentAtIndex(i)));
305373670dfSGreg Clayton     }
306373670dfSGreg Clayton   }
307d232abc3SJonas Devlieghere   return sb_type_list;
308373670dfSGreg Clayton }
309373670dfSGreg Clayton 
GetNumberOfMemberFunctions()310b9c1b51eSKate Stone uint32_t SBType::GetNumberOfMemberFunctions() {
3111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
312baf5664fSJonas Devlieghere 
313b9c1b51eSKate Stone   if (IsValid()) {
314a1e5dc86SGreg Clayton     return m_opaque_sp->GetCompilerType(true).GetNumMemberFunctions();
315190064adSEnrico Granata   }
316190064adSEnrico Granata   return 0;
317190064adSEnrico Granata }
318190064adSEnrico Granata 
GetMemberFunctionAtIndex(uint32_t idx)319b9c1b51eSKate Stone lldb::SBTypeMemberFunction SBType::GetMemberFunctionAtIndex(uint32_t idx) {
3201755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
321baf5664fSJonas Devlieghere 
3226c42cb11SEnrico Granata   SBTypeMemberFunction sb_func_type;
323190064adSEnrico Granata   if (IsValid())
324b9c1b51eSKate Stone     sb_func_type.reset(new TypeMemberFunctionImpl(
325b9c1b51eSKate Stone         m_opaque_sp->GetCompilerType(true).GetMemberFunctionAtIndex(idx)));
326d232abc3SJonas Devlieghere   return sb_func_type;
327190064adSEnrico Granata }
328190064adSEnrico Granata 
GetUnqualifiedType()329b9c1b51eSKate Stone lldb::SBType SBType::GetUnqualifiedType() {
3301755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
331baf5664fSJonas Devlieghere 
33266016fd8SGreg Clayton   if (!IsValid())
333d232abc3SJonas Devlieghere     return SBType();
334d232abc3SJonas Devlieghere   return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetUnqualifiedType())));
33566016fd8SGreg Clayton }
33666016fd8SGreg Clayton 
GetCanonicalType()337b9c1b51eSKate Stone lldb::SBType SBType::GetCanonicalType() {
3381755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
339baf5664fSJonas Devlieghere 
340315501e2SGreg Clayton   if (IsValid())
341d232abc3SJonas Devlieghere     return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetCanonicalType())));
342d232abc3SJonas Devlieghere   return SBType();
343315501e2SGreg Clayton }
344315501e2SGreg Clayton 
GetEnumerationIntegerType()3451432ae57SAndy Yankovsky SBType SBType::GetEnumerationIntegerType() {
3461755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
3471432ae57SAndy Yankovsky 
3481432ae57SAndy Yankovsky   if (IsValid()) {
349d232abc3SJonas Devlieghere     return SBType(
350d232abc3SJonas Devlieghere         m_opaque_sp->GetCompilerType(true).GetEnumerationIntegerType());
3511432ae57SAndy Yankovsky   }
352d232abc3SJonas Devlieghere   return SBType();
3531432ae57SAndy Yankovsky }
3541432ae57SAndy Yankovsky 
GetBasicType()355b9c1b51eSKate Stone lldb::BasicType SBType::GetBasicType() {
3561755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
357baf5664fSJonas Devlieghere 
358eaafa732SGreg Clayton   if (IsValid())
359a1e5dc86SGreg Clayton     return m_opaque_sp->GetCompilerType(false).GetBasicTypeEnumeration();
360eaafa732SGreg Clayton   return eBasicTypeInvalid;
361eaafa732SGreg Clayton }
36266016fd8SGreg Clayton 
GetBasicType(lldb::BasicType basic_type)363b9c1b51eSKate Stone SBType SBType::GetBasicType(lldb::BasicType basic_type) {
3641755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, basic_type);
365baf5664fSJonas Devlieghere 
366d8d4a57bSGreg Clayton   if (IsValid() && m_opaque_sp->IsValid())
367d232abc3SJonas Devlieghere     return SBType(
368d232abc3SJonas Devlieghere         m_opaque_sp->GetTypeSystem(false)->GetBasicTypeFromAST(basic_type));
369d232abc3SJonas Devlieghere   return SBType();
370ba9fbbb8SGreg Clayton }
371ba9fbbb8SGreg Clayton 
GetNumberOfDirectBaseClasses()372b9c1b51eSKate Stone uint32_t SBType::GetNumberOfDirectBaseClasses() {
3731755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
374baf5664fSJonas Devlieghere 
375bf2331c4SGreg Clayton   if (IsValid())
37699558cc4SGreg Clayton     return m_opaque_sp->GetCompilerType(true).GetNumDirectBaseClasses();
377bf2331c4SGreg Clayton   return 0;
378bf2331c4SGreg Clayton }
379bf2331c4SGreg Clayton 
GetNumberOfVirtualBaseClasses()380b9c1b51eSKate Stone uint32_t SBType::GetNumberOfVirtualBaseClasses() {
3811755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
382baf5664fSJonas Devlieghere 
383bf2331c4SGreg Clayton   if (IsValid())
38499558cc4SGreg Clayton     return m_opaque_sp->GetCompilerType(true).GetNumVirtualBaseClasses();
385bf2331c4SGreg Clayton   return 0;
386bf2331c4SGreg Clayton }
387bf2331c4SGreg Clayton 
GetNumberOfFields()388b9c1b51eSKate Stone uint32_t SBType::GetNumberOfFields() {
3891755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
390baf5664fSJonas Devlieghere 
391bf2331c4SGreg Clayton   if (IsValid())
392a1e5dc86SGreg Clayton     return m_opaque_sp->GetCompilerType(true).GetNumFields();
393bf2331c4SGreg Clayton   return 0;
394bf2331c4SGreg Clayton }
395bf2331c4SGreg Clayton 
GetDescription(SBStream & description,lldb::DescriptionLevel description_level)396b9c1b51eSKate Stone bool SBType::GetDescription(SBStream &description,
397b9c1b51eSKate Stone                             lldb::DescriptionLevel description_level) {
3981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
399baf5664fSJonas Devlieghere 
400da7bc7d0SGreg Clayton   Stream &strm = description.ref();
401da7bc7d0SGreg Clayton 
402b9c1b51eSKate Stone   if (m_opaque_sp) {
403da7bc7d0SGreg Clayton     m_opaque_sp->GetDescription(strm, description_level);
404b9c1b51eSKate Stone   } else
405da7bc7d0SGreg Clayton     strm.PutCString("No value");
406da7bc7d0SGreg Clayton 
407da7bc7d0SGreg Clayton   return true;
408da7bc7d0SGreg Clayton }
409da7bc7d0SGreg Clayton 
GetDirectBaseClassAtIndex(uint32_t idx)410b9c1b51eSKate Stone SBTypeMember SBType::GetDirectBaseClassAtIndex(uint32_t idx) {
4111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
412baf5664fSJonas Devlieghere 
413bf2331c4SGreg Clayton   SBTypeMember sb_type_member;
414b9c1b51eSKate Stone   if (IsValid()) {
41557ee3067SGreg Clayton     uint32_t bit_offset = 0;
416b9c1b51eSKate Stone     CompilerType base_class_type =
417b9c1b51eSKate Stone         m_opaque_sp->GetCompilerType(true).GetDirectBaseClassAtIndex(
418b9c1b51eSKate Stone             idx, &bit_offset);
41957ee3067SGreg Clayton     if (base_class_type.IsValid())
420b9c1b51eSKate Stone       sb_type_member.reset(new TypeMemberImpl(
421b9c1b51eSKate Stone           TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
42257ee3067SGreg Clayton   }
423d232abc3SJonas Devlieghere   return sb_type_member;
424bf2331c4SGreg Clayton }
425bf2331c4SGreg Clayton 
GetVirtualBaseClassAtIndex(uint32_t idx)426b9c1b51eSKate Stone SBTypeMember SBType::GetVirtualBaseClassAtIndex(uint32_t idx) {
4271755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
428baf5664fSJonas Devlieghere 
429b9c1b51eSKate Stone   SBTypeMember sb_type_member;
430b9c1b51eSKate Stone   if (IsValid()) {
431b9c1b51eSKate Stone     uint32_t bit_offset = 0;
432b9c1b51eSKate Stone     CompilerType base_class_type =
433b9c1b51eSKate Stone         m_opaque_sp->GetCompilerType(true).GetVirtualBaseClassAtIndex(
434b9c1b51eSKate Stone             idx, &bit_offset);
435b9c1b51eSKate Stone     if (base_class_type.IsValid())
436b9c1b51eSKate Stone       sb_type_member.reset(new TypeMemberImpl(
437b9c1b51eSKate Stone           TypeImplSP(new TypeImpl(base_class_type)), bit_offset));
438b9c1b51eSKate Stone   }
439d232abc3SJonas Devlieghere   return sb_type_member;
440b9c1b51eSKate Stone }
441b9c1b51eSKate Stone 
GetEnumMembers()442b9c1b51eSKate Stone SBTypeEnumMemberList SBType::GetEnumMembers() {
4431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
444baf5664fSJonas Devlieghere 
445732215f9STodd Fiala   SBTypeEnumMemberList sb_enum_member_list;
446b9c1b51eSKate Stone   if (IsValid()) {
44799558cc4SGreg Clayton     CompilerType this_type(m_opaque_sp->GetCompilerType(true));
448b9c1b51eSKate Stone     if (this_type.IsValid()) {
449b9c1b51eSKate Stone       this_type.ForEachEnumerator([&sb_enum_member_list](
450b9c1b51eSKate Stone                                       const CompilerType &integer_type,
4510e4c4821SAdrian Prantl                                       ConstString name,
452b9c1b51eSKate Stone                                       const llvm::APSInt &value) -> bool {
453b9c1b51eSKate Stone         SBTypeEnumMember enum_member(
454b9c1b51eSKate Stone             lldb::TypeEnumMemberImplSP(new TypeEnumMemberImpl(
455b9c1b51eSKate Stone                 lldb::TypeImplSP(new TypeImpl(integer_type)), name, value)));
456732215f9STodd Fiala         sb_enum_member_list.Append(enum_member);
45799558cc4SGreg Clayton         return true; // Keep iterating
45899558cc4SGreg Clayton       });
459732215f9STodd Fiala     }
460732215f9STodd Fiala   }
461d232abc3SJonas Devlieghere   return sb_enum_member_list;
462732215f9STodd Fiala }
463732215f9STodd Fiala 
GetFieldAtIndex(uint32_t idx)464b9c1b51eSKate Stone SBTypeMember SBType::GetFieldAtIndex(uint32_t idx) {
4651755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
466baf5664fSJonas Devlieghere 
467bf2331c4SGreg Clayton   SBTypeMember sb_type_member;
468b9c1b51eSKate Stone   if (IsValid()) {
469a1e5dc86SGreg Clayton     CompilerType this_type(m_opaque_sp->GetCompilerType(false));
470b9c1b51eSKate Stone     if (this_type.IsValid()) {
4711811b4faSGreg Clayton       uint64_t bit_offset = 0;
4721811b4faSGreg Clayton       uint32_t bitfield_bit_size = 0;
4731811b4faSGreg Clayton       bool is_bitfield = false;
474bf2331c4SGreg Clayton       std::string name_sstr;
475b9c1b51eSKate Stone       CompilerType field_type(this_type.GetFieldAtIndex(
476b9c1b51eSKate Stone           idx, name_sstr, &bit_offset, &bitfield_bit_size, &is_bitfield));
477b9c1b51eSKate Stone       if (field_type.IsValid()) {
478bf2331c4SGreg Clayton         ConstString name;
479bf2331c4SGreg Clayton         if (!name_sstr.empty())
480bf2331c4SGreg Clayton           name.SetCString(name_sstr.c_str());
481b9c1b51eSKate Stone         sb_type_member.reset(
482b9c1b51eSKate Stone             new TypeMemberImpl(TypeImplSP(new TypeImpl(field_type)), bit_offset,
483b9c1b51eSKate Stone                                name, bitfield_bit_size, is_bitfield));
48457ee3067SGreg Clayton       }
485bf2331c4SGreg Clayton     }
486bf2331c4SGreg Clayton   }
487d232abc3SJonas Devlieghere   return sb_type_member;
488bf2331c4SGreg Clayton }
489bf2331c4SGreg Clayton 
IsTypeComplete()490b9c1b51eSKate Stone bool SBType::IsTypeComplete() {
4911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
492baf5664fSJonas Devlieghere 
49386027e95SEnrico Granata   if (!IsValid())
49486027e95SEnrico Granata     return false;
495a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(false).IsCompleteType();
49686027e95SEnrico Granata }
49786027e95SEnrico Granata 
GetTypeFlags()498b9c1b51eSKate Stone uint32_t SBType::GetTypeFlags() {
4991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
500baf5664fSJonas Devlieghere 
501622be238SEnrico Granata   if (!IsValid())
502622be238SEnrico Granata     return 0;
503a1e5dc86SGreg Clayton   return m_opaque_sp->GetCompilerType(true).GetTypeInfo();
504622be238SEnrico Granata }
505622be238SEnrico Granata 
GetModule()5062c0cbc47SIlya Bukonkin lldb::SBModule SBType::GetModule() {
5071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
5082c0cbc47SIlya Bukonkin 
5092c0cbc47SIlya Bukonkin   lldb::SBModule sb_module;
5102c0cbc47SIlya Bukonkin   if (!IsValid())
511d232abc3SJonas Devlieghere     return sb_module;
5122c0cbc47SIlya Bukonkin 
5132c0cbc47SIlya Bukonkin   sb_module.SetSP(m_opaque_sp->GetModule());
514d232abc3SJonas Devlieghere   return sb_module;
5152c0cbc47SIlya Bukonkin }
5162c0cbc47SIlya Bukonkin 
GetName()517b9c1b51eSKate Stone const char *SBType::GetName() {
5181755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
519baf5664fSJonas Devlieghere 
5206f3533fbSEnrico Granata   if (!IsValid())
5216f3533fbSEnrico Granata     return "";
522dc4db5a6SEnrico Granata   return m_opaque_sp->GetName().GetCString();
523ba9fbbb8SGreg Clayton }
524ba9fbbb8SGreg Clayton 
GetDisplayTypeName()525b9c1b51eSKate Stone const char *SBType::GetDisplayTypeName() {
5261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
527baf5664fSJonas Devlieghere 
528e8daa2f8SEnrico Granata   if (!IsValid())
529e8daa2f8SEnrico Granata     return "";
530e8daa2f8SEnrico Granata   return m_opaque_sp->GetDisplayTypeName().GetCString();
531e8daa2f8SEnrico Granata }
532e8daa2f8SEnrico Granata 
GetTypeClass()533b9c1b51eSKate Stone lldb::TypeClass SBType::GetTypeClass() {
5341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
535baf5664fSJonas Devlieghere 
536bf2331c4SGreg Clayton   if (IsValid())
537a1e5dc86SGreg Clayton     return m_opaque_sp->GetCompilerType(true).GetTypeClass();
538bf2331c4SGreg Clayton   return lldb::eTypeClassInvalid;
539bf2331c4SGreg Clayton }
540bf2331c4SGreg Clayton 
GetNumberOfTemplateArguments()541b9c1b51eSKate Stone uint32_t SBType::GetNumberOfTemplateArguments() {
5421755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
543baf5664fSJonas Devlieghere 
544402230e6SGreg Clayton   if (IsValid())
545*2d5c43adSJonas Devlieghere     return m_opaque_sp->GetCompilerType(false).GetNumTemplateArguments(
546*2d5c43adSJonas Devlieghere         /*expand_pack=*/true);
547402230e6SGreg Clayton   return 0;
548402230e6SGreg Clayton }
549402230e6SGreg Clayton 
GetTemplateArgumentType(uint32_t idx)550b9c1b51eSKate Stone lldb::SBType SBType::GetTemplateArgumentType(uint32_t idx) {
5511755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
552baf5664fSJonas Devlieghere 
553769b21eaSPavel Labath   if (!IsValid())
554d232abc3SJonas Devlieghere     return SBType();
555769b21eaSPavel Labath 
556769b21eaSPavel Labath   CompilerType type;
557*2d5c43adSJonas Devlieghere   const bool expand_pack = true;
558769b21eaSPavel Labath   switch(GetTemplateArgumentKind(idx)) {
559769b21eaSPavel Labath     case eTemplateArgumentKindType:
560*2d5c43adSJonas Devlieghere       type = m_opaque_sp->GetCompilerType(false).GetTypeTemplateArgument(
561*2d5c43adSJonas Devlieghere           idx, expand_pack);
562769b21eaSPavel Labath       break;
563769b21eaSPavel Labath     case eTemplateArgumentKindIntegral:
564769b21eaSPavel Labath       type = m_opaque_sp->GetCompilerType(false)
565*2d5c43adSJonas Devlieghere                  .GetIntegralTemplateArgument(idx, expand_pack)
566f59056ffSPavel Labath                  ->type;
567769b21eaSPavel Labath       break;
568769b21eaSPavel Labath     default:
569769b21eaSPavel Labath       break;
570402230e6SGreg Clayton   }
571769b21eaSPavel Labath   if (type.IsValid())
572d232abc3SJonas Devlieghere     return SBType(type);
573d232abc3SJonas Devlieghere   return SBType();
574402230e6SGreg Clayton }
575402230e6SGreg Clayton 
GetTemplateArgumentKind(uint32_t idx)576b9c1b51eSKate Stone lldb::TemplateArgumentKind SBType::GetTemplateArgumentKind(uint32_t idx) {
5771755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
578baf5664fSJonas Devlieghere 
579402230e6SGreg Clayton   if (IsValid())
580*2d5c43adSJonas Devlieghere     return m_opaque_sp->GetCompilerType(false).GetTemplateArgumentKind(
581*2d5c43adSJonas Devlieghere         idx, /*expand_pack=*/true);
582769b21eaSPavel Labath   return eTemplateArgumentKindNull;
583402230e6SGreg Clayton }
584402230e6SGreg Clayton 
SBTypeList()585baf5664fSJonas Devlieghere SBTypeList::SBTypeList() : m_opaque_up(new TypeListImpl()) {
5861755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
587baf5664fSJonas Devlieghere }
588402230e6SGreg Clayton 
SBTypeList(const SBTypeList & rhs)589b9c1b51eSKate Stone SBTypeList::SBTypeList(const SBTypeList &rhs)
590d5b44036SJonas Devlieghere     : m_opaque_up(new TypeListImpl()) {
5911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
592baf5664fSJonas Devlieghere 
593b9c1b51eSKate Stone   for (uint32_t i = 0, rhs_size = const_cast<SBTypeList &>(rhs).GetSize();
594b9c1b51eSKate Stone        i < rhs_size; i++)
595bf2331c4SGreg Clayton     Append(const_cast<SBTypeList &>(rhs).GetTypeAtIndex(i));
596efabb123SGreg Clayton }
597efabb123SGreg Clayton 
IsValid()598baf5664fSJonas Devlieghere bool SBTypeList::IsValid() {
5991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
6007f5237bcSPavel Labath   return this->operator bool();
6017f5237bcSPavel Labath }
operator bool() const6027f5237bcSPavel Labath SBTypeList::operator bool() const {
6031755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
604baf5664fSJonas Devlieghere 
605248a1305SKonrad Kleine   return (m_opaque_up != nullptr);
606baf5664fSJonas Devlieghere }
60776ea84eaSJohnny Chen 
operator =(const SBTypeList & rhs)608b9c1b51eSKate Stone SBTypeList &SBTypeList::operator=(const SBTypeList &rhs) {
6091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
610baf5664fSJonas Devlieghere 
611b9c1b51eSKate Stone   if (this != &rhs) {
6121c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<TypeListImpl>();
613b9c1b51eSKate Stone     for (uint32_t i = 0, rhs_size = const_cast<SBTypeList &>(rhs).GetSize();
614b9c1b51eSKate Stone          i < rhs_size; i++)
615bf2331c4SGreg Clayton       Append(const_cast<SBTypeList &>(rhs).GetTypeAtIndex(i));
616efabb123SGreg Clayton   }
617d232abc3SJonas Devlieghere   return *this;
618efabb123SGreg Clayton }
619efabb123SGreg Clayton 
Append(SBType type)620b9c1b51eSKate Stone void SBTypeList::Append(SBType type) {
6211755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, type);
622baf5664fSJonas Devlieghere 
6236f3533fbSEnrico Granata   if (type.IsValid())
624d5b44036SJonas Devlieghere     m_opaque_up->Append(type.m_opaque_sp);
625ba9fbbb8SGreg Clayton }
626ba9fbbb8SGreg Clayton 
GetTypeAtIndex(uint32_t index)627b9c1b51eSKate Stone SBType SBTypeList::GetTypeAtIndex(uint32_t index) {
6281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, index);
629baf5664fSJonas Devlieghere 
630d5b44036SJonas Devlieghere   if (m_opaque_up)
631d232abc3SJonas Devlieghere     return SBType(m_opaque_up->GetTypeAtIndex(index));
632d232abc3SJonas Devlieghere   return SBType();
633ba9fbbb8SGreg Clayton }
634ba9fbbb8SGreg Clayton 
GetSize()635baf5664fSJonas Devlieghere uint32_t SBTypeList::GetSize() {
6361755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
637baf5664fSJonas Devlieghere 
638baf5664fSJonas Devlieghere   return m_opaque_up->GetSize();
639baf5664fSJonas Devlieghere }
640ba9fbbb8SGreg Clayton 
641866b7a65SJonas Devlieghere SBTypeList::~SBTypeList() = default;
642a17ec9d8SGreg Clayton 
SBTypeMember()6431755f5b1SJonas Devlieghere SBTypeMember::SBTypeMember() { LLDB_INSTRUMENT_VA(this); }
644bf2331c4SGreg Clayton 
645866b7a65SJonas Devlieghere SBTypeMember::~SBTypeMember() = default;
646bf2331c4SGreg Clayton 
SBTypeMember(const SBTypeMember & rhs)647a3436f73SKazu Hirata SBTypeMember::SBTypeMember(const SBTypeMember &rhs) {
6481755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
649baf5664fSJonas Devlieghere 
650b9c1b51eSKate Stone   if (this != &rhs) {
651bf2331c4SGreg Clayton     if (rhs.IsValid())
6521c0bbe43SJonas Devlieghere       m_opaque_up = std::make_unique<TypeMemberImpl>(rhs.ref());
653bf2331c4SGreg Clayton   }
654bf2331c4SGreg Clayton }
655bf2331c4SGreg Clayton 
operator =(const lldb::SBTypeMember & rhs)656b9c1b51eSKate Stone lldb::SBTypeMember &SBTypeMember::operator=(const lldb::SBTypeMember &rhs) {
6571755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
658baf5664fSJonas Devlieghere 
659b9c1b51eSKate Stone   if (this != &rhs) {
660bf2331c4SGreg Clayton     if (rhs.IsValid())
6611c0bbe43SJonas Devlieghere       m_opaque_up = std::make_unique<TypeMemberImpl>(rhs.ref());
662bf2331c4SGreg Clayton   }
663d232abc3SJonas Devlieghere   return *this;
664bf2331c4SGreg Clayton }
665bf2331c4SGreg Clayton 
IsValid() const666baf5664fSJonas Devlieghere bool SBTypeMember::IsValid() const {
6671755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
6687f5237bcSPavel Labath   return this->operator bool();
6697f5237bcSPavel Labath }
operator bool() const6707f5237bcSPavel Labath SBTypeMember::operator bool() const {
6711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
672baf5664fSJonas Devlieghere 
673baf5664fSJonas Devlieghere   return m_opaque_up.get();
674baf5664fSJonas Devlieghere }
675bf2331c4SGreg Clayton 
GetName()676b9c1b51eSKate Stone const char *SBTypeMember::GetName() {
6771755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
678baf5664fSJonas Devlieghere 
679d5b44036SJonas Devlieghere   if (m_opaque_up)
680d5b44036SJonas Devlieghere     return m_opaque_up->GetName().GetCString();
681248a1305SKonrad Kleine   return nullptr;
682bf2331c4SGreg Clayton }
683bf2331c4SGreg Clayton 
GetType()684b9c1b51eSKate Stone SBType SBTypeMember::GetType() {
6851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
686baf5664fSJonas Devlieghere 
687bf2331c4SGreg Clayton   SBType sb_type;
688d5b44036SJonas Devlieghere   if (m_opaque_up) {
689d5b44036SJonas Devlieghere     sb_type.SetSP(m_opaque_up->GetTypeImpl());
690bf2331c4SGreg Clayton   }
691d232abc3SJonas Devlieghere   return sb_type;
692bf2331c4SGreg Clayton }
693bf2331c4SGreg Clayton 
GetOffsetInBytes()694b9c1b51eSKate Stone uint64_t SBTypeMember::GetOffsetInBytes() {
6951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
696baf5664fSJonas Devlieghere 
697d5b44036SJonas Devlieghere   if (m_opaque_up)
698d5b44036SJonas Devlieghere     return m_opaque_up->GetBitOffset() / 8u;
699bf2331c4SGreg Clayton   return 0;
700bf2331c4SGreg Clayton }
701bf2331c4SGreg Clayton 
GetOffsetInBits()702b9c1b51eSKate Stone uint64_t SBTypeMember::GetOffsetInBits() {
7031755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
704baf5664fSJonas Devlieghere 
705d5b44036SJonas Devlieghere   if (m_opaque_up)
706d5b44036SJonas Devlieghere     return m_opaque_up->GetBitOffset();
707da7bc7d0SGreg Clayton   return 0;
708da7bc7d0SGreg Clayton }
709da7bc7d0SGreg Clayton 
IsBitfield()710b9c1b51eSKate Stone bool SBTypeMember::IsBitfield() {
7111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
712baf5664fSJonas Devlieghere 
713d5b44036SJonas Devlieghere   if (m_opaque_up)
714d5b44036SJonas Devlieghere     return m_opaque_up->GetIsBitfield();
7151811b4faSGreg Clayton   return false;
7161811b4faSGreg Clayton }
7171811b4faSGreg Clayton 
GetBitfieldSizeInBits()718b9c1b51eSKate Stone uint32_t SBTypeMember::GetBitfieldSizeInBits() {
7191755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
720baf5664fSJonas Devlieghere 
721d5b44036SJonas Devlieghere   if (m_opaque_up)
722d5b44036SJonas Devlieghere     return m_opaque_up->GetBitfieldBitSize();
7231811b4faSGreg Clayton   return 0;
7241811b4faSGreg Clayton }
7251811b4faSGreg Clayton 
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)726b9c1b51eSKate Stone bool SBTypeMember::GetDescription(lldb::SBStream &description,
727b9c1b51eSKate Stone                                   lldb::DescriptionLevel description_level) {
7281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
729baf5664fSJonas Devlieghere 
730da7bc7d0SGreg Clayton   Stream &strm = description.ref();
731da7bc7d0SGreg Clayton 
732d5b44036SJonas Devlieghere   if (m_opaque_up) {
733d5b44036SJonas Devlieghere     const uint32_t bit_offset = m_opaque_up->GetBitOffset();
7341811b4faSGreg Clayton     const uint32_t byte_offset = bit_offset / 8u;
7351811b4faSGreg Clayton     const uint32_t byte_bit_offset = bit_offset % 8u;
736d5b44036SJonas Devlieghere     const char *name = m_opaque_up->GetName().GetCString();
7371811b4faSGreg Clayton     if (byte_bit_offset)
7381811b4faSGreg Clayton       strm.Printf("+%u + %u bits: (", byte_offset, byte_bit_offset);
7391811b4faSGreg Clayton     else
740da7bc7d0SGreg Clayton       strm.Printf("+%u: (", byte_offset);
741da7bc7d0SGreg Clayton 
742d5b44036SJonas Devlieghere     TypeImplSP type_impl_sp(m_opaque_up->GetTypeImpl());
743da7bc7d0SGreg Clayton     if (type_impl_sp)
744da7bc7d0SGreg Clayton       type_impl_sp->GetDescription(strm, description_level);
745da7bc7d0SGreg Clayton 
746da7bc7d0SGreg Clayton     strm.Printf(") %s", name);
747d5b44036SJonas Devlieghere     if (m_opaque_up->GetIsBitfield()) {
748d5b44036SJonas Devlieghere       const uint32_t bitfield_bit_size = m_opaque_up->GetBitfieldBitSize();
7491811b4faSGreg Clayton       strm.Printf(" : %u", bitfield_bit_size);
7501811b4faSGreg Clayton     }
751b9c1b51eSKate Stone   } else {
752da7bc7d0SGreg Clayton     strm.PutCString("No value");
753da7bc7d0SGreg Clayton   }
754da7bc7d0SGreg Clayton   return true;
755da7bc7d0SGreg Clayton }
756da7bc7d0SGreg Clayton 
reset(TypeMemberImpl * type_member_impl)757b9c1b51eSKate Stone void SBTypeMember::reset(TypeMemberImpl *type_member_impl) {
758d5b44036SJonas Devlieghere   m_opaque_up.reset(type_member_impl);
759bf2331c4SGreg Clayton }
760bf2331c4SGreg Clayton 
ref()761b9c1b51eSKate Stone TypeMemberImpl &SBTypeMember::ref() {
762248a1305SKonrad Kleine   if (m_opaque_up == nullptr)
7631c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<TypeMemberImpl>();
764d5b44036SJonas Devlieghere   return *m_opaque_up;
765bf2331c4SGreg Clayton }
766bf2331c4SGreg Clayton 
ref() const767d5b44036SJonas Devlieghere const TypeMemberImpl &SBTypeMember::ref() const { return *m_opaque_up; }
7686c42cb11SEnrico Granata 
SBTypeMemberFunction()7691755f5b1SJonas Devlieghere SBTypeMemberFunction::SBTypeMemberFunction() { LLDB_INSTRUMENT_VA(this); }
7706c42cb11SEnrico Granata 
771866b7a65SJonas Devlieghere SBTypeMemberFunction::~SBTypeMemberFunction() = default;
7726c42cb11SEnrico Granata 
SBTypeMemberFunction(const SBTypeMemberFunction & rhs)773b9c1b51eSKate Stone SBTypeMemberFunction::SBTypeMemberFunction(const SBTypeMemberFunction &rhs)
774baf5664fSJonas Devlieghere     : m_opaque_sp(rhs.m_opaque_sp) {
7751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
776baf5664fSJonas Devlieghere }
7776c42cb11SEnrico Granata 
778b9c1b51eSKate Stone lldb::SBTypeMemberFunction &SBTypeMemberFunction::
operator =(const lldb::SBTypeMemberFunction & rhs)779b9c1b51eSKate Stone operator=(const lldb::SBTypeMemberFunction &rhs) {
7801755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
781baf5664fSJonas Devlieghere 
7826c42cb11SEnrico Granata   if (this != &rhs)
7836c42cb11SEnrico Granata     m_opaque_sp = rhs.m_opaque_sp;
784d232abc3SJonas Devlieghere   return *this;
7856c42cb11SEnrico Granata }
7866c42cb11SEnrico Granata 
IsValid() const787baf5664fSJonas Devlieghere bool SBTypeMemberFunction::IsValid() const {
7881755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
7897f5237bcSPavel Labath   return this->operator bool();
7907f5237bcSPavel Labath }
operator bool() const7917f5237bcSPavel Labath SBTypeMemberFunction::operator bool() const {
7921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
793baf5664fSJonas Devlieghere 
794baf5664fSJonas Devlieghere   return m_opaque_sp.get();
795baf5664fSJonas Devlieghere }
7966c42cb11SEnrico Granata 
GetName()797b9c1b51eSKate Stone const char *SBTypeMemberFunction::GetName() {
7981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
799baf5664fSJonas Devlieghere 
8006c42cb11SEnrico Granata   if (m_opaque_sp)
8016c42cb11SEnrico Granata     return m_opaque_sp->GetName().GetCString();
802248a1305SKonrad Kleine   return nullptr;
8036c42cb11SEnrico Granata }
8046c42cb11SEnrico Granata 
GetDemangledName()805b9c1b51eSKate Stone const char *SBTypeMemberFunction::GetDemangledName() {
8061755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
807baf5664fSJonas Devlieghere 
808b9c1b51eSKate Stone   if (m_opaque_sp) {
809fe68904fSGreg Clayton     ConstString mangled_str = m_opaque_sp->GetMangledName();
810b9c1b51eSKate Stone     if (mangled_str) {
811939411c1SAdrian Prantl       Mangled mangled(mangled_str);
81222b04487SAlex Langford       return mangled.GetDemangledName().GetCString();
813fe68904fSGreg Clayton     }
814fe68904fSGreg Clayton   }
815248a1305SKonrad Kleine   return nullptr;
816fe68904fSGreg Clayton }
817fe68904fSGreg Clayton 
GetMangledName()818b9c1b51eSKate Stone const char *SBTypeMemberFunction::GetMangledName() {
8191755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
820baf5664fSJonas Devlieghere 
821fe68904fSGreg Clayton   if (m_opaque_sp)
822fe68904fSGreg Clayton     return m_opaque_sp->GetMangledName().GetCString();
823248a1305SKonrad Kleine   return nullptr;
824fe68904fSGreg Clayton }
825fe68904fSGreg Clayton 
GetType()826b9c1b51eSKate Stone SBType SBTypeMemberFunction::GetType() {
8271755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
828baf5664fSJonas Devlieghere 
8296c42cb11SEnrico Granata   SBType sb_type;
830b9c1b51eSKate Stone   if (m_opaque_sp) {
8316c42cb11SEnrico Granata     sb_type.SetSP(lldb::TypeImplSP(new TypeImpl(m_opaque_sp->GetType())));
8326c42cb11SEnrico Granata   }
833d232abc3SJonas Devlieghere   return sb_type;
83447caf9a9SEnrico Granata }
8356c42cb11SEnrico Granata 
GetReturnType()836b9c1b51eSKate Stone lldb::SBType SBTypeMemberFunction::GetReturnType() {
8371755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
838baf5664fSJonas Devlieghere 
83947caf9a9SEnrico Granata   SBType sb_type;
840b9c1b51eSKate Stone   if (m_opaque_sp) {
84147caf9a9SEnrico Granata     sb_type.SetSP(lldb::TypeImplSP(new TypeImpl(m_opaque_sp->GetReturnType())));
84247caf9a9SEnrico Granata   }
843d232abc3SJonas Devlieghere   return sb_type;
84447caf9a9SEnrico Granata }
84547caf9a9SEnrico Granata 
GetNumberOfArguments()846b9c1b51eSKate Stone uint32_t SBTypeMemberFunction::GetNumberOfArguments() {
8471755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
848baf5664fSJonas Devlieghere 
84947caf9a9SEnrico Granata   if (m_opaque_sp)
85047caf9a9SEnrico Granata     return m_opaque_sp->GetNumArguments();
85147caf9a9SEnrico Granata   return 0;
85247caf9a9SEnrico Granata }
85347caf9a9SEnrico Granata 
GetArgumentTypeAtIndex(uint32_t i)854b9c1b51eSKate Stone lldb::SBType SBTypeMemberFunction::GetArgumentTypeAtIndex(uint32_t i) {
8551755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, i);
856baf5664fSJonas Devlieghere 
85747caf9a9SEnrico Granata   SBType sb_type;
858b9c1b51eSKate Stone   if (m_opaque_sp) {
859b9c1b51eSKate Stone     sb_type.SetSP(
860b9c1b51eSKate Stone         lldb::TypeImplSP(new TypeImpl(m_opaque_sp->GetArgumentAtIndex(i))));
86147caf9a9SEnrico Granata   }
862d232abc3SJonas Devlieghere   return sb_type;
8636c42cb11SEnrico Granata }
8646c42cb11SEnrico Granata 
GetKind()865b9c1b51eSKate Stone lldb::MemberFunctionKind SBTypeMemberFunction::GetKind() {
8661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
867baf5664fSJonas Devlieghere 
8686c42cb11SEnrico Granata   if (m_opaque_sp)
8696c42cb11SEnrico Granata     return m_opaque_sp->GetKind();
8706c42cb11SEnrico Granata   return lldb::eMemberFunctionKindUnknown;
8716c42cb11SEnrico Granata }
8726c42cb11SEnrico Granata 
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)873b9c1b51eSKate Stone bool SBTypeMemberFunction::GetDescription(
874b9c1b51eSKate Stone     lldb::SBStream &description, lldb::DescriptionLevel description_level) {
8751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
876baf5664fSJonas Devlieghere 
8776c42cb11SEnrico Granata   Stream &strm = description.ref();
8786c42cb11SEnrico Granata 
8796c42cb11SEnrico Granata   if (m_opaque_sp)
8806c42cb11SEnrico Granata     return m_opaque_sp->GetDescription(strm);
8816c42cb11SEnrico Granata 
8826c42cb11SEnrico Granata   return false;
8836c42cb11SEnrico Granata }
8846c42cb11SEnrico Granata 
reset(TypeMemberFunctionImpl * type_member_impl)885b9c1b51eSKate Stone void SBTypeMemberFunction::reset(TypeMemberFunctionImpl *type_member_impl) {
8866c42cb11SEnrico Granata   m_opaque_sp.reset(type_member_impl);
8876c42cb11SEnrico Granata }
8886c42cb11SEnrico Granata 
ref()889b9c1b51eSKate Stone TypeMemberFunctionImpl &SBTypeMemberFunction::ref() {
8906c42cb11SEnrico Granata   if (!m_opaque_sp)
891796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<TypeMemberFunctionImpl>();
8926c42cb11SEnrico Granata   return *m_opaque_sp.get();
8936c42cb11SEnrico Granata }
8946c42cb11SEnrico Granata 
ref() const895b9c1b51eSKate Stone const TypeMemberFunctionImpl &SBTypeMemberFunction::ref() const {
8966c42cb11SEnrico Granata   return *m_opaque_sp.get();
8976c42cb11SEnrico Granata }
898