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