180814287SRaphael Isemann //===-- Type.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 
976e47d48SRaphael Isemann #include <cstdio>
10fcf334b8STamas Berghammer 
1130fdc8d8SChris Lattner #include "lldb/Core/Module.h"
12666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h"
13666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h"
14c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
150e252e38SAlex Langford #include "lldb/Utility/Log.h"
16d821c997SPavel Labath #include "lldb/Utility/Scalar.h"
17bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
1830fdc8d8SChris Lattner 
19a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h"
2030fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h"
2130fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContextScope.h"
2230fdc8d8SChris Lattner #include "lldb/Symbol/SymbolFile.h"
237277284fSSean Callanan #include "lldb/Symbol/SymbolVendor.h"
2430fdc8d8SChris Lattner #include "lldb/Symbol/Type.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/TypeList.h"
2656939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
2930fdc8d8SChris Lattner #include "lldb/Target/Process.h"
30514487e8SGreg Clayton #include "lldb/Target/Target.h"
3130fdc8d8SChris Lattner 
327bc31332SGreg Clayton #include "llvm/ADT/StringRef.h"
337bc31332SGreg Clayton 
341be10fcaSGreg Clayton using namespace lldb;
351a65ae11SGreg Clayton using namespace lldb_private;
361be10fcaSGreg Clayton 
contextMatches(llvm::ArrayRef<CompilerContext> context_chain,llvm::ArrayRef<CompilerContext> pattern)37330ae19aSAdrian Prantl bool lldb_private::contextMatches(llvm::ArrayRef<CompilerContext> context_chain,
38330ae19aSAdrian Prantl                                   llvm::ArrayRef<CompilerContext> pattern) {
39330ae19aSAdrian Prantl   auto ctx = context_chain.begin();
40330ae19aSAdrian Prantl   auto ctx_end = context_chain.end();
41330ae19aSAdrian Prantl   for (const CompilerContext &pat : pattern) {
42330ae19aSAdrian Prantl     // Early exit if the pattern is too long.
43330ae19aSAdrian Prantl     if (ctx == ctx_end)
44330ae19aSAdrian Prantl       return false;
45330ae19aSAdrian Prantl     if (*ctx != pat) {
46330ae19aSAdrian Prantl       // Skip any number of module matches.
47330ae19aSAdrian Prantl       if (pat.kind == CompilerContextKind::AnyModule) {
48330ae19aSAdrian Prantl         // Greedily match 0..n modules.
49330ae19aSAdrian Prantl         ctx = std::find_if(ctx, ctx_end, [](const CompilerContext &ctx) {
50330ae19aSAdrian Prantl           return ctx.kind != CompilerContextKind::Module;
51330ae19aSAdrian Prantl         });
52330ae19aSAdrian Prantl         continue;
53330ae19aSAdrian Prantl       }
54330ae19aSAdrian Prantl       // See if there is a kind mismatch; they should have 1 bit in common.
55330ae19aSAdrian Prantl       if (((uint16_t)ctx->kind & (uint16_t)pat.kind) == 0)
56330ae19aSAdrian Prantl         return false;
57330ae19aSAdrian Prantl       // The name is ignored for AnyModule, but not for AnyType.
58330ae19aSAdrian Prantl       if (pat.kind != CompilerContextKind::AnyModule && ctx->name != pat.name)
59330ae19aSAdrian Prantl         return false;
60330ae19aSAdrian Prantl     }
61330ae19aSAdrian Prantl     ++ctx;
62330ae19aSAdrian Prantl   }
63330ae19aSAdrian Prantl   return true;
64330ae19aSAdrian Prantl }
65330ae19aSAdrian Prantl 
Dump() const66b9c1b51eSKate Stone void CompilerContext::Dump() const {
67330ae19aSAdrian Prantl   switch (kind) {
68330ae19aSAdrian Prantl   default:
69b9c1b51eSKate Stone     printf("Invalid");
70b9c1b51eSKate Stone     break;
71b9c1b51eSKate Stone   case CompilerContextKind::TranslationUnit:
72b9c1b51eSKate Stone     printf("TranslationUnit");
73b9c1b51eSKate Stone     break;
74b9c1b51eSKate Stone   case CompilerContextKind::Module:
75b9c1b51eSKate Stone     printf("Module");
76b9c1b51eSKate Stone     break;
77b9c1b51eSKate Stone   case CompilerContextKind::Namespace:
78b9c1b51eSKate Stone     printf("Namespace");
79b9c1b51eSKate Stone     break;
80b9c1b51eSKate Stone   case CompilerContextKind::Class:
81b9c1b51eSKate Stone     printf("Class");
82b9c1b51eSKate Stone     break;
83330ae19aSAdrian Prantl   case CompilerContextKind::Struct:
84b9c1b51eSKate Stone     printf("Structure");
85b9c1b51eSKate Stone     break;
86b9c1b51eSKate Stone   case CompilerContextKind::Union:
87b9c1b51eSKate Stone     printf("Union");
88b9c1b51eSKate Stone     break;
89b9c1b51eSKate Stone   case CompilerContextKind::Function:
90b9c1b51eSKate Stone     printf("Function");
91b9c1b51eSKate Stone     break;
92b9c1b51eSKate Stone   case CompilerContextKind::Variable:
93b9c1b51eSKate Stone     printf("Variable");
94b9c1b51eSKate Stone     break;
95330ae19aSAdrian Prantl   case CompilerContextKind::Enum:
96b9c1b51eSKate Stone     printf("Enumeration");
97b9c1b51eSKate Stone     break;
98b9c1b51eSKate Stone   case CompilerContextKind::Typedef:
99b9c1b51eSKate Stone     printf("Typedef");
100b9c1b51eSKate Stone     break;
101330ae19aSAdrian Prantl   case CompilerContextKind::AnyModule:
102330ae19aSAdrian Prantl     printf("AnyModule");
103330ae19aSAdrian Prantl     break;
104330ae19aSAdrian Prantl   case CompilerContextKind::AnyType:
105330ae19aSAdrian Prantl     printf("AnyType");
106330ae19aSAdrian Prantl     break;
107e6b36cddSGreg Clayton   }
108e6b36cddSGreg Clayton   printf("(\"%s\")\n", name.GetCString());
109e6b36cddSGreg Clayton }
110e6b36cddSGreg Clayton 
111b9c1b51eSKate Stone class TypeAppendVisitor {
112f02500c7SGreg Clayton public:
TypeAppendVisitor(TypeListImpl & type_list)113b9c1b51eSKate Stone   TypeAppendVisitor(TypeListImpl &type_list) : m_type_list(type_list) {}
114f02500c7SGreg Clayton 
operator ()(const lldb::TypeSP & type)115b9c1b51eSKate Stone   bool operator()(const lldb::TypeSP &type) {
116f02500c7SGreg Clayton     m_type_list.Append(TypeImplSP(new TypeImpl(type)));
117f02500c7SGreg Clayton     return true;
118f02500c7SGreg Clayton   }
119f02500c7SGreg Clayton 
120f02500c7SGreg Clayton private:
121f02500c7SGreg Clayton   TypeListImpl &m_type_list;
122f02500c7SGreg Clayton };
123f02500c7SGreg Clayton 
Append(const lldb_private::TypeList & type_list)124b9c1b51eSKate Stone void TypeListImpl::Append(const lldb_private::TypeList &type_list) {
125f02500c7SGreg Clayton   TypeAppendVisitor cb(*this);
126f02500c7SGreg Clayton   type_list.ForEach(cb);
127f02500c7SGreg Clayton }
128f02500c7SGreg Clayton 
SymbolFileType(SymbolFile & symbol_file,const lldb::TypeSP & type_sp)129b9c1b51eSKate Stone SymbolFileType::SymbolFileType(SymbolFile &symbol_file,
130b9c1b51eSKate Stone                                const lldb::TypeSP &type_sp)
131b9c1b51eSKate Stone     : UserID(type_sp ? type_sp->GetID() : LLDB_INVALID_UID),
132b9c1b51eSKate Stone       m_symbol_file(symbol_file), m_type_sp(type_sp) {}
133e6b36cddSGreg Clayton 
GetType()134b9c1b51eSKate Stone Type *SymbolFileType::GetType() {
135b9c1b51eSKate Stone   if (!m_type_sp) {
136e72dfb32SGreg Clayton     Type *resolved_type = m_symbol_file.ResolveTypeUID(GetID());
137e72dfb32SGreg Clayton     if (resolved_type)
138e72dfb32SGreg Clayton       m_type_sp = resolved_type->shared_from_this();
139e72dfb32SGreg Clayton   }
140d1767f05SGreg Clayton   return m_type_sp.get();
141d1767f05SGreg Clayton }
142d1767f05SGreg Clayton 
Type(lldb::user_id_t uid,SymbolFile * symbol_file,ConstString name,llvm::Optional<uint64_t> byte_size,SymbolContextScope * context,user_id_t encoding_uid,EncodingDataType encoding_uid_type,const Declaration & decl,const CompilerType & compiler_type,ResolveState compiler_type_resolve_state,uint32_t opaque_payload)143d4f18f11SAdrian Prantl Type::Type(lldb::user_id_t uid, SymbolFile *symbol_file, ConstString name,
144d4f18f11SAdrian Prantl            llvm::Optional<uint64_t> byte_size, SymbolContextScope *context,
145d4f18f11SAdrian Prantl            user_id_t encoding_uid, EncodingDataType encoding_uid_type,
146d4f18f11SAdrian Prantl            const Declaration &decl, const CompilerType &compiler_type,
1477b06cb45SAdrian Prantl            ResolveState compiler_type_resolve_state, uint32_t opaque_payload)
148b9c1b51eSKate Stone     : std::enable_shared_from_this<Type>(), UserID(uid), m_name(name),
14928c878aeSShafik Yaghmour       m_symbol_file(symbol_file), m_context(context),
150b9c1b51eSKate Stone       m_encoding_uid(encoding_uid), m_encoding_uid_type(encoding_uid_type),
151d4f18f11SAdrian Prantl       m_decl(decl), m_compiler_type(compiler_type),
1527b06cb45SAdrian Prantl       m_compiler_type_resolve_state(compiler_type ? compiler_type_resolve_state
153d4f18f11SAdrian Prantl                                                   : ResolveState::Unresolved),
1547b06cb45SAdrian Prantl       m_payload(opaque_payload) {
155d13777aaSAdrian Prantl   if (byte_size) {
156d13777aaSAdrian Prantl     m_byte_size = *byte_size;
157d13777aaSAdrian Prantl     m_byte_size_has_value = true;
158d13777aaSAdrian Prantl   } else {
159d13777aaSAdrian Prantl     m_byte_size = 0;
160d13777aaSAdrian Prantl     m_byte_size_has_value = false;
161d13777aaSAdrian Prantl   }
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
Type()164b9c1b51eSKate Stone Type::Type()
165*4871dfc6SSlava Gurevich     : std::enable_shared_from_this<Type>(), UserID(0), m_name("<INVALID TYPE>"),
166*4871dfc6SSlava Gurevich       m_payload(0) {
167d4f18f11SAdrian Prantl   m_byte_size = 0;
168d4f18f11SAdrian Prantl   m_byte_size_has_value = false;
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
GetDescription(Stream * s,lldb::DescriptionLevel level,bool show_name,ExecutionContextScope * exe_scope)171b9c1b51eSKate Stone void Type::GetDescription(Stream *s, lldb::DescriptionLevel level,
17202f58373SAdrian Prantl                           bool show_name, ExecutionContextScope *exe_scope) {
1730c5cd90dSGreg Clayton   *s << "id = " << (const UserID &)*this;
1740c5cd90dSGreg Clayton 
1756dbd3983SGreg Clayton   // Call the name accessor to make sure we resolve the type name
176b9c1b51eSKate Stone   if (show_name) {
1770e4c4821SAdrian Prantl     ConstString type_name = GetName();
178b9c1b51eSKate Stone     if (type_name) {
17984db9105SGreg Clayton       *s << ", name = \"" << type_name << '"';
18084db9105SGreg Clayton       ConstString qualified_type_name(GetQualifiedName());
181b9c1b51eSKate Stone       if (qualified_type_name != type_name) {
18284db9105SGreg Clayton         *s << ", qualified = \"" << qualified_type_name << '"';
18384db9105SGreg Clayton       }
18484db9105SGreg Clayton     }
18584db9105SGreg Clayton   }
186c9800667SGreg Clayton 
1876dbd3983SGreg Clayton   // Call the get byte size accesor so we resolve our byte size
18802f58373SAdrian Prantl   if (GetByteSize(exe_scope))
189faac1118SGreg Clayton     s->Printf(", byte-size = %" PRIu64, m_byte_size);
1906dbd3983SGreg Clayton   bool show_fullpaths = (level == lldb::eDescriptionLevelVerbose);
1916dbd3983SGreg Clayton   m_decl.Dump(s, show_fullpaths);
1920c5cd90dSGreg Clayton 
193b9c1b51eSKate Stone   if (m_compiler_type.IsValid()) {
1943ad353f3SBruce Mitchener     *s << ", compiler_type = \"";
19599558cc4SGreg Clayton     GetForwardCompilerType().DumpTypeDescription(s);
196c9800667SGreg Clayton     *s << '"';
197b9c1b51eSKate Stone   } else if (m_encoding_uid != LLDB_INVALID_UID) {
198d01b2953SDaniel Malea     s->Printf(", type_uid = 0x%8.8" PRIx64, m_encoding_uid);
199b9c1b51eSKate Stone     switch (m_encoding_uid_type) {
200b9c1b51eSKate Stone     case eEncodingInvalid:
201b9c1b51eSKate Stone       break;
202b9c1b51eSKate Stone     case eEncodingIsUID:
203b9c1b51eSKate Stone       s->PutCString(" (unresolved type)");
204b9c1b51eSKate Stone       break;
205b9c1b51eSKate Stone     case eEncodingIsConstUID:
206b9c1b51eSKate Stone       s->PutCString(" (unresolved const type)");
207b9c1b51eSKate Stone       break;
208b9c1b51eSKate Stone     case eEncodingIsRestrictUID:
209b9c1b51eSKate Stone       s->PutCString(" (unresolved restrict type)");
210b9c1b51eSKate Stone       break;
211b9c1b51eSKate Stone     case eEncodingIsVolatileUID:
212b9c1b51eSKate Stone       s->PutCString(" (unresolved volatile type)");
213b9c1b51eSKate Stone       break;
214d0fb7a47SRaphael Isemann     case eEncodingIsAtomicUID:
215d0fb7a47SRaphael Isemann       s->PutCString(" (unresolved atomic type)");
216d0fb7a47SRaphael Isemann       break;
217b9c1b51eSKate Stone     case eEncodingIsTypedefUID:
218b9c1b51eSKate Stone       s->PutCString(" (unresolved typedef)");
219b9c1b51eSKate Stone       break;
220b9c1b51eSKate Stone     case eEncodingIsPointerUID:
221b9c1b51eSKate Stone       s->PutCString(" (unresolved pointer)");
222b9c1b51eSKate Stone       break;
223b9c1b51eSKate Stone     case eEncodingIsLValueReferenceUID:
224b9c1b51eSKate Stone       s->PutCString(" (unresolved L value reference)");
225b9c1b51eSKate Stone       break;
226b9c1b51eSKate Stone     case eEncodingIsRValueReferenceUID:
227b9c1b51eSKate Stone       s->PutCString(" (unresolved R value reference)");
228b9c1b51eSKate Stone       break;
229b9c1b51eSKate Stone     case eEncodingIsSyntheticUID:
230b9c1b51eSKate Stone       s->PutCString(" (synthetic type)");
231b9c1b51eSKate Stone       break;
2320c5cd90dSGreg Clayton     }
2330c5cd90dSGreg Clayton   }
2340c5cd90dSGreg Clayton }
2350c5cd90dSGreg Clayton 
Dump(Stream * s,bool show_context,lldb::DescriptionLevel level)236681466f5SAdrian Prantl void Type::Dump(Stream *s, bool show_context, lldb::DescriptionLevel level) {
237324a1036SSaleem Abdulrasool   s->Printf("%p: ", static_cast<void *>(this));
23830fdc8d8SChris Lattner   s->Indent();
239324a1036SSaleem Abdulrasool   *s << "Type" << static_cast<const UserID &>(*this) << ' ';
24030fdc8d8SChris Lattner   if (m_name)
24130fdc8d8SChris Lattner     *s << ", name = \"" << m_name << "\"";
24230fdc8d8SChris Lattner 
243d13777aaSAdrian Prantl   if (m_byte_size_has_value)
244faac1118SGreg Clayton     s->Printf(", size = %" PRIu64, m_byte_size);
24530fdc8d8SChris Lattner 
246b9c1b51eSKate Stone   if (show_context && m_context != nullptr) {
24730fdc8d8SChris Lattner     s->PutCString(", context = ( ");
24830fdc8d8SChris Lattner     m_context->DumpSymbolContext(s);
24930fdc8d8SChris Lattner     s->PutCString(" )");
25030fdc8d8SChris Lattner   }
25130fdc8d8SChris Lattner 
2526dbd3983SGreg Clayton   bool show_fullpaths = false;
2536dbd3983SGreg Clayton   m_decl.Dump(s, show_fullpaths);
25430fdc8d8SChris Lattner 
255b9c1b51eSKate Stone   if (m_compiler_type.IsValid()) {
2563ad353f3SBruce Mitchener     *s << ", compiler_type = " << m_compiler_type.GetOpaqueQualType() << ' ';
257681466f5SAdrian Prantl     GetForwardCompilerType().DumpTypeDescription(s, level);
258b9c1b51eSKate Stone   } else if (m_encoding_uid != LLDB_INVALID_UID) {
259957d9a03SPavel Labath     s->Format(", type_data = {0:x-16}", m_encoding_uid);
260b9c1b51eSKate Stone     switch (m_encoding_uid_type) {
261b9c1b51eSKate Stone     case eEncodingInvalid:
262b9c1b51eSKate Stone       break;
263b9c1b51eSKate Stone     case eEncodingIsUID:
264b9c1b51eSKate Stone       s->PutCString(" (unresolved type)");
265b9c1b51eSKate Stone       break;
266b9c1b51eSKate Stone     case eEncodingIsConstUID:
267b9c1b51eSKate Stone       s->PutCString(" (unresolved const type)");
268b9c1b51eSKate Stone       break;
269b9c1b51eSKate Stone     case eEncodingIsRestrictUID:
270b9c1b51eSKate Stone       s->PutCString(" (unresolved restrict type)");
271b9c1b51eSKate Stone       break;
272b9c1b51eSKate Stone     case eEncodingIsVolatileUID:
273b9c1b51eSKate Stone       s->PutCString(" (unresolved volatile type)");
274b9c1b51eSKate Stone       break;
275d0fb7a47SRaphael Isemann     case eEncodingIsAtomicUID:
276d0fb7a47SRaphael Isemann       s->PutCString(" (unresolved atomic type)");
277d0fb7a47SRaphael Isemann       break;
278b9c1b51eSKate Stone     case eEncodingIsTypedefUID:
279b9c1b51eSKate Stone       s->PutCString(" (unresolved typedef)");
280b9c1b51eSKate Stone       break;
281b9c1b51eSKate Stone     case eEncodingIsPointerUID:
282b9c1b51eSKate Stone       s->PutCString(" (unresolved pointer)");
283b9c1b51eSKate Stone       break;
284b9c1b51eSKate Stone     case eEncodingIsLValueReferenceUID:
285b9c1b51eSKate Stone       s->PutCString(" (unresolved L value reference)");
286b9c1b51eSKate Stone       break;
287b9c1b51eSKate Stone     case eEncodingIsRValueReferenceUID:
288b9c1b51eSKate Stone       s->PutCString(" (unresolved R value reference)");
289b9c1b51eSKate Stone       break;
290b9c1b51eSKate Stone     case eEncodingIsSyntheticUID:
291b9c1b51eSKate Stone       s->PutCString(" (synthetic type)");
292b9c1b51eSKate Stone       break;
29330fdc8d8SChris Lattner     }
29430fdc8d8SChris Lattner   }
29530fdc8d8SChris Lattner 
29630fdc8d8SChris Lattner   //
29730fdc8d8SChris Lattner   //  if (m_access)
29830fdc8d8SChris Lattner   //      s->Printf(", access = %u", m_access);
29930fdc8d8SChris Lattner   s->EOL();
30030fdc8d8SChris Lattner }
30130fdc8d8SChris Lattner 
GetName()3020e4c4821SAdrian Prantl ConstString Type::GetName() {
303e3055942SGreg Clayton   if (!m_name)
30430ce956aSRaphael Isemann     m_name = GetForwardCompilerType().GetTypeName();
30530fdc8d8SChris Lattner   return m_name;
30630fdc8d8SChris Lattner }
30730fdc8d8SChris Lattner 
DumpTypeName(Stream * s)308b9c1b51eSKate Stone void Type::DumpTypeName(Stream *s) { GetName().Dump(s, "<invalid-type-name>"); }
30930fdc8d8SChris Lattner 
DumpValue(ExecutionContext * exe_ctx,Stream * s,const DataExtractor & data,uint32_t data_byte_offset,bool show_types,bool show_summary,bool verbose,lldb::Format format)310b9c1b51eSKate Stone void Type::DumpValue(ExecutionContext *exe_ctx, Stream *s,
311b9c1b51eSKate Stone                      const DataExtractor &data, uint32_t data_byte_offset,
312b9c1b51eSKate Stone                      bool show_types, bool show_summary, bool verbose,
313b9c1b51eSKate Stone                      lldb::Format format) {
314fc0ba63fSAlex Langford   if (ResolveCompilerType(ResolveState::Forward)) {
315b9c1b51eSKate Stone     if (show_types) {
31630fdc8d8SChris Lattner       s->PutChar('(');
31730fdc8d8SChris Lattner       if (verbose)
318d01b2953SDaniel Malea         s->Printf("Type{0x%8.8" PRIx64 "} ", GetID());
31930fdc8d8SChris Lattner       DumpTypeName(s);
32030fdc8d8SChris Lattner       s->PutCString(") ");
32130fdc8d8SChris Lattner     }
32230fdc8d8SChris Lattner 
323b9c1b51eSKate Stone     GetForwardCompilerType().DumpValue(
324b9c1b51eSKate Stone         exe_ctx, s, format == lldb::eFormatDefault ? GetFormat() : format, data,
32502f58373SAdrian Prantl         data_byte_offset,
32602f58373SAdrian Prantl         GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr)
327aa88161bSKazu Hirata             .value_or(0),
32830fdc8d8SChris Lattner         0, // Bitfield bit size
32930fdc8d8SChris Lattner         0, // Bitfield bit offset
330b9c1b51eSKate Stone         show_types, show_summary, verbose, 0);
33130fdc8d8SChris Lattner   }
33230fdc8d8SChris Lattner }
33330fdc8d8SChris Lattner 
GetEncodingType()334b9c1b51eSKate Stone Type *Type::GetEncodingType() {
335d4612ad0SEd Maste   if (m_encoding_type == nullptr && m_encoding_uid != LLDB_INVALID_UID)
33616c880f0SGreg Clayton     m_encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
33716c880f0SGreg Clayton   return m_encoding_type;
33816c880f0SGreg Clayton }
33916c880f0SGreg Clayton 
GetByteSize(ExecutionContextScope * exe_scope)34002f58373SAdrian Prantl llvm::Optional<uint64_t> Type::GetByteSize(ExecutionContextScope *exe_scope) {
341d13777aaSAdrian Prantl   if (m_byte_size_has_value)
342d13777aaSAdrian Prantl     return m_byte_size;
343d13777aaSAdrian Prantl 
344b9c1b51eSKate Stone   switch (m_encoding_uid_type) {
3457a5388bfSGreg Clayton   case eEncodingInvalid:
3467a5388bfSGreg Clayton   case eEncodingIsSyntheticUID:
3477a5388bfSGreg Clayton     break;
3484957bf69SGreg Clayton   case eEncodingIsUID:
3494957bf69SGreg Clayton   case eEncodingIsConstUID:
3504957bf69SGreg Clayton   case eEncodingIsRestrictUID:
3514957bf69SGreg Clayton   case eEncodingIsVolatileUID:
352d0fb7a47SRaphael Isemann   case eEncodingIsAtomicUID:
353b9c1b51eSKate Stone   case eEncodingIsTypedefUID: {
35416c880f0SGreg Clayton     Type *encoding_type = GetEncodingType();
35530fdc8d8SChris Lattner     if (encoding_type)
35602f58373SAdrian Prantl       if (llvm::Optional<uint64_t> size = encoding_type->GetByteSize(exe_scope)) {
357729fcf17SAdrian Prantl         m_byte_size = *size;
358d13777aaSAdrian Prantl         m_byte_size_has_value = true;
359d13777aaSAdrian Prantl         return m_byte_size;
360d13777aaSAdrian Prantl       }
361d13777aaSAdrian Prantl 
362d13777aaSAdrian Prantl     if (llvm::Optional<uint64_t> size =
36302f58373SAdrian Prantl             GetLayoutCompilerType().GetByteSize(exe_scope)) {
364d13777aaSAdrian Prantl       m_byte_size = *size;
365d13777aaSAdrian Prantl       m_byte_size_has_value = true;
366d13777aaSAdrian Prantl         return m_byte_size;
367d13777aaSAdrian Prantl     }
368b9c1b51eSKate Stone   } break;
36930fdc8d8SChris Lattner 
37030fdc8d8SChris Lattner     // If we are a pointer or reference, then this is just a pointer size;
3714957bf69SGreg Clayton     case eEncodingIsPointerUID:
3724957bf69SGreg Clayton     case eEncodingIsLValueReferenceUID:
373b9c1b51eSKate Stone     case eEncodingIsRValueReferenceUID: {
374d13777aaSAdrian Prantl       if (ArchSpec arch = m_symbol_file->GetObjectFile()->GetArchitecture()) {
37556939cb3SGreg Clayton         m_byte_size = arch.GetAddressByteSize();
376d13777aaSAdrian Prantl         m_byte_size_has_value = true;
3770de14633SPavel Labath         return m_byte_size;
378d13777aaSAdrian Prantl       }
379b9c1b51eSKate Stone     } break;
38030fdc8d8SChris Lattner   }
381d13777aaSAdrian Prantl   return {};
38230fdc8d8SChris Lattner }
38330fdc8d8SChris Lattner 
GetNumChildren(bool omit_empty_base_classes)384b9c1b51eSKate Stone uint32_t Type::GetNumChildren(bool omit_empty_base_classes) {
385eca07c59SAdrian Prantl   return GetForwardCompilerType().GetNumChildren(omit_empty_base_classes, nullptr);
38630fdc8d8SChris Lattner }
38730fdc8d8SChris Lattner 
IsAggregateType()388b9c1b51eSKate Stone bool Type::IsAggregateType() {
38999558cc4SGreg Clayton   return GetForwardCompilerType().IsAggregateType();
39030fdc8d8SChris Lattner }
39130fdc8d8SChris Lattner 
GetTypedefType()392b9c1b51eSKate Stone lldb::TypeSP Type::GetTypedefType() {
393aafa5c9eSGreg Clayton   lldb::TypeSP type_sp;
394b9c1b51eSKate Stone   if (IsTypedef()) {
395aafa5c9eSGreg Clayton     Type *typedef_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
396aafa5c9eSGreg Clayton     if (typedef_type)
397aafa5c9eSGreg Clayton       type_sp = typedef_type->shared_from_this();
398aafa5c9eSGreg Clayton   }
399aafa5c9eSGreg Clayton   return type_sp;
400aafa5c9eSGreg Clayton }
401aafa5c9eSGreg Clayton 
GetFormat()402b9c1b51eSKate Stone lldb::Format Type::GetFormat() { return GetForwardCompilerType().GetFormat(); }
403aafa5c9eSGreg Clayton 
GetEncoding(uint64_t & count)404b9c1b51eSKate Stone lldb::Encoding Type::GetEncoding(uint64_t &count) {
40530fdc8d8SChris Lattner   // Make sure we resolve our type if it already hasn't been.
40699558cc4SGreg Clayton   return GetForwardCompilerType().GetEncoding(count);
40730fdc8d8SChris Lattner }
40830fdc8d8SChris Lattner 
DumpValueInMemory(ExecutionContext * exe_ctx,Stream * s,lldb::addr_t address,AddressType address_type,bool show_types,bool show_summary,bool verbose)409b9c1b51eSKate Stone bool Type::DumpValueInMemory(ExecutionContext *exe_ctx, Stream *s,
410b9c1b51eSKate Stone                              lldb::addr_t address, AddressType address_type,
411b9c1b51eSKate Stone                              bool show_types, bool show_summary, bool verbose) {
412b9c1b51eSKate Stone   if (address != LLDB_INVALID_ADDRESS) {
4131a65ae11SGreg Clayton     DataExtractor data;
414d4612ad0SEd Maste     Target *target = nullptr;
415c14ee32dSGreg Clayton     if (exe_ctx)
416c14ee32dSGreg Clayton       target = exe_ctx->GetTargetPtr();
417c14ee32dSGreg Clayton     if (target)
418c14ee32dSGreg Clayton       data.SetByteOrder(target->GetArchitecture().GetByteOrder());
419b9c1b51eSKate Stone     if (ReadFromMemory(exe_ctx, address, address_type, data)) {
42030fdc8d8SChris Lattner       DumpValue(exe_ctx, s, data, 0, show_types, show_summary, verbose);
42130fdc8d8SChris Lattner       return true;
42230fdc8d8SChris Lattner     }
42330fdc8d8SChris Lattner   }
42430fdc8d8SChris Lattner   return false;
42530fdc8d8SChris Lattner }
42630fdc8d8SChris Lattner 
ReadFromMemory(ExecutionContext * exe_ctx,lldb::addr_t addr,AddressType address_type,DataExtractor & data)427b9c1b51eSKate Stone bool Type::ReadFromMemory(ExecutionContext *exe_ctx, lldb::addr_t addr,
428b9c1b51eSKate Stone                           AddressType address_type, DataExtractor &data) {
429b9c1b51eSKate Stone   if (address_type == eAddressTypeFile) {
43005097246SAdrian Prantl     // Can't convert a file address to anything valid without more context
43105097246SAdrian Prantl     // (which Module it came from)
43230fdc8d8SChris Lattner     return false;
43330fdc8d8SChris Lattner   }
43430fdc8d8SChris Lattner 
43502f58373SAdrian Prantl   const uint64_t byte_size =
43602f58373SAdrian Prantl       GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr)
437aa88161bSKazu Hirata           .value_or(0);
438b9c1b51eSKate Stone   if (data.GetByteSize() < byte_size) {
43930fdc8d8SChris Lattner     lldb::DataBufferSP data_sp(new DataBufferHeap(byte_size, '\0'));
44030fdc8d8SChris Lattner     data.SetData(data_sp);
44130fdc8d8SChris Lattner   }
44230fdc8d8SChris Lattner 
443ba507b04SSaleem Abdulrasool   uint8_t *dst = const_cast<uint8_t *>(data.PeekData(0, byte_size));
444b9c1b51eSKate Stone   if (dst != nullptr) {
445b9c1b51eSKate Stone     if (address_type == eAddressTypeHost) {
44630fdc8d8SChris Lattner       // The address is an address in this process, so just copy it
447c1a5b2ebSEnrico Granata       if (addr == 0)
448c1a5b2ebSEnrico Granata         return false;
449eac00c3bSPavel Labath       memcpy(dst, reinterpret_cast<uint8_t *>(addr), byte_size);
45030fdc8d8SChris Lattner       return true;
451b9c1b51eSKate Stone     } else {
452b9c1b51eSKate Stone       if (exe_ctx) {
453c14ee32dSGreg Clayton         Process *process = exe_ctx->GetProcessPtr();
454b9c1b51eSKate Stone         if (process) {
45597206d57SZachary Turner           Status error;
456b9c1b51eSKate Stone           return exe_ctx->GetProcessPtr()->ReadMemory(addr, dst, byte_size,
457b9c1b51eSKate Stone                                                       error) == byte_size;
458c14ee32dSGreg Clayton         }
45930fdc8d8SChris Lattner       }
46030fdc8d8SChris Lattner     }
46130fdc8d8SChris Lattner   }
46230fdc8d8SChris Lattner   return false;
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
WriteToMemory(ExecutionContext * exe_ctx,lldb::addr_t addr,AddressType address_type,DataExtractor & data)465b9c1b51eSKate Stone bool Type::WriteToMemory(ExecutionContext *exe_ctx, lldb::addr_t addr,
466b9c1b51eSKate Stone                          AddressType address_type, DataExtractor &data) {
46730fdc8d8SChris Lattner   return false;
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
GetDeclaration() const470b9c1b51eSKate Stone const Declaration &Type::GetDeclaration() const { return m_decl; }
47130fdc8d8SChris Lattner 
ResolveCompilerType(ResolveState compiler_type_resolve_state)472fc0ba63fSAlex Langford bool Type::ResolveCompilerType(ResolveState compiler_type_resolve_state) {
473d8d4a57bSGreg Clayton   // TODO: This needs to consider the correct type system to use.
474d4612ad0SEd Maste   Type *encoding_type = nullptr;
475b9c1b51eSKate Stone   if (!m_compiler_type.IsValid()) {
476526e5afbSGreg Clayton     encoding_type = GetEncodingType();
477b9c1b51eSKate Stone     if (encoding_type) {
478b9c1b51eSKate Stone       switch (m_encoding_uid_type) {
479b9c1b51eSKate Stone       case eEncodingIsUID: {
480b9c1b51eSKate Stone         CompilerType encoding_compiler_type =
481b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType();
482b9c1b51eSKate Stone         if (encoding_compiler_type.IsValid()) {
4833ad353f3SBruce Mitchener           m_compiler_type = encoding_compiler_type;
484d4f18f11SAdrian Prantl           m_compiler_type_resolve_state =
485d4f18f11SAdrian Prantl               encoding_type->m_compiler_type_resolve_state;
486526e5afbSGreg Clayton         }
487b9c1b51eSKate Stone       } break;
48830fdc8d8SChris Lattner 
4894957bf69SGreg Clayton       case eEncodingIsConstUID:
490b9c1b51eSKate Stone         m_compiler_type =
491b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().AddConstModifier();
49230fdc8d8SChris Lattner         break;
49330fdc8d8SChris Lattner 
4944957bf69SGreg Clayton       case eEncodingIsRestrictUID:
495b9c1b51eSKate Stone         m_compiler_type =
496b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().AddRestrictModifier();
49730fdc8d8SChris Lattner         break;
49830fdc8d8SChris Lattner 
4994957bf69SGreg Clayton       case eEncodingIsVolatileUID:
500b9c1b51eSKate Stone         m_compiler_type =
501b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().AddVolatileModifier();
50230fdc8d8SChris Lattner         break;
50330fdc8d8SChris Lattner 
504d0fb7a47SRaphael Isemann       case eEncodingIsAtomicUID:
505d0fb7a47SRaphael Isemann         m_compiler_type =
506d0fb7a47SRaphael Isemann             encoding_type->GetForwardCompilerType().GetAtomicType();
507d0fb7a47SRaphael Isemann         break;
508d0fb7a47SRaphael Isemann 
5094957bf69SGreg Clayton       case eEncodingIsTypedefUID:
510b9c1b51eSKate Stone         m_compiler_type = encoding_type->GetForwardCompilerType().CreateTypedef(
511b9c1b51eSKate Stone             m_name.AsCString("__lldb_invalid_typedef_name"),
512143d507cSAdrian Prantl             GetSymbolFile()->GetDeclContextContainingUID(GetID()), m_payload);
51330fdc8d8SChris Lattner         m_name.Clear();
51430fdc8d8SChris Lattner         break;
51530fdc8d8SChris Lattner 
5164957bf69SGreg Clayton       case eEncodingIsPointerUID:
517b9c1b51eSKate Stone         m_compiler_type =
518b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().GetPointerType();
51930fdc8d8SChris Lattner         break;
52030fdc8d8SChris Lattner 
5214957bf69SGreg Clayton       case eEncodingIsLValueReferenceUID:
522b9c1b51eSKate Stone         m_compiler_type =
523b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().GetLValueReferenceType();
52430fdc8d8SChris Lattner         break;
52530fdc8d8SChris Lattner 
5264957bf69SGreg Clayton       case eEncodingIsRValueReferenceUID:
527b9c1b51eSKate Stone         m_compiler_type =
528b9c1b51eSKate Stone             encoding_type->GetForwardCompilerType().GetRValueReferenceType();
52930fdc8d8SChris Lattner         break;
53030fdc8d8SChris Lattner 
53130fdc8d8SChris Lattner       default:
532a322f36cSDavid Blaikie         llvm_unreachable("Unhandled encoding_data_type.");
53330fdc8d8SChris Lattner       }
534b9c1b51eSKate Stone     } else {
53530fdc8d8SChris Lattner       // We have no encoding type, return void?
5360e252e38SAlex Langford       auto type_system_or_err =
537b9c1b51eSKate Stone           m_symbol_file->GetTypeSystemForLanguage(eLanguageTypeC);
5380e252e38SAlex Langford       if (auto err = type_system_or_err.takeError()) {
539a007a6d8SPavel Labath         LLDB_LOG_ERROR(GetLog(LLDBLog::Symbols), std::move(err),
5406e3b0cc2SRaphael Isemann                        "Unable to construct void type from TypeSystemClang");
5410e252e38SAlex Langford       } else {
542b9c1b51eSKate Stone         CompilerType void_compiler_type =
5430e252e38SAlex Langford             type_system_or_err->GetBasicTypeFromAST(eBasicTypeVoid);
544b9c1b51eSKate Stone         switch (m_encoding_uid_type) {
5454957bf69SGreg Clayton         case eEncodingIsUID:
5463ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type;
54730fdc8d8SChris Lattner           break;
54830fdc8d8SChris Lattner 
5494957bf69SGreg Clayton         case eEncodingIsConstUID:
5503ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.AddConstModifier();
55130fdc8d8SChris Lattner           break;
55230fdc8d8SChris Lattner 
5534957bf69SGreg Clayton         case eEncodingIsRestrictUID:
5543ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.AddRestrictModifier();
55530fdc8d8SChris Lattner           break;
55630fdc8d8SChris Lattner 
5574957bf69SGreg Clayton         case eEncodingIsVolatileUID:
5583ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.AddVolatileModifier();
55930fdc8d8SChris Lattner           break;
56030fdc8d8SChris Lattner 
561d0fb7a47SRaphael Isemann         case eEncodingIsAtomicUID:
562d0fb7a47SRaphael Isemann           m_compiler_type = void_compiler_type.GetAtomicType();
563d0fb7a47SRaphael Isemann           break;
564d0fb7a47SRaphael Isemann 
5654957bf69SGreg Clayton         case eEncodingIsTypedefUID:
566b9c1b51eSKate Stone           m_compiler_type = void_compiler_type.CreateTypedef(
567b9c1b51eSKate Stone               m_name.AsCString("__lldb_invalid_typedef_name"),
568143d507cSAdrian Prantl               GetSymbolFile()->GetDeclContextContainingUID(GetID()), m_payload);
56930fdc8d8SChris Lattner           break;
57030fdc8d8SChris Lattner 
5714957bf69SGreg Clayton         case eEncodingIsPointerUID:
5723ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.GetPointerType();
57330fdc8d8SChris Lattner           break;
57430fdc8d8SChris Lattner 
5754957bf69SGreg Clayton         case eEncodingIsLValueReferenceUID:
5763ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.GetLValueReferenceType();
57730fdc8d8SChris Lattner           break;
57830fdc8d8SChris Lattner 
5794957bf69SGreg Clayton         case eEncodingIsRValueReferenceUID:
5803ad353f3SBruce Mitchener           m_compiler_type = void_compiler_type.GetRValueReferenceType();
58130fdc8d8SChris Lattner           break;
58230fdc8d8SChris Lattner 
58330fdc8d8SChris Lattner         default:
584a322f36cSDavid Blaikie           llvm_unreachable("Unhandled encoding_data_type.");
58530fdc8d8SChris Lattner         }
58630fdc8d8SChris Lattner       }
5870e252e38SAlex Langford     }
58849e9010cSGreg Clayton 
589b9c1b51eSKate Stone     // When we have a EncodingUID, our "m_flags.compiler_type_resolve_state" is
59005097246SAdrian Prantl     // set to eResolveStateUnresolved so we need to update it to say that we
59105097246SAdrian Prantl     // now have a forward declaration since that is what we created above.
5923ad353f3SBruce Mitchener     if (m_compiler_type.IsValid())
593d4f18f11SAdrian Prantl       m_compiler_type_resolve_state = ResolveState::Forward;
59430fdc8d8SChris Lattner   }
5951be10fcaSGreg Clayton 
5961be10fcaSGreg Clayton   // Check if we have a forward reference to a class/struct/union/enum?
597d4f18f11SAdrian Prantl   if (compiler_type_resolve_state == ResolveState::Layout ||
598d4f18f11SAdrian Prantl       compiler_type_resolve_state == ResolveState::Full) {
59949e9010cSGreg Clayton     // Check if we have a forward reference to a class/struct/union/enum?
600b9c1b51eSKate Stone     if (m_compiler_type.IsValid() &&
601d4f18f11SAdrian Prantl         m_compiler_type_resolve_state < compiler_type_resolve_state) {
602d4f18f11SAdrian Prantl       m_compiler_type_resolve_state = ResolveState::Full;
603b9c1b51eSKate Stone       if (!m_compiler_type.IsDefined()) {
604b9c1b51eSKate Stone         // We have a forward declaration, we need to resolve it to a complete
605b9c1b51eSKate Stone         // definition.
6063ad353f3SBruce Mitchener         m_symbol_file->CompleteType(m_compiler_type);
6071be10fcaSGreg Clayton       }
608aaf99e04SGreg Clayton     }
60949e9010cSGreg Clayton   }
610aaf99e04SGreg Clayton 
61105097246SAdrian Prantl   // If we have an encoding type, then we need to make sure it is resolved
61205097246SAdrian Prantl   // appropriately.
613b9c1b51eSKate Stone   if (m_encoding_uid != LLDB_INVALID_UID) {
614d4612ad0SEd Maste     if (encoding_type == nullptr)
615526e5afbSGreg Clayton       encoding_type = GetEncodingType();
616b9c1b51eSKate Stone     if (encoding_type) {
617b9c1b51eSKate Stone       ResolveState encoding_compiler_type_resolve_state =
618b9c1b51eSKate Stone           compiler_type_resolve_state;
61932d2a483SGreg Clayton 
620d4f18f11SAdrian Prantl       if (compiler_type_resolve_state == ResolveState::Layout) {
621b9c1b51eSKate Stone         switch (m_encoding_uid_type) {
622526e5afbSGreg Clayton         case eEncodingIsPointerUID:
623526e5afbSGreg Clayton         case eEncodingIsLValueReferenceUID:
624526e5afbSGreg Clayton         case eEncodingIsRValueReferenceUID:
625d4f18f11SAdrian Prantl           encoding_compiler_type_resolve_state = ResolveState::Forward;
626526e5afbSGreg Clayton           break;
627526e5afbSGreg Clayton         default:
628526e5afbSGreg Clayton           break;
6298f92f0a3SGreg Clayton         }
63032d2a483SGreg Clayton       }
631fc0ba63fSAlex Langford       encoding_type->ResolveCompilerType(encoding_compiler_type_resolve_state);
6328f92f0a3SGreg Clayton     }
6338f92f0a3SGreg Clayton   }
6343ad353f3SBruce Mitchener   return m_compiler_type.IsValid();
63530fdc8d8SChris Lattner }
GetEncodingMask()636b9c1b51eSKate Stone uint32_t Type::GetEncodingMask() {
6377fedea2cSGreg Clayton   uint32_t encoding_mask = 1u << m_encoding_uid_type;
6387fedea2cSGreg Clayton   Type *encoding_type = GetEncodingType();
6397fedea2cSGreg Clayton   assert(encoding_type != this);
6407fedea2cSGreg Clayton   if (encoding_type)
6417fedea2cSGreg Clayton     encoding_mask |= encoding_type->GetEncodingMask();
6427fedea2cSGreg Clayton   return encoding_mask;
6437fedea2cSGreg Clayton }
64430fdc8d8SChris Lattner 
GetFullCompilerType()645b9c1b51eSKate Stone CompilerType Type::GetFullCompilerType() {
646fc0ba63fSAlex Langford   ResolveCompilerType(ResolveState::Full);
6473ad353f3SBruce Mitchener   return m_compiler_type;
648526e5afbSGreg Clayton }
649526e5afbSGreg Clayton 
GetLayoutCompilerType()650b9c1b51eSKate Stone CompilerType Type::GetLayoutCompilerType() {
651fc0ba63fSAlex Langford   ResolveCompilerType(ResolveState::Layout);
6523ad353f3SBruce Mitchener   return m_compiler_type;
653c93237c9SGreg Clayton }
65430fdc8d8SChris Lattner 
GetForwardCompilerType()655b9c1b51eSKate Stone CompilerType Type::GetForwardCompilerType() {
656fc0ba63fSAlex Langford   ResolveCompilerType(ResolveState::Forward);
6573ad353f3SBruce Mitchener   return m_compiler_type;
65830fdc8d8SChris Lattner }
65930fdc8d8SChris Lattner 
GetQualifiedName()660b9c1b51eSKate Stone ConstString Type::GetQualifiedName() {
66130ce956aSRaphael Isemann   return GetForwardCompilerType().GetTypeName();
66284db9105SGreg Clayton }
66384db9105SGreg Clayton 
GetTypeScopeAndBasename(llvm::StringRef name,llvm::StringRef & scope,llvm::StringRef & basename,TypeClass & type_class)664efefc4eeSLuís Ferreira bool Type::GetTypeScopeAndBasename(llvm::StringRef name,
6652e5c47edSLuís Ferreira                                    llvm::StringRef &scope,
6662e5c47edSLuís Ferreira                                    llvm::StringRef &basename,
667b9c1b51eSKate Stone                                    TypeClass &type_class) {
6687bc31332SGreg Clayton   type_class = eTypeClassAny;
6697bc31332SGreg Clayton 
670556b1611STamas Berghammer   if (name.empty())
671556b1611STamas Berghammer     return false;
672556b1611STamas Berghammer 
673556b1611STamas Berghammer   basename = name;
674556b1611STamas Berghammer   if (basename.consume_front("struct "))
6757bc31332SGreg Clayton     type_class = eTypeClassStruct;
676556b1611STamas Berghammer   else if (basename.consume_front("class "))
6777bc31332SGreg Clayton     type_class = eTypeClassClass;
678556b1611STamas Berghammer   else if (basename.consume_front("union "))
6797bc31332SGreg Clayton     type_class = eTypeClassUnion;
680556b1611STamas Berghammer   else if (basename.consume_front("enum "))
6817bc31332SGreg Clayton     type_class = eTypeClassEnumeration;
682556b1611STamas Berghammer   else if (basename.consume_front("typedef "))
6837bc31332SGreg Clayton     type_class = eTypeClassTypedef;
684556b1611STamas Berghammer 
685556b1611STamas Berghammer   size_t namespace_separator = basename.find("::");
686556b1611STamas Berghammer   if (namespace_separator == llvm::StringRef::npos)
687556b1611STamas Berghammer     return false;
688556b1611STamas Berghammer 
689556b1611STamas Berghammer   size_t template_begin = basename.find('<');
690556b1611STamas Berghammer   while (namespace_separator != llvm::StringRef::npos) {
691556b1611STamas Berghammer     if (template_begin != llvm::StringRef::npos &&
692556b1611STamas Berghammer         namespace_separator > template_begin) {
693556b1611STamas Berghammer       size_t template_depth = 1;
694556b1611STamas Berghammer       llvm::StringRef template_arg =
695556b1611STamas Berghammer           basename.drop_front(template_begin + 1);
696556b1611STamas Berghammer       while (template_depth > 0 && !template_arg.empty()) {
697556b1611STamas Berghammer         if (template_arg.front() == '<')
698556b1611STamas Berghammer           template_depth++;
699556b1611STamas Berghammer         else if (template_arg.front() == '>')
700556b1611STamas Berghammer           template_depth--;
701556b1611STamas Berghammer         template_arg = template_arg.drop_front(1);
7027bc31332SGreg Clayton       }
703556b1611STamas Berghammer       if (template_depth != 0)
704556b1611STamas Berghammer         return false; // We have an invalid type name. Bail out.
705556b1611STamas Berghammer       if (template_arg.empty())
706556b1611STamas Berghammer         break; // The template ends at the end of the full name.
707556b1611STamas Berghammer       basename = template_arg;
708556b1611STamas Berghammer     } else {
709556b1611STamas Berghammer       basename = basename.drop_front(namespace_separator + 2);
71084db9105SGreg Clayton     }
711556b1611STamas Berghammer     template_begin = basename.find('<');
712556b1611STamas Berghammer     namespace_separator = basename.find("::");
713556b1611STamas Berghammer   }
714556b1611STamas Berghammer   if (basename.size() < name.size()) {
715556b1611STamas Berghammer     scope = name.take_front(name.size() - basename.size());
71684db9105SGreg Clayton     return true;
71784db9105SGreg Clayton   }
71884db9105SGreg Clayton   return false;
71984db9105SGreg Clayton }
72084db9105SGreg Clayton 
GetModule()721b9c1b51eSKate Stone ModuleSP Type::GetModule() {
722a3939069SGreg Clayton   if (m_symbol_file)
723a3939069SGreg Clayton     return m_symbol_file->GetObjectFile()->GetModule();
724a3939069SGreg Clayton   return ModuleSP();
725a3939069SGreg Clayton }
72684db9105SGreg Clayton 
GetExeModule()7272c0cbc47SIlya Bukonkin ModuleSP Type::GetExeModule() {
7282c0cbc47SIlya Bukonkin   if (m_compiler_type) {
7292c0cbc47SIlya Bukonkin     SymbolFile *symbol_file = m_compiler_type.GetTypeSystem()->GetSymbolFile();
730ec28e43eSAugusto Noronha     if (symbol_file)
7312c0cbc47SIlya Bukonkin       return symbol_file->GetObjectFile()->GetModule();
7322c0cbc47SIlya Bukonkin   }
7332c0cbc47SIlya Bukonkin   return ModuleSP();
7342c0cbc47SIlya Bukonkin }
7352c0cbc47SIlya Bukonkin 
TypeAndOrName(TypeSP & in_type_sp)7369876addcSPavel Labath TypeAndOrName::TypeAndOrName(TypeSP &in_type_sp) {
7379876addcSPavel Labath   if (in_type_sp) {
7389876addcSPavel Labath     m_compiler_type = in_type_sp->GetForwardCompilerType();
73961be0903SJim Ingham     m_type_name = in_type_sp->GetName();
74061be0903SJim Ingham   }
7419876addcSPavel Labath }
74261be0903SJim Ingham 
TypeAndOrName(const char * in_type_str)743b9c1b51eSKate Stone TypeAndOrName::TypeAndOrName(const char *in_type_str)
744b9c1b51eSKate Stone     : m_type_name(in_type_str) {}
74561be0903SJim Ingham 
TypeAndOrName(ConstString & in_type_const_string)746b9c1b51eSKate Stone TypeAndOrName::TypeAndOrName(ConstString &in_type_const_string)
747b9c1b51eSKate Stone     : m_type_name(in_type_const_string) {}
74861be0903SJim Ingham 
operator ==(const TypeAndOrName & other) const749b9c1b51eSKate Stone bool TypeAndOrName::operator==(const TypeAndOrName &other) const {
7509876addcSPavel Labath   if (m_compiler_type != other.m_compiler_type)
751f7b1a34eSEnrico Granata     return false;
752f7b1a34eSEnrico Granata   if (m_type_name != other.m_type_name)
753f7b1a34eSEnrico Granata     return false;
754f7b1a34eSEnrico Granata   return true;
755f7b1a34eSEnrico Granata }
756f7b1a34eSEnrico Granata 
operator !=(const TypeAndOrName & other) const757b9c1b51eSKate Stone bool TypeAndOrName::operator!=(const TypeAndOrName &other) const {
7589470c66cSDavide Italiano   return !(*this == other);
759f7b1a34eSEnrico Granata }
760f7b1a34eSEnrico Granata 
GetName() const761b9c1b51eSKate Stone ConstString TypeAndOrName::GetName() const {
762fcf0c4e3SEnrico Granata   if (m_type_name)
763fcf0c4e3SEnrico Granata     return m_type_name;
7649876addcSPavel Labath   if (m_compiler_type)
7659876addcSPavel Labath     return m_compiler_type.GetTypeName();
766fcf0c4e3SEnrico Granata   return ConstString("<invalid>");
76761be0903SJim Ingham }
76861be0903SJim Ingham 
SetName(ConstString type_name)7690e4c4821SAdrian Prantl void TypeAndOrName::SetName(ConstString type_name) {
770d64dd12fSGreg Clayton   m_type_name = type_name;
77161be0903SJim Ingham }
77261be0903SJim Ingham 
SetName(const char * type_name_cstr)773b9c1b51eSKate Stone void TypeAndOrName::SetName(const char *type_name_cstr) {
774d64dd12fSGreg Clayton   m_type_name.SetCString(type_name_cstr);
77561be0903SJim Ingham }
77661be0903SJim Ingham 
SetTypeSP(lldb::TypeSP type_sp)777b9c1b51eSKate Stone void TypeAndOrName::SetTypeSP(lldb::TypeSP type_sp) {
7789876addcSPavel Labath   if (type_sp) {
7799876addcSPavel Labath     m_compiler_type = type_sp->GetForwardCompilerType();
7809876addcSPavel Labath     m_type_name = type_sp->GetName();
7819876addcSPavel Labath   } else
7829876addcSPavel Labath     Clear();
783dc4db5a6SEnrico Granata }
784dc4db5a6SEnrico Granata 
SetCompilerType(CompilerType compiler_type)785b9c1b51eSKate Stone void TypeAndOrName::SetCompilerType(CompilerType compiler_type) {
7869876addcSPavel Labath   m_compiler_type = compiler_type;
7879876addcSPavel Labath   if (m_compiler_type)
7889876addcSPavel Labath     m_type_name = m_compiler_type.GetTypeName();
78961be0903SJim Ingham }
79061be0903SJim Ingham 
IsEmpty() const791b9c1b51eSKate Stone bool TypeAndOrName::IsEmpty() const {
7929876addcSPavel Labath   return !((bool)m_type_name || (bool)m_compiler_type);
79361be0903SJim Ingham }
7946f3533fbSEnrico Granata 
Clear()795b9c1b51eSKate Stone void TypeAndOrName::Clear() {
796f7b1a34eSEnrico Granata   m_type_name.Clear();
7979876addcSPavel Labath   m_compiler_type.Clear();
798f7b1a34eSEnrico Granata }
799f7b1a34eSEnrico Granata 
HasName() const800b9c1b51eSKate Stone bool TypeAndOrName::HasName() const { return (bool)m_type_name; }
801f7b1a34eSEnrico Granata 
HasCompilerType() const802b9c1b51eSKate Stone bool TypeAndOrName::HasCompilerType() const {
8039876addcSPavel Labath   return m_compiler_type.IsValid();
804dc4db5a6SEnrico Granata }
805dc4db5a6SEnrico Granata 
TypeImpl(const lldb::TypeSP & type_sp)806b9c1b51eSKate Stone TypeImpl::TypeImpl(const lldb::TypeSP &type_sp)
807b9c1b51eSKate Stone     : m_module_wp(), m_static_type(), m_dynamic_type() {
808a3939069SGreg Clayton   SetType(type_sp);
809dc4db5a6SEnrico Granata }
810dc4db5a6SEnrico Granata 
TypeImpl(const CompilerType & compiler_type)811b9c1b51eSKate Stone TypeImpl::TypeImpl(const CompilerType &compiler_type)
812b9c1b51eSKate Stone     : m_module_wp(), m_static_type(), m_dynamic_type() {
8133ad353f3SBruce Mitchener   SetType(compiler_type);
814dc4db5a6SEnrico Granata }
815dc4db5a6SEnrico Granata 
TypeImpl(const lldb::TypeSP & type_sp,const CompilerType & dynamic)816b9c1b51eSKate Stone TypeImpl::TypeImpl(const lldb::TypeSP &type_sp, const CompilerType &dynamic)
8179876addcSPavel Labath     : m_module_wp(), m_static_type(), m_dynamic_type(dynamic) {
818a3939069SGreg Clayton   SetType(type_sp, dynamic);
819dc4db5a6SEnrico Granata }
820dc4db5a6SEnrico Granata 
TypeImpl(const CompilerType & static_type,const CompilerType & dynamic_type)821b9c1b51eSKate Stone TypeImpl::TypeImpl(const CompilerType &static_type,
822b9c1b51eSKate Stone                    const CompilerType &dynamic_type)
823b9c1b51eSKate Stone     : m_module_wp(), m_static_type(), m_dynamic_type() {
824a3939069SGreg Clayton   SetType(static_type, dynamic_type);
825dc4db5a6SEnrico Granata }
826dc4db5a6SEnrico Granata 
SetType(const lldb::TypeSP & type_sp)827b9c1b51eSKate Stone void TypeImpl::SetType(const lldb::TypeSP &type_sp) {
8289876addcSPavel Labath   if (type_sp) {
8299876addcSPavel Labath     m_static_type = type_sp->GetForwardCompilerType();
8302c0cbc47SIlya Bukonkin     m_exe_module_wp = type_sp->GetExeModule();
831a3939069SGreg Clayton     m_module_wp = type_sp->GetModule();
8329876addcSPavel Labath   } else {
8339876addcSPavel Labath     m_static_type.Clear();
834a3939069SGreg Clayton     m_module_wp = lldb::ModuleWP();
8355569e64eSGreg Clayton   }
8369876addcSPavel Labath }
837dc4db5a6SEnrico Granata 
SetType(const CompilerType & compiler_type)838b9c1b51eSKate Stone void TypeImpl::SetType(const CompilerType &compiler_type) {
839a3939069SGreg Clayton   m_module_wp = lldb::ModuleWP();
8409876addcSPavel Labath   m_static_type = compiler_type;
8415569e64eSGreg Clayton }
842dc4db5a6SEnrico Granata 
SetType(const lldb::TypeSP & type_sp,const CompilerType & dynamic)843b9c1b51eSKate Stone void TypeImpl::SetType(const lldb::TypeSP &type_sp,
844b9c1b51eSKate Stone                        const CompilerType &dynamic) {
845a3939069SGreg Clayton   SetType(type_sp);
846dc4db5a6SEnrico Granata   m_dynamic_type = dynamic;
847dc4db5a6SEnrico Granata }
848dc4db5a6SEnrico Granata 
SetType(const CompilerType & compiler_type,const CompilerType & dynamic)849b9c1b51eSKate Stone void TypeImpl::SetType(const CompilerType &compiler_type,
850b9c1b51eSKate Stone                        const CompilerType &dynamic) {
851a3939069SGreg Clayton   m_module_wp = lldb::ModuleWP();
8529876addcSPavel Labath   m_static_type = compiler_type;
853dc4db5a6SEnrico Granata   m_dynamic_type = dynamic;
8545569e64eSGreg Clayton }
8555569e64eSGreg Clayton 
CheckModule(lldb::ModuleSP & module_sp) const856b9c1b51eSKate Stone bool TypeImpl::CheckModule(lldb::ModuleSP &module_sp) const {
8572c0cbc47SIlya Bukonkin   return CheckModuleCommon(m_module_wp, module_sp);
8582c0cbc47SIlya Bukonkin }
8592c0cbc47SIlya Bukonkin 
CheckExeModule(lldb::ModuleSP & module_sp) const8602c0cbc47SIlya Bukonkin bool TypeImpl::CheckExeModule(lldb::ModuleSP &module_sp) const {
8612c0cbc47SIlya Bukonkin   return CheckModuleCommon(m_exe_module_wp, module_sp);
8622c0cbc47SIlya Bukonkin }
8632c0cbc47SIlya Bukonkin 
CheckModuleCommon(const lldb::ModuleWP & input_module_wp,lldb::ModuleSP & module_sp) const8642c0cbc47SIlya Bukonkin bool TypeImpl::CheckModuleCommon(const lldb::ModuleWP &input_module_wp,
8652c0cbc47SIlya Bukonkin                                  lldb::ModuleSP &module_sp) const {
86605097246SAdrian Prantl   // Check if we have a module for this type. If we do and the shared pointer
86705097246SAdrian Prantl   // is can be successfully initialized with m_module_wp, return true. Else
86805097246SAdrian Prantl   // return false if we didn't have a module, or if we had a module and it has
86905097246SAdrian Prantl   // been deleted. Any functions doing anything with a TypeSP in this TypeImpl
87005097246SAdrian Prantl   // class should call this function and only do anything with the ivars if
87105097246SAdrian Prantl   // this function returns true. If we have a module, the "module_sp" will be
87205097246SAdrian Prantl   // filled in with a strong reference to the module so that the module will at
87305097246SAdrian Prantl   // least stay around long enough for the type query to succeed.
8742c0cbc47SIlya Bukonkin   module_sp = input_module_wp.lock();
875b9c1b51eSKate Stone   if (!module_sp) {
876a3939069SGreg Clayton     lldb::ModuleWP empty_module_wp;
877b9c1b51eSKate Stone     // If either call to "std::weak_ptr::owner_before(...) value returns true,
87805097246SAdrian Prantl     // this indicates that m_module_wp once contained (possibly still does) a
87905097246SAdrian Prantl     // reference to a valid shared pointer. This helps us know if we had a
88005097246SAdrian Prantl     // valid reference to a section which is now invalid because the module it
88105097246SAdrian Prantl     // was in was deleted
8822c0cbc47SIlya Bukonkin     if (empty_module_wp.owner_before(input_module_wp) ||
8832c0cbc47SIlya Bukonkin         input_module_wp.owner_before(empty_module_wp)) {
8842c0cbc47SIlya Bukonkin       // input_module_wp had a valid reference to a module, but all strong
88505097246SAdrian Prantl       // references have been released and the module has been deleted
886a3939069SGreg Clayton       return false;
887a3939069SGreg Clayton     }
888a3939069SGreg Clayton   }
889a3939069SGreg Clayton   // We either successfully locked the module, or didn't have one to begin with
890a3939069SGreg Clayton   return true;
891a3939069SGreg Clayton }
892a3939069SGreg Clayton 
operator ==(const TypeImpl & rhs) const893b9c1b51eSKate Stone bool TypeImpl::operator==(const TypeImpl &rhs) const {
894b9c1b51eSKate Stone   return m_static_type == rhs.m_static_type &&
895b9c1b51eSKate Stone          m_dynamic_type == rhs.m_dynamic_type;
8966f3533fbSEnrico Granata }
8976f3533fbSEnrico Granata 
operator !=(const TypeImpl & rhs) const898b9c1b51eSKate Stone bool TypeImpl::operator!=(const TypeImpl &rhs) const {
899e4c91204SDavide Italiano   return !(*this == rhs);
900dc4db5a6SEnrico Granata }
9016f3533fbSEnrico Granata 
IsValid() const902b9c1b51eSKate Stone bool TypeImpl::IsValid() const {
903dc4db5a6SEnrico Granata   // just a name is not valid
904a3939069SGreg Clayton   ModuleSP module_sp;
905a3939069SGreg Clayton   if (CheckModule(module_sp))
906dc4db5a6SEnrico Granata     return m_static_type.IsValid() || m_dynamic_type.IsValid();
907a3939069SGreg Clayton   return false;
908dc4db5a6SEnrico Granata }
909dc4db5a6SEnrico Granata 
operator bool() const910b9c1b51eSKate Stone TypeImpl::operator bool() const { return IsValid(); }
911dc4db5a6SEnrico Granata 
Clear()912b9c1b51eSKate Stone void TypeImpl::Clear() {
913a3939069SGreg Clayton   m_module_wp = lldb::ModuleWP();
914dc4db5a6SEnrico Granata   m_static_type.Clear();
915dc4db5a6SEnrico Granata   m_dynamic_type.Clear();
916dc4db5a6SEnrico Granata }
917dc4db5a6SEnrico Granata 
GetModule() const9182c0cbc47SIlya Bukonkin ModuleSP TypeImpl::GetModule() const {
9192c0cbc47SIlya Bukonkin   lldb::ModuleSP module_sp;
9202c0cbc47SIlya Bukonkin   if (CheckExeModule(module_sp))
9212c0cbc47SIlya Bukonkin     return module_sp;
9222c0cbc47SIlya Bukonkin   return nullptr;
9232c0cbc47SIlya Bukonkin }
9242c0cbc47SIlya Bukonkin 
GetName() const925b9c1b51eSKate Stone ConstString TypeImpl::GetName() const {
926a3939069SGreg Clayton   ModuleSP module_sp;
927b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
928dc4db5a6SEnrico Granata     if (m_dynamic_type)
929dc4db5a6SEnrico Granata       return m_dynamic_type.GetTypeName();
9309876addcSPavel Labath     return m_static_type.GetTypeName();
931dc4db5a6SEnrico Granata   }
932a3939069SGreg Clayton   return ConstString();
933a3939069SGreg Clayton }
934dc4db5a6SEnrico Granata 
GetDisplayTypeName() const935b9c1b51eSKate Stone ConstString TypeImpl::GetDisplayTypeName() const {
936a3939069SGreg Clayton   ModuleSP module_sp;
937b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
938e8daa2f8SEnrico Granata     if (m_dynamic_type)
939e8daa2f8SEnrico Granata       return m_dynamic_type.GetDisplayTypeName();
940e8daa2f8SEnrico Granata     return m_static_type.GetDisplayTypeName();
941e8daa2f8SEnrico Granata   }
942a3939069SGreg Clayton   return ConstString();
943a3939069SGreg Clayton }
944e8daa2f8SEnrico Granata 
GetPointerType() const945b9c1b51eSKate Stone TypeImpl TypeImpl::GetPointerType() const {
946a3939069SGreg Clayton   ModuleSP module_sp;
947b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
948b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
949b9c1b51eSKate Stone       return TypeImpl(m_static_type.GetPointerType(),
950b9c1b51eSKate Stone                       m_dynamic_type.GetPointerType());
951dc4db5a6SEnrico Granata     }
952dc4db5a6SEnrico Granata     return TypeImpl(m_static_type.GetPointerType());
953dc4db5a6SEnrico Granata   }
954a3939069SGreg Clayton   return TypeImpl();
955a3939069SGreg Clayton }
956dc4db5a6SEnrico Granata 
GetPointeeType() const957b9c1b51eSKate Stone TypeImpl TypeImpl::GetPointeeType() const {
958a3939069SGreg Clayton   ModuleSP module_sp;
959b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
960b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
961b9c1b51eSKate Stone       return TypeImpl(m_static_type.GetPointeeType(),
962b9c1b51eSKate Stone                       m_dynamic_type.GetPointeeType());
963dc4db5a6SEnrico Granata     }
964dc4db5a6SEnrico Granata     return TypeImpl(m_static_type.GetPointeeType());
965dc4db5a6SEnrico Granata   }
966a3939069SGreg Clayton   return TypeImpl();
967a3939069SGreg Clayton }
968dc4db5a6SEnrico Granata 
GetReferenceType() const969b9c1b51eSKate Stone TypeImpl TypeImpl::GetReferenceType() const {
970a3939069SGreg Clayton   ModuleSP module_sp;
971b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
972b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
9739876addcSPavel Labath       return TypeImpl(m_static_type.GetLValueReferenceType(),
974b9c1b51eSKate Stone                       m_dynamic_type.GetLValueReferenceType());
975dc4db5a6SEnrico Granata     }
9769876addcSPavel Labath     return TypeImpl(m_static_type.GetLValueReferenceType());
977dc4db5a6SEnrico Granata   }
978a3939069SGreg Clayton   return TypeImpl();
979a3939069SGreg Clayton }
980dc4db5a6SEnrico Granata 
GetTypedefedType() const981b9c1b51eSKate Stone TypeImpl TypeImpl::GetTypedefedType() const {
982a3939069SGreg Clayton   ModuleSP module_sp;
983b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
984b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
985b9c1b51eSKate Stone       return TypeImpl(m_static_type.GetTypedefedType(),
986b9c1b51eSKate Stone                       m_dynamic_type.GetTypedefedType());
9871f4db7daSGreg Clayton     }
9881f4db7daSGreg Clayton     return TypeImpl(m_static_type.GetTypedefedType());
9891f4db7daSGreg Clayton   }
990a3939069SGreg Clayton   return TypeImpl();
991a3939069SGreg Clayton }
9921f4db7daSGreg Clayton 
GetDereferencedType() const993b9c1b51eSKate Stone TypeImpl TypeImpl::GetDereferencedType() const {
994a3939069SGreg Clayton   ModuleSP module_sp;
995b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
996b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
9979876addcSPavel Labath       return TypeImpl(m_static_type.GetNonReferenceType(),
998b9c1b51eSKate Stone                       m_dynamic_type.GetNonReferenceType());
999dc4db5a6SEnrico Granata     }
10009876addcSPavel Labath     return TypeImpl(m_static_type.GetNonReferenceType());
1001dc4db5a6SEnrico Granata   }
1002a3939069SGreg Clayton   return TypeImpl();
1003a3939069SGreg Clayton }
1004dc4db5a6SEnrico Granata 
GetUnqualifiedType() const1005b9c1b51eSKate Stone TypeImpl TypeImpl::GetUnqualifiedType() const {
1006a3939069SGreg Clayton   ModuleSP module_sp;
1007b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
1008b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
10099876addcSPavel Labath       return TypeImpl(m_static_type.GetFullyUnqualifiedType(),
1010b9c1b51eSKate Stone                       m_dynamic_type.GetFullyUnqualifiedType());
1011dc4db5a6SEnrico Granata     }
10129876addcSPavel Labath     return TypeImpl(m_static_type.GetFullyUnqualifiedType());
1013dc4db5a6SEnrico Granata   }
1014a3939069SGreg Clayton   return TypeImpl();
1015a3939069SGreg Clayton }
1016dc4db5a6SEnrico Granata 
GetCanonicalType() const1017b9c1b51eSKate Stone TypeImpl TypeImpl::GetCanonicalType() const {
1018a3939069SGreg Clayton   ModuleSP module_sp;
1019b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
1020b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
1021b9c1b51eSKate Stone       return TypeImpl(m_static_type.GetCanonicalType(),
1022b9c1b51eSKate Stone                       m_dynamic_type.GetCanonicalType());
1023dc4db5a6SEnrico Granata     }
1024dc4db5a6SEnrico Granata     return TypeImpl(m_static_type.GetCanonicalType());
1025dc4db5a6SEnrico Granata   }
1026a3939069SGreg Clayton   return TypeImpl();
1027a3939069SGreg Clayton }
1028dc4db5a6SEnrico Granata 
GetCompilerType(bool prefer_dynamic)1029b9c1b51eSKate Stone CompilerType TypeImpl::GetCompilerType(bool prefer_dynamic) {
1030a3939069SGreg Clayton   ModuleSP module_sp;
1031b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
1032b9c1b51eSKate Stone     if (prefer_dynamic) {
1033dc4db5a6SEnrico Granata       if (m_dynamic_type.IsValid())
1034dc4db5a6SEnrico Granata         return m_dynamic_type;
1035dc4db5a6SEnrico Granata     }
10369876addcSPavel Labath     return m_static_type;
1037dc4db5a6SEnrico Granata   }
1038a1e5dc86SGreg Clayton   return CompilerType();
1039a3939069SGreg Clayton }
1040dc4db5a6SEnrico Granata 
GetTypeSystem(bool prefer_dynamic)1041b9c1b51eSKate Stone TypeSystem *TypeImpl::GetTypeSystem(bool prefer_dynamic) {
1042a3939069SGreg Clayton   ModuleSP module_sp;
1043b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
1044b9c1b51eSKate Stone     if (prefer_dynamic) {
1045dc4db5a6SEnrico Granata       if (m_dynamic_type.IsValid())
1046d8d4a57bSGreg Clayton         return m_dynamic_type.GetTypeSystem();
1047dc4db5a6SEnrico Granata     }
10489876addcSPavel Labath     return m_static_type.GetTypeSystem();
10496f3533fbSEnrico Granata   }
1050248a1305SKonrad Kleine   return nullptr;
1051a3939069SGreg Clayton }
1052da7bc7d0SGreg Clayton 
GetDescription(lldb_private::Stream & strm,lldb::DescriptionLevel description_level)1053b9c1b51eSKate Stone bool TypeImpl::GetDescription(lldb_private::Stream &strm,
1054b9c1b51eSKate Stone                               lldb::DescriptionLevel description_level) {
1055a3939069SGreg Clayton   ModuleSP module_sp;
1056b9c1b51eSKate Stone   if (CheckModule(module_sp)) {
1057b9c1b51eSKate Stone     if (m_dynamic_type.IsValid()) {
1058dc4db5a6SEnrico Granata       strm.Printf("Dynamic:\n");
1059dc4db5a6SEnrico Granata       m_dynamic_type.DumpTypeDescription(&strm);
1060dc4db5a6SEnrico Granata       strm.Printf("\nStatic:\n");
1061da7bc7d0SGreg Clayton     }
10629876addcSPavel Labath     m_static_type.DumpTypeDescription(&strm);
1063b9c1b51eSKate Stone   } else {
1064a3939069SGreg Clayton     strm.PutCString("Invalid TypeImpl module for type has been deleted\n");
1065a3939069SGreg Clayton   }
1066da7bc7d0SGreg Clayton   return true;
1067da7bc7d0SGreg Clayton }
1068732215f9STodd Fiala 
IsValid()1069b9c1b51eSKate Stone bool TypeMemberFunctionImpl::IsValid() {
10706c42cb11SEnrico Granata   return m_type.IsValid() && m_kind != lldb::eMemberFunctionKindUnknown;
10716c42cb11SEnrico Granata }
10726c42cb11SEnrico Granata 
GetName() const1073b9c1b51eSKate Stone ConstString TypeMemberFunctionImpl::GetName() const { return m_name; }
10746c42cb11SEnrico Granata 
GetMangledName() const1075b9c1b51eSKate Stone ConstString TypeMemberFunctionImpl::GetMangledName() const {
1076fe68904fSGreg Clayton   return m_decl.GetMangledName();
1077fe68904fSGreg Clayton }
1078fe68904fSGreg Clayton 
GetType() const1079b9c1b51eSKate Stone CompilerType TypeMemberFunctionImpl::GetType() const { return m_type; }
10806c42cb11SEnrico Granata 
GetKind() const1081b9c1b51eSKate Stone lldb::MemberFunctionKind TypeMemberFunctionImpl::GetKind() const {
10826c42cb11SEnrico Granata   return m_kind;
10836c42cb11SEnrico Granata }
10846c42cb11SEnrico Granata 
GetDescription(Stream & stream)1085b9c1b51eSKate Stone bool TypeMemberFunctionImpl::GetDescription(Stream &stream) {
10866c42cb11SEnrico Granata   switch (m_kind) {
10876c42cb11SEnrico Granata   case lldb::eMemberFunctionKindUnknown:
10886c42cb11SEnrico Granata     return false;
10896c42cb11SEnrico Granata   case lldb::eMemberFunctionKindConstructor:
1090b9c1b51eSKate Stone     stream.Printf("constructor for %s",
1091b9c1b51eSKate Stone                   m_type.GetTypeName().AsCString("<unknown>"));
10926c42cb11SEnrico Granata     break;
10936c42cb11SEnrico Granata   case lldb::eMemberFunctionKindDestructor:
1094b9c1b51eSKate Stone     stream.Printf("destructor for %s",
1095b9c1b51eSKate Stone                   m_type.GetTypeName().AsCString("<unknown>"));
10966c42cb11SEnrico Granata     break;
10976c42cb11SEnrico Granata   case lldb::eMemberFunctionKindInstanceMethod:
1098b9c1b51eSKate Stone     stream.Printf("instance method %s of type %s", m_name.AsCString(),
1099fe68904fSGreg Clayton                   m_decl.GetDeclContext().GetName().AsCString());
11006c42cb11SEnrico Granata     break;
11016c42cb11SEnrico Granata   case lldb::eMemberFunctionKindStaticMethod:
1102b9c1b51eSKate Stone     stream.Printf("static method %s of type %s", m_name.AsCString(),
1103fe68904fSGreg Clayton                   m_decl.GetDeclContext().GetName().AsCString());
11046c42cb11SEnrico Granata     break;
11056c42cb11SEnrico Granata   }
11066c42cb11SEnrico Granata   return true;
11076c42cb11SEnrico Granata }
11086c42cb11SEnrico Granata 
GetReturnType() const1109b9c1b51eSKate Stone CompilerType TypeMemberFunctionImpl::GetReturnType() const {
111047caf9a9SEnrico Granata   if (m_type)
111147caf9a9SEnrico Granata     return m_type.GetFunctionReturnType();
1112fe68904fSGreg Clayton   return m_decl.GetFunctionReturnType();
111347caf9a9SEnrico Granata }
111447caf9a9SEnrico Granata 
GetNumArguments() const1115b9c1b51eSKate Stone size_t TypeMemberFunctionImpl::GetNumArguments() const {
111647caf9a9SEnrico Granata   if (m_type)
111747caf9a9SEnrico Granata     return m_type.GetNumberOfFunctionArguments();
1118fe68904fSGreg Clayton   else
1119fe68904fSGreg Clayton     return m_decl.GetNumFunctionArguments();
112047caf9a9SEnrico Granata }
112147caf9a9SEnrico Granata 
GetArgumentAtIndex(size_t idx) const1122b9c1b51eSKate Stone CompilerType TypeMemberFunctionImpl::GetArgumentAtIndex(size_t idx) const {
112347caf9a9SEnrico Granata   if (m_type)
112447caf9a9SEnrico Granata     return m_type.GetFunctionArgumentAtIndex(idx);
1125fe68904fSGreg Clayton   else
1126fe68904fSGreg Clayton     return m_decl.GetFunctionArgumentType(idx);
112747caf9a9SEnrico Granata }
112847caf9a9SEnrico Granata 
TypeEnumMemberImpl(const lldb::TypeImplSP & integer_type_sp,ConstString name,const llvm::APSInt & value)112999558cc4SGreg Clayton TypeEnumMemberImpl::TypeEnumMemberImpl(const lldb::TypeImplSP &integer_type_sp,
11300e4c4821SAdrian Prantl                                        ConstString name,
1131b9c1b51eSKate Stone                                        const llvm::APSInt &value)
1132b9c1b51eSKate Stone     : m_integer_type_sp(integer_type_sp), m_name(name), m_value(value),
113399558cc4SGreg Clayton       m_valid((bool)name && (bool)integer_type_sp)
11344bd024d4SGreg Clayton 
1135b9c1b51eSKate Stone {}
1136