1 //===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "lldb/Symbol/ClangASTContext.h"
10
11 #include "llvm/Support/FormatAdapters.h"
12 #include "llvm/Support/FormatVariadic.h"
13
14 #include <mutex>
15 #include <string>
16 #include <vector>
17
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/ASTImporter.h"
20 #include "clang/AST/Attr.h"
21 #include "clang/AST/CXXInheritance.h"
22 #include "clang/AST/DeclObjC.h"
23 #include "clang/AST/DeclTemplate.h"
24 #include "clang/AST/Mangle.h"
25 #include "clang/AST/RecordLayout.h"
26 #include "clang/AST/Type.h"
27 #include "clang/AST/VTableBuilder.h"
28 #include "clang/Basic/Builtins.h"
29 #include "clang/Basic/Diagnostic.h"
30 #include "clang/Basic/FileManager.h"
31 #include "clang/Basic/FileSystemOptions.h"
32 #include "clang/Basic/LangStandard.h"
33 #include "clang/Basic/SourceManager.h"
34 #include "clang/Basic/TargetInfo.h"
35 #include "clang/Basic/TargetOptions.h"
36 #include "clang/Frontend/FrontendOptions.h"
37 #include "clang/Sema/Sema.h"
38
39 #include "llvm/Support/Signals.h"
40 #include "llvm/Support/Threading.h"
41
42 #include "Plugins/ExpressionParser/Clang/ClangFunctionCaller.h"
43 #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
44 #include "Plugins/ExpressionParser/Clang/ClangUserExpression.h"
45 #include "Plugins/ExpressionParser/Clang/ClangUtilityFunction.h"
46 #include "lldb/Utility/ArchSpec.h"
47 #include "lldb/Utility/Flags.h"
48
49 #include "lldb/Core/DumpDataExtractor.h"
50 #include "lldb/Core/Module.h"
51 #include "lldb/Core/PluginManager.h"
52 #include "lldb/Core/StreamFile.h"
53 #include "lldb/Core/ThreadSafeDenseMap.h"
54 #include "lldb/Core/UniqueCStringMap.h"
55 #include "lldb/Symbol/ClangASTImporter.h"
56 #include "lldb/Symbol/ClangASTMetadata.h"
57 #include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
58 #include "lldb/Symbol/ClangUtil.h"
59 #include "lldb/Symbol/ObjectFile.h"
60 #include "lldb/Symbol/SymbolFile.h"
61 #include "lldb/Target/ExecutionContext.h"
62 #include "lldb/Target/Language.h"
63 #include "lldb/Target/Process.h"
64 #include "lldb/Target/Target.h"
65 #include "lldb/Utility/DataExtractor.h"
66 #include "lldb/Utility/LLDBAssert.h"
67 #include "lldb/Utility/Log.h"
68 #include "lldb/Utility/RegularExpression.h"
69 #include "lldb/Utility/Scalar.h"
70
71 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
72 #include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
73 #ifdef LLDB_ENABLE_ALL
74 #include "Plugins/SymbolFile/PDB/PDBASTParser.h"
75 #endif // LLDB_ENABLE_ALL
76
77 #include <stdio.h>
78
79 #include <mutex>
80
81 using namespace lldb;
82 using namespace lldb_private;
83 using namespace clang;
84 using llvm::StringSwitch;
85
86 namespace {
87 #ifdef LLDB_CONFIGURATION_DEBUG
VerifyDecl(clang::Decl * decl)88 static void VerifyDecl(clang::Decl *decl) {
89 assert(decl && "VerifyDecl called with nullptr?");
90 decl->getAccess();
91 }
92 #endif
93
94 static inline bool
ClangASTContextSupportsLanguage(lldb::LanguageType language)95 ClangASTContextSupportsLanguage(lldb::LanguageType language) {
96 return language == eLanguageTypeUnknown || // Clang is the default type system
97 lldb_private::Language::LanguageIsC(language) ||
98 lldb_private::Language::LanguageIsCPlusPlus(language) ||
99 lldb_private::Language::LanguageIsObjC(language) ||
100 lldb_private::Language::LanguageIsPascal(language) ||
101 // Use Clang for Rust until there is a proper language plugin for it
102 language == eLanguageTypeRust ||
103 language == eLanguageTypeExtRenderScript ||
104 // Use Clang for D until there is a proper language plugin for it
105 language == eLanguageTypeD ||
106 // Open Dylan compiler debug info is designed to be Clang-compatible
107 language == eLanguageTypeDylan;
108 }
109
110 // Checks whether m1 is an overload of m2 (as opposed to an override). This is
111 // called by addOverridesForMethod to distinguish overrides (which share a
112 // vtable entry) from overloads (which require distinct entries).
isOverload(clang::CXXMethodDecl * m1,clang::CXXMethodDecl * m2)113 bool isOverload(clang::CXXMethodDecl *m1, clang::CXXMethodDecl *m2) {
114 // FIXME: This should detect covariant return types, but currently doesn't.
115 lldbassert(&m1->getASTContext() == &m2->getASTContext() &&
116 "Methods should have the same AST context");
117 clang::ASTContext &context = m1->getASTContext();
118
119 const auto *m1Type = llvm::cast<clang::FunctionProtoType>(
120 context.getCanonicalType(m1->getType()));
121
122 const auto *m2Type = llvm::cast<clang::FunctionProtoType>(
123 context.getCanonicalType(m2->getType()));
124
125 auto compareArgTypes = [&context](const clang::QualType &m1p,
126 const clang::QualType &m2p) {
127 return context.hasSameType(m1p.getUnqualifiedType(),
128 m2p.getUnqualifiedType());
129 };
130
131 // FIXME: In C++14 and later, we can just pass m2Type->param_type_end()
132 // as a fourth parameter to std::equal().
133 return (m1->getNumParams() != m2->getNumParams()) ||
134 !std::equal(m1Type->param_type_begin(), m1Type->param_type_end(),
135 m2Type->param_type_begin(), compareArgTypes);
136 }
137
138 // If decl is a virtual method, walk the base classes looking for methods that
139 // decl overrides. This table of overridden methods is used by IRGen to
140 // determine the vtable layout for decl's parent class.
addOverridesForMethod(clang::CXXMethodDecl * decl)141 void addOverridesForMethod(clang::CXXMethodDecl *decl) {
142 if (!decl->isVirtual())
143 return;
144
145 clang::CXXBasePaths paths;
146
147 auto find_overridden_methods =
148 [decl](const clang::CXXBaseSpecifier *specifier,
149 clang::CXXBasePath &path) {
150 if (auto *base_record = llvm::dyn_cast<clang::CXXRecordDecl>(
151 specifier->getType()->getAs<clang::RecordType>()->getDecl())) {
152
153 clang::DeclarationName name = decl->getDeclName();
154
155 // If this is a destructor, check whether the base class destructor is
156 // virtual.
157 if (name.getNameKind() == clang::DeclarationName::CXXDestructorName)
158 if (auto *baseDtorDecl = base_record->getDestructor()) {
159 if (baseDtorDecl->isVirtual()) {
160 path.Decls = baseDtorDecl;
161 return true;
162 } else
163 return false;
164 }
165
166 // Otherwise, search for name in the base class.
167 for (path.Decls = base_record->lookup(name); !path.Decls.empty();
168 path.Decls = path.Decls.slice(1)) {
169 if (auto *method_decl =
170 llvm::dyn_cast<clang::CXXMethodDecl>(path.Decls.front()))
171 if (method_decl->isVirtual() && !isOverload(decl, method_decl)) {
172 path.Decls = method_decl;
173 return true;
174 }
175 }
176 }
177
178 return false;
179 };
180
181 if (decl->getParent()->lookupInBases(find_overridden_methods, paths)) {
182 for (auto *overridden_decl : paths.found_decls())
183 decl->addOverriddenMethod(
184 llvm::cast<clang::CXXMethodDecl>(overridden_decl));
185 }
186 }
187 }
188
GetVTableAddress(Process & process,VTableContextBase & vtable_ctx,ValueObject & valobj,const ASTRecordLayout & record_layout)189 static lldb::addr_t GetVTableAddress(Process &process,
190 VTableContextBase &vtable_ctx,
191 ValueObject &valobj,
192 const ASTRecordLayout &record_layout) {
193 // Retrieve type info
194 CompilerType pointee_type;
195 CompilerType this_type(valobj.GetCompilerType());
196 uint32_t type_info = this_type.GetTypeInfo(&pointee_type);
197 if (!type_info)
198 return LLDB_INVALID_ADDRESS;
199
200 // Check if it's a pointer or reference
201 bool ptr_or_ref = false;
202 if (type_info & (eTypeIsPointer | eTypeIsReference)) {
203 ptr_or_ref = true;
204 type_info = pointee_type.GetTypeInfo();
205 }
206
207 // We process only C++ classes
208 const uint32_t cpp_class = eTypeIsClass | eTypeIsCPlusPlus;
209 if ((type_info & cpp_class) != cpp_class)
210 return LLDB_INVALID_ADDRESS;
211
212 // Calculate offset to VTable pointer
213 lldb::offset_t vbtable_ptr_offset =
214 vtable_ctx.isMicrosoft() ? record_layout.getVBPtrOffset().getQuantity()
215 : 0;
216
217 if (ptr_or_ref) {
218 // We have a pointer / ref to object, so read
219 // VTable pointer from process memory
220
221 if (valobj.GetAddressTypeOfChildren() != eAddressTypeLoad)
222 return LLDB_INVALID_ADDRESS;
223
224 auto vbtable_ptr_addr = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
225 if (vbtable_ptr_addr == LLDB_INVALID_ADDRESS)
226 return LLDB_INVALID_ADDRESS;
227
228 vbtable_ptr_addr += vbtable_ptr_offset;
229
230 Status err;
231 return process.ReadPointerFromMemory(vbtable_ptr_addr, err);
232 }
233
234 // We have an object already read from process memory,
235 // so just extract VTable pointer from it
236
237 DataExtractor data;
238 Status err;
239 auto size = valobj.GetData(data, err);
240 if (err.Fail() || vbtable_ptr_offset + data.GetAddressByteSize() > size)
241 return LLDB_INVALID_ADDRESS;
242
243 return data.GetPointer(&vbtable_ptr_offset);
244 }
245
ReadVBaseOffsetFromVTable(Process & process,VTableContextBase & vtable_ctx,lldb::addr_t vtable_ptr,const CXXRecordDecl * cxx_record_decl,const CXXRecordDecl * base_class_decl)246 static int64_t ReadVBaseOffsetFromVTable(Process &process,
247 VTableContextBase &vtable_ctx,
248 lldb::addr_t vtable_ptr,
249 const CXXRecordDecl *cxx_record_decl,
250 const CXXRecordDecl *base_class_decl) {
251 if (vtable_ctx.isMicrosoft()) {
252 clang::MicrosoftVTableContext &msoft_vtable_ctx =
253 static_cast<clang::MicrosoftVTableContext &>(vtable_ctx);
254
255 // Get the index into the virtual base table. The
256 // index is the index in uint32_t from vbtable_ptr
257 const unsigned vbtable_index =
258 msoft_vtable_ctx.getVBTableIndex(cxx_record_decl, base_class_decl);
259 const lldb::addr_t base_offset_addr = vtable_ptr + vbtable_index * 4;
260 Status err;
261 return process.ReadSignedIntegerFromMemory(base_offset_addr, 4, INT64_MAX,
262 err);
263 }
264
265 clang::ItaniumVTableContext &itanium_vtable_ctx =
266 static_cast<clang::ItaniumVTableContext &>(vtable_ctx);
267
268 clang::CharUnits base_offset_offset =
269 itanium_vtable_ctx.getVirtualBaseOffsetOffset(cxx_record_decl,
270 base_class_decl);
271 const lldb::addr_t base_offset_addr =
272 vtable_ptr + base_offset_offset.getQuantity();
273 const uint32_t base_offset_size = process.GetAddressByteSize();
274 Status err;
275 return process.ReadSignedIntegerFromMemory(base_offset_addr, base_offset_size,
276 INT64_MAX, err);
277 }
278
GetVBaseBitOffset(VTableContextBase & vtable_ctx,ValueObject & valobj,const ASTRecordLayout & record_layout,const CXXRecordDecl * cxx_record_decl,const CXXRecordDecl * base_class_decl,int32_t & bit_offset)279 static bool GetVBaseBitOffset(VTableContextBase &vtable_ctx,
280 ValueObject &valobj,
281 const ASTRecordLayout &record_layout,
282 const CXXRecordDecl *cxx_record_decl,
283 const CXXRecordDecl *base_class_decl,
284 int32_t &bit_offset) {
285 ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
286 Process *process = exe_ctx.GetProcessPtr();
287 if (!process)
288 return false;
289
290 lldb::addr_t vtable_ptr =
291 GetVTableAddress(*process, vtable_ctx, valobj, record_layout);
292 if (vtable_ptr == LLDB_INVALID_ADDRESS)
293 return false;
294
295 auto base_offset = ReadVBaseOffsetFromVTable(
296 *process, vtable_ctx, vtable_ptr, cxx_record_decl, base_class_decl);
297 if (base_offset == INT64_MAX)
298 return false;
299
300 bit_offset = base_offset * 8;
301
302 return true;
303 }
304
305 typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext *>
306 ClangASTMap;
307
GetASTMap()308 static ClangASTMap &GetASTMap() {
309 static ClangASTMap *g_map_ptr = nullptr;
310 static llvm::once_flag g_once_flag;
311 llvm::call_once(g_once_flag, []() {
312 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
313 });
314 return *g_map_ptr;
315 }
316
317 char ClangASTContext::ID;
318
IsOperator(llvm::StringRef name,clang::OverloadedOperatorKind & op_kind)319 bool ClangASTContext::IsOperator(llvm::StringRef name,
320 clang::OverloadedOperatorKind &op_kind) {
321 // All operators have to start with "operator".
322 if (!name.consume_front("operator"))
323 return false;
324
325 // Remember if there was a space after "operator". This is necessary to
326 // check for collisions with strangely named functions like "operatorint()".
327 bool space_after_operator = name.consume_front(" ");
328
329 op_kind = StringSwitch<clang::OverloadedOperatorKind>(name)
330 .Case("+", clang::OO_Plus)
331 .Case("+=", clang::OO_PlusEqual)
332 .Case("++", clang::OO_PlusPlus)
333 .Case("-", clang::OO_Minus)
334 .Case("-=", clang::OO_MinusEqual)
335 .Case("--", clang::OO_MinusMinus)
336 .Case("->", clang::OO_Arrow)
337 .Case("->*", clang::OO_ArrowStar)
338 .Case("*", clang::OO_Star)
339 .Case("*=", clang::OO_StarEqual)
340 .Case("/", clang::OO_Slash)
341 .Case("/=", clang::OO_SlashEqual)
342 .Case("%", clang::OO_Percent)
343 .Case("%=", clang::OO_PercentEqual)
344 .Case("^", clang::OO_Caret)
345 .Case("^=", clang::OO_CaretEqual)
346 .Case("&", clang::OO_Amp)
347 .Case("&=", clang::OO_AmpEqual)
348 .Case("&&", clang::OO_AmpAmp)
349 .Case("|", clang::OO_Pipe)
350 .Case("|=", clang::OO_PipeEqual)
351 .Case("||", clang::OO_PipePipe)
352 .Case("~", clang::OO_Tilde)
353 .Case("!", clang::OO_Exclaim)
354 .Case("!=", clang::OO_ExclaimEqual)
355 .Case("=", clang::OO_Equal)
356 .Case("==", clang::OO_EqualEqual)
357 .Case("<", clang::OO_Less)
358 .Case("<<", clang::OO_LessLess)
359 .Case("<<=", clang::OO_LessLessEqual)
360 .Case("<=", clang::OO_LessEqual)
361 .Case(">", clang::OO_Greater)
362 .Case(">>", clang::OO_GreaterGreater)
363 .Case(">>=", clang::OO_GreaterGreaterEqual)
364 .Case(">=", clang::OO_GreaterEqual)
365 .Case("()", clang::OO_Call)
366 .Case("[]", clang::OO_Subscript)
367 .Case(",", clang::OO_Comma)
368 .Default(clang::NUM_OVERLOADED_OPERATORS);
369
370 // We found a fitting operator, so we can exit now.
371 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
372 return true;
373
374 // After the "operator " or "operator" part is something unknown. This means
375 // it's either one of the named operators (new/delete), a conversion operator
376 // (e.g. operator bool) or a function which name starts with "operator"
377 // (e.g. void operatorbool).
378
379 // If it's a function that starts with operator it can't have a space after
380 // "operator" because identifiers can't contain spaces.
381 // E.g. "operator int" (conversion operator)
382 // vs. "operatorint" (function with colliding name).
383 if (!space_after_operator)
384 return false; // not an operator.
385
386 // Now the operator is either one of the named operators or a conversion
387 // operator.
388 op_kind = StringSwitch<clang::OverloadedOperatorKind>(name)
389 .Case("new", clang::OO_New)
390 .Case("new[]", clang::OO_Array_New)
391 .Case("delete", clang::OO_Delete)
392 .Case("delete[]", clang::OO_Array_Delete)
393 // conversion operators hit this case.
394 .Default(clang::NUM_OVERLOADED_OPERATORS);
395
396 return true;
397 }
398
399 clang::AccessSpecifier
ConvertAccessTypeToAccessSpecifier(AccessType access)400 ClangASTContext::ConvertAccessTypeToAccessSpecifier(AccessType access) {
401 switch (access) {
402 default:
403 break;
404 case eAccessNone:
405 return AS_none;
406 case eAccessPublic:
407 return AS_public;
408 case eAccessPrivate:
409 return AS_private;
410 case eAccessProtected:
411 return AS_protected;
412 }
413 return AS_none;
414 }
415
ParseLangArgs(LangOptions & Opts,InputKind IK,const char * triple)416 static void ParseLangArgs(LangOptions &Opts, InputKind IK, const char *triple) {
417 // FIXME: Cleanup per-file based stuff.
418
419 // Set some properties which depend solely on the input kind; it would be
420 // nice to move these to the language standard, and have the driver resolve
421 // the input kind + language standard.
422 if (IK.getLanguage() == clang::Language::Asm) {
423 Opts.AsmPreprocessor = 1;
424 } else if (IK.isObjectiveC()) {
425 Opts.ObjC = 1;
426 }
427
428 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
429
430 if (LangStd == LangStandard::lang_unspecified) {
431 // Based on the base language, pick one.
432 switch (IK.getLanguage()) {
433 case clang::Language::Unknown:
434 case clang::Language::LLVM_IR:
435 case clang::Language::RenderScript:
436 llvm_unreachable("Invalid input kind!");
437 case clang::Language::OpenCL:
438 LangStd = LangStandard::lang_opencl10;
439 break;
440 case clang::Language::CUDA:
441 LangStd = LangStandard::lang_cuda;
442 break;
443 case clang::Language::Asm:
444 case clang::Language::C:
445 case clang::Language::ObjC:
446 LangStd = LangStandard::lang_gnu99;
447 break;
448 case clang::Language::CXX:
449 case clang::Language::ObjCXX:
450 LangStd = LangStandard::lang_gnucxx98;
451 break;
452 case clang::Language::HIP:
453 LangStd = LangStandard::lang_hip;
454 break;
455 }
456 }
457
458 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
459 Opts.LineComment = Std.hasLineComments();
460 Opts.C99 = Std.isC99();
461 Opts.CPlusPlus = Std.isCPlusPlus();
462 Opts.CPlusPlus11 = Std.isCPlusPlus11();
463 Opts.Digraphs = Std.hasDigraphs();
464 Opts.GNUMode = Std.isGNUMode();
465 Opts.GNUInline = !Std.isC99();
466 Opts.HexFloats = Std.hasHexFloats();
467 Opts.ImplicitInt = Std.hasImplicitInt();
468
469 Opts.WChar = true;
470
471 // OpenCL has some additional defaults.
472 if (LangStd == LangStandard::lang_opencl10) {
473 Opts.OpenCL = 1;
474 Opts.AltiVec = 1;
475 Opts.CXXOperatorNames = 1;
476 Opts.setLaxVectorConversions(LangOptions::LaxVectorConversionKind::All);
477 }
478
479 // OpenCL and C++ both have bool, true, false keywords.
480 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
481
482 Opts.setValueVisibilityMode(DefaultVisibility);
483
484 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs is
485 // specified, or -std is set to a conforming mode.
486 Opts.Trigraphs = !Opts.GNUMode;
487 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
488 Opts.OptimizeSize = 0;
489
490 // FIXME: Eliminate this dependency.
491 // unsigned Opt =
492 // Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
493 // Opts.Optimize = Opt != 0;
494 unsigned Opt = 0;
495
496 // This is the __NO_INLINE__ define, which just depends on things like the
497 // optimization level and -fno-inline, not actually whether the backend has
498 // inlining enabled.
499 //
500 // FIXME: This is affected by other options (-fno-inline).
501 Opts.NoInlineDefine = !Opt;
502 }
503
ClangASTContext(llvm::Triple target_triple)504 ClangASTContext::ClangASTContext(llvm::Triple target_triple) {
505 if (!target_triple.str().empty())
506 SetTargetTriple(target_triple.str());
507 // The caller didn't pass an ASTContext so create a new one for this
508 // ClangASTContext.
509 CreateASTContext();
510 }
511
ClangASTContext(ASTContext & existing_ctxt)512 ClangASTContext::ClangASTContext(ASTContext &existing_ctxt) {
513 SetTargetTriple(existing_ctxt.getTargetInfo().getTriple().str());
514
515 m_ast_up.reset(&existing_ctxt);
516 GetASTMap().Insert(&existing_ctxt, this);
517 }
518
519 // Destructor
~ClangASTContext()520 ClangASTContext::~ClangASTContext() { Finalize(); }
521
GetPluginNameStatic()522 ConstString ClangASTContext::GetPluginNameStatic() {
523 return ConstString("clang");
524 }
525
GetPluginName()526 ConstString ClangASTContext::GetPluginName() {
527 return ClangASTContext::GetPluginNameStatic();
528 }
529
GetPluginVersion()530 uint32_t ClangASTContext::GetPluginVersion() { return 1; }
531
CreateInstance(lldb::LanguageType language,lldb_private::Module * module,Target * target)532 lldb::TypeSystemSP ClangASTContext::CreateInstance(lldb::LanguageType language,
533 lldb_private::Module *module,
534 Target *target) {
535 if (!ClangASTContextSupportsLanguage(language))
536 return lldb::TypeSystemSP();
537 ArchSpec arch;
538 if (module)
539 arch = module->GetArchitecture();
540 else if (target)
541 arch = target->GetArchitecture();
542
543 if (!arch.IsValid())
544 return lldb::TypeSystemSP();
545
546 llvm::Triple triple = arch.GetTriple();
547 // LLVM wants this to be set to iOS or MacOSX; if we're working on
548 // a bare-boards type image, change the triple for llvm's benefit.
549 if (triple.getVendor() == llvm::Triple::Apple &&
550 triple.getOS() == llvm::Triple::UnknownOS) {
551 if (triple.getArch() == llvm::Triple::arm ||
552 triple.getArch() == llvm::Triple::aarch64 ||
553 triple.getArch() == llvm::Triple::aarch64_32 ||
554 triple.getArch() == llvm::Triple::thumb) {
555 triple.setOS(llvm::Triple::IOS);
556 } else {
557 triple.setOS(llvm::Triple::MacOSX);
558 }
559 }
560
561 if (module)
562 return std::make_shared<ClangASTContext>(triple);
563 else if (target && target->IsValid())
564 return std::make_shared<ClangASTContextForExpressions>(*target, triple);
565 return lldb::TypeSystemSP();
566 }
567
GetSupportedLanguagesForTypes()568 LanguageSet ClangASTContext::GetSupportedLanguagesForTypes() {
569 LanguageSet languages;
570 languages.Insert(lldb::eLanguageTypeC89);
571 languages.Insert(lldb::eLanguageTypeC);
572 languages.Insert(lldb::eLanguageTypeC11);
573 languages.Insert(lldb::eLanguageTypeC_plus_plus);
574 languages.Insert(lldb::eLanguageTypeC99);
575 languages.Insert(lldb::eLanguageTypeObjC);
576 languages.Insert(lldb::eLanguageTypeObjC_plus_plus);
577 languages.Insert(lldb::eLanguageTypeC_plus_plus_03);
578 languages.Insert(lldb::eLanguageTypeC_plus_plus_11);
579 languages.Insert(lldb::eLanguageTypeC11);
580 languages.Insert(lldb::eLanguageTypeC_plus_plus_14);
581 return languages;
582 }
583
GetSupportedLanguagesForExpressions()584 LanguageSet ClangASTContext::GetSupportedLanguagesForExpressions() {
585 LanguageSet languages;
586 languages.Insert(lldb::eLanguageTypeC_plus_plus);
587 languages.Insert(lldb::eLanguageTypeObjC_plus_plus);
588 languages.Insert(lldb::eLanguageTypeC_plus_plus_03);
589 languages.Insert(lldb::eLanguageTypeC_plus_plus_11);
590 languages.Insert(lldb::eLanguageTypeC_plus_plus_14);
591 return languages;
592 }
593
Initialize()594 void ClangASTContext::Initialize() {
595 PluginManager::RegisterPlugin(
596 GetPluginNameStatic(), "clang base AST context plug-in", CreateInstance,
597 GetSupportedLanguagesForTypes(), GetSupportedLanguagesForExpressions());
598 }
599
Terminate()600 void ClangASTContext::Terminate() {
601 PluginManager::UnregisterPlugin(CreateInstance);
602 }
603
Finalize()604 void ClangASTContext::Finalize() {
605 assert(m_ast_up);
606 GetASTMap().Erase(m_ast_up.get());
607 if (!m_ast_owned)
608 m_ast_up.release();
609
610 m_builtins_up.reset();
611 m_selector_table_up.reset();
612 m_identifier_table_up.reset();
613 m_target_info_up.reset();
614 m_target_options_rp.reset();
615 m_diagnostics_engine_up.reset();
616 m_source_manager_up.reset();
617 m_language_options_up.reset();
618 }
619
setSema(Sema * s)620 void ClangASTContext::setSema(Sema *s) {
621 // Ensure that the new sema actually belongs to our ASTContext.
622 assert(s == nullptr || &s->getASTContext() == m_ast_up.get());
623 m_sema = s;
624 }
625
GetTargetTriple()626 const char *ClangASTContext::GetTargetTriple() {
627 return m_target_triple.c_str();
628 }
629
SetTargetTriple(llvm::StringRef target_triple)630 void ClangASTContext::SetTargetTriple(llvm::StringRef target_triple) {
631 m_target_triple = target_triple.str();
632 }
633
SetExternalSource(llvm::IntrusiveRefCntPtr<ExternalASTSource> & ast_source_up)634 void ClangASTContext::SetExternalSource(
635 llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_up) {
636 ASTContext &ast = getASTContext();
637 ast.setExternalSource(ast_source_up);
638 ast.getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
639 }
640
getASTContext()641 ASTContext &ClangASTContext::getASTContext() {
642 assert(m_ast_up);
643 return *m_ast_up;
644 }
645
646 class NullDiagnosticConsumer : public DiagnosticConsumer {
647 public:
NullDiagnosticConsumer()648 NullDiagnosticConsumer() {
649 m_log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS);
650 }
651
HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,const clang::Diagnostic & info)652 void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
653 const clang::Diagnostic &info) override {
654 if (m_log) {
655 llvm::SmallVector<char, 32> diag_str(10);
656 info.FormatDiagnostic(diag_str);
657 diag_str.push_back('\0');
658 LLDB_LOGF(m_log, "Compiler diagnostic: %s\n", diag_str.data());
659 }
660 }
661
clone(DiagnosticsEngine & Diags) const662 DiagnosticConsumer *clone(DiagnosticsEngine &Diags) const {
663 return new NullDiagnosticConsumer();
664 }
665
666 private:
667 Log *m_log;
668 };
669
CreateASTContext()670 void ClangASTContext::CreateASTContext() {
671 assert(!m_ast_up);
672 m_ast_owned = true;
673
674 m_language_options_up.reset(new LangOptions());
675 ParseLangArgs(*m_language_options_up, clang::Language::ObjCXX,
676 GetTargetTriple());
677
678 m_identifier_table_up.reset(
679 new IdentifierTable(*m_language_options_up, nullptr));
680 m_builtins_up.reset(new Builtin::Context());
681
682 m_selector_table_up.reset(new SelectorTable());
683
684 clang::FileSystemOptions file_system_options;
685 m_file_manager_up.reset(new clang::FileManager(
686 file_system_options, FileSystem::Instance().GetVirtualFileSystem()));
687
688 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
689 m_diagnostics_engine_up.reset(
690 new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
691
692 m_source_manager_up.reset(
693 new clang::SourceManager(*m_diagnostics_engine_up, *m_file_manager_up));
694 m_ast_up.reset(new ASTContext(*m_language_options_up, *m_source_manager_up,
695 *m_identifier_table_up, *m_selector_table_up,
696 *m_builtins_up));
697
698 m_diagnostic_consumer_up.reset(new NullDiagnosticConsumer);
699 m_ast_up->getDiagnostics().setClient(m_diagnostic_consumer_up.get(), false);
700
701 // This can be NULL if we don't know anything about the architecture or if
702 // the target for an architecture isn't enabled in the llvm/clang that we
703 // built
704 TargetInfo *target_info = getTargetInfo();
705 if (target_info)
706 m_ast_up->InitBuiltinTypes(*target_info);
707
708 GetASTMap().Insert(m_ast_up.get(), this);
709
710 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_up(
711 new ClangExternalASTSourceCallbacks(*this));
712 SetExternalSource(ast_source_up);
713 }
714
GetASTContext(clang::ASTContext * ast)715 ClangASTContext *ClangASTContext::GetASTContext(clang::ASTContext *ast) {
716 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
717 return clang_ast;
718 }
719
getMangleContext()720 clang::MangleContext *ClangASTContext::getMangleContext() {
721 if (m_mangle_ctx_up == nullptr)
722 m_mangle_ctx_up.reset(getASTContext().createMangleContext());
723 return m_mangle_ctx_up.get();
724 }
725
getTargetOptions()726 std::shared_ptr<clang::TargetOptions> &ClangASTContext::getTargetOptions() {
727 if (m_target_options_rp == nullptr && !m_target_triple.empty()) {
728 m_target_options_rp = std::make_shared<clang::TargetOptions>();
729 if (m_target_options_rp != nullptr)
730 m_target_options_rp->Triple = m_target_triple;
731 }
732 return m_target_options_rp;
733 }
734
getTargetInfo()735 TargetInfo *ClangASTContext::getTargetInfo() {
736 // target_triple should be something like "x86_64-apple-macosx"
737 if (m_target_info_up == nullptr && !m_target_triple.empty())
738 m_target_info_up.reset(TargetInfo::CreateTargetInfo(
739 getASTContext().getDiagnostics(), getTargetOptions()));
740 return m_target_info_up.get();
741 }
742
743 #pragma mark Basic Types
744
QualTypeMatchesBitSize(const uint64_t bit_size,ASTContext & ast,QualType qual_type)745 static inline bool QualTypeMatchesBitSize(const uint64_t bit_size,
746 ASTContext &ast, QualType qual_type) {
747 uint64_t qual_type_bit_size = ast.getTypeSize(qual_type);
748 return qual_type_bit_size == bit_size;
749 }
750
751 CompilerType
GetBuiltinTypeForEncodingAndBitSize(Encoding encoding,size_t bit_size)752 ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(Encoding encoding,
753 size_t bit_size) {
754 ASTContext &ast = getASTContext();
755 switch (encoding) {
756 case eEncodingInvalid:
757 if (QualTypeMatchesBitSize(bit_size, ast, ast.VoidPtrTy))
758 return GetType(ast.VoidPtrTy);
759 break;
760
761 case eEncodingUint:
762 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedCharTy))
763 return GetType(ast.UnsignedCharTy);
764 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedShortTy))
765 return GetType(ast.UnsignedShortTy);
766 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedIntTy))
767 return GetType(ast.UnsignedIntTy);
768 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongTy))
769 return GetType(ast.UnsignedLongTy);
770 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongLongTy))
771 return GetType(ast.UnsignedLongLongTy);
772 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedInt128Ty))
773 return GetType(ast.UnsignedInt128Ty);
774 break;
775
776 case eEncodingSint:
777 if (QualTypeMatchesBitSize(bit_size, ast, ast.SignedCharTy))
778 return GetType(ast.SignedCharTy);
779 if (QualTypeMatchesBitSize(bit_size, ast, ast.ShortTy))
780 return GetType(ast.ShortTy);
781 if (QualTypeMatchesBitSize(bit_size, ast, ast.IntTy))
782 return GetType(ast.IntTy);
783 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongTy))
784 return GetType(ast.LongTy);
785 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongLongTy))
786 return GetType(ast.LongLongTy);
787 if (QualTypeMatchesBitSize(bit_size, ast, ast.Int128Ty))
788 return GetType(ast.Int128Ty);
789 break;
790
791 case eEncodingIEEE754:
792 if (QualTypeMatchesBitSize(bit_size, ast, ast.FloatTy))
793 return GetType(ast.FloatTy);
794 if (QualTypeMatchesBitSize(bit_size, ast, ast.DoubleTy))
795 return GetType(ast.DoubleTy);
796 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongDoubleTy))
797 return GetType(ast.LongDoubleTy);
798 if (QualTypeMatchesBitSize(bit_size, ast, ast.HalfTy))
799 return GetType(ast.HalfTy);
800 break;
801
802 case eEncodingVector:
803 // Sanity check that bit_size is a multiple of 8's.
804 if (bit_size && !(bit_size & 0x7u))
805 return GetType(ast.getExtVectorType(ast.UnsignedCharTy, bit_size / 8));
806 break;
807 }
808
809 return CompilerType();
810 }
811
812 lldb::BasicType
GetBasicTypeEnumeration(ConstString name)813 ClangASTContext::GetBasicTypeEnumeration(ConstString name) {
814 if (name) {
815 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
816 static TypeNameToBasicTypeMap g_type_map;
817 static llvm::once_flag g_once_flag;
818 llvm::call_once(g_once_flag, []() {
819 // "void"
820 g_type_map.Append(ConstString("void"), eBasicTypeVoid);
821
822 // "char"
823 g_type_map.Append(ConstString("char"), eBasicTypeChar);
824 g_type_map.Append(ConstString("signed char"), eBasicTypeSignedChar);
825 g_type_map.Append(ConstString("unsigned char"), eBasicTypeUnsignedChar);
826 g_type_map.Append(ConstString("wchar_t"), eBasicTypeWChar);
827 g_type_map.Append(ConstString("signed wchar_t"), eBasicTypeSignedWChar);
828 g_type_map.Append(ConstString("unsigned wchar_t"),
829 eBasicTypeUnsignedWChar);
830 // "short"
831 g_type_map.Append(ConstString("short"), eBasicTypeShort);
832 g_type_map.Append(ConstString("short int"), eBasicTypeShort);
833 g_type_map.Append(ConstString("unsigned short"), eBasicTypeUnsignedShort);
834 g_type_map.Append(ConstString("unsigned short int"),
835 eBasicTypeUnsignedShort);
836
837 // "int"
838 g_type_map.Append(ConstString("int"), eBasicTypeInt);
839 g_type_map.Append(ConstString("signed int"), eBasicTypeInt);
840 g_type_map.Append(ConstString("unsigned int"), eBasicTypeUnsignedInt);
841 g_type_map.Append(ConstString("unsigned"), eBasicTypeUnsignedInt);
842
843 // "long"
844 g_type_map.Append(ConstString("long"), eBasicTypeLong);
845 g_type_map.Append(ConstString("long int"), eBasicTypeLong);
846 g_type_map.Append(ConstString("unsigned long"), eBasicTypeUnsignedLong);
847 g_type_map.Append(ConstString("unsigned long int"),
848 eBasicTypeUnsignedLong);
849
850 // "long long"
851 g_type_map.Append(ConstString("long long"), eBasicTypeLongLong);
852 g_type_map.Append(ConstString("long long int"), eBasicTypeLongLong);
853 g_type_map.Append(ConstString("unsigned long long"),
854 eBasicTypeUnsignedLongLong);
855 g_type_map.Append(ConstString("unsigned long long int"),
856 eBasicTypeUnsignedLongLong);
857
858 // "int128"
859 g_type_map.Append(ConstString("__int128_t"), eBasicTypeInt128);
860 g_type_map.Append(ConstString("__uint128_t"), eBasicTypeUnsignedInt128);
861
862 // Miscellaneous
863 g_type_map.Append(ConstString("bool"), eBasicTypeBool);
864 g_type_map.Append(ConstString("float"), eBasicTypeFloat);
865 g_type_map.Append(ConstString("double"), eBasicTypeDouble);
866 g_type_map.Append(ConstString("long double"), eBasicTypeLongDouble);
867 g_type_map.Append(ConstString("id"), eBasicTypeObjCID);
868 g_type_map.Append(ConstString("SEL"), eBasicTypeObjCSel);
869 g_type_map.Append(ConstString("nullptr"), eBasicTypeNullPtr);
870 g_type_map.Sort();
871 });
872
873 return g_type_map.Find(name, eBasicTypeInvalid);
874 }
875 return eBasicTypeInvalid;
876 }
877
GetPointerByteSize()878 uint32_t ClangASTContext::GetPointerByteSize() {
879 if (m_pointer_byte_size == 0)
880 if (auto size = GetBasicType(lldb::eBasicTypeVoid)
881 .GetPointerType()
882 .GetByteSize(nullptr))
883 m_pointer_byte_size = *size;
884 return m_pointer_byte_size;
885 }
886
GetBasicType(lldb::BasicType basic_type)887 CompilerType ClangASTContext::GetBasicType(lldb::BasicType basic_type) {
888 clang::ASTContext &ast = getASTContext();
889
890 lldb::opaque_compiler_type_t clang_type =
891 GetOpaqueCompilerType(&ast, basic_type);
892
893 if (clang_type)
894 return CompilerType(this, clang_type);
895 return CompilerType();
896 }
897
GetBuiltinTypeForDWARFEncodingAndBitSize(llvm::StringRef type_name,uint32_t dw_ate,uint32_t bit_size)898 CompilerType ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize(
899 llvm::StringRef type_name, uint32_t dw_ate, uint32_t bit_size) {
900 ASTContext &ast = getASTContext();
901
902 switch (dw_ate) {
903 default:
904 break;
905
906 case DW_ATE_address:
907 if (QualTypeMatchesBitSize(bit_size, ast, ast.VoidPtrTy))
908 return GetType(ast.VoidPtrTy);
909 break;
910
911 case DW_ATE_boolean:
912 if (QualTypeMatchesBitSize(bit_size, ast, ast.BoolTy))
913 return GetType(ast.BoolTy);
914 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedCharTy))
915 return GetType(ast.UnsignedCharTy);
916 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedShortTy))
917 return GetType(ast.UnsignedShortTy);
918 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedIntTy))
919 return GetType(ast.UnsignedIntTy);
920 break;
921
922 case DW_ATE_lo_user:
923 // This has been seen to mean DW_AT_complex_integer
924 if (type_name.contains("complex")) {
925 CompilerType complex_int_clang_type =
926 GetBuiltinTypeForDWARFEncodingAndBitSize("int", DW_ATE_signed,
927 bit_size / 2);
928 return GetType(
929 ast.getComplexType(ClangUtil::GetQualType(complex_int_clang_type)));
930 }
931 break;
932
933 case DW_ATE_complex_float:
934 if (QualTypeMatchesBitSize(bit_size, ast, ast.FloatComplexTy))
935 return GetType(ast.FloatComplexTy);
936 else if (QualTypeMatchesBitSize(bit_size, ast, ast.DoubleComplexTy))
937 return GetType(ast.DoubleComplexTy);
938 else if (QualTypeMatchesBitSize(bit_size, ast, ast.LongDoubleComplexTy))
939 return GetType(ast.LongDoubleComplexTy);
940 else {
941 CompilerType complex_float_clang_type =
942 GetBuiltinTypeForDWARFEncodingAndBitSize("float", DW_ATE_float,
943 bit_size / 2);
944 return GetType(
945 ast.getComplexType(ClangUtil::GetQualType(complex_float_clang_type)));
946 }
947 break;
948
949 case DW_ATE_float:
950 if (type_name == "float" &&
951 QualTypeMatchesBitSize(bit_size, ast, ast.FloatTy))
952 return GetType(ast.FloatTy);
953 if (type_name == "double" &&
954 QualTypeMatchesBitSize(bit_size, ast, ast.DoubleTy))
955 return GetType(ast.DoubleTy);
956 if (type_name == "long double" &&
957 QualTypeMatchesBitSize(bit_size, ast, ast.LongDoubleTy))
958 return GetType(ast.LongDoubleTy);
959 // Fall back to not requiring a name match
960 if (QualTypeMatchesBitSize(bit_size, ast, ast.FloatTy))
961 return GetType(ast.FloatTy);
962 if (QualTypeMatchesBitSize(bit_size, ast, ast.DoubleTy))
963 return GetType(ast.DoubleTy);
964 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongDoubleTy))
965 return GetType(ast.LongDoubleTy);
966 if (QualTypeMatchesBitSize(bit_size, ast, ast.HalfTy))
967 return GetType(ast.HalfTy);
968 break;
969
970 case DW_ATE_signed:
971 if (!type_name.empty()) {
972 if (type_name == "wchar_t" &&
973 QualTypeMatchesBitSize(bit_size, ast, ast.WCharTy) &&
974 (getTargetInfo() &&
975 TargetInfo::isTypeSigned(getTargetInfo()->getWCharType())))
976 return GetType(ast.WCharTy);
977 if (type_name == "void" &&
978 QualTypeMatchesBitSize(bit_size, ast, ast.VoidTy))
979 return GetType(ast.VoidTy);
980 if (type_name.contains("long long") &&
981 QualTypeMatchesBitSize(bit_size, ast, ast.LongLongTy))
982 return GetType(ast.LongLongTy);
983 if (type_name.contains("long") &&
984 QualTypeMatchesBitSize(bit_size, ast, ast.LongTy))
985 return GetType(ast.LongTy);
986 if (type_name.contains("short") &&
987 QualTypeMatchesBitSize(bit_size, ast, ast.ShortTy))
988 return GetType(ast.ShortTy);
989 if (type_name.contains("char")) {
990 if (QualTypeMatchesBitSize(bit_size, ast, ast.CharTy))
991 return GetType(ast.CharTy);
992 if (QualTypeMatchesBitSize(bit_size, ast, ast.SignedCharTy))
993 return GetType(ast.SignedCharTy);
994 }
995 if (type_name.contains("int")) {
996 if (QualTypeMatchesBitSize(bit_size, ast, ast.IntTy))
997 return GetType(ast.IntTy);
998 if (QualTypeMatchesBitSize(bit_size, ast, ast.Int128Ty))
999 return GetType(ast.Int128Ty);
1000 }
1001 }
1002 // We weren't able to match up a type name, just search by size
1003 if (QualTypeMatchesBitSize(bit_size, ast, ast.CharTy))
1004 return GetType(ast.CharTy);
1005 if (QualTypeMatchesBitSize(bit_size, ast, ast.ShortTy))
1006 return GetType(ast.ShortTy);
1007 if (QualTypeMatchesBitSize(bit_size, ast, ast.IntTy))
1008 return GetType(ast.IntTy);
1009 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongTy))
1010 return GetType(ast.LongTy);
1011 if (QualTypeMatchesBitSize(bit_size, ast, ast.LongLongTy))
1012 return GetType(ast.LongLongTy);
1013 if (QualTypeMatchesBitSize(bit_size, ast, ast.Int128Ty))
1014 return GetType(ast.Int128Ty);
1015 break;
1016
1017 case DW_ATE_signed_char:
1018 if (ast.getLangOpts().CharIsSigned && type_name == "char") {
1019 if (QualTypeMatchesBitSize(bit_size, ast, ast.CharTy))
1020 return GetType(ast.CharTy);
1021 }
1022 if (QualTypeMatchesBitSize(bit_size, ast, ast.SignedCharTy))
1023 return GetType(ast.SignedCharTy);
1024 break;
1025
1026 case DW_ATE_unsigned:
1027 if (!type_name.empty()) {
1028 if (type_name == "wchar_t") {
1029 if (QualTypeMatchesBitSize(bit_size, ast, ast.WCharTy)) {
1030 if (!(getTargetInfo() &&
1031 TargetInfo::isTypeSigned(getTargetInfo()->getWCharType())))
1032 return GetType(ast.WCharTy);
1033 }
1034 }
1035 if (type_name.contains("long long")) {
1036 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongLongTy))
1037 return GetType(ast.UnsignedLongLongTy);
1038 } else if (type_name.contains("long")) {
1039 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongTy))
1040 return GetType(ast.UnsignedLongTy);
1041 } else if (type_name.contains("short")) {
1042 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedShortTy))
1043 return GetType(ast.UnsignedShortTy);
1044 } else if (type_name.contains("char")) {
1045 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedCharTy))
1046 return GetType(ast.UnsignedCharTy);
1047 } else if (type_name.contains("int")) {
1048 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedIntTy))
1049 return GetType(ast.UnsignedIntTy);
1050 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedInt128Ty))
1051 return GetType(ast.UnsignedInt128Ty);
1052 }
1053 }
1054 // We weren't able to match up a type name, just search by size
1055 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedCharTy))
1056 return GetType(ast.UnsignedCharTy);
1057 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedShortTy))
1058 return GetType(ast.UnsignedShortTy);
1059 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedIntTy))
1060 return GetType(ast.UnsignedIntTy);
1061 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongTy))
1062 return GetType(ast.UnsignedLongTy);
1063 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedLongLongTy))
1064 return GetType(ast.UnsignedLongLongTy);
1065 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedInt128Ty))
1066 return GetType(ast.UnsignedInt128Ty);
1067 break;
1068
1069 case DW_ATE_unsigned_char:
1070 if (!ast.getLangOpts().CharIsSigned && type_name == "char") {
1071 if (QualTypeMatchesBitSize(bit_size, ast, ast.CharTy))
1072 return GetType(ast.CharTy);
1073 }
1074 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedCharTy))
1075 return GetType(ast.UnsignedCharTy);
1076 if (QualTypeMatchesBitSize(bit_size, ast, ast.UnsignedShortTy))
1077 return GetType(ast.UnsignedShortTy);
1078 break;
1079
1080 case DW_ATE_imaginary_float:
1081 break;
1082
1083 case DW_ATE_UTF:
1084 if (!type_name.empty()) {
1085 if (type_name == "char16_t")
1086 return GetType(ast.Char16Ty);
1087 if (type_name == "char32_t")
1088 return GetType(ast.Char32Ty);
1089 if (type_name == "char8_t")
1090 return GetType(ast.Char8Ty);
1091 }
1092 break;
1093 }
1094 // This assert should fire for anything that we don't catch above so we know
1095 // to fix any issues we run into.
1096 if (!type_name.empty()) {
1097 std::string type_name_str = type_name.str();
1098 Host::SystemLog(Host::eSystemLogError,
1099 "error: need to add support for DW_TAG_base_type '%s' "
1100 "encoded with DW_ATE = 0x%x, bit_size = %u\n",
1101 type_name_str.c_str(), dw_ate, bit_size);
1102 } else {
1103 Host::SystemLog(Host::eSystemLogError, "error: need to add support for "
1104 "DW_TAG_base_type encoded with "
1105 "DW_ATE = 0x%x, bit_size = %u\n",
1106 dw_ate, bit_size);
1107 }
1108 return CompilerType();
1109 }
1110
GetCStringType(bool is_const)1111 CompilerType ClangASTContext::GetCStringType(bool is_const) {
1112 ASTContext &ast = getASTContext();
1113 QualType char_type(ast.CharTy);
1114
1115 if (is_const)
1116 char_type.addConst();
1117
1118 return GetType(ast.getPointerType(char_type));
1119 }
1120
AreTypesSame(CompilerType type1,CompilerType type2,bool ignore_qualifiers)1121 bool ClangASTContext::AreTypesSame(CompilerType type1, CompilerType type2,
1122 bool ignore_qualifiers) {
1123 ClangASTContext *ast =
1124 llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1125 if (!ast || ast != type2.GetTypeSystem())
1126 return false;
1127
1128 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
1129 return true;
1130
1131 QualType type1_qual = ClangUtil::GetQualType(type1);
1132 QualType type2_qual = ClangUtil::GetQualType(type2);
1133
1134 if (ignore_qualifiers) {
1135 type1_qual = type1_qual.getUnqualifiedType();
1136 type2_qual = type2_qual.getUnqualifiedType();
1137 }
1138
1139 return ast->getASTContext().hasSameType(type1_qual, type2_qual);
1140 }
1141
GetTypeForDecl(void * opaque_decl)1142 CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) {
1143 if (!opaque_decl)
1144 return CompilerType();
1145
1146 clang::Decl *decl = static_cast<clang::Decl *>(opaque_decl);
1147 if (auto *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl))
1148 return GetTypeForDecl(named_decl);
1149 return CompilerType();
1150 }
1151
CreateDeclContext(DeclContext * ctx)1152 CompilerDeclContext ClangASTContext::CreateDeclContext(DeclContext *ctx) {
1153 // Check that the DeclContext actually belongs to this ASTContext.
1154 assert(&ctx->getParentASTContext() == &getASTContext());
1155 return CompilerDeclContext(this, ctx);
1156 }
1157
GetTypeForDecl(clang::NamedDecl * decl)1158 CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) {
1159 if (clang::ObjCInterfaceDecl *interface_decl =
1160 llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1161 return GetTypeForDecl(interface_decl);
1162 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1163 return GetTypeForDecl(tag_decl);
1164 return CompilerType();
1165 }
1166
GetTypeForDecl(TagDecl * decl)1167 CompilerType ClangASTContext::GetTypeForDecl(TagDecl *decl) {
1168 return GetType(getASTContext().getTagDeclType(decl));
1169 }
1170
GetTypeForDecl(ObjCInterfaceDecl * decl)1171 CompilerType ClangASTContext::GetTypeForDecl(ObjCInterfaceDecl *decl) {
1172 return GetType(getASTContext().getObjCInterfaceType(decl));
1173 }
1174
1175 #pragma mark Structure, Unions, Classes
1176
CreateRecordType(DeclContext * decl_ctx,AccessType access_type,llvm::StringRef name,int kind,LanguageType language,ClangASTMetadata * metadata,bool exports_symbols)1177 CompilerType ClangASTContext::CreateRecordType(DeclContext *decl_ctx,
1178 AccessType access_type,
1179 llvm::StringRef name, int kind,
1180 LanguageType language,
1181 ClangASTMetadata *metadata,
1182 bool exports_symbols) {
1183 ASTContext &ast = getASTContext();
1184
1185 if (decl_ctx == nullptr)
1186 decl_ctx = ast.getTranslationUnitDecl();
1187
1188 if (language == eLanguageTypeObjC ||
1189 language == eLanguageTypeObjC_plus_plus) {
1190 bool isForwardDecl = true;
1191 bool isInternal = false;
1192 return CreateObjCClass(name, decl_ctx, isForwardDecl, isInternal, metadata);
1193 }
1194
1195 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1196 // we will need to update this code. I was told to currently always use the
1197 // CXXRecordDecl class since we often don't know from debug information if
1198 // something is struct or a class, so we default to always use the more
1199 // complete definition just in case.
1200
1201 bool has_name = !name.empty();
1202
1203 CXXRecordDecl *decl = CXXRecordDecl::Create(
1204 ast, (TagDecl::TagKind)kind, decl_ctx, SourceLocation(), SourceLocation(),
1205 has_name ? &ast.Idents.get(name) : nullptr);
1206
1207 if (!has_name) {
1208 // In C++ a lambda is also represented as an unnamed class. This is
1209 // different from an *anonymous class* that the user wrote:
1210 //
1211 // struct A {
1212 // // anonymous class (GNU/MSVC extension)
1213 // struct {
1214 // int x;
1215 // };
1216 // // unnamed class within a class
1217 // struct {
1218 // int y;
1219 // } B;
1220 // };
1221 //
1222 // void f() {
1223 // // unammed class outside of a class
1224 // struct {
1225 // int z;
1226 // } C;
1227 // }
1228 //
1229 // Anonymous classes is a GNU/MSVC extension that clang supports. It
1230 // requires the anonymous class be embedded within a class. So the new
1231 // heuristic verifies this condition.
1232 if (isa<CXXRecordDecl>(decl_ctx) && exports_symbols)
1233 decl->setAnonymousStructOrUnion(true);
1234 }
1235
1236 if (decl) {
1237 if (metadata)
1238 SetMetadata(decl, *metadata);
1239
1240 if (access_type != eAccessNone)
1241 decl->setAccess(ConvertAccessTypeToAccessSpecifier(access_type));
1242
1243 if (decl_ctx)
1244 decl_ctx->addDecl(decl);
1245
1246 return GetType(ast.getTagDeclType(decl));
1247 }
1248 return CompilerType();
1249 }
1250
1251 namespace {
IsValueParam(const clang::TemplateArgument & argument)1252 bool IsValueParam(const clang::TemplateArgument &argument) {
1253 return argument.getKind() == TemplateArgument::Integral;
1254 }
1255 }
1256
CreateTemplateParameterList(ASTContext * ast,const ClangASTContext::TemplateParameterInfos & template_param_infos,llvm::SmallVector<NamedDecl *,8> & template_param_decls)1257 static TemplateParameterList *CreateTemplateParameterList(
1258 ASTContext *ast,
1259 const ClangASTContext::TemplateParameterInfos &template_param_infos,
1260 llvm::SmallVector<NamedDecl *, 8> &template_param_decls) {
1261 const bool parameter_pack = false;
1262 const bool is_typename = false;
1263 const unsigned depth = 0;
1264 const size_t num_template_params = template_param_infos.args.size();
1265 DeclContext *const decl_context =
1266 ast->getTranslationUnitDecl(); // Is this the right decl context?,
1267 for (size_t i = 0; i < num_template_params; ++i) {
1268 const char *name = template_param_infos.names[i];
1269
1270 IdentifierInfo *identifier_info = nullptr;
1271 if (name && name[0])
1272 identifier_info = &ast->Idents.get(name);
1273 if (IsValueParam(template_param_infos.args[i])) {
1274 template_param_decls.push_back(NonTypeTemplateParmDecl::Create(
1275 *ast, decl_context,
1276 SourceLocation(), SourceLocation(), depth, i, identifier_info,
1277 template_param_infos.args[i].getIntegralType(), parameter_pack,
1278 nullptr));
1279
1280 } else {
1281 template_param_decls.push_back(TemplateTypeParmDecl::Create(
1282 *ast, decl_context,
1283 SourceLocation(), SourceLocation(), depth, i, identifier_info,
1284 is_typename, parameter_pack));
1285 }
1286 }
1287
1288 if (template_param_infos.packed_args) {
1289 IdentifierInfo *identifier_info = nullptr;
1290 if (template_param_infos.pack_name && template_param_infos.pack_name[0])
1291 identifier_info = &ast->Idents.get(template_param_infos.pack_name);
1292 const bool parameter_pack_true = true;
1293
1294 if (!template_param_infos.packed_args->args.empty() &&
1295 IsValueParam(template_param_infos.packed_args->args[0])) {
1296 template_param_decls.push_back(NonTypeTemplateParmDecl::Create(
1297 *ast, decl_context, SourceLocation(), SourceLocation(), depth,
1298 num_template_params, identifier_info,
1299 template_param_infos.packed_args->args[0].getIntegralType(),
1300 parameter_pack_true, nullptr));
1301 } else {
1302 template_param_decls.push_back(TemplateTypeParmDecl::Create(
1303 *ast, decl_context, SourceLocation(), SourceLocation(), depth,
1304 num_template_params, identifier_info, is_typename,
1305 parameter_pack_true));
1306 }
1307 }
1308 clang::Expr *const requires_clause = nullptr; // TODO: Concepts
1309 TemplateParameterList *template_param_list = TemplateParameterList::Create(
1310 *ast, SourceLocation(), SourceLocation(), template_param_decls,
1311 SourceLocation(), requires_clause);
1312 return template_param_list;
1313 }
1314
CreateFunctionTemplateDecl(clang::DeclContext * decl_ctx,clang::FunctionDecl * func_decl,const char * name,const TemplateParameterInfos & template_param_infos)1315 clang::FunctionTemplateDecl *ClangASTContext::CreateFunctionTemplateDecl(
1316 clang::DeclContext *decl_ctx, clang::FunctionDecl *func_decl,
1317 const char *name, const TemplateParameterInfos &template_param_infos) {
1318 // /// Create a function template node.
1319 ASTContext &ast = getASTContext();
1320
1321 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1322
1323 TemplateParameterList *template_param_list = CreateTemplateParameterList(
1324 &ast, template_param_infos, template_param_decls);
1325 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create(
1326 ast, decl_ctx, func_decl->getLocation(), func_decl->getDeclName(),
1327 template_param_list, func_decl);
1328
1329 for (size_t i = 0, template_param_decl_count = template_param_decls.size();
1330 i < template_param_decl_count; ++i) {
1331 // TODO: verify which decl context we should put template_param_decls into..
1332 template_param_decls[i]->setDeclContext(func_decl);
1333 }
1334 // Function templates inside a record need to have an access specifier.
1335 // It doesn't matter what access specifier we give the template as LLDB
1336 // anyway allows accessing everything inside a record.
1337 if (decl_ctx->isRecord())
1338 func_tmpl_decl->setAccess(clang::AccessSpecifier::AS_public);
1339
1340 return func_tmpl_decl;
1341 }
1342
CreateFunctionTemplateSpecializationInfo(FunctionDecl * func_decl,clang::FunctionTemplateDecl * func_tmpl_decl,const TemplateParameterInfos & infos)1343 void ClangASTContext::CreateFunctionTemplateSpecializationInfo(
1344 FunctionDecl *func_decl, clang::FunctionTemplateDecl *func_tmpl_decl,
1345 const TemplateParameterInfos &infos) {
1346 TemplateArgumentList *template_args_ptr =
1347 TemplateArgumentList::CreateCopy(func_decl->getASTContext(), infos.args);
1348
1349 func_decl->setFunctionTemplateSpecialization(func_tmpl_decl,
1350 template_args_ptr, nullptr);
1351 }
1352
CreateClassTemplateDecl(DeclContext * decl_ctx,lldb::AccessType access_type,const char * class_name,int kind,const TemplateParameterInfos & template_param_infos)1353 ClassTemplateDecl *ClangASTContext::CreateClassTemplateDecl(
1354 DeclContext *decl_ctx, lldb::AccessType access_type, const char *class_name,
1355 int kind, const TemplateParameterInfos &template_param_infos) {
1356 ASTContext &ast = getASTContext();
1357
1358 ClassTemplateDecl *class_template_decl = nullptr;
1359 if (decl_ctx == nullptr)
1360 decl_ctx = ast.getTranslationUnitDecl();
1361
1362 IdentifierInfo &identifier_info = ast.Idents.get(class_name);
1363 DeclarationName decl_name(&identifier_info);
1364
1365 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1366
1367 for (NamedDecl *decl : result) {
1368 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
1369 if (class_template_decl)
1370 return class_template_decl;
1371 }
1372
1373 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1374
1375 TemplateParameterList *template_param_list = CreateTemplateParameterList(
1376 &ast, template_param_infos, template_param_decls);
1377
1378 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create(
1379 ast, (TagDecl::TagKind)kind,
1380 decl_ctx, // What decl context do we use here? TU? The actual decl
1381 // context?
1382 SourceLocation(), SourceLocation(), &identifier_info);
1383
1384 for (size_t i = 0, template_param_decl_count = template_param_decls.size();
1385 i < template_param_decl_count; ++i) {
1386 template_param_decls[i]->setDeclContext(template_cxx_decl);
1387 }
1388
1389 // With templated classes, we say that a class is templated with
1390 // specializations, but that the bare class has no functions.
1391 // template_cxx_decl->startDefinition();
1392 // template_cxx_decl->completeDefinition();
1393
1394 class_template_decl = ClassTemplateDecl::Create(
1395 ast,
1396 decl_ctx, // What decl context do we use here? TU? The actual decl
1397 // context?
1398 SourceLocation(), decl_name, template_param_list, template_cxx_decl);
1399 template_cxx_decl->setDescribedClassTemplate(class_template_decl);
1400
1401 if (class_template_decl) {
1402 if (access_type != eAccessNone)
1403 class_template_decl->setAccess(
1404 ConvertAccessTypeToAccessSpecifier(access_type));
1405
1406 // if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1407 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1408
1409 decl_ctx->addDecl(class_template_decl);
1410
1411 #ifdef LLDB_CONFIGURATION_DEBUG
1412 VerifyDecl(class_template_decl);
1413 #endif
1414 }
1415
1416 return class_template_decl;
1417 }
1418
1419 TemplateTemplateParmDecl *
CreateTemplateTemplateParmDecl(const char * template_name)1420 ClangASTContext::CreateTemplateTemplateParmDecl(const char *template_name) {
1421 ASTContext &ast = getASTContext();
1422
1423 auto *decl_ctx = ast.getTranslationUnitDecl();
1424
1425 IdentifierInfo &identifier_info = ast.Idents.get(template_name);
1426 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1427
1428 ClangASTContext::TemplateParameterInfos template_param_infos;
1429 TemplateParameterList *template_param_list = CreateTemplateParameterList(
1430 &ast, template_param_infos, template_param_decls);
1431
1432 // LLDB needs to create those decls only to be able to display a
1433 // type that includes a template template argument. Only the name matters for
1434 // this purpose, so we use dummy values for the other characterisitcs of the
1435 // type.
1436 return TemplateTemplateParmDecl::Create(
1437 ast, decl_ctx, SourceLocation(),
1438 /*Depth*/ 0, /*Position*/ 0,
1439 /*IsParameterPack*/ false, &identifier_info, template_param_list);
1440 }
1441
1442 ClassTemplateSpecializationDecl *
CreateClassTemplateSpecializationDecl(DeclContext * decl_ctx,ClassTemplateDecl * class_template_decl,int kind,const TemplateParameterInfos & template_param_infos)1443 ClangASTContext::CreateClassTemplateSpecializationDecl(
1444 DeclContext *decl_ctx, ClassTemplateDecl *class_template_decl, int kind,
1445 const TemplateParameterInfos &template_param_infos) {
1446 ASTContext &ast = getASTContext();
1447 llvm::SmallVector<clang::TemplateArgument, 2> args(
1448 template_param_infos.args.size() +
1449 (template_param_infos.packed_args ? 1 : 0));
1450 std::copy(template_param_infos.args.begin(), template_param_infos.args.end(),
1451 args.begin());
1452 if (template_param_infos.packed_args) {
1453 args[args.size() - 1] = TemplateArgument::CreatePackCopy(
1454 ast, template_param_infos.packed_args->args);
1455 }
1456 ClassTemplateSpecializationDecl *class_template_specialization_decl =
1457 ClassTemplateSpecializationDecl::Create(
1458 ast, (TagDecl::TagKind)kind, decl_ctx, SourceLocation(),
1459 SourceLocation(), class_template_decl, args, nullptr);
1460
1461 class_template_specialization_decl->setSpecializationKind(
1462 TSK_ExplicitSpecialization);
1463
1464 return class_template_specialization_decl;
1465 }
1466
CreateClassTemplateSpecializationType(ClassTemplateSpecializationDecl * class_template_specialization_decl)1467 CompilerType ClangASTContext::CreateClassTemplateSpecializationType(
1468 ClassTemplateSpecializationDecl *class_template_specialization_decl) {
1469 if (class_template_specialization_decl) {
1470 ASTContext &ast = getASTContext();
1471 return GetType(ast.getTagDeclType(class_template_specialization_decl));
1472 }
1473 return CompilerType();
1474 }
1475
check_op_param(bool is_method,clang::OverloadedOperatorKind op_kind,bool unary,bool binary,uint32_t num_params)1476 static inline bool check_op_param(bool is_method,
1477 clang::OverloadedOperatorKind op_kind,
1478 bool unary, bool binary,
1479 uint32_t num_params) {
1480 // Special-case call since it can take any number of operands
1481 if (op_kind == OO_Call)
1482 return true;
1483
1484 // The parameter count doesn't include "this"
1485 if (is_method)
1486 ++num_params;
1487 if (num_params == 1)
1488 return unary;
1489 if (num_params == 2)
1490 return binary;
1491 else
1492 return false;
1493 }
1494
CheckOverloadedOperatorKindParameterCount(bool is_method,clang::OverloadedOperatorKind op_kind,uint32_t num_params)1495 bool ClangASTContext::CheckOverloadedOperatorKindParameterCount(
1496 bool is_method, clang::OverloadedOperatorKind op_kind,
1497 uint32_t num_params) {
1498 switch (op_kind) {
1499 default:
1500 break;
1501 // C++ standard allows any number of arguments to new/delete
1502 case OO_New:
1503 case OO_Array_New:
1504 case OO_Delete:
1505 case OO_Array_Delete:
1506 return true;
1507 }
1508
1509 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
1510 case OO_##Name: \
1511 return check_op_param(is_method, op_kind, Unary, Binary, num_params);
1512 switch (op_kind) {
1513 #include "clang/Basic/OperatorKinds.def"
1514 default:
1515 break;
1516 }
1517 return false;
1518 }
1519
1520 clang::AccessSpecifier
UnifyAccessSpecifiers(clang::AccessSpecifier lhs,clang::AccessSpecifier rhs)1521 ClangASTContext::UnifyAccessSpecifiers(clang::AccessSpecifier lhs,
1522 clang::AccessSpecifier rhs) {
1523 // Make the access equal to the stricter of the field and the nested field's
1524 // access
1525 if (lhs == AS_none || rhs == AS_none)
1526 return AS_none;
1527 if (lhs == AS_private || rhs == AS_private)
1528 return AS_private;
1529 if (lhs == AS_protected || rhs == AS_protected)
1530 return AS_protected;
1531 return AS_public;
1532 }
1533
FieldIsBitfield(FieldDecl * field,uint32_t & bitfield_bit_size)1534 bool ClangASTContext::FieldIsBitfield(FieldDecl *field,
1535 uint32_t &bitfield_bit_size) {
1536 ASTContext &ast = getASTContext();
1537 if (field == nullptr)
1538 return false;
1539
1540 if (field->isBitField()) {
1541 Expr *bit_width_expr = field->getBitWidth();
1542 if (bit_width_expr) {
1543 llvm::APSInt bit_width_apsint;
1544 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, ast)) {
1545 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1546 return true;
1547 }
1548 }
1549 }
1550 return false;
1551 }
1552
RecordHasFields(const RecordDecl * record_decl)1553 bool ClangASTContext::RecordHasFields(const RecordDecl *record_decl) {
1554 if (record_decl == nullptr)
1555 return false;
1556
1557 if (!record_decl->field_empty())
1558 return true;
1559
1560 // No fields, lets check this is a CXX record and check the base classes
1561 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1562 if (cxx_record_decl) {
1563 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1564 for (base_class = cxx_record_decl->bases_begin(),
1565 base_class_end = cxx_record_decl->bases_end();
1566 base_class != base_class_end; ++base_class) {
1567 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(
1568 base_class->getType()->getAs<RecordType>()->getDecl());
1569 if (RecordHasFields(base_class_decl))
1570 return true;
1571 }
1572 }
1573 return false;
1574 }
1575
1576 #pragma mark Objective-C Classes
1577
CreateObjCClass(llvm::StringRef name,DeclContext * decl_ctx,bool isForwardDecl,bool isInternal,ClangASTMetadata * metadata)1578 CompilerType ClangASTContext::CreateObjCClass(llvm::StringRef name,
1579 DeclContext *decl_ctx,
1580 bool isForwardDecl,
1581 bool isInternal,
1582 ClangASTMetadata *metadata) {
1583 ASTContext &ast = getASTContext();
1584 assert(!name.empty());
1585 if (decl_ctx == nullptr)
1586 decl_ctx = ast.getTranslationUnitDecl();
1587
1588 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create(
1589 ast, decl_ctx, SourceLocation(), &ast.Idents.get(name), nullptr, nullptr,
1590 SourceLocation(),
1591 /*isForwardDecl,*/
1592 isInternal);
1593
1594 if (decl && metadata)
1595 SetMetadata(decl, *metadata);
1596
1597 return GetType(ast.getObjCInterfaceType(decl));
1598 }
1599
BaseSpecifierIsEmpty(const CXXBaseSpecifier * b)1600 static inline bool BaseSpecifierIsEmpty(const CXXBaseSpecifier *b) {
1601 return !ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl());
1602 }
1603
1604 uint32_t
GetNumBaseClasses(const CXXRecordDecl * cxx_record_decl,bool omit_empty_base_classes)1605 ClangASTContext::GetNumBaseClasses(const CXXRecordDecl *cxx_record_decl,
1606 bool omit_empty_base_classes) {
1607 uint32_t num_bases = 0;
1608 if (cxx_record_decl) {
1609 if (omit_empty_base_classes) {
1610 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1611 for (base_class = cxx_record_decl->bases_begin(),
1612 base_class_end = cxx_record_decl->bases_end();
1613 base_class != base_class_end; ++base_class) {
1614 // Skip empty base classes
1615 if (omit_empty_base_classes) {
1616 if (BaseSpecifierIsEmpty(base_class))
1617 continue;
1618 }
1619 ++num_bases;
1620 }
1621 } else
1622 num_bases = cxx_record_decl->getNumBases();
1623 }
1624 return num_bases;
1625 }
1626
1627 #pragma mark Namespace Declarations
1628
GetUniqueNamespaceDeclaration(const char * name,DeclContext * decl_ctx,bool is_inline)1629 NamespaceDecl *ClangASTContext::GetUniqueNamespaceDeclaration(
1630 const char *name, DeclContext *decl_ctx, bool is_inline) {
1631 NamespaceDecl *namespace_decl = nullptr;
1632 ASTContext &ast = getASTContext();
1633 TranslationUnitDecl *translation_unit_decl = ast.getTranslationUnitDecl();
1634 if (decl_ctx == nullptr)
1635 decl_ctx = translation_unit_decl;
1636
1637 if (name) {
1638 IdentifierInfo &identifier_info = ast.Idents.get(name);
1639 DeclarationName decl_name(&identifier_info);
1640 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1641 for (NamedDecl *decl : result) {
1642 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
1643 if (namespace_decl)
1644 return namespace_decl;
1645 }
1646
1647 namespace_decl =
1648 NamespaceDecl::Create(ast, decl_ctx, is_inline, SourceLocation(),
1649 SourceLocation(), &identifier_info, nullptr);
1650
1651 decl_ctx->addDecl(namespace_decl);
1652 } else {
1653 if (decl_ctx == translation_unit_decl) {
1654 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1655 if (namespace_decl)
1656 return namespace_decl;
1657
1658 namespace_decl =
1659 NamespaceDecl::Create(ast, decl_ctx, false, SourceLocation(),
1660 SourceLocation(), nullptr, nullptr);
1661 translation_unit_decl->setAnonymousNamespace(namespace_decl);
1662 translation_unit_decl->addDecl(namespace_decl);
1663 assert(namespace_decl == translation_unit_decl->getAnonymousNamespace());
1664 } else {
1665 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1666 if (parent_namespace_decl) {
1667 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1668 if (namespace_decl)
1669 return namespace_decl;
1670 namespace_decl =
1671 NamespaceDecl::Create(ast, decl_ctx, false, SourceLocation(),
1672 SourceLocation(), nullptr, nullptr);
1673 parent_namespace_decl->setAnonymousNamespace(namespace_decl);
1674 parent_namespace_decl->addDecl(namespace_decl);
1675 assert(namespace_decl ==
1676 parent_namespace_decl->getAnonymousNamespace());
1677 } else {
1678 assert(false && "GetUniqueNamespaceDeclaration called with no name and "
1679 "no namespace as decl_ctx");
1680 }
1681 }
1682 }
1683 #ifdef LLDB_CONFIGURATION_DEBUG
1684 VerifyDecl(namespace_decl);
1685 #endif
1686 return namespace_decl;
1687 }
1688
1689 clang::BlockDecl *
CreateBlockDeclaration(clang::DeclContext * ctx)1690 ClangASTContext::CreateBlockDeclaration(clang::DeclContext *ctx) {
1691 if (ctx != nullptr) {
1692 clang::BlockDecl *decl =
1693 clang::BlockDecl::Create(getASTContext(), ctx, clang::SourceLocation());
1694 ctx->addDecl(decl);
1695 return decl;
1696 }
1697 return nullptr;
1698 }
1699
FindLCABetweenDecls(clang::DeclContext * left,clang::DeclContext * right,clang::DeclContext * root)1700 clang::DeclContext *FindLCABetweenDecls(clang::DeclContext *left,
1701 clang::DeclContext *right,
1702 clang::DeclContext *root) {
1703 if (root == nullptr)
1704 return nullptr;
1705
1706 std::set<clang::DeclContext *> path_left;
1707 for (clang::DeclContext *d = left; d != nullptr; d = d->getParent())
1708 path_left.insert(d);
1709
1710 for (clang::DeclContext *d = right; d != nullptr; d = d->getParent())
1711 if (path_left.find(d) != path_left.end())
1712 return d;
1713
1714 return nullptr;
1715 }
1716
CreateUsingDirectiveDeclaration(clang::DeclContext * decl_ctx,clang::NamespaceDecl * ns_decl)1717 clang::UsingDirectiveDecl *ClangASTContext::CreateUsingDirectiveDeclaration(
1718 clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl) {
1719 if (decl_ctx != nullptr && ns_decl != nullptr) {
1720 auto *translation_unit = getASTContext().getTranslationUnitDecl();
1721 clang::UsingDirectiveDecl *using_decl = clang::UsingDirectiveDecl::Create(
1722 getASTContext(), decl_ctx, clang::SourceLocation(),
1723 clang::SourceLocation(), clang::NestedNameSpecifierLoc(),
1724 clang::SourceLocation(), ns_decl,
1725 FindLCABetweenDecls(decl_ctx, ns_decl, translation_unit));
1726 decl_ctx->addDecl(using_decl);
1727 return using_decl;
1728 }
1729 return nullptr;
1730 }
1731
1732 clang::UsingDecl *
CreateUsingDeclaration(clang::DeclContext * current_decl_ctx,clang::NamedDecl * target)1733 ClangASTContext::CreateUsingDeclaration(clang::DeclContext *current_decl_ctx,
1734 clang::NamedDecl *target) {
1735 if (current_decl_ctx != nullptr && target != nullptr) {
1736 clang::UsingDecl *using_decl = clang::UsingDecl::Create(
1737 getASTContext(), current_decl_ctx, clang::SourceLocation(),
1738 clang::NestedNameSpecifierLoc(), clang::DeclarationNameInfo(), false);
1739 clang::UsingShadowDecl *shadow_decl = clang::UsingShadowDecl::Create(
1740 getASTContext(), current_decl_ctx, clang::SourceLocation(), using_decl,
1741 target);
1742 using_decl->addShadowDecl(shadow_decl);
1743 current_decl_ctx->addDecl(using_decl);
1744 return using_decl;
1745 }
1746 return nullptr;
1747 }
1748
CreateVariableDeclaration(clang::DeclContext * decl_context,const char * name,clang::QualType type)1749 clang::VarDecl *ClangASTContext::CreateVariableDeclaration(
1750 clang::DeclContext *decl_context, const char *name, clang::QualType type) {
1751 if (decl_context != nullptr) {
1752 clang::VarDecl *var_decl = clang::VarDecl::Create(
1753 getASTContext(), decl_context, clang::SourceLocation(),
1754 clang::SourceLocation(),
1755 name && name[0] ? &getASTContext().Idents.getOwn(name) : nullptr, type,
1756 nullptr, clang::SC_None);
1757 var_decl->setAccess(clang::AS_public);
1758 decl_context->addDecl(var_decl);
1759 return var_decl;
1760 }
1761 return nullptr;
1762 }
1763
1764 lldb::opaque_compiler_type_t
GetOpaqueCompilerType(clang::ASTContext * ast,lldb::BasicType basic_type)1765 ClangASTContext::GetOpaqueCompilerType(clang::ASTContext *ast,
1766 lldb::BasicType basic_type) {
1767 switch (basic_type) {
1768 case eBasicTypeVoid:
1769 return ast->VoidTy.getAsOpaquePtr();
1770 case eBasicTypeChar:
1771 return ast->CharTy.getAsOpaquePtr();
1772 case eBasicTypeSignedChar:
1773 return ast->SignedCharTy.getAsOpaquePtr();
1774 case eBasicTypeUnsignedChar:
1775 return ast->UnsignedCharTy.getAsOpaquePtr();
1776 case eBasicTypeWChar:
1777 return ast->getWCharType().getAsOpaquePtr();
1778 case eBasicTypeSignedWChar:
1779 return ast->getSignedWCharType().getAsOpaquePtr();
1780 case eBasicTypeUnsignedWChar:
1781 return ast->getUnsignedWCharType().getAsOpaquePtr();
1782 case eBasicTypeChar16:
1783 return ast->Char16Ty.getAsOpaquePtr();
1784 case eBasicTypeChar32:
1785 return ast->Char32Ty.getAsOpaquePtr();
1786 case eBasicTypeShort:
1787 return ast->ShortTy.getAsOpaquePtr();
1788 case eBasicTypeUnsignedShort:
1789 return ast->UnsignedShortTy.getAsOpaquePtr();
1790 case eBasicTypeInt:
1791 return ast->IntTy.getAsOpaquePtr();
1792 case eBasicTypeUnsignedInt:
1793 return ast->UnsignedIntTy.getAsOpaquePtr();
1794 case eBasicTypeLong:
1795 return ast->LongTy.getAsOpaquePtr();
1796 case eBasicTypeUnsignedLong:
1797 return ast->UnsignedLongTy.getAsOpaquePtr();
1798 case eBasicTypeLongLong:
1799 return ast->LongLongTy.getAsOpaquePtr();
1800 case eBasicTypeUnsignedLongLong:
1801 return ast->UnsignedLongLongTy.getAsOpaquePtr();
1802 case eBasicTypeInt128:
1803 return ast->Int128Ty.getAsOpaquePtr();
1804 case eBasicTypeUnsignedInt128:
1805 return ast->UnsignedInt128Ty.getAsOpaquePtr();
1806 case eBasicTypeBool:
1807 return ast->BoolTy.getAsOpaquePtr();
1808 case eBasicTypeHalf:
1809 return ast->HalfTy.getAsOpaquePtr();
1810 case eBasicTypeFloat:
1811 return ast->FloatTy.getAsOpaquePtr();
1812 case eBasicTypeDouble:
1813 return ast->DoubleTy.getAsOpaquePtr();
1814 case eBasicTypeLongDouble:
1815 return ast->LongDoubleTy.getAsOpaquePtr();
1816 case eBasicTypeFloatComplex:
1817 return ast->FloatComplexTy.getAsOpaquePtr();
1818 case eBasicTypeDoubleComplex:
1819 return ast->DoubleComplexTy.getAsOpaquePtr();
1820 case eBasicTypeLongDoubleComplex:
1821 return ast->LongDoubleComplexTy.getAsOpaquePtr();
1822 case eBasicTypeObjCID:
1823 return ast->getObjCIdType().getAsOpaquePtr();
1824 case eBasicTypeObjCClass:
1825 return ast->getObjCClassType().getAsOpaquePtr();
1826 case eBasicTypeObjCSel:
1827 return ast->getObjCSelType().getAsOpaquePtr();
1828 case eBasicTypeNullPtr:
1829 return ast->NullPtrTy.getAsOpaquePtr();
1830 default:
1831 return nullptr;
1832 }
1833 }
1834
1835 #pragma mark Function Types
1836
1837 clang::DeclarationName
GetDeclarationName(const char * name,const CompilerType & function_clang_type)1838 ClangASTContext::GetDeclarationName(const char *name,
1839 const CompilerType &function_clang_type) {
1840 if (!name || !name[0])
1841 return clang::DeclarationName();
1842
1843 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
1844 if (!IsOperator(name, op_kind) || op_kind == clang::NUM_OVERLOADED_OPERATORS)
1845 return DeclarationName(&getASTContext().Idents.get(
1846 name)); // Not operator, but a regular function.
1847
1848 // Check the number of operator parameters. Sometimes we have seen bad DWARF
1849 // that doesn't correctly describe operators and if we try to create a method
1850 // and add it to the class, clang will assert and crash, so we need to make
1851 // sure things are acceptable.
1852 clang::QualType method_qual_type(ClangUtil::GetQualType(function_clang_type));
1853 const clang::FunctionProtoType *function_type =
1854 llvm::dyn_cast<clang::FunctionProtoType>(method_qual_type.getTypePtr());
1855 if (function_type == nullptr)
1856 return clang::DeclarationName();
1857
1858 const bool is_method = false;
1859 const unsigned int num_params = function_type->getNumParams();
1860 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount(
1861 is_method, op_kind, num_params))
1862 return clang::DeclarationName();
1863
1864 return getASTContext().DeclarationNames.getCXXOperatorName(op_kind);
1865 }
1866
CreateFunctionDeclaration(DeclContext * decl_ctx,const char * name,const CompilerType & function_clang_type,int storage,bool is_inline)1867 FunctionDecl *ClangASTContext::CreateFunctionDeclaration(
1868 DeclContext *decl_ctx, const char *name,
1869 const CompilerType &function_clang_type, int storage, bool is_inline) {
1870 FunctionDecl *func_decl = nullptr;
1871 ASTContext &ast = getASTContext();
1872 if (decl_ctx == nullptr)
1873 decl_ctx = ast.getTranslationUnitDecl();
1874
1875 const bool hasWrittenPrototype = true;
1876 const bool isConstexprSpecified = false;
1877
1878 clang::DeclarationName declarationName =
1879 GetDeclarationName(name, function_clang_type);
1880 func_decl = FunctionDecl::Create(
1881 ast, decl_ctx, SourceLocation(), SourceLocation(), declarationName,
1882 ClangUtil::GetQualType(function_clang_type), nullptr,
1883 (clang::StorageClass)storage, is_inline, hasWrittenPrototype,
1884 isConstexprSpecified ? CSK_constexpr : CSK_unspecified);
1885 if (func_decl)
1886 decl_ctx->addDecl(func_decl);
1887
1888 #ifdef LLDB_CONFIGURATION_DEBUG
1889 VerifyDecl(func_decl);
1890 #endif
1891
1892 return func_decl;
1893 }
1894
1895 CompilerType
CreateFunctionType(const CompilerType & result_type,const CompilerType * args,unsigned num_args,bool is_variadic,unsigned type_quals,clang::CallingConv cc)1896 ClangASTContext::CreateFunctionType(const CompilerType &result_type,
1897 const CompilerType *args, unsigned num_args,
1898 bool is_variadic, unsigned type_quals,
1899 clang::CallingConv cc) {
1900 if (!result_type || !ClangUtil::IsClangType(result_type))
1901 return CompilerType(); // invalid return type
1902
1903 std::vector<QualType> qual_type_args;
1904 if (num_args > 0 && args == nullptr)
1905 return CompilerType(); // invalid argument array passed in
1906
1907 // Verify that all arguments are valid and the right type
1908 for (unsigned i = 0; i < num_args; ++i) {
1909 if (args[i]) {
1910 // Make sure we have a clang type in args[i] and not a type from another
1911 // language whose name might match
1912 const bool is_clang_type = ClangUtil::IsClangType(args[i]);
1913 lldbassert(is_clang_type);
1914 if (is_clang_type)
1915 qual_type_args.push_back(ClangUtil::GetQualType(args[i]));
1916 else
1917 return CompilerType(); // invalid argument type (must be a clang type)
1918 } else
1919 return CompilerType(); // invalid argument type (empty)
1920 }
1921
1922 // TODO: Detect calling convention in DWARF?
1923 FunctionProtoType::ExtProtoInfo proto_info;
1924 proto_info.ExtInfo = cc;
1925 proto_info.Variadic = is_variadic;
1926 proto_info.ExceptionSpec = EST_None;
1927 proto_info.TypeQuals = clang::Qualifiers::fromFastMask(type_quals);
1928 proto_info.RefQualifier = RQ_None;
1929
1930 return GetType(getASTContext().getFunctionType(
1931 ClangUtil::GetQualType(result_type), qual_type_args, proto_info));
1932 }
1933
CreateParameterDeclaration(clang::DeclContext * decl_ctx,const char * name,const CompilerType & param_type,int storage,bool add_decl)1934 ParmVarDecl *ClangASTContext::CreateParameterDeclaration(
1935 clang::DeclContext *decl_ctx, const char *name,
1936 const CompilerType ¶m_type, int storage, bool add_decl) {
1937 ASTContext &ast = getASTContext();
1938 auto *decl =
1939 ParmVarDecl::Create(ast, decl_ctx, SourceLocation(), SourceLocation(),
1940 name && name[0] ? &ast.Idents.get(name) : nullptr,
1941 ClangUtil::GetQualType(param_type), nullptr,
1942 (clang::StorageClass)storage, nullptr);
1943 if (add_decl)
1944 decl_ctx->addDecl(decl);
1945
1946 return decl;
1947 }
1948
SetFunctionParameters(FunctionDecl * function_decl,ParmVarDecl ** params,unsigned num_params)1949 void ClangASTContext::SetFunctionParameters(FunctionDecl *function_decl,
1950 ParmVarDecl **params,
1951 unsigned num_params) {
1952 if (function_decl)
1953 function_decl->setParams(ArrayRef<ParmVarDecl *>(params, num_params));
1954 }
1955
1956 CompilerType
CreateBlockPointerType(const CompilerType & function_type)1957 ClangASTContext::CreateBlockPointerType(const CompilerType &function_type) {
1958 QualType block_type = m_ast_up->getBlockPointerType(
1959 clang::QualType::getFromOpaquePtr(function_type.GetOpaqueQualType()));
1960
1961 return GetType(block_type);
1962 }
1963
1964 #pragma mark Array Types
1965
CreateArrayType(const CompilerType & element_type,size_t element_count,bool is_vector)1966 CompilerType ClangASTContext::CreateArrayType(const CompilerType &element_type,
1967 size_t element_count,
1968 bool is_vector) {
1969 if (element_type.IsValid()) {
1970 ASTContext &ast = getASTContext();
1971
1972 if (is_vector) {
1973 return GetType(ast.getExtVectorType(ClangUtil::GetQualType(element_type),
1974 element_count));
1975 } else {
1976
1977 llvm::APInt ap_element_count(64, element_count);
1978 if (element_count == 0) {
1979 return GetType(ast.getIncompleteArrayType(
1980 ClangUtil::GetQualType(element_type), clang::ArrayType::Normal, 0));
1981 } else {
1982 return GetType(ast.getConstantArrayType(
1983 ClangUtil::GetQualType(element_type), ap_element_count, nullptr,
1984 clang::ArrayType::Normal, 0));
1985 }
1986 }
1987 }
1988 return CompilerType();
1989 }
1990
CreateStructForIdentifier(ConstString type_name,const std::initializer_list<std::pair<const char *,CompilerType>> & type_fields,bool packed)1991 CompilerType ClangASTContext::CreateStructForIdentifier(
1992 ConstString type_name,
1993 const std::initializer_list<std::pair<const char *, CompilerType>>
1994 &type_fields,
1995 bool packed) {
1996 CompilerType type;
1997 if (!type_name.IsEmpty() &&
1998 (type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name))
1999 .IsValid()) {
2000 lldbassert(0 && "Trying to create a type for an existing name");
2001 return type;
2002 }
2003
2004 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(),
2005 clang::TTK_Struct, lldb::eLanguageTypeC);
2006 StartTagDeclarationDefinition(type);
2007 for (const auto &field : type_fields)
2008 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic,
2009 0);
2010 if (packed)
2011 SetIsPacked(type);
2012 CompleteTagDeclarationDefinition(type);
2013 return type;
2014 }
2015
GetOrCreateStructForIdentifier(ConstString type_name,const std::initializer_list<std::pair<const char *,CompilerType>> & type_fields,bool packed)2016 CompilerType ClangASTContext::GetOrCreateStructForIdentifier(
2017 ConstString type_name,
2018 const std::initializer_list<std::pair<const char *, CompilerType>>
2019 &type_fields,
2020 bool packed) {
2021 CompilerType type;
2022 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2023 return type;
2024
2025 return CreateStructForIdentifier(type_name, type_fields, packed);
2026 }
2027
2028 #pragma mark Enumeration Types
2029
2030 CompilerType
CreateEnumerationType(const char * name,DeclContext * decl_ctx,const Declaration & decl,const CompilerType & integer_clang_type,bool is_scoped)2031 ClangASTContext::CreateEnumerationType(const char *name, DeclContext *decl_ctx,
2032 const Declaration &decl,
2033 const CompilerType &integer_clang_type,
2034 bool is_scoped) {
2035 // TODO: Do something intelligent with the Declaration object passed in
2036 // like maybe filling in the SourceLocation with it...
2037 ASTContext &ast = getASTContext();
2038
2039 // TODO: ask about these...
2040 // const bool IsFixed = false;
2041
2042 EnumDecl *enum_decl = EnumDecl::Create(
2043 ast, decl_ctx, SourceLocation(), SourceLocation(),
2044 name && name[0] ? &ast.Idents.get(name) : nullptr, nullptr,
2045 is_scoped, // IsScoped
2046 is_scoped, // IsScopedUsingClassTag
2047 false); // IsFixed
2048
2049 if (enum_decl) {
2050 if (decl_ctx)
2051 decl_ctx->addDecl(enum_decl);
2052
2053 // TODO: check if we should be setting the promotion type too?
2054 enum_decl->setIntegerType(ClangUtil::GetQualType(integer_clang_type));
2055
2056 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
2057
2058 return GetType(ast.getTagDeclType(enum_decl));
2059 }
2060 return CompilerType();
2061 }
2062
GetIntTypeFromBitSize(size_t bit_size,bool is_signed)2063 CompilerType ClangASTContext::GetIntTypeFromBitSize(size_t bit_size,
2064 bool is_signed) {
2065 clang::ASTContext &ast = getASTContext();
2066
2067 if (is_signed) {
2068 if (bit_size == ast.getTypeSize(ast.SignedCharTy))
2069 return GetType(ast.SignedCharTy);
2070
2071 if (bit_size == ast.getTypeSize(ast.ShortTy))
2072 return GetType(ast.ShortTy);
2073
2074 if (bit_size == ast.getTypeSize(ast.IntTy))
2075 return GetType(ast.IntTy);
2076
2077 if (bit_size == ast.getTypeSize(ast.LongTy))
2078 return GetType(ast.LongTy);
2079
2080 if (bit_size == ast.getTypeSize(ast.LongLongTy))
2081 return GetType(ast.LongLongTy);
2082
2083 if (bit_size == ast.getTypeSize(ast.Int128Ty))
2084 return GetType(ast.Int128Ty);
2085 } else {
2086 if (bit_size == ast.getTypeSize(ast.UnsignedCharTy))
2087 return GetType(ast.UnsignedCharTy);
2088
2089 if (bit_size == ast.getTypeSize(ast.UnsignedShortTy))
2090 return GetType(ast.UnsignedShortTy);
2091
2092 if (bit_size == ast.getTypeSize(ast.UnsignedIntTy))
2093 return GetType(ast.UnsignedIntTy);
2094
2095 if (bit_size == ast.getTypeSize(ast.UnsignedLongTy))
2096 return GetType(ast.UnsignedLongTy);
2097
2098 if (bit_size == ast.getTypeSize(ast.UnsignedLongLongTy))
2099 return GetType(ast.UnsignedLongLongTy);
2100
2101 if (bit_size == ast.getTypeSize(ast.UnsignedInt128Ty))
2102 return GetType(ast.UnsignedInt128Ty);
2103 }
2104 return CompilerType();
2105 }
2106
GetPointerSizedIntType(bool is_signed)2107 CompilerType ClangASTContext::GetPointerSizedIntType(bool is_signed) {
2108 return GetIntTypeFromBitSize(
2109 getASTContext().getTypeSize(getASTContext().VoidPtrTy), is_signed);
2110 }
2111
DumpDeclContextHiearchy(clang::DeclContext * decl_ctx)2112 void ClangASTContext::DumpDeclContextHiearchy(clang::DeclContext *decl_ctx) {
2113 if (decl_ctx) {
2114 DumpDeclContextHiearchy(decl_ctx->getParent());
2115
2116 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl_ctx);
2117 if (named_decl) {
2118 printf("%20s: %s\n", decl_ctx->getDeclKindName(),
2119 named_decl->getDeclName().getAsString().c_str());
2120 } else {
2121 printf("%20s\n", decl_ctx->getDeclKindName());
2122 }
2123 }
2124 }
2125
DumpDeclHiearchy(clang::Decl * decl)2126 void ClangASTContext::DumpDeclHiearchy(clang::Decl *decl) {
2127 if (decl == nullptr)
2128 return;
2129 DumpDeclContextHiearchy(decl->getDeclContext());
2130
2131 clang::RecordDecl *record_decl = llvm::dyn_cast<clang::RecordDecl>(decl);
2132 if (record_decl) {
2133 printf("%20s: %s%s\n", decl->getDeclKindName(),
2134 record_decl->getDeclName().getAsString().c_str(),
2135 record_decl->isInjectedClassName() ? " (injected class name)" : "");
2136
2137 } else {
2138 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl);
2139 if (named_decl) {
2140 printf("%20s: %s\n", decl->getDeclKindName(),
2141 named_decl->getDeclName().getAsString().c_str());
2142 } else {
2143 printf("%20s\n", decl->getDeclKindName());
2144 }
2145 }
2146 }
2147
DeclsAreEquivalent(clang::Decl * lhs_decl,clang::Decl * rhs_decl)2148 bool ClangASTContext::DeclsAreEquivalent(clang::Decl *lhs_decl,
2149 clang::Decl *rhs_decl) {
2150 if (lhs_decl && rhs_decl) {
2151 // Make sure the decl kinds match first
2152 const clang::Decl::Kind lhs_decl_kind = lhs_decl->getKind();
2153 const clang::Decl::Kind rhs_decl_kind = rhs_decl->getKind();
2154
2155 if (lhs_decl_kind == rhs_decl_kind) {
2156 // Now check that the decl contexts kinds are all equivalent before we
2157 // have to check any names of the decl contexts...
2158 clang::DeclContext *lhs_decl_ctx = lhs_decl->getDeclContext();
2159 clang::DeclContext *rhs_decl_ctx = rhs_decl->getDeclContext();
2160 if (lhs_decl_ctx && rhs_decl_ctx) {
2161 while (true) {
2162 if (lhs_decl_ctx && rhs_decl_ctx) {
2163 const clang::Decl::Kind lhs_decl_ctx_kind =
2164 lhs_decl_ctx->getDeclKind();
2165 const clang::Decl::Kind rhs_decl_ctx_kind =
2166 rhs_decl_ctx->getDeclKind();
2167 if (lhs_decl_ctx_kind == rhs_decl_ctx_kind) {
2168 lhs_decl_ctx = lhs_decl_ctx->getParent();
2169 rhs_decl_ctx = rhs_decl_ctx->getParent();
2170
2171 if (lhs_decl_ctx == nullptr && rhs_decl_ctx == nullptr)
2172 break;
2173 } else
2174 return false;
2175 } else
2176 return false;
2177 }
2178
2179 // Now make sure the name of the decls match
2180 clang::NamedDecl *lhs_named_decl =
2181 llvm::dyn_cast<clang::NamedDecl>(lhs_decl);
2182 clang::NamedDecl *rhs_named_decl =
2183 llvm::dyn_cast<clang::NamedDecl>(rhs_decl);
2184 if (lhs_named_decl && rhs_named_decl) {
2185 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2186 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2187 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind()) {
2188 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2189 return false;
2190 } else
2191 return false;
2192 } else
2193 return false;
2194
2195 // We know that the decl context kinds all match, so now we need to
2196 // make sure the names match as well
2197 lhs_decl_ctx = lhs_decl->getDeclContext();
2198 rhs_decl_ctx = rhs_decl->getDeclContext();
2199 while (true) {
2200 switch (lhs_decl_ctx->getDeclKind()) {
2201 case clang::Decl::TranslationUnit:
2202 // We don't care about the translation unit names
2203 return true;
2204 default: {
2205 clang::NamedDecl *lhs_named_decl =
2206 llvm::dyn_cast<clang::NamedDecl>(lhs_decl_ctx);
2207 clang::NamedDecl *rhs_named_decl =
2208 llvm::dyn_cast<clang::NamedDecl>(rhs_decl_ctx);
2209 if (lhs_named_decl && rhs_named_decl) {
2210 clang::DeclarationName lhs_decl_name =
2211 lhs_named_decl->getDeclName();
2212 clang::DeclarationName rhs_decl_name =
2213 rhs_named_decl->getDeclName();
2214 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind()) {
2215 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2216 return false;
2217 } else
2218 return false;
2219 } else
2220 return false;
2221 } break;
2222 }
2223 lhs_decl_ctx = lhs_decl_ctx->getParent();
2224 rhs_decl_ctx = rhs_decl_ctx->getParent();
2225 }
2226 }
2227 }
2228 }
2229 return false;
2230 }
GetCompleteDecl(clang::ASTContext * ast,clang::Decl * decl)2231 bool ClangASTContext::GetCompleteDecl(clang::ASTContext *ast,
2232 clang::Decl *decl) {
2233 if (!decl)
2234 return false;
2235
2236 ExternalASTSource *ast_source = ast->getExternalSource();
2237
2238 if (!ast_source)
2239 return false;
2240
2241 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl)) {
2242 if (tag_decl->isCompleteDefinition())
2243 return true;
2244
2245 if (!tag_decl->hasExternalLexicalStorage())
2246 return false;
2247
2248 ast_source->CompleteType(tag_decl);
2249
2250 return !tag_decl->getTypeForDecl()->isIncompleteType();
2251 } else if (clang::ObjCInterfaceDecl *objc_interface_decl =
2252 llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl)) {
2253 if (objc_interface_decl->getDefinition())
2254 return true;
2255
2256 if (!objc_interface_decl->hasExternalLexicalStorage())
2257 return false;
2258
2259 ast_source->CompleteType(objc_interface_decl);
2260
2261 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
2262 } else {
2263 return false;
2264 }
2265 }
2266
SetMetadataAsUserID(const clang::Decl * decl,user_id_t user_id)2267 void ClangASTContext::SetMetadataAsUserID(const clang::Decl *decl,
2268 user_id_t user_id) {
2269 ClangASTMetadata meta_data;
2270 meta_data.SetUserID(user_id);
2271 SetMetadata(decl, meta_data);
2272 }
2273
SetMetadataAsUserID(const clang::Type * type,user_id_t user_id)2274 void ClangASTContext::SetMetadataAsUserID(const clang::Type *type,
2275 user_id_t user_id) {
2276 ClangASTMetadata meta_data;
2277 meta_data.SetUserID(user_id);
2278 SetMetadata(type, meta_data);
2279 }
2280
SetMetadata(const clang::Decl * object,ClangASTMetadata & metadata)2281 void ClangASTContext::SetMetadata(const clang::Decl *object,
2282 ClangASTMetadata &metadata) {
2283 m_decl_metadata[object] = metadata;
2284 }
2285
SetMetadata(const clang::Type * object,ClangASTMetadata & metadata)2286 void ClangASTContext::SetMetadata(const clang::Type *object,
2287 ClangASTMetadata &metadata) {
2288 m_type_metadata[object] = metadata;
2289 }
2290
GetMetadata(const clang::Decl * object)2291 ClangASTMetadata *ClangASTContext::GetMetadata(const clang::Decl *object) {
2292 auto It = m_decl_metadata.find(object);
2293 if (It != m_decl_metadata.end())
2294 return &It->second;
2295 return nullptr;
2296 }
2297
GetMetadata(const clang::Type * object)2298 ClangASTMetadata *ClangASTContext::GetMetadata(const clang::Type *object) {
2299 auto It = m_type_metadata.find(object);
2300 if (It != m_type_metadata.end())
2301 return &It->second;
2302 return nullptr;
2303 }
2304
SetTagTypeKind(clang::QualType tag_qual_type,int kind) const2305 bool ClangASTContext::SetTagTypeKind(clang::QualType tag_qual_type,
2306 int kind) const {
2307 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2308 if (clang_type) {
2309 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2310 if (tag_type) {
2311 clang::TagDecl *tag_decl =
2312 llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2313 if (tag_decl) {
2314 tag_decl->setTagKind((clang::TagDecl::TagKind)kind);
2315 return true;
2316 }
2317 }
2318 }
2319 return false;
2320 }
2321
SetDefaultAccessForRecordFields(clang::RecordDecl * record_decl,int default_accessibility,int * assigned_accessibilities,size_t num_assigned_accessibilities)2322 bool ClangASTContext::SetDefaultAccessForRecordFields(
2323 clang::RecordDecl *record_decl, int default_accessibility,
2324 int *assigned_accessibilities, size_t num_assigned_accessibilities) {
2325 if (record_decl) {
2326 uint32_t field_idx;
2327 clang::RecordDecl::field_iterator field, field_end;
2328 for (field = record_decl->field_begin(),
2329 field_end = record_decl->field_end(), field_idx = 0;
2330 field != field_end; ++field, ++field_idx) {
2331 // If no accessibility was assigned, assign the correct one
2332 if (field_idx < num_assigned_accessibilities &&
2333 assigned_accessibilities[field_idx] == clang::AS_none)
2334 field->setAccess((clang::AccessSpecifier)default_accessibility);
2335 }
2336 return true;
2337 }
2338 return false;
2339 }
2340
2341 clang::DeclContext *
GetDeclContextForType(const CompilerType & type)2342 ClangASTContext::GetDeclContextForType(const CompilerType &type) {
2343 return GetDeclContextForType(ClangUtil::GetQualType(type));
2344 }
2345
2346 /// Aggressively desugar the provided type, skipping past various kinds of
2347 /// syntactic sugar and other constructs one typically wants to ignore.
2348 /// The \p mask argument allows one to skip certain kinds of simplifications,
2349 /// when one wishes to handle a certain kind of type directly.
2350 static QualType
RemoveWrappingTypes(QualType type,ArrayRef<clang::Type::TypeClass> mask={})2351 RemoveWrappingTypes(QualType type, ArrayRef<clang::Type::TypeClass> mask = {}) {
2352 while (true) {
2353 if (find(mask, type->getTypeClass()) != mask.end())
2354 return type;
2355 switch (type->getTypeClass()) {
2356 // This is not fully correct as _Atomic is more than sugar, but it is
2357 // sufficient for the purposes we care about.
2358 case clang::Type::Atomic:
2359 type = cast<clang::AtomicType>(type)->getValueType();
2360 break;
2361 case clang::Type::Auto:
2362 case clang::Type::Decltype:
2363 case clang::Type::Elaborated:
2364 case clang::Type::Paren:
2365 case clang::Type::Typedef:
2366 case clang::Type::TypeOf:
2367 case clang::Type::TypeOfExpr:
2368 type = type->getLocallyUnqualifiedSingleStepDesugaredType();
2369 break;
2370 default:
2371 return type;
2372 }
2373 }
2374 }
2375
2376 clang::DeclContext *
GetDeclContextForType(clang::QualType type)2377 ClangASTContext::GetDeclContextForType(clang::QualType type) {
2378 if (type.isNull())
2379 return nullptr;
2380
2381 clang::QualType qual_type = RemoveWrappingTypes(type.getCanonicalType());
2382 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2383 switch (type_class) {
2384 case clang::Type::ObjCInterface:
2385 return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())
2386 ->getInterface();
2387 case clang::Type::ObjCObjectPointer:
2388 return GetDeclContextForType(
2389 llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())
2390 ->getPointeeType());
2391 case clang::Type::Record:
2392 return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2393 case clang::Type::Enum:
2394 return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2395 default:
2396 break;
2397 }
2398 // No DeclContext in this type...
2399 return nullptr;
2400 }
2401
GetCompleteQualType(clang::ASTContext * ast,clang::QualType qual_type,bool allow_completion=true)2402 static bool GetCompleteQualType(clang::ASTContext *ast,
2403 clang::QualType qual_type,
2404 bool allow_completion = true) {
2405 qual_type = RemoveWrappingTypes(qual_type);
2406 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2407 switch (type_class) {
2408 case clang::Type::ConstantArray:
2409 case clang::Type::IncompleteArray:
2410 case clang::Type::VariableArray: {
2411 const clang::ArrayType *array_type =
2412 llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2413
2414 if (array_type)
2415 return GetCompleteQualType(ast, array_type->getElementType(),
2416 allow_completion);
2417 } break;
2418 case clang::Type::Record: {
2419 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2420 if (cxx_record_decl) {
2421 if (cxx_record_decl->hasExternalLexicalStorage()) {
2422 const bool is_complete = cxx_record_decl->isCompleteDefinition();
2423 const bool fields_loaded =
2424 cxx_record_decl->hasLoadedFieldsFromExternalStorage();
2425 if (is_complete && fields_loaded)
2426 return true;
2427
2428 if (!allow_completion)
2429 return false;
2430
2431 // Call the field_begin() accessor to for it to use the external source
2432 // to load the fields...
2433 clang::ExternalASTSource *external_ast_source =
2434 ast->getExternalSource();
2435 if (external_ast_source) {
2436 external_ast_source->CompleteType(cxx_record_decl);
2437 if (cxx_record_decl->isCompleteDefinition()) {
2438 cxx_record_decl->field_begin();
2439 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
2440 }
2441 }
2442 }
2443 }
2444 const clang::TagType *tag_type =
2445 llvm::cast<clang::TagType>(qual_type.getTypePtr());
2446 return !tag_type->isIncompleteType();
2447 } break;
2448
2449 case clang::Type::Enum: {
2450 const clang::TagType *tag_type =
2451 llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2452 if (tag_type) {
2453 clang::TagDecl *tag_decl = tag_type->getDecl();
2454 if (tag_decl) {
2455 if (tag_decl->getDefinition())
2456 return true;
2457
2458 if (!allow_completion)
2459 return false;
2460
2461 if (tag_decl->hasExternalLexicalStorage()) {
2462 if (ast) {
2463 clang::ExternalASTSource *external_ast_source =
2464 ast->getExternalSource();
2465 if (external_ast_source) {
2466 external_ast_source->CompleteType(tag_decl);
2467 return !tag_type->isIncompleteType();
2468 }
2469 }
2470 }
2471 return false;
2472 }
2473 }
2474
2475 } break;
2476 case clang::Type::ObjCObject:
2477 case clang::Type::ObjCInterface: {
2478 const clang::ObjCObjectType *objc_class_type =
2479 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2480 if (objc_class_type) {
2481 clang::ObjCInterfaceDecl *class_interface_decl =
2482 objc_class_type->getInterface();
2483 // We currently can't complete objective C types through the newly added
2484 // ASTContext because it only supports TagDecl objects right now...
2485 if (class_interface_decl) {
2486 if (class_interface_decl->getDefinition())
2487 return true;
2488
2489 if (!allow_completion)
2490 return false;
2491
2492 if (class_interface_decl->hasExternalLexicalStorage()) {
2493 if (ast) {
2494 clang::ExternalASTSource *external_ast_source =
2495 ast->getExternalSource();
2496 if (external_ast_source) {
2497 external_ast_source->CompleteType(class_interface_decl);
2498 return !objc_class_type->isIncompleteType();
2499 }
2500 }
2501 }
2502 return false;
2503 }
2504 }
2505 } break;
2506
2507 case clang::Type::Attributed:
2508 return GetCompleteQualType(
2509 ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(),
2510 allow_completion);
2511
2512 default:
2513 break;
2514 }
2515
2516 return true;
2517 }
2518
2519 static clang::ObjCIvarDecl::AccessControl
ConvertAccessTypeToObjCIvarAccessControl(AccessType access)2520 ConvertAccessTypeToObjCIvarAccessControl(AccessType access) {
2521 switch (access) {
2522 case eAccessNone:
2523 return clang::ObjCIvarDecl::None;
2524 case eAccessPublic:
2525 return clang::ObjCIvarDecl::Public;
2526 case eAccessPrivate:
2527 return clang::ObjCIvarDecl::Private;
2528 case eAccessProtected:
2529 return clang::ObjCIvarDecl::Protected;
2530 case eAccessPackage:
2531 return clang::ObjCIvarDecl::Package;
2532 }
2533 return clang::ObjCIvarDecl::None;
2534 }
2535
2536 // Tests
2537
IsAggregateType(lldb::opaque_compiler_type_t type)2538 bool ClangASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) {
2539 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
2540
2541 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2542 switch (type_class) {
2543 case clang::Type::IncompleteArray:
2544 case clang::Type::VariableArray:
2545 case clang::Type::ConstantArray:
2546 case clang::Type::ExtVector:
2547 case clang::Type::Vector:
2548 case clang::Type::Record:
2549 case clang::Type::ObjCObject:
2550 case clang::Type::ObjCInterface:
2551 return true;
2552 default:
2553 break;
2554 }
2555 // The clang type does have a value
2556 return false;
2557 }
2558
IsAnonymousType(lldb::opaque_compiler_type_t type)2559 bool ClangASTContext::IsAnonymousType(lldb::opaque_compiler_type_t type) {
2560 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
2561
2562 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2563 switch (type_class) {
2564 case clang::Type::Record: {
2565 if (const clang::RecordType *record_type =
2566 llvm::dyn_cast_or_null<clang::RecordType>(
2567 qual_type.getTypePtrOrNull())) {
2568 if (const clang::RecordDecl *record_decl = record_type->getDecl()) {
2569 return record_decl->isAnonymousStructOrUnion();
2570 }
2571 }
2572 break;
2573 }
2574 default:
2575 break;
2576 }
2577 // The clang type does have a value
2578 return false;
2579 }
2580
IsArrayType(lldb::opaque_compiler_type_t type,CompilerType * element_type_ptr,uint64_t * size,bool * is_incomplete)2581 bool ClangASTContext::IsArrayType(lldb::opaque_compiler_type_t type,
2582 CompilerType *element_type_ptr,
2583 uint64_t *size, bool *is_incomplete) {
2584 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
2585
2586 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2587 switch (type_class) {
2588 default:
2589 break;
2590
2591 case clang::Type::ConstantArray:
2592 if (element_type_ptr)
2593 element_type_ptr->SetCompilerType(
2594 this, llvm::cast<clang::ConstantArrayType>(qual_type)
2595 ->getElementType()
2596 .getAsOpaquePtr());
2597 if (size)
2598 *size = llvm::cast<clang::ConstantArrayType>(qual_type)
2599 ->getSize()
2600 .getLimitedValue(ULLONG_MAX);
2601 if (is_incomplete)
2602 *is_incomplete = false;
2603 return true;
2604
2605 case clang::Type::IncompleteArray:
2606 if (element_type_ptr)
2607 element_type_ptr->SetCompilerType(
2608 this, llvm::cast<clang::IncompleteArrayType>(qual_type)
2609 ->getElementType()
2610 .getAsOpaquePtr());
2611 if (size)
2612 *size = 0;
2613 if (is_incomplete)
2614 *is_incomplete = true;
2615 return true;
2616
2617 case clang::Type::VariableArray:
2618 if (element_type_ptr)
2619 element_type_ptr->SetCompilerType(
2620 this, llvm::cast<clang::VariableArrayType>(qual_type)
2621 ->getElementType()
2622 .getAsOpaquePtr());
2623 if (size)
2624 *size = 0;
2625 if (is_incomplete)
2626 *is_incomplete = false;
2627 return true;
2628
2629 case clang::Type::DependentSizedArray:
2630 if (element_type_ptr)
2631 element_type_ptr->SetCompilerType(
2632 this, llvm::cast<clang::DependentSizedArrayType>(qual_type)
2633 ->getElementType()
2634 .getAsOpaquePtr());
2635 if (size)
2636 *size = 0;
2637 if (is_incomplete)
2638 *is_incomplete = false;
2639 return true;
2640 }
2641 if (element_type_ptr)
2642 element_type_ptr->Clear();
2643 if (size)
2644 *size = 0;
2645 if (is_incomplete)
2646 *is_incomplete = false;
2647 return false;
2648 }
2649
IsVectorType(lldb::opaque_compiler_type_t type,CompilerType * element_type,uint64_t * size)2650 bool ClangASTContext::IsVectorType(lldb::opaque_compiler_type_t type,
2651 CompilerType *element_type, uint64_t *size) {
2652 clang::QualType qual_type(GetCanonicalQualType(type));
2653
2654 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2655 switch (type_class) {
2656 case clang::Type::Vector: {
2657 const clang::VectorType *vector_type =
2658 qual_type->getAs<clang::VectorType>();
2659 if (vector_type) {
2660 if (size)
2661 *size = vector_type->getNumElements();
2662 if (element_type)
2663 *element_type = GetType(vector_type->getElementType());
2664 }
2665 return true;
2666 } break;
2667 case clang::Type::ExtVector: {
2668 const clang::ExtVectorType *ext_vector_type =
2669 qual_type->getAs<clang::ExtVectorType>();
2670 if (ext_vector_type) {
2671 if (size)
2672 *size = ext_vector_type->getNumElements();
2673 if (element_type)
2674 *element_type =
2675 CompilerType(this, ext_vector_type->getElementType().getAsOpaquePtr());
2676 }
2677 return true;
2678 }
2679 default:
2680 break;
2681 }
2682 return false;
2683 }
2684
IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type)2685 bool ClangASTContext::IsRuntimeGeneratedType(
2686 lldb::opaque_compiler_type_t type) {
2687 clang::DeclContext *decl_ctx = GetDeclContextForType(GetQualType(type));
2688 if (!decl_ctx)
2689 return false;
2690
2691 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2692 return false;
2693
2694 clang::ObjCInterfaceDecl *result_iface_decl =
2695 llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2696
2697 ClangASTMetadata *ast_metadata = GetMetadata(result_iface_decl);
2698 if (!ast_metadata)
2699 return false;
2700 return (ast_metadata->GetISAPtr() != 0);
2701 }
2702
IsCharType(lldb::opaque_compiler_type_t type)2703 bool ClangASTContext::IsCharType(lldb::opaque_compiler_type_t type) {
2704 return GetQualType(type).getUnqualifiedType()->isCharType();
2705 }
2706
IsCompleteType(lldb::opaque_compiler_type_t type)2707 bool ClangASTContext::IsCompleteType(lldb::opaque_compiler_type_t type) {
2708 const bool allow_completion = false;
2709 return GetCompleteQualType(&getASTContext(), GetQualType(type),
2710 allow_completion);
2711 }
2712
IsConst(lldb::opaque_compiler_type_t type)2713 bool ClangASTContext::IsConst(lldb::opaque_compiler_type_t type) {
2714 return GetQualType(type).isConstQualified();
2715 }
2716
IsCStringType(lldb::opaque_compiler_type_t type,uint32_t & length)2717 bool ClangASTContext::IsCStringType(lldb::opaque_compiler_type_t type,
2718 uint32_t &length) {
2719 CompilerType pointee_or_element_clang_type;
2720 length = 0;
2721 Flags type_flags(GetTypeInfo(type, &pointee_or_element_clang_type));
2722
2723 if (!pointee_or_element_clang_type.IsValid())
2724 return false;
2725
2726 if (type_flags.AnySet(eTypeIsArray | eTypeIsPointer)) {
2727 if (pointee_or_element_clang_type.IsCharType()) {
2728 if (type_flags.Test(eTypeIsArray)) {
2729 // We know the size of the array and it could be a C string since it is
2730 // an array of characters
2731 length = llvm::cast<clang::ConstantArrayType>(
2732 GetCanonicalQualType(type).getTypePtr())
2733 ->getSize()
2734 .getLimitedValue();
2735 }
2736 return true;
2737 }
2738 }
2739 return false;
2740 }
2741
IsFunctionType(lldb::opaque_compiler_type_t type,bool * is_variadic_ptr)2742 bool ClangASTContext::IsFunctionType(lldb::opaque_compiler_type_t type,
2743 bool *is_variadic_ptr) {
2744 if (type) {
2745 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
2746
2747 if (qual_type->isFunctionType()) {
2748 if (is_variadic_ptr) {
2749 const clang::FunctionProtoType *function_proto_type =
2750 llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2751 if (function_proto_type)
2752 *is_variadic_ptr = function_proto_type->isVariadic();
2753 else
2754 *is_variadic_ptr = false;
2755 }
2756 return true;
2757 }
2758
2759 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2760 switch (type_class) {
2761 default:
2762 break;
2763 case clang::Type::LValueReference:
2764 case clang::Type::RValueReference: {
2765 const clang::ReferenceType *reference_type =
2766 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2767 if (reference_type)
2768 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(),
2769 nullptr);
2770 } break;
2771 }
2772 }
2773 return false;
2774 }
2775
2776 // Used to detect "Homogeneous Floating-point Aggregates"
2777 uint32_t
IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,CompilerType * base_type_ptr)2778 ClangASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,
2779 CompilerType *base_type_ptr) {
2780 if (!type)
2781 return 0;
2782
2783 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
2784 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2785 switch (type_class) {
2786 case clang::Type::Record:
2787 if (GetCompleteType(type)) {
2788 const clang::CXXRecordDecl *cxx_record_decl =
2789 qual_type->getAsCXXRecordDecl();
2790 if (cxx_record_decl) {
2791 if (cxx_record_decl->getNumBases() || cxx_record_decl->isDynamicClass())
2792 return 0;
2793 }
2794 const clang::RecordType *record_type =
2795 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
2796 if (record_type) {
2797 const clang::RecordDecl *record_decl = record_type->getDecl();
2798 if (record_decl) {
2799 // We are looking for a structure that contains only floating point
2800 // types
2801 clang::RecordDecl::field_iterator field_pos,
2802 field_end = record_decl->field_end();
2803 uint32_t num_fields = 0;
2804 bool is_hva = false;
2805 bool is_hfa = false;
2806 clang::QualType base_qual_type;
2807 uint64_t base_bitwidth = 0;
2808 for (field_pos = record_decl->field_begin(); field_pos != field_end;
2809 ++field_pos) {
2810 clang::QualType field_qual_type = field_pos->getType();
2811 uint64_t field_bitwidth = getASTContext().getTypeSize(qual_type);
2812 if (field_qual_type->isFloatingType()) {
2813 if (field_qual_type->isComplexType())
2814 return 0;
2815 else {
2816 if (num_fields == 0)
2817 base_qual_type = field_qual_type;
2818 else {
2819 if (is_hva)
2820 return 0;
2821 is_hfa = true;
2822 if (field_qual_type.getTypePtr() !=
2823 base_qual_type.getTypePtr())
2824 return 0;
2825 }
2826 }
2827 } else if (field_qual_type->isVectorType() ||
2828 field_qual_type->isExtVectorType()) {
2829 if (num_fields == 0) {
2830 base_qual_type = field_qual_type;
2831 base_bitwidth = field_bitwidth;
2832 } else {
2833 if (is_hfa)
2834 return 0;
2835 is_hva = true;
2836 if (base_bitwidth != field_bitwidth)
2837 return 0;
2838 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2839 return 0;
2840 }
2841 } else
2842 return 0;
2843 ++num_fields;
2844 }
2845 if (base_type_ptr)
2846 *base_type_ptr = CompilerType(this, base_qual_type.getAsOpaquePtr());
2847 return num_fields;
2848 }
2849 }
2850 }
2851 break;
2852
2853 default:
2854 break;
2855 }
2856 return 0;
2857 }
2858
GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type)2859 size_t ClangASTContext::GetNumberOfFunctionArguments(
2860 lldb::opaque_compiler_type_t type) {
2861 if (type) {
2862 clang::QualType qual_type(GetCanonicalQualType(type));
2863 const clang::FunctionProtoType *func =
2864 llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2865 if (func)
2866 return func->getNumParams();
2867 }
2868 return 0;
2869 }
2870
2871 CompilerType
GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,const size_t index)2872 ClangASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
2873 const size_t index) {
2874 if (type) {
2875 clang::QualType qual_type(GetQualType(type));
2876 const clang::FunctionProtoType *func =
2877 llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2878 if (func) {
2879 if (index < func->getNumParams())
2880 return CompilerType(this, func->getParamType(index).getAsOpaquePtr());
2881 }
2882 }
2883 return CompilerType();
2884 }
2885
IsFunctionPointerType(lldb::opaque_compiler_type_t type)2886 bool ClangASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
2887 if (type) {
2888 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
2889
2890 if (qual_type->isFunctionPointerType())
2891 return true;
2892
2893 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2894 switch (type_class) {
2895 default:
2896 break;
2897
2898 case clang::Type::LValueReference:
2899 case clang::Type::RValueReference: {
2900 const clang::ReferenceType *reference_type =
2901 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2902 if (reference_type)
2903 return IsFunctionPointerType(
2904 reference_type->getPointeeType().getAsOpaquePtr());
2905 } break;
2906 }
2907 }
2908 return false;
2909 }
2910
IsBlockPointerType(lldb::opaque_compiler_type_t type,CompilerType * function_pointer_type_ptr)2911 bool ClangASTContext::IsBlockPointerType(
2912 lldb::opaque_compiler_type_t type,
2913 CompilerType *function_pointer_type_ptr) {
2914 if (type) {
2915 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
2916
2917 if (qual_type->isBlockPointerType()) {
2918 if (function_pointer_type_ptr) {
2919 const clang::BlockPointerType *block_pointer_type =
2920 qual_type->getAs<clang::BlockPointerType>();
2921 QualType pointee_type = block_pointer_type->getPointeeType();
2922 QualType function_pointer_type = m_ast_up->getPointerType(pointee_type);
2923 *function_pointer_type_ptr =
2924 CompilerType(this, function_pointer_type.getAsOpaquePtr());
2925 }
2926 return true;
2927 }
2928
2929 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2930 switch (type_class) {
2931 default:
2932 break;
2933
2934 case clang::Type::LValueReference:
2935 case clang::Type::RValueReference: {
2936 const clang::ReferenceType *reference_type =
2937 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2938 if (reference_type)
2939 return IsBlockPointerType(
2940 reference_type->getPointeeType().getAsOpaquePtr(),
2941 function_pointer_type_ptr);
2942 } break;
2943 }
2944 }
2945 return false;
2946 }
2947
IsIntegerType(lldb::opaque_compiler_type_t type,bool & is_signed)2948 bool ClangASTContext::IsIntegerType(lldb::opaque_compiler_type_t type,
2949 bool &is_signed) {
2950 if (!type)
2951 return false;
2952
2953 clang::QualType qual_type(GetCanonicalQualType(type));
2954 const clang::BuiltinType *builtin_type =
2955 llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
2956
2957 if (builtin_type) {
2958 if (builtin_type->isInteger()) {
2959 is_signed = builtin_type->isSignedInteger();
2960 return true;
2961 }
2962 }
2963
2964 return false;
2965 }
2966
IsEnumerationType(lldb::opaque_compiler_type_t type,bool & is_signed)2967 bool ClangASTContext::IsEnumerationType(lldb::opaque_compiler_type_t type,
2968 bool &is_signed) {
2969 if (type) {
2970 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(
2971 GetCanonicalQualType(type)->getCanonicalTypeInternal());
2972
2973 if (enum_type) {
2974 IsIntegerType(enum_type->getDecl()->getIntegerType().getAsOpaquePtr(),
2975 is_signed);
2976 return true;
2977 }
2978 }
2979
2980 return false;
2981 }
2982
IsPointerType(lldb::opaque_compiler_type_t type,CompilerType * pointee_type)2983 bool ClangASTContext::IsPointerType(lldb::opaque_compiler_type_t type,
2984 CompilerType *pointee_type) {
2985 if (type) {
2986 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
2987 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2988 switch (type_class) {
2989 case clang::Type::Builtin:
2990 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
2991 default:
2992 break;
2993 case clang::BuiltinType::ObjCId:
2994 case clang::BuiltinType::ObjCClass:
2995 return true;
2996 }
2997 return false;
2998 case clang::Type::ObjCObjectPointer:
2999 if (pointee_type)
3000 pointee_type->SetCompilerType(
3001 this, llvm::cast<clang::ObjCObjectPointerType>(qual_type)
3002 ->getPointeeType()
3003 .getAsOpaquePtr());
3004 return true;
3005 case clang::Type::BlockPointer:
3006 if (pointee_type)
3007 pointee_type->SetCompilerType(
3008 this, llvm::cast<clang::BlockPointerType>(qual_type)
3009 ->getPointeeType()
3010 .getAsOpaquePtr());
3011 return true;
3012 case clang::Type::Pointer:
3013 if (pointee_type)
3014 pointee_type->SetCompilerType(this,
3015 llvm::cast<clang::PointerType>(qual_type)
3016 ->getPointeeType()
3017 .getAsOpaquePtr());
3018 return true;
3019 case clang::Type::MemberPointer:
3020 if (pointee_type)
3021 pointee_type->SetCompilerType(
3022 this, llvm::cast<clang::MemberPointerType>(qual_type)
3023 ->getPointeeType()
3024 .getAsOpaquePtr());
3025 return true;
3026 default:
3027 break;
3028 }
3029 }
3030 if (pointee_type)
3031 pointee_type->Clear();
3032 return false;
3033 }
3034
IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,CompilerType * pointee_type)3035 bool ClangASTContext::IsPointerOrReferenceType(
3036 lldb::opaque_compiler_type_t type, CompilerType *pointee_type) {
3037 if (type) {
3038 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
3039 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3040 switch (type_class) {
3041 case clang::Type::Builtin:
3042 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
3043 default:
3044 break;
3045 case clang::BuiltinType::ObjCId:
3046 case clang::BuiltinType::ObjCClass:
3047 return true;
3048 }
3049 return false;
3050 case clang::Type::ObjCObjectPointer:
3051 if (pointee_type)
3052 pointee_type->SetCompilerType(
3053 this, llvm::cast<clang::ObjCObjectPointerType>(qual_type)
3054 ->getPointeeType().getAsOpaquePtr());
3055 return true;
3056 case clang::Type::BlockPointer:
3057 if (pointee_type)
3058 pointee_type->SetCompilerType(
3059 this, llvm::cast<clang::BlockPointerType>(qual_type)
3060 ->getPointeeType()
3061 .getAsOpaquePtr());
3062 return true;
3063 case clang::Type::Pointer:
3064 if (pointee_type)
3065 pointee_type->SetCompilerType(this,
3066 llvm::cast<clang::PointerType>(qual_type)
3067 ->getPointeeType()
3068 .getAsOpaquePtr());
3069 return true;
3070 case clang::Type::MemberPointer:
3071 if (pointee_type)
3072 pointee_type->SetCompilerType(
3073 this, llvm::cast<clang::MemberPointerType>(qual_type)
3074 ->getPointeeType()
3075 .getAsOpaquePtr());
3076 return true;
3077 case clang::Type::LValueReference:
3078 if (pointee_type)
3079 pointee_type->SetCompilerType(
3080 this, llvm::cast<clang::LValueReferenceType>(qual_type)
3081 ->desugar()
3082 .getAsOpaquePtr());
3083 return true;
3084 case clang::Type::RValueReference:
3085 if (pointee_type)
3086 pointee_type->SetCompilerType(
3087 this, llvm::cast<clang::RValueReferenceType>(qual_type)
3088 ->desugar()
3089 .getAsOpaquePtr());
3090 return true;
3091 default:
3092 break;
3093 }
3094 }
3095 if (pointee_type)
3096 pointee_type->Clear();
3097 return false;
3098 }
3099
IsReferenceType(lldb::opaque_compiler_type_t type,CompilerType * pointee_type,bool * is_rvalue)3100 bool ClangASTContext::IsReferenceType(lldb::opaque_compiler_type_t type,
3101 CompilerType *pointee_type,
3102 bool *is_rvalue) {
3103 if (type) {
3104 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
3105 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3106
3107 switch (type_class) {
3108 case clang::Type::LValueReference:
3109 if (pointee_type)
3110 pointee_type->SetCompilerType(
3111 this, llvm::cast<clang::LValueReferenceType>(qual_type)
3112 ->desugar()
3113 .getAsOpaquePtr());
3114 if (is_rvalue)
3115 *is_rvalue = false;
3116 return true;
3117 case clang::Type::RValueReference:
3118 if (pointee_type)
3119 pointee_type->SetCompilerType(
3120 this, llvm::cast<clang::RValueReferenceType>(qual_type)
3121 ->desugar()
3122 .getAsOpaquePtr());
3123 if (is_rvalue)
3124 *is_rvalue = true;
3125 return true;
3126
3127 default:
3128 break;
3129 }
3130 }
3131 if (pointee_type)
3132 pointee_type->Clear();
3133 return false;
3134 }
3135
IsFloatingPointType(lldb::opaque_compiler_type_t type,uint32_t & count,bool & is_complex)3136 bool ClangASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type,
3137 uint32_t &count, bool &is_complex) {
3138 if (type) {
3139 clang::QualType qual_type(GetCanonicalQualType(type));
3140
3141 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(
3142 qual_type->getCanonicalTypeInternal())) {
3143 clang::BuiltinType::Kind kind = BT->getKind();
3144 if (kind >= clang::BuiltinType::Float &&
3145 kind <= clang::BuiltinType::LongDouble) {
3146 count = 1;
3147 is_complex = false;
3148 return true;
3149 }
3150 } else if (const clang::ComplexType *CT =
3151 llvm::dyn_cast<clang::ComplexType>(
3152 qual_type->getCanonicalTypeInternal())) {
3153 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count,
3154 is_complex)) {
3155 count = 2;
3156 is_complex = true;
3157 return true;
3158 }
3159 } else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(
3160 qual_type->getCanonicalTypeInternal())) {
3161 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count,
3162 is_complex)) {
3163 count = VT->getNumElements();
3164 is_complex = false;
3165 return true;
3166 }
3167 }
3168 }
3169 count = 0;
3170 is_complex = false;
3171 return false;
3172 }
3173
IsDefined(lldb::opaque_compiler_type_t type)3174 bool ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type) {
3175 if (!type)
3176 return false;
3177
3178 clang::QualType qual_type(GetQualType(type));
3179 const clang::TagType *tag_type =
3180 llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3181 if (tag_type) {
3182 clang::TagDecl *tag_decl = tag_type->getDecl();
3183 if (tag_decl)
3184 return tag_decl->isCompleteDefinition();
3185 return false;
3186 } else {
3187 const clang::ObjCObjectType *objc_class_type =
3188 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3189 if (objc_class_type) {
3190 clang::ObjCInterfaceDecl *class_interface_decl =
3191 objc_class_type->getInterface();
3192 if (class_interface_decl)
3193 return class_interface_decl->getDefinition() != nullptr;
3194 return false;
3195 }
3196 }
3197 return true;
3198 }
3199
IsObjCClassType(const CompilerType & type)3200 bool ClangASTContext::IsObjCClassType(const CompilerType &type) {
3201 if (ClangUtil::IsClangType(type)) {
3202 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
3203
3204 const clang::ObjCObjectPointerType *obj_pointer_type =
3205 llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3206
3207 if (obj_pointer_type)
3208 return obj_pointer_type->isObjCClassType();
3209 }
3210 return false;
3211 }
3212
IsObjCObjectOrInterfaceType(const CompilerType & type)3213 bool ClangASTContext::IsObjCObjectOrInterfaceType(const CompilerType &type) {
3214 if (ClangUtil::IsClangType(type))
3215 return ClangUtil::GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3216 return false;
3217 }
3218
IsClassType(lldb::opaque_compiler_type_t type)3219 bool ClangASTContext::IsClassType(lldb::opaque_compiler_type_t type) {
3220 if (!type)
3221 return false;
3222 clang::QualType qual_type(GetCanonicalQualType(type));
3223 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3224 return (type_class == clang::Type::Record);
3225 }
3226
IsEnumType(lldb::opaque_compiler_type_t type)3227 bool ClangASTContext::IsEnumType(lldb::opaque_compiler_type_t type) {
3228 if (!type)
3229 return false;
3230 clang::QualType qual_type(GetCanonicalQualType(type));
3231 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3232 return (type_class == clang::Type::Enum);
3233 }
3234
IsPolymorphicClass(lldb::opaque_compiler_type_t type)3235 bool ClangASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type) {
3236 if (type) {
3237 clang::QualType qual_type(GetCanonicalQualType(type));
3238 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3239 switch (type_class) {
3240 case clang::Type::Record:
3241 if (GetCompleteType(type)) {
3242 const clang::RecordType *record_type =
3243 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3244 const clang::RecordDecl *record_decl = record_type->getDecl();
3245 if (record_decl) {
3246 const clang::CXXRecordDecl *cxx_record_decl =
3247 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3248 if (cxx_record_decl)
3249 return cxx_record_decl->isPolymorphic();
3250 }
3251 }
3252 break;
3253
3254 default:
3255 break;
3256 }
3257 }
3258 return false;
3259 }
3260
IsPossibleDynamicType(lldb::opaque_compiler_type_t type,CompilerType * dynamic_pointee_type,bool check_cplusplus,bool check_objc)3261 bool ClangASTContext::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
3262 CompilerType *dynamic_pointee_type,
3263 bool check_cplusplus,
3264 bool check_objc) {
3265 clang::QualType pointee_qual_type;
3266 if (type) {
3267 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
3268 bool success = false;
3269 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3270 switch (type_class) {
3271 case clang::Type::Builtin:
3272 if (check_objc &&
3273 llvm::cast<clang::BuiltinType>(qual_type)->getKind() ==
3274 clang::BuiltinType::ObjCId) {
3275 if (dynamic_pointee_type)
3276 dynamic_pointee_type->SetCompilerType(this, type);
3277 return true;
3278 }
3279 break;
3280
3281 case clang::Type::ObjCObjectPointer:
3282 if (check_objc) {
3283 if (auto objc_pointee_type =
3284 qual_type->getPointeeType().getTypePtrOrNull()) {
3285 if (auto objc_object_type =
3286 llvm::dyn_cast_or_null<clang::ObjCObjectType>(
3287 objc_pointee_type)) {
3288 if (objc_object_type->isObjCClass())
3289 return false;
3290 }
3291 }
3292 if (dynamic_pointee_type)
3293 dynamic_pointee_type->SetCompilerType(
3294 this, llvm::cast<clang::ObjCObjectPointerType>(qual_type)
3295 ->getPointeeType()
3296 .getAsOpaquePtr());
3297 return true;
3298 }
3299 break;
3300
3301 case clang::Type::Pointer:
3302 pointee_qual_type =
3303 llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3304 success = true;
3305 break;
3306
3307 case clang::Type::LValueReference:
3308 case clang::Type::RValueReference:
3309 pointee_qual_type =
3310 llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3311 success = true;
3312 break;
3313
3314 default:
3315 break;
3316 }
3317
3318 if (success) {
3319 // Check to make sure what we are pointing too is a possible dynamic C++
3320 // type We currently accept any "void *" (in case we have a class that
3321 // has been watered down to an opaque pointer) and virtual C++ classes.
3322 const clang::Type::TypeClass pointee_type_class =
3323 pointee_qual_type.getCanonicalType()->getTypeClass();
3324 switch (pointee_type_class) {
3325 case clang::Type::Builtin:
3326 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind()) {
3327 case clang::BuiltinType::UnknownAny:
3328 case clang::BuiltinType::Void:
3329 if (dynamic_pointee_type)
3330 dynamic_pointee_type->SetCompilerType(
3331 this, pointee_qual_type.getAsOpaquePtr());
3332 return true;
3333 default:
3334 break;
3335 }
3336 break;
3337
3338 case clang::Type::Record:
3339 if (check_cplusplus) {
3340 clang::CXXRecordDecl *cxx_record_decl =
3341 pointee_qual_type->getAsCXXRecordDecl();
3342 if (cxx_record_decl) {
3343 bool is_complete = cxx_record_decl->isCompleteDefinition();
3344
3345 if (is_complete)
3346 success = cxx_record_decl->isDynamicClass();
3347 else {
3348 ClangASTMetadata *metadata = GetMetadata(cxx_record_decl);
3349 if (metadata)
3350 success = metadata->GetIsDynamicCXXType();
3351 else {
3352 is_complete = GetType(pointee_qual_type).GetCompleteType();
3353 if (is_complete)
3354 success = cxx_record_decl->isDynamicClass();
3355 else
3356 success = false;
3357 }
3358 }
3359
3360 if (success) {
3361 if (dynamic_pointee_type)
3362 dynamic_pointee_type->SetCompilerType(
3363 this, pointee_qual_type.getAsOpaquePtr());
3364 return true;
3365 }
3366 }
3367 }
3368 break;
3369
3370 case clang::Type::ObjCObject:
3371 case clang::Type::ObjCInterface:
3372 if (check_objc) {
3373 if (dynamic_pointee_type)
3374 dynamic_pointee_type->SetCompilerType(
3375 this, pointee_qual_type.getAsOpaquePtr());
3376 return true;
3377 }
3378 break;
3379
3380 default:
3381 break;
3382 }
3383 }
3384 }
3385 if (dynamic_pointee_type)
3386 dynamic_pointee_type->Clear();
3387 return false;
3388 }
3389
IsScalarType(lldb::opaque_compiler_type_t type)3390 bool ClangASTContext::IsScalarType(lldb::opaque_compiler_type_t type) {
3391 if (!type)
3392 return false;
3393
3394 return (GetTypeInfo(type, nullptr) & eTypeIsScalar) != 0;
3395 }
3396
IsTypedefType(lldb::opaque_compiler_type_t type)3397 bool ClangASTContext::IsTypedefType(lldb::opaque_compiler_type_t type) {
3398 if (!type)
3399 return false;
3400 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3401 }
3402
IsVoidType(lldb::opaque_compiler_type_t type)3403 bool ClangASTContext::IsVoidType(lldb::opaque_compiler_type_t type) {
3404 if (!type)
3405 return false;
3406 return GetCanonicalQualType(type)->isVoidType();
3407 }
3408
CanPassInRegisters(const CompilerType & type)3409 bool ClangASTContext::CanPassInRegisters(const CompilerType &type) {
3410 if (auto *record_decl =
3411 ClangASTContext::GetAsRecordDecl(type)) {
3412 return record_decl->canPassInRegisters();
3413 }
3414 return false;
3415 }
3416
SupportsLanguage(lldb::LanguageType language)3417 bool ClangASTContext::SupportsLanguage(lldb::LanguageType language) {
3418 return ClangASTContextSupportsLanguage(language);
3419 }
3420
3421 Optional<std::string>
GetCXXClassName(const CompilerType & type)3422 ClangASTContext::GetCXXClassName(const CompilerType &type) {
3423 if (!type)
3424 return llvm::None;
3425
3426 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
3427 if (qual_type.isNull())
3428 return llvm::None;
3429
3430 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3431 if (!cxx_record_decl)
3432 return llvm::None;
3433
3434 return std::string(cxx_record_decl->getIdentifier()->getNameStart());
3435 }
3436
IsCXXClassType(const CompilerType & type)3437 bool ClangASTContext::IsCXXClassType(const CompilerType &type) {
3438 if (!type)
3439 return false;
3440
3441 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
3442 return !qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr;
3443 }
3444
IsBeingDefined(lldb::opaque_compiler_type_t type)3445 bool ClangASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type) {
3446 if (!type)
3447 return false;
3448 clang::QualType qual_type(GetCanonicalQualType(type));
3449 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3450 if (tag_type)
3451 return tag_type->isBeingDefined();
3452 return false;
3453 }
3454
IsObjCObjectPointerType(const CompilerType & type,CompilerType * class_type_ptr)3455 bool ClangASTContext::IsObjCObjectPointerType(const CompilerType &type,
3456 CompilerType *class_type_ptr) {
3457 if (!ClangUtil::IsClangType(type))
3458 return false;
3459
3460 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
3461
3462 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType()) {
3463 if (class_type_ptr) {
3464 if (!qual_type->isObjCClassType() && !qual_type->isObjCIdType()) {
3465 const clang::ObjCObjectPointerType *obj_pointer_type =
3466 llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3467 if (obj_pointer_type == nullptr)
3468 class_type_ptr->Clear();
3469 else
3470 class_type_ptr->SetCompilerType(
3471 type.GetTypeSystem(),
3472 clang::QualType(obj_pointer_type->getInterfaceType(), 0)
3473 .getAsOpaquePtr());
3474 }
3475 }
3476 return true;
3477 }
3478 if (class_type_ptr)
3479 class_type_ptr->Clear();
3480 return false;
3481 }
3482
3483 // Type Completion
3484
GetCompleteType(lldb::opaque_compiler_type_t type)3485 bool ClangASTContext::GetCompleteType(lldb::opaque_compiler_type_t type) {
3486 if (!type)
3487 return false;
3488 const bool allow_completion = true;
3489 return GetCompleteQualType(&getASTContext(), GetQualType(type),
3490 allow_completion);
3491 }
3492
GetTypeName(lldb::opaque_compiler_type_t type)3493 ConstString ClangASTContext::GetTypeName(lldb::opaque_compiler_type_t type) {
3494 std::string type_name;
3495 if (type) {
3496 clang::PrintingPolicy printing_policy(getASTContext().getPrintingPolicy());
3497 clang::QualType qual_type(GetQualType(type));
3498 printing_policy.SuppressTagKeyword = true;
3499 const clang::TypedefType *typedef_type =
3500 qual_type->getAs<clang::TypedefType>();
3501 if (typedef_type) {
3502 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3503 type_name = typedef_decl->getQualifiedNameAsString();
3504 } else {
3505 type_name = qual_type.getAsString(printing_policy);
3506 }
3507 }
3508 return ConstString(type_name);
3509 }
3510
3511 uint32_t
GetTypeInfo(lldb::opaque_compiler_type_t type,CompilerType * pointee_or_element_clang_type)3512 ClangASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type,
3513 CompilerType *pointee_or_element_clang_type) {
3514 if (!type)
3515 return 0;
3516
3517 if (pointee_or_element_clang_type)
3518 pointee_or_element_clang_type->Clear();
3519
3520 clang::QualType qual_type =
3521 RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef});
3522
3523 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3524 switch (type_class) {
3525 case clang::Type::Attributed:
3526 return GetTypeInfo(
3527 qual_type->getAs<clang::AttributedType>()
3528 ->getModifiedType().getAsOpaquePtr(),
3529 pointee_or_element_clang_type);
3530 case clang::Type::Builtin: {
3531 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(
3532 qual_type->getCanonicalTypeInternal());
3533
3534 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3535 switch (builtin_type->getKind()) {
3536 case clang::BuiltinType::ObjCId:
3537 case clang::BuiltinType::ObjCClass:
3538 if (pointee_or_element_clang_type)
3539 pointee_or_element_clang_type->SetCompilerType(
3540 this, getASTContext().ObjCBuiltinClassTy.getAsOpaquePtr());
3541 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3542 break;
3543
3544 case clang::BuiltinType::ObjCSel:
3545 if (pointee_or_element_clang_type)
3546 pointee_or_element_clang_type->SetCompilerType(
3547 this, getASTContext().CharTy.getAsOpaquePtr());
3548 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3549 break;
3550
3551 case clang::BuiltinType::Bool:
3552 case clang::BuiltinType::Char_U:
3553 case clang::BuiltinType::UChar:
3554 case clang::BuiltinType::WChar_U:
3555 case clang::BuiltinType::Char16:
3556 case clang::BuiltinType::Char32:
3557 case clang::BuiltinType::UShort:
3558 case clang::BuiltinType::UInt:
3559 case clang::BuiltinType::ULong:
3560 case clang::BuiltinType::ULongLong:
3561 case clang::BuiltinType::UInt128:
3562 case clang::BuiltinType::Char_S:
3563 case clang::BuiltinType::SChar:
3564 case clang::BuiltinType::WChar_S:
3565 case clang::BuiltinType::Short:
3566 case clang::BuiltinType::Int:
3567 case clang::BuiltinType::Long:
3568 case clang::BuiltinType::LongLong:
3569 case clang::BuiltinType::Int128:
3570 case clang::BuiltinType::Float:
3571 case clang::BuiltinType::Double:
3572 case clang::BuiltinType::LongDouble:
3573 builtin_type_flags |= eTypeIsScalar;
3574 if (builtin_type->isInteger()) {
3575 builtin_type_flags |= eTypeIsInteger;
3576 if (builtin_type->isSignedInteger())
3577 builtin_type_flags |= eTypeIsSigned;
3578 } else if (builtin_type->isFloatingPoint())
3579 builtin_type_flags |= eTypeIsFloat;
3580 break;
3581 default:
3582 break;
3583 }
3584 return builtin_type_flags;
3585 }
3586
3587 case clang::Type::BlockPointer:
3588 if (pointee_or_element_clang_type)
3589 pointee_or_element_clang_type->SetCompilerType(
3590 this, qual_type->getPointeeType().getAsOpaquePtr());
3591 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3592
3593 case clang::Type::Complex: {
3594 uint32_t complex_type_flags =
3595 eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3596 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(
3597 qual_type->getCanonicalTypeInternal());
3598 if (complex_type) {
3599 clang::QualType complex_element_type(complex_type->getElementType());
3600 if (complex_element_type->isIntegerType())
3601 complex_type_flags |= eTypeIsFloat;
3602 else if (complex_element_type->isFloatingType())
3603 complex_type_flags |= eTypeIsInteger;
3604 }
3605 return complex_type_flags;
3606 } break;
3607
3608 case clang::Type::ConstantArray:
3609 case clang::Type::DependentSizedArray:
3610 case clang::Type::IncompleteArray:
3611 case clang::Type::VariableArray:
3612 if (pointee_or_element_clang_type)
3613 pointee_or_element_clang_type->SetCompilerType(
3614 this, llvm::cast<clang::ArrayType>(qual_type.getTypePtr())
3615 ->getElementType()
3616 .getAsOpaquePtr());
3617 return eTypeHasChildren | eTypeIsArray;
3618
3619 case clang::Type::DependentName:
3620 return 0;
3621 case clang::Type::DependentSizedExtVector:
3622 return eTypeHasChildren | eTypeIsVector;
3623 case clang::Type::DependentTemplateSpecialization:
3624 return eTypeIsTemplate;
3625
3626 case clang::Type::Enum:
3627 if (pointee_or_element_clang_type)
3628 pointee_or_element_clang_type->SetCompilerType(
3629 this, llvm::cast<clang::EnumType>(qual_type)
3630 ->getDecl()
3631 ->getIntegerType()
3632 .getAsOpaquePtr());
3633 return eTypeIsEnumeration | eTypeHasValue;
3634
3635 case clang::Type::FunctionProto:
3636 return eTypeIsFuncPrototype | eTypeHasValue;
3637 case clang::Type::FunctionNoProto:
3638 return eTypeIsFuncPrototype | eTypeHasValue;
3639 case clang::Type::InjectedClassName:
3640 return 0;
3641
3642 case clang::Type::LValueReference:
3643 case clang::Type::RValueReference:
3644 if (pointee_or_element_clang_type)
3645 pointee_or_element_clang_type->SetCompilerType(
3646 this, llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())
3647 ->getPointeeType()
3648 .getAsOpaquePtr());
3649 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3650
3651 case clang::Type::MemberPointer:
3652 return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3653
3654 case clang::Type::ObjCObjectPointer:
3655 if (pointee_or_element_clang_type)
3656 pointee_or_element_clang_type->SetCompilerType(
3657 this, qual_type->getPointeeType().getAsOpaquePtr());
3658 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer |
3659 eTypeHasValue;
3660
3661 case clang::Type::ObjCObject:
3662 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3663 case clang::Type::ObjCInterface:
3664 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3665
3666 case clang::Type::Pointer:
3667 if (pointee_or_element_clang_type)
3668 pointee_or_element_clang_type->SetCompilerType(
3669 this, qual_type->getPointeeType().getAsOpaquePtr());
3670 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3671
3672 case clang::Type::Record:
3673 if (qual_type->getAsCXXRecordDecl())
3674 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3675 else
3676 return eTypeHasChildren | eTypeIsStructUnion;
3677 break;
3678 case clang::Type::SubstTemplateTypeParm:
3679 return eTypeIsTemplate;
3680 case clang::Type::TemplateTypeParm:
3681 return eTypeIsTemplate;
3682 case clang::Type::TemplateSpecialization:
3683 return eTypeIsTemplate;
3684
3685 case clang::Type::Typedef:
3686 return eTypeIsTypedef | GetType(llvm::cast<clang::TypedefType>(qual_type)
3687 ->getDecl()
3688 ->getUnderlyingType())
3689 .GetTypeInfo(pointee_or_element_clang_type);
3690 case clang::Type::UnresolvedUsing:
3691 return 0;
3692
3693 case clang::Type::ExtVector:
3694 case clang::Type::Vector: {
3695 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3696 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(
3697 qual_type->getCanonicalTypeInternal());
3698 if (vector_type) {
3699 if (vector_type->isIntegerType())
3700 vector_type_flags |= eTypeIsFloat;
3701 else if (vector_type->isFloatingType())
3702 vector_type_flags |= eTypeIsInteger;
3703 }
3704 return vector_type_flags;
3705 }
3706 default:
3707 return 0;
3708 }
3709 return 0;
3710 }
3711
3712 lldb::LanguageType
GetMinimumLanguage(lldb::opaque_compiler_type_t type)3713 ClangASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type) {
3714 if (!type)
3715 return lldb::eLanguageTypeC;
3716
3717 // If the type is a reference, then resolve it to what it refers to first:
3718 clang::QualType qual_type(GetCanonicalQualType(type).getNonReferenceType());
3719 if (qual_type->isAnyPointerType()) {
3720 if (qual_type->isObjCObjectPointerType())
3721 return lldb::eLanguageTypeObjC;
3722 if (qual_type->getPointeeCXXRecordDecl())
3723 return lldb::eLanguageTypeC_plus_plus;
3724
3725 clang::QualType pointee_type(qual_type->getPointeeType());
3726 if (pointee_type->getPointeeCXXRecordDecl())
3727 return lldb::eLanguageTypeC_plus_plus;
3728 if (pointee_type->isObjCObjectOrInterfaceType())
3729 return lldb::eLanguageTypeObjC;
3730 if (pointee_type->isObjCClassType())
3731 return lldb::eLanguageTypeObjC;
3732 if (pointee_type.getTypePtr() ==
3733 getASTContext().ObjCBuiltinIdTy.getTypePtr())
3734 return lldb::eLanguageTypeObjC;
3735 } else {
3736 if (qual_type->isObjCObjectOrInterfaceType())
3737 return lldb::eLanguageTypeObjC;
3738 if (qual_type->getAsCXXRecordDecl())
3739 return lldb::eLanguageTypeC_plus_plus;
3740 switch (qual_type->getTypeClass()) {
3741 default:
3742 break;
3743 case clang::Type::Builtin:
3744 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
3745 default:
3746 case clang::BuiltinType::Void:
3747 case clang::BuiltinType::Bool:
3748 case clang::BuiltinType::Char_U:
3749 case clang::BuiltinType::UChar:
3750 case clang::BuiltinType::WChar_U:
3751 case clang::BuiltinType::Char16:
3752 case clang::BuiltinType::Char32:
3753 case clang::BuiltinType::UShort:
3754 case clang::BuiltinType::UInt:
3755 case clang::BuiltinType::ULong:
3756 case clang::BuiltinType::ULongLong:
3757 case clang::BuiltinType::UInt128:
3758 case clang::BuiltinType::Char_S:
3759 case clang::BuiltinType::SChar:
3760 case clang::BuiltinType::WChar_S:
3761 case clang::BuiltinType::Short:
3762 case clang::BuiltinType::Int:
3763 case clang::BuiltinType::Long:
3764 case clang::BuiltinType::LongLong:
3765 case clang::BuiltinType::Int128:
3766 case clang::BuiltinType::Float:
3767 case clang::BuiltinType::Double:
3768 case clang::BuiltinType::LongDouble:
3769 break;
3770
3771 case clang::BuiltinType::NullPtr:
3772 return eLanguageTypeC_plus_plus;
3773
3774 case clang::BuiltinType::ObjCId:
3775 case clang::BuiltinType::ObjCClass:
3776 case clang::BuiltinType::ObjCSel:
3777 return eLanguageTypeObjC;
3778
3779 case clang::BuiltinType::Dependent:
3780 case clang::BuiltinType::Overload:
3781 case clang::BuiltinType::BoundMember:
3782 case clang::BuiltinType::UnknownAny:
3783 break;
3784 }
3785 break;
3786 case clang::Type::Typedef:
3787 return GetType(llvm::cast<clang::TypedefType>(qual_type)
3788 ->getDecl()
3789 ->getUnderlyingType())
3790 .GetMinimumLanguage();
3791 }
3792 }
3793 return lldb::eLanguageTypeC;
3794 }
3795
3796 lldb::TypeClass
GetTypeClass(lldb::opaque_compiler_type_t type)3797 ClangASTContext::GetTypeClass(lldb::opaque_compiler_type_t type) {
3798 if (!type)
3799 return lldb::eTypeClassInvalid;
3800
3801 clang::QualType qual_type =
3802 RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef});
3803
3804 switch (qual_type->getTypeClass()) {
3805 case clang::Type::Atomic:
3806 case clang::Type::Auto:
3807 case clang::Type::Decltype:
3808 case clang::Type::Elaborated:
3809 case clang::Type::Paren:
3810 case clang::Type::TypeOf:
3811 case clang::Type::TypeOfExpr:
3812 llvm_unreachable("Handled in RemoveWrappingTypes!");
3813 case clang::Type::UnaryTransform:
3814 break;
3815 case clang::Type::FunctionNoProto:
3816 return lldb::eTypeClassFunction;
3817 case clang::Type::FunctionProto:
3818 return lldb::eTypeClassFunction;
3819 case clang::Type::IncompleteArray:
3820 return lldb::eTypeClassArray;
3821 case clang::Type::VariableArray:
3822 return lldb::eTypeClassArray;
3823 case clang::Type::ConstantArray:
3824 return lldb::eTypeClassArray;
3825 case clang::Type::DependentSizedArray:
3826 return lldb::eTypeClassArray;
3827 case clang::Type::DependentSizedExtVector:
3828 return lldb::eTypeClassVector;
3829 case clang::Type::DependentVector:
3830 return lldb::eTypeClassVector;
3831 case clang::Type::ExtVector:
3832 return lldb::eTypeClassVector;
3833 case clang::Type::Vector:
3834 return lldb::eTypeClassVector;
3835 case clang::Type::Builtin:
3836 return lldb::eTypeClassBuiltin;
3837 case clang::Type::ObjCObjectPointer:
3838 return lldb::eTypeClassObjCObjectPointer;
3839 case clang::Type::BlockPointer:
3840 return lldb::eTypeClassBlockPointer;
3841 case clang::Type::Pointer:
3842 return lldb::eTypeClassPointer;
3843 case clang::Type::LValueReference:
3844 return lldb::eTypeClassReference;
3845 case clang::Type::RValueReference:
3846 return lldb::eTypeClassReference;
3847 case clang::Type::MemberPointer:
3848 return lldb::eTypeClassMemberPointer;
3849 case clang::Type::Complex:
3850 if (qual_type->isComplexType())
3851 return lldb::eTypeClassComplexFloat;
3852 else
3853 return lldb::eTypeClassComplexInteger;
3854 case clang::Type::ObjCObject:
3855 return lldb::eTypeClassObjCObject;
3856 case clang::Type::ObjCInterface:
3857 return lldb::eTypeClassObjCInterface;
3858 case clang::Type::Record: {
3859 const clang::RecordType *record_type =
3860 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3861 const clang::RecordDecl *record_decl = record_type->getDecl();
3862 if (record_decl->isUnion())
3863 return lldb::eTypeClassUnion;
3864 else if (record_decl->isStruct())
3865 return lldb::eTypeClassStruct;
3866 else
3867 return lldb::eTypeClassClass;
3868 } break;
3869 case clang::Type::Enum:
3870 return lldb::eTypeClassEnumeration;
3871 case clang::Type::Typedef:
3872 return lldb::eTypeClassTypedef;
3873 case clang::Type::UnresolvedUsing:
3874 break;
3875
3876 case clang::Type::Attributed:
3877 break;
3878 case clang::Type::TemplateTypeParm:
3879 break;
3880 case clang::Type::SubstTemplateTypeParm:
3881 break;
3882 case clang::Type::SubstTemplateTypeParmPack:
3883 break;
3884 case clang::Type::InjectedClassName:
3885 break;
3886 case clang::Type::DependentName:
3887 break;
3888 case clang::Type::DependentTemplateSpecialization:
3889 break;
3890 case clang::Type::PackExpansion:
3891 break;
3892
3893 case clang::Type::TemplateSpecialization:
3894 break;
3895 case clang::Type::DeducedTemplateSpecialization:
3896 break;
3897 case clang::Type::Pipe:
3898 break;
3899
3900 // pointer type decayed from an array or function type.
3901 case clang::Type::Decayed:
3902 break;
3903 case clang::Type::Adjusted:
3904 break;
3905 case clang::Type::ObjCTypeParam:
3906 break;
3907
3908 case clang::Type::DependentAddressSpace:
3909 break;
3910 case clang::Type::MacroQualified:
3911 break;
3912 }
3913 // We don't know hot to display this type...
3914 return lldb::eTypeClassOther;
3915 }
3916
GetTypeQualifiers(lldb::opaque_compiler_type_t type)3917 unsigned ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type) {
3918 if (type)
3919 return GetQualType(type).getQualifiers().getCVRQualifiers();
3920 return 0;
3921 }
3922
3923 // Creating related types
3924
3925 CompilerType
GetArrayElementType(lldb::opaque_compiler_type_t type,uint64_t * stride)3926 ClangASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
3927 uint64_t *stride) {
3928 if (type) {
3929 clang::QualType qual_type(GetQualType(type));
3930
3931 const clang::Type *array_eletype =
3932 qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3933
3934 if (!array_eletype)
3935 return CompilerType();
3936
3937 CompilerType element_type = GetType(clang::QualType(array_eletype, 0));
3938
3939 // TODO: the real stride will be >= this value.. find the real one!
3940 if (stride)
3941 if (Optional<uint64_t> size = element_type.GetByteSize(nullptr))
3942 *stride = *size;
3943
3944 return element_type;
3945 }
3946 return CompilerType();
3947 }
3948
GetArrayType(lldb::opaque_compiler_type_t type,uint64_t size)3949 CompilerType ClangASTContext::GetArrayType(lldb::opaque_compiler_type_t type,
3950 uint64_t size) {
3951 if (type) {
3952 clang::QualType qual_type(GetCanonicalQualType(type));
3953 clang::ASTContext &ast_ctx = getASTContext();
3954 if (size != 0)
3955 return GetType(ast_ctx.getConstantArrayType(
3956 qual_type, llvm::APInt(64, size), nullptr,
3957 clang::ArrayType::ArraySizeModifier::Normal, 0));
3958 else
3959 return GetType(ast_ctx.getIncompleteArrayType(
3960 qual_type, clang::ArrayType::ArraySizeModifier::Normal, 0));
3961 }
3962
3963 return CompilerType();
3964 }
3965
3966 CompilerType
GetCanonicalType(lldb::opaque_compiler_type_t type)3967 ClangASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type) {
3968 if (type)
3969 return GetType(GetCanonicalQualType(type));
3970 return CompilerType();
3971 }
3972
GetFullyUnqualifiedType_Impl(clang::ASTContext * ast,clang::QualType qual_type)3973 static clang::QualType GetFullyUnqualifiedType_Impl(clang::ASTContext *ast,
3974 clang::QualType qual_type) {
3975 if (qual_type->isPointerType())
3976 qual_type = ast->getPointerType(
3977 GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3978 else
3979 qual_type = qual_type.getUnqualifiedType();
3980 qual_type.removeLocalConst();
3981 qual_type.removeLocalRestrict();
3982 qual_type.removeLocalVolatile();
3983 return qual_type;
3984 }
3985
3986 CompilerType
GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type)3987 ClangASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) {
3988 if (type)
3989 return GetType(
3990 GetFullyUnqualifiedType_Impl(&getASTContext(), GetQualType(type)));
3991 return CompilerType();
3992 }
3993
GetFunctionArgumentCount(lldb::opaque_compiler_type_t type)3994 int ClangASTContext::GetFunctionArgumentCount(
3995 lldb::opaque_compiler_type_t type) {
3996 if (type) {
3997 const clang::FunctionProtoType *func =
3998 llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3999 if (func)
4000 return func->getNumParams();
4001 }
4002 return -1;
4003 }
4004
GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type,size_t idx)4005 CompilerType ClangASTContext::GetFunctionArgumentTypeAtIndex(
4006 lldb::opaque_compiler_type_t type, size_t idx) {
4007 if (type) {
4008 const clang::FunctionProtoType *func =
4009 llvm::dyn_cast<clang::FunctionProtoType>(GetQualType(type));
4010 if (func) {
4011 const uint32_t num_args = func->getNumParams();
4012 if (idx < num_args)
4013 return GetType(func->getParamType(idx));
4014 }
4015 }
4016 return CompilerType();
4017 }
4018
4019 CompilerType
GetFunctionReturnType(lldb::opaque_compiler_type_t type)4020 ClangASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type) {
4021 if (type) {
4022 clang::QualType qual_type(GetQualType(type));
4023 const clang::FunctionProtoType *func =
4024 llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4025 if (func)
4026 return GetType(func->getReturnType());
4027 }
4028 return CompilerType();
4029 }
4030
4031 size_t
GetNumMemberFunctions(lldb::opaque_compiler_type_t type)4032 ClangASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) {
4033 size_t num_functions = 0;
4034 if (type) {
4035 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
4036 switch (qual_type->getTypeClass()) {
4037 case clang::Type::Record:
4038 if (GetCompleteQualType(&getASTContext(), qual_type)) {
4039 const clang::RecordType *record_type =
4040 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4041 const clang::RecordDecl *record_decl = record_type->getDecl();
4042 assert(record_decl);
4043 const clang::CXXRecordDecl *cxx_record_decl =
4044 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4045 if (cxx_record_decl)
4046 num_functions = std::distance(cxx_record_decl->method_begin(),
4047 cxx_record_decl->method_end());
4048 }
4049 break;
4050
4051 case clang::Type::ObjCObjectPointer: {
4052 const clang::ObjCObjectPointerType *objc_class_type =
4053 qual_type->getAs<clang::ObjCObjectPointerType>();
4054 const clang::ObjCInterfaceType *objc_interface_type =
4055 objc_class_type->getInterfaceType();
4056 if (objc_interface_type &&
4057 GetCompleteType(static_cast<lldb::opaque_compiler_type_t>(
4058 const_cast<clang::ObjCInterfaceType *>(objc_interface_type)))) {
4059 clang::ObjCInterfaceDecl *class_interface_decl =
4060 objc_interface_type->getDecl();
4061 if (class_interface_decl) {
4062 num_functions = std::distance(class_interface_decl->meth_begin(),
4063 class_interface_decl->meth_end());
4064 }
4065 }
4066 break;
4067 }
4068
4069 case clang::Type::ObjCObject:
4070 case clang::Type::ObjCInterface:
4071 if (GetCompleteType(type)) {
4072 const clang::ObjCObjectType *objc_class_type =
4073 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4074 if (objc_class_type) {
4075 clang::ObjCInterfaceDecl *class_interface_decl =
4076 objc_class_type->getInterface();
4077 if (class_interface_decl)
4078 num_functions = std::distance(class_interface_decl->meth_begin(),
4079 class_interface_decl->meth_end());
4080 }
4081 }
4082 break;
4083
4084 default:
4085 break;
4086 }
4087 }
4088 return num_functions;
4089 }
4090
4091 TypeMemberFunctionImpl
GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,size_t idx)4092 ClangASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,
4093 size_t idx) {
4094 std::string name;
4095 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
4096 CompilerType clang_type;
4097 CompilerDecl clang_decl;
4098 if (type) {
4099 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
4100 switch (qual_type->getTypeClass()) {
4101 case clang::Type::Record:
4102 if (GetCompleteQualType(&getASTContext(), qual_type)) {
4103 const clang::RecordType *record_type =
4104 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4105 const clang::RecordDecl *record_decl = record_type->getDecl();
4106 assert(record_decl);
4107 const clang::CXXRecordDecl *cxx_record_decl =
4108 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4109 if (cxx_record_decl) {
4110 auto method_iter = cxx_record_decl->method_begin();
4111 auto method_end = cxx_record_decl->method_end();
4112 if (idx <
4113 static_cast<size_t>(std::distance(method_iter, method_end))) {
4114 std::advance(method_iter, idx);
4115 clang::CXXMethodDecl *cxx_method_decl =
4116 method_iter->getCanonicalDecl();
4117 if (cxx_method_decl) {
4118 name = cxx_method_decl->getDeclName().getAsString();
4119 if (cxx_method_decl->isStatic())
4120 kind = lldb::eMemberFunctionKindStaticMethod;
4121 else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
4122 kind = lldb::eMemberFunctionKindConstructor;
4123 else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
4124 kind = lldb::eMemberFunctionKindDestructor;
4125 else
4126 kind = lldb::eMemberFunctionKindInstanceMethod;
4127 clang_type = GetType(cxx_method_decl->getType());
4128 clang_decl = CompilerDecl(this, cxx_method_decl);
4129 }
4130 }
4131 }
4132 }
4133 break;
4134
4135 case clang::Type::ObjCObjectPointer: {
4136 const clang::ObjCObjectPointerType *objc_class_type =
4137 qual_type->getAs<clang::ObjCObjectPointerType>();
4138 const clang::ObjCInterfaceType *objc_interface_type =
4139 objc_class_type->getInterfaceType();
4140 if (objc_interface_type &&
4141 GetCompleteType(static_cast<lldb::opaque_compiler_type_t>(
4142 const_cast<clang::ObjCInterfaceType *>(objc_interface_type)))) {
4143 clang::ObjCInterfaceDecl *class_interface_decl =
4144 objc_interface_type->getDecl();
4145 if (class_interface_decl) {
4146 auto method_iter = class_interface_decl->meth_begin();
4147 auto method_end = class_interface_decl->meth_end();
4148 if (idx <
4149 static_cast<size_t>(std::distance(method_iter, method_end))) {
4150 std::advance(method_iter, idx);
4151 clang::ObjCMethodDecl *objc_method_decl =
4152 method_iter->getCanonicalDecl();
4153 if (objc_method_decl) {
4154 clang_decl = CompilerDecl(this, objc_method_decl);
4155 name = objc_method_decl->getSelector().getAsString();
4156 if (objc_method_decl->isClassMethod())
4157 kind = lldb::eMemberFunctionKindStaticMethod;
4158 else
4159 kind = lldb::eMemberFunctionKindInstanceMethod;
4160 }
4161 }
4162 }
4163 }
4164 break;
4165 }
4166
4167 case clang::Type::ObjCObject:
4168 case clang::Type::ObjCInterface:
4169 if (GetCompleteType(type)) {
4170 const clang::ObjCObjectType *objc_class_type =
4171 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4172 if (objc_class_type) {
4173 clang::ObjCInterfaceDecl *class_interface_decl =
4174 objc_class_type->getInterface();
4175 if (class_interface_decl) {
4176 auto method_iter = class_interface_decl->meth_begin();
4177 auto method_end = class_interface_decl->meth_end();
4178 if (idx <
4179 static_cast<size_t>(std::distance(method_iter, method_end))) {
4180 std::advance(method_iter, idx);
4181 clang::ObjCMethodDecl *objc_method_decl =
4182 method_iter->getCanonicalDecl();
4183 if (objc_method_decl) {
4184 clang_decl = CompilerDecl(this, objc_method_decl);
4185 name = objc_method_decl->getSelector().getAsString();
4186 if (objc_method_decl->isClassMethod())
4187 kind = lldb::eMemberFunctionKindStaticMethod;
4188 else
4189 kind = lldb::eMemberFunctionKindInstanceMethod;
4190 }
4191 }
4192 }
4193 }
4194 }
4195 break;
4196
4197 default:
4198 break;
4199 }
4200 }
4201
4202 if (kind == eMemberFunctionKindUnknown)
4203 return TypeMemberFunctionImpl();
4204 else
4205 return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
4206 }
4207
4208 CompilerType
GetNonReferenceType(lldb::opaque_compiler_type_t type)4209 ClangASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type) {
4210 if (type)
4211 return GetType(GetQualType(type).getNonReferenceType());
4212 return CompilerType();
4213 }
4214
CreateTypedefType(const CompilerType & type,const char * typedef_name,const CompilerDeclContext & compiler_decl_ctx)4215 CompilerType ClangASTContext::CreateTypedefType(
4216 const CompilerType &type, const char *typedef_name,
4217 const CompilerDeclContext &compiler_decl_ctx) {
4218 if (type && typedef_name && typedef_name[0]) {
4219 ClangASTContext *ast =
4220 llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
4221 if (!ast)
4222 return CompilerType();
4223 clang::ASTContext &clang_ast = ast->getASTContext();
4224 clang::QualType qual_type(ClangUtil::GetQualType(type));
4225
4226 clang::DeclContext *decl_ctx =
4227 ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4228 if (decl_ctx == nullptr)
4229 decl_ctx = ast->getASTContext().getTranslationUnitDecl();
4230
4231 clang::TypedefDecl *decl = clang::TypedefDecl::Create(
4232 clang_ast, decl_ctx, clang::SourceLocation(), clang::SourceLocation(),
4233 &clang_ast.Idents.get(typedef_name),
4234 clang_ast.getTrivialTypeSourceInfo(qual_type));
4235
4236 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4237
4238 decl_ctx->addDecl(decl);
4239
4240 // Get a uniqued clang::QualType for the typedef decl type
4241 return ast->GetType(clang_ast.getTypedefType(decl));
4242 }
4243 return CompilerType();
4244 }
4245
4246 CompilerType
GetPointeeType(lldb::opaque_compiler_type_t type)4247 ClangASTContext::GetPointeeType(lldb::opaque_compiler_type_t type) {
4248 if (type) {
4249 clang::QualType qual_type(GetQualType(type));
4250 return GetType(qual_type.getTypePtr()->getPointeeType());
4251 }
4252 return CompilerType();
4253 }
4254
4255 CompilerType
GetPointerType(lldb::opaque_compiler_type_t type)4256 ClangASTContext::GetPointerType(lldb::opaque_compiler_type_t type) {
4257 if (type) {
4258 clang::QualType qual_type(GetQualType(type));
4259
4260 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4261 switch (type_class) {
4262 case clang::Type::ObjCObject:
4263 case clang::Type::ObjCInterface:
4264 return GetType(getASTContext().getObjCObjectPointerType(qual_type));
4265
4266 default:
4267 return GetType(getASTContext().getPointerType(qual_type));
4268 }
4269 }
4270 return CompilerType();
4271 }
4272
4273 CompilerType
GetLValueReferenceType(lldb::opaque_compiler_type_t type)4274 ClangASTContext::GetLValueReferenceType(lldb::opaque_compiler_type_t type) {
4275 if (type)
4276 return GetType(getASTContext().getLValueReferenceType(GetQualType(type)));
4277 else
4278 return CompilerType();
4279 }
4280
4281 CompilerType
GetRValueReferenceType(lldb::opaque_compiler_type_t type)4282 ClangASTContext::GetRValueReferenceType(lldb::opaque_compiler_type_t type) {
4283 if (type)
4284 return GetType(getASTContext().getRValueReferenceType(GetQualType(type)));
4285 else
4286 return CompilerType();
4287 }
4288
GetAtomicType(lldb::opaque_compiler_type_t type)4289 CompilerType ClangASTContext::GetAtomicType(lldb::opaque_compiler_type_t type) {
4290 if (!type)
4291 return CompilerType();
4292 return GetType(getASTContext().getAtomicType(GetQualType(type)));
4293 }
4294
4295 CompilerType
AddConstModifier(lldb::opaque_compiler_type_t type)4296 ClangASTContext::AddConstModifier(lldb::opaque_compiler_type_t type) {
4297 if (type) {
4298 clang::QualType result(GetQualType(type));
4299 result.addConst();
4300 return GetType(result);
4301 }
4302 return CompilerType();
4303 }
4304
4305 CompilerType
AddVolatileModifier(lldb::opaque_compiler_type_t type)4306 ClangASTContext::AddVolatileModifier(lldb::opaque_compiler_type_t type) {
4307 if (type) {
4308 clang::QualType result(GetQualType(type));
4309 result.addVolatile();
4310 return GetType(result);
4311 }
4312 return CompilerType();
4313 }
4314
4315 CompilerType
AddRestrictModifier(lldb::opaque_compiler_type_t type)4316 ClangASTContext::AddRestrictModifier(lldb::opaque_compiler_type_t type) {
4317 if (type) {
4318 clang::QualType result(GetQualType(type));
4319 result.addRestrict();
4320 return GetType(result);
4321 }
4322 return CompilerType();
4323 }
4324
4325 CompilerType
CreateTypedef(lldb::opaque_compiler_type_t type,const char * typedef_name,const CompilerDeclContext & compiler_decl_ctx)4326 ClangASTContext::CreateTypedef(lldb::opaque_compiler_type_t type,
4327 const char *typedef_name,
4328 const CompilerDeclContext &compiler_decl_ctx) {
4329 if (type) {
4330 clang::ASTContext &clang_ast = getASTContext();
4331 clang::QualType qual_type(GetQualType(type));
4332
4333 clang::DeclContext *decl_ctx =
4334 ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4335 if (decl_ctx == nullptr)
4336 decl_ctx = getASTContext().getTranslationUnitDecl();
4337
4338 clang::TypedefDecl *decl = clang::TypedefDecl::Create(
4339 clang_ast, decl_ctx, clang::SourceLocation(), clang::SourceLocation(),
4340 &clang_ast.Idents.get(typedef_name),
4341 clang_ast.getTrivialTypeSourceInfo(qual_type));
4342
4343 clang::TagDecl *tdecl = nullptr;
4344 if (!qual_type.isNull()) {
4345 if (const clang::RecordType *rt = qual_type->getAs<clang::RecordType>())
4346 tdecl = rt->getDecl();
4347 if (const clang::EnumType *et = qual_type->getAs<clang::EnumType>())
4348 tdecl = et->getDecl();
4349 }
4350
4351 // Check whether this declaration is an anonymous struct, union, or enum,
4352 // hidden behind a typedef. If so, we try to check whether we have a
4353 // typedef tag to attach to the original record declaration
4354 if (tdecl && !tdecl->getIdentifier() && !tdecl->getTypedefNameForAnonDecl())
4355 tdecl->setTypedefNameForAnonDecl(decl);
4356
4357 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4358
4359 // Get a uniqued clang::QualType for the typedef decl type
4360 return GetType(clang_ast.getTypedefType(decl));
4361 }
4362 return CompilerType();
4363 }
4364
4365 CompilerType
GetTypedefedType(lldb::opaque_compiler_type_t type)4366 ClangASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type) {
4367 if (type) {
4368 const clang::TypedefType *typedef_type =
4369 llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4370 if (typedef_type)
4371 return GetType(typedef_type->getDecl()->getUnderlyingType());
4372 }
4373 return CompilerType();
4374 }
4375
4376 // Create related types using the current type's AST
4377
GetBasicTypeFromAST(lldb::BasicType basic_type)4378 CompilerType ClangASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type) {
4379 return ClangASTContext::GetBasicType(basic_type);
4380 }
4381 // Exploring the type
4382
4383 const llvm::fltSemantics &
GetFloatTypeSemantics(size_t byte_size)4384 ClangASTContext::GetFloatTypeSemantics(size_t byte_size) {
4385 clang::ASTContext &ast = getASTContext();
4386 const size_t bit_size = byte_size * 8;
4387 if (bit_size == ast.getTypeSize(ast.FloatTy))
4388 return ast.getFloatTypeSemantics(ast.FloatTy);
4389 else if (bit_size == ast.getTypeSize(ast.DoubleTy))
4390 return ast.getFloatTypeSemantics(ast.DoubleTy);
4391 else if (bit_size == ast.getTypeSize(ast.LongDoubleTy))
4392 return ast.getFloatTypeSemantics(ast.LongDoubleTy);
4393 else if (bit_size == ast.getTypeSize(ast.HalfTy))
4394 return ast.getFloatTypeSemantics(ast.HalfTy);
4395 return llvm::APFloatBase::Bogus();
4396 }
4397
4398 Optional<uint64_t>
GetBitSize(lldb::opaque_compiler_type_t type,ExecutionContextScope * exe_scope)4399 ClangASTContext::GetBitSize(lldb::opaque_compiler_type_t type,
4400 ExecutionContextScope *exe_scope) {
4401 if (GetCompleteType(type)) {
4402 clang::QualType qual_type(GetCanonicalQualType(type));
4403 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4404 switch (type_class) {
4405 case clang::Type::Record:
4406 if (GetCompleteType(type))
4407 return getASTContext().getTypeSize(qual_type);
4408 else
4409 return None;
4410 break;
4411
4412 case clang::Type::ObjCInterface:
4413 case clang::Type::ObjCObject: {
4414 ExecutionContext exe_ctx(exe_scope);
4415 Process *process = exe_ctx.GetProcessPtr();
4416 if (process) {
4417 ObjCLanguageRuntime *objc_runtime = ObjCLanguageRuntime::Get(*process);
4418 if (objc_runtime) {
4419 uint64_t bit_size = 0;
4420 if (objc_runtime->GetTypeBitSize(GetType(qual_type), bit_size))
4421 return bit_size;
4422 }
4423 } else {
4424 static bool g_printed = false;
4425 if (!g_printed) {
4426 StreamString s;
4427 DumpTypeDescription(type, &s);
4428
4429 llvm::outs() << "warning: trying to determine the size of type ";
4430 llvm::outs() << s.GetString() << "\n";
4431 llvm::outs() << "without a valid ExecutionContext. this is not "
4432 "reliable. please file a bug against LLDB.\n";
4433 llvm::outs() << "backtrace:\n";
4434 llvm::sys::PrintStackTrace(llvm::outs());
4435 llvm::outs() << "\n";
4436 g_printed = true;
4437 }
4438 }
4439 }
4440 LLVM_FALLTHROUGH;
4441 default:
4442 const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
4443 if (bit_size == 0) {
4444 if (qual_type->isIncompleteArrayType())
4445 return getASTContext().getTypeSize(
4446 qual_type->getArrayElementTypeNoTypeQual()
4447 ->getCanonicalTypeUnqualified());
4448 }
4449 if (qual_type->isObjCObjectOrInterfaceType())
4450 return bit_size +
4451 getASTContext().getTypeSize(getASTContext().ObjCBuiltinClassTy);
4452 // Function types actually have a size of 0, that's not an error.
4453 if (qual_type->isFunctionProtoType())
4454 return bit_size;
4455 if (bit_size)
4456 return bit_size;
4457 }
4458 }
4459 return None;
4460 }
4461
4462 llvm::Optional<size_t>
GetTypeBitAlign(lldb::opaque_compiler_type_t type,ExecutionContextScope * exe_scope)4463 ClangASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type,
4464 ExecutionContextScope *exe_scope) {
4465 if (GetCompleteType(type))
4466 return getASTContext().getTypeAlign(GetQualType(type));
4467 return {};
4468 }
4469
GetEncoding(lldb::opaque_compiler_type_t type,uint64_t & count)4470 lldb::Encoding ClangASTContext::GetEncoding(lldb::opaque_compiler_type_t type,
4471 uint64_t &count) {
4472 if (!type)
4473 return lldb::eEncodingInvalid;
4474
4475 count = 1;
4476 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
4477
4478 switch (qual_type->getTypeClass()) {
4479 case clang::Type::Atomic:
4480 case clang::Type::Auto:
4481 case clang::Type::Decltype:
4482 case clang::Type::Elaborated:
4483 case clang::Type::Paren:
4484 case clang::Type::Typedef:
4485 case clang::Type::TypeOf:
4486 case clang::Type::TypeOfExpr:
4487 llvm_unreachable("Handled in RemoveWrappingTypes!");
4488
4489 case clang::Type::UnaryTransform:
4490 break;
4491
4492 case clang::Type::FunctionNoProto:
4493 case clang::Type::FunctionProto:
4494 break;
4495
4496 case clang::Type::IncompleteArray:
4497 case clang::Type::VariableArray:
4498 break;
4499
4500 case clang::Type::ConstantArray:
4501 break;
4502
4503 case clang::Type::DependentVector:
4504 case clang::Type::ExtVector:
4505 case clang::Type::Vector:
4506 // TODO: Set this to more than one???
4507 break;
4508
4509 case clang::Type::Builtin:
4510 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
4511 case clang::BuiltinType::Void:
4512 break;
4513
4514 case clang::BuiltinType::Bool:
4515 case clang::BuiltinType::Char_S:
4516 case clang::BuiltinType::SChar:
4517 case clang::BuiltinType::WChar_S:
4518 case clang::BuiltinType::Short:
4519 case clang::BuiltinType::Int:
4520 case clang::BuiltinType::Long:
4521 case clang::BuiltinType::LongLong:
4522 case clang::BuiltinType::Int128:
4523 return lldb::eEncodingSint;
4524
4525 case clang::BuiltinType::Char_U:
4526 case clang::BuiltinType::UChar:
4527 case clang::BuiltinType::WChar_U:
4528 case clang::BuiltinType::Char8:
4529 case clang::BuiltinType::Char16:
4530 case clang::BuiltinType::Char32:
4531 case clang::BuiltinType::UShort:
4532 case clang::BuiltinType::UInt:
4533 case clang::BuiltinType::ULong:
4534 case clang::BuiltinType::ULongLong:
4535 case clang::BuiltinType::UInt128:
4536 return lldb::eEncodingUint;
4537
4538 // Fixed point types. Note that they are currently ignored.
4539 case clang::BuiltinType::ShortAccum:
4540 case clang::BuiltinType::Accum:
4541 case clang::BuiltinType::LongAccum:
4542 case clang::BuiltinType::UShortAccum:
4543 case clang::BuiltinType::UAccum:
4544 case clang::BuiltinType::ULongAccum:
4545 case clang::BuiltinType::ShortFract:
4546 case clang::BuiltinType::Fract:
4547 case clang::BuiltinType::LongFract:
4548 case clang::BuiltinType::UShortFract:
4549 case clang::BuiltinType::UFract:
4550 case clang::BuiltinType::ULongFract:
4551 case clang::BuiltinType::SatShortAccum:
4552 case clang::BuiltinType::SatAccum:
4553 case clang::BuiltinType::SatLongAccum:
4554 case clang::BuiltinType::SatUShortAccum:
4555 case clang::BuiltinType::SatUAccum:
4556 case clang::BuiltinType::SatULongAccum:
4557 case clang::BuiltinType::SatShortFract:
4558 case clang::BuiltinType::SatFract:
4559 case clang::BuiltinType::SatLongFract:
4560 case clang::BuiltinType::SatUShortFract:
4561 case clang::BuiltinType::SatUFract:
4562 case clang::BuiltinType::SatULongFract:
4563 break;
4564
4565 case clang::BuiltinType::Half:
4566 case clang::BuiltinType::Float:
4567 case clang::BuiltinType::Float16:
4568 case clang::BuiltinType::Float128:
4569 case clang::BuiltinType::Double:
4570 case clang::BuiltinType::LongDouble:
4571 return lldb::eEncodingIEEE754;
4572
4573 case clang::BuiltinType::ObjCClass:
4574 case clang::BuiltinType::ObjCId:
4575 case clang::BuiltinType::ObjCSel:
4576 return lldb::eEncodingUint;
4577
4578 case clang::BuiltinType::NullPtr:
4579 return lldb::eEncodingUint;
4580
4581 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4582 case clang::BuiltinType::Kind::BoundMember:
4583 case clang::BuiltinType::Kind::BuiltinFn:
4584 case clang::BuiltinType::Kind::Dependent:
4585 case clang::BuiltinType::Kind::OCLClkEvent:
4586 case clang::BuiltinType::Kind::OCLEvent:
4587 case clang::BuiltinType::Kind::OCLImage1dRO:
4588 case clang::BuiltinType::Kind::OCLImage1dWO:
4589 case clang::BuiltinType::Kind::OCLImage1dRW:
4590 case clang::BuiltinType::Kind::OCLImage1dArrayRO:
4591 case clang::BuiltinType::Kind::OCLImage1dArrayWO:
4592 case clang::BuiltinType::Kind::OCLImage1dArrayRW:
4593 case clang::BuiltinType::Kind::OCLImage1dBufferRO:
4594 case clang::BuiltinType::Kind::OCLImage1dBufferWO:
4595 case clang::BuiltinType::Kind::OCLImage1dBufferRW:
4596 case clang::BuiltinType::Kind::OCLImage2dRO:
4597 case clang::BuiltinType::Kind::OCLImage2dWO:
4598 case clang::BuiltinType::Kind::OCLImage2dRW:
4599 case clang::BuiltinType::Kind::OCLImage2dArrayRO:
4600 case clang::BuiltinType::Kind::OCLImage2dArrayWO:
4601 case clang::BuiltinType::Kind::OCLImage2dArrayRW:
4602 case clang::BuiltinType::Kind::OCLImage2dArrayDepthRO:
4603 case clang::BuiltinType::Kind::OCLImage2dArrayDepthWO:
4604 case clang::BuiltinType::Kind::OCLImage2dArrayDepthRW:
4605 case clang::BuiltinType::Kind::OCLImage2dArrayMSAARO:
4606 case clang::BuiltinType::Kind::OCLImage2dArrayMSAAWO:
4607 case clang::BuiltinType::Kind::OCLImage2dArrayMSAARW:
4608 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRO:
4609 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthWO:
4610 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRW:
4611 case clang::BuiltinType::Kind::OCLImage2dDepthRO:
4612 case clang::BuiltinType::Kind::OCLImage2dDepthWO:
4613 case clang::BuiltinType::Kind::OCLImage2dDepthRW:
4614 case clang::BuiltinType::Kind::OCLImage2dMSAARO:
4615 case clang::BuiltinType::Kind::OCLImage2dMSAAWO:
4616 case clang::BuiltinType::Kind::OCLImage2dMSAARW:
4617 case clang::BuiltinType::Kind::OCLImage2dMSAADepthRO:
4618 case clang::BuiltinType::Kind::OCLImage2dMSAADepthWO:
4619 case clang::BuiltinType::Kind::OCLImage2dMSAADepthRW:
4620 case clang::BuiltinType::Kind::OCLImage3dRO:
4621 case clang::BuiltinType::Kind::OCLImage3dWO:
4622 case clang::BuiltinType::Kind::OCLImage3dRW:
4623 case clang::BuiltinType::Kind::OCLQueue:
4624 case clang::BuiltinType::Kind::OCLReserveID:
4625 case clang::BuiltinType::Kind::OCLSampler:
4626 case clang::BuiltinType::Kind::OMPArraySection:
4627 case clang::BuiltinType::Kind::Overload:
4628 case clang::BuiltinType::Kind::PseudoObject:
4629 case clang::BuiltinType::Kind::UnknownAny:
4630 break;
4631
4632 case clang::BuiltinType::OCLIntelSubgroupAVCMcePayload:
4633 case clang::BuiltinType::OCLIntelSubgroupAVCImePayload:
4634 case clang::BuiltinType::OCLIntelSubgroupAVCRefPayload:
4635 case clang::BuiltinType::OCLIntelSubgroupAVCSicPayload:
4636 case clang::BuiltinType::OCLIntelSubgroupAVCMceResult:
4637 case clang::BuiltinType::OCLIntelSubgroupAVCImeResult:
4638 case clang::BuiltinType::OCLIntelSubgroupAVCRefResult:
4639 case clang::BuiltinType::OCLIntelSubgroupAVCSicResult:
4640 case clang::BuiltinType::OCLIntelSubgroupAVCImeResultSingleRefStreamout:
4641 case clang::BuiltinType::OCLIntelSubgroupAVCImeResultDualRefStreamout:
4642 case clang::BuiltinType::OCLIntelSubgroupAVCImeSingleRefStreamin:
4643 case clang::BuiltinType::OCLIntelSubgroupAVCImeDualRefStreamin:
4644 break;
4645
4646 case clang::BuiltinType::SveBool:
4647 case clang::BuiltinType::SveInt8:
4648 case clang::BuiltinType::SveInt16:
4649 case clang::BuiltinType::SveInt32:
4650 case clang::BuiltinType::SveInt64:
4651 case clang::BuiltinType::SveUint8:
4652 case clang::BuiltinType::SveUint16:
4653 case clang::BuiltinType::SveUint32:
4654 case clang::BuiltinType::SveUint64:
4655 case clang::BuiltinType::SveFloat16:
4656 case clang::BuiltinType::SveFloat32:
4657 case clang::BuiltinType::SveFloat64:
4658 break;
4659 }
4660 break;
4661 // All pointer types are represented as unsigned integer encodings. We may
4662 // nee to add a eEncodingPointer if we ever need to know the difference
4663 case clang::Type::ObjCObjectPointer:
4664 case clang::Type::BlockPointer:
4665 case clang::Type::Pointer:
4666 case clang::Type::LValueReference:
4667 case clang::Type::RValueReference:
4668 case clang::Type::MemberPointer:
4669 return lldb::eEncodingUint;
4670 case clang::Type::Complex: {
4671 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4672 if (qual_type->isComplexType())
4673 encoding = lldb::eEncodingIEEE754;
4674 else {
4675 const clang::ComplexType *complex_type =
4676 qual_type->getAsComplexIntegerType();
4677 if (complex_type)
4678 encoding = GetType(complex_type->getElementType()).GetEncoding(count);
4679 else
4680 encoding = lldb::eEncodingSint;
4681 }
4682 count = 2;
4683 return encoding;
4684 }
4685
4686 case clang::Type::ObjCInterface:
4687 break;
4688 case clang::Type::Record:
4689 break;
4690 case clang::Type::Enum:
4691 return lldb::eEncodingSint;
4692 case clang::Type::DependentSizedArray:
4693 case clang::Type::DependentSizedExtVector:
4694 case clang::Type::UnresolvedUsing:
4695 case clang::Type::Attributed:
4696 case clang::Type::TemplateTypeParm:
4697 case clang::Type::SubstTemplateTypeParm:
4698 case clang::Type::SubstTemplateTypeParmPack:
4699 case clang::Type::InjectedClassName:
4700 case clang::Type::DependentName:
4701 case clang::Type::DependentTemplateSpecialization:
4702 case clang::Type::PackExpansion:
4703 case clang::Type::ObjCObject:
4704
4705 case clang::Type::TemplateSpecialization:
4706 case clang::Type::DeducedTemplateSpecialization:
4707 case clang::Type::Adjusted:
4708 case clang::Type::Pipe:
4709 break;
4710
4711 // pointer type decayed from an array or function type.
4712 case clang::Type::Decayed:
4713 break;
4714 case clang::Type::ObjCTypeParam:
4715 break;
4716
4717 case clang::Type::DependentAddressSpace:
4718 break;
4719 case clang::Type::MacroQualified:
4720 break;
4721 }
4722 count = 0;
4723 return lldb::eEncodingInvalid;
4724 }
4725
GetFormat(lldb::opaque_compiler_type_t type)4726 lldb::Format ClangASTContext::GetFormat(lldb::opaque_compiler_type_t type) {
4727 if (!type)
4728 return lldb::eFormatDefault;
4729
4730 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
4731
4732 switch (qual_type->getTypeClass()) {
4733 case clang::Type::Atomic:
4734 case clang::Type::Auto:
4735 case clang::Type::Decltype:
4736 case clang::Type::Elaborated:
4737 case clang::Type::Paren:
4738 case clang::Type::Typedef:
4739 case clang::Type::TypeOf:
4740 case clang::Type::TypeOfExpr:
4741 llvm_unreachable("Handled in RemoveWrappingTypes!");
4742 case clang::Type::UnaryTransform:
4743 break;
4744
4745 case clang::Type::FunctionNoProto:
4746 case clang::Type::FunctionProto:
4747 break;
4748
4749 case clang::Type::IncompleteArray:
4750 case clang::Type::VariableArray:
4751 break;
4752
4753 case clang::Type::ConstantArray:
4754 return lldb::eFormatVoid; // no value
4755
4756 case clang::Type::DependentVector:
4757 case clang::Type::ExtVector:
4758 case clang::Type::Vector:
4759 break;
4760
4761 case clang::Type::Builtin:
4762 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
4763 // default: assert(0 && "Unknown builtin type!");
4764 case clang::BuiltinType::UnknownAny:
4765 case clang::BuiltinType::Void:
4766 case clang::BuiltinType::BoundMember:
4767 break;
4768
4769 case clang::BuiltinType::Bool:
4770 return lldb::eFormatBoolean;
4771 case clang::BuiltinType::Char_S:
4772 case clang::BuiltinType::SChar:
4773 case clang::BuiltinType::WChar_S:
4774 case clang::BuiltinType::Char_U:
4775 case clang::BuiltinType::UChar:
4776 case clang::BuiltinType::WChar_U:
4777 return lldb::eFormatChar;
4778 case clang::BuiltinType::Char16:
4779 return lldb::eFormatUnicode16;
4780 case clang::BuiltinType::Char32:
4781 return lldb::eFormatUnicode32;
4782 case clang::BuiltinType::UShort:
4783 return lldb::eFormatUnsigned;
4784 case clang::BuiltinType::Short:
4785 return lldb::eFormatDecimal;
4786 case clang::BuiltinType::UInt:
4787 return lldb::eFormatUnsigned;
4788 case clang::BuiltinType::Int:
4789 return lldb::eFormatDecimal;
4790 case clang::BuiltinType::ULong:
4791 return lldb::eFormatUnsigned;
4792 case clang::BuiltinType::Long:
4793 return lldb::eFormatDecimal;
4794 case clang::BuiltinType::ULongLong:
4795 return lldb::eFormatUnsigned;
4796 case clang::BuiltinType::LongLong:
4797 return lldb::eFormatDecimal;
4798 case clang::BuiltinType::UInt128:
4799 return lldb::eFormatUnsigned;
4800 case clang::BuiltinType::Int128:
4801 return lldb::eFormatDecimal;
4802 case clang::BuiltinType::Half:
4803 case clang::BuiltinType::Float:
4804 case clang::BuiltinType::Double:
4805 case clang::BuiltinType::LongDouble:
4806 return lldb::eFormatFloat;
4807 default:
4808 return lldb::eFormatHex;
4809 }
4810 break;
4811 case clang::Type::ObjCObjectPointer:
4812 return lldb::eFormatHex;
4813 case clang::Type::BlockPointer:
4814 return lldb::eFormatHex;
4815 case clang::Type::Pointer:
4816 return lldb::eFormatHex;
4817 case clang::Type::LValueReference:
4818 case clang::Type::RValueReference:
4819 return lldb::eFormatHex;
4820 case clang::Type::MemberPointer:
4821 break;
4822 case clang::Type::Complex: {
4823 if (qual_type->isComplexType())
4824 return lldb::eFormatComplex;
4825 else
4826 return lldb::eFormatComplexInteger;
4827 }
4828 case clang::Type::ObjCInterface:
4829 break;
4830 case clang::Type::Record:
4831 break;
4832 case clang::Type::Enum:
4833 return lldb::eFormatEnum;
4834 case clang::Type::DependentSizedArray:
4835 case clang::Type::DependentSizedExtVector:
4836 case clang::Type::UnresolvedUsing:
4837 case clang::Type::Attributed:
4838 case clang::Type::TemplateTypeParm:
4839 case clang::Type::SubstTemplateTypeParm:
4840 case clang::Type::SubstTemplateTypeParmPack:
4841 case clang::Type::InjectedClassName:
4842 case clang::Type::DependentName:
4843 case clang::Type::DependentTemplateSpecialization:
4844 case clang::Type::PackExpansion:
4845 case clang::Type::ObjCObject:
4846
4847 case clang::Type::TemplateSpecialization:
4848 case clang::Type::DeducedTemplateSpecialization:
4849 case clang::Type::Adjusted:
4850 case clang::Type::Pipe:
4851 break;
4852
4853 // pointer type decayed from an array or function type.
4854 case clang::Type::Decayed:
4855 break;
4856 case clang::Type::ObjCTypeParam:
4857 break;
4858
4859 case clang::Type::DependentAddressSpace:
4860 break;
4861 case clang::Type::MacroQualified:
4862 break;
4863 }
4864 // We don't know hot to display this type...
4865 return lldb::eFormatBytes;
4866 }
4867
ObjCDeclHasIVars(clang::ObjCInterfaceDecl * class_interface_decl,bool check_superclass)4868 static bool ObjCDeclHasIVars(clang::ObjCInterfaceDecl *class_interface_decl,
4869 bool check_superclass) {
4870 while (class_interface_decl) {
4871 if (class_interface_decl->ivar_size() > 0)
4872 return true;
4873
4874 if (check_superclass)
4875 class_interface_decl = class_interface_decl->getSuperClass();
4876 else
4877 break;
4878 }
4879 return false;
4880 }
4881
4882 static Optional<SymbolFile::ArrayInfo>
GetDynamicArrayInfo(ClangASTContext & ast,SymbolFile * sym_file,clang::QualType qual_type,const ExecutionContext * exe_ctx)4883 GetDynamicArrayInfo(ClangASTContext &ast, SymbolFile *sym_file,
4884 clang::QualType qual_type,
4885 const ExecutionContext *exe_ctx) {
4886 if (qual_type->isIncompleteArrayType())
4887 if (auto *metadata = ast.GetMetadata(qual_type.getTypePtr()))
4888 return sym_file->GetDynamicArrayInfoForUID(metadata->GetUserID(),
4889 exe_ctx);
4890 return llvm::None;
4891 }
4892
GetNumChildren(lldb::opaque_compiler_type_t type,bool omit_empty_base_classes,const ExecutionContext * exe_ctx)4893 uint32_t ClangASTContext::GetNumChildren(lldb::opaque_compiler_type_t type,
4894 bool omit_empty_base_classes,
4895 const ExecutionContext *exe_ctx) {
4896 if (!type)
4897 return 0;
4898
4899 uint32_t num_children = 0;
4900 clang::QualType qual_type(RemoveWrappingTypes(GetQualType(type)));
4901 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4902 switch (type_class) {
4903 case clang::Type::Builtin:
4904 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
4905 case clang::BuiltinType::ObjCId: // child is Class
4906 case clang::BuiltinType::ObjCClass: // child is Class
4907 num_children = 1;
4908 break;
4909
4910 default:
4911 break;
4912 }
4913 break;
4914
4915 case clang::Type::Complex:
4916 return 0;
4917 case clang::Type::Record:
4918 if (GetCompleteQualType(&getASTContext(), qual_type)) {
4919 const clang::RecordType *record_type =
4920 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4921 const clang::RecordDecl *record_decl = record_type->getDecl();
4922 assert(record_decl);
4923 const clang::CXXRecordDecl *cxx_record_decl =
4924 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4925 if (cxx_record_decl) {
4926 if (omit_empty_base_classes) {
4927 // Check each base classes to see if it or any of its base classes
4928 // contain any fields. This can help limit the noise in variable
4929 // views by not having to show base classes that contain no members.
4930 clang::CXXRecordDecl::base_class_const_iterator base_class,
4931 base_class_end;
4932 for (base_class = cxx_record_decl->bases_begin(),
4933 base_class_end = cxx_record_decl->bases_end();
4934 base_class != base_class_end; ++base_class) {
4935 const clang::CXXRecordDecl *base_class_decl =
4936 llvm::cast<clang::CXXRecordDecl>(
4937 base_class->getType()
4938 ->getAs<clang::RecordType>()
4939 ->getDecl());
4940
4941 // Skip empty base classes
4942 if (!ClangASTContext::RecordHasFields(base_class_decl))
4943 continue;
4944
4945 num_children++;
4946 }
4947 } else {
4948 // Include all base classes
4949 num_children += cxx_record_decl->getNumBases();
4950 }
4951 }
4952 clang::RecordDecl::field_iterator field, field_end;
4953 for (field = record_decl->field_begin(),
4954 field_end = record_decl->field_end();
4955 field != field_end; ++field)
4956 ++num_children;
4957 }
4958 break;
4959
4960 case clang::Type::ObjCObject:
4961 case clang::Type::ObjCInterface:
4962 if (GetCompleteQualType(&getASTContext(), qual_type)) {
4963 const clang::ObjCObjectType *objc_class_type =
4964 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4965 assert(objc_class_type);
4966 if (objc_class_type) {
4967 clang::ObjCInterfaceDecl *class_interface_decl =
4968 objc_class_type->getInterface();
4969
4970 if (class_interface_decl) {
4971
4972 clang::ObjCInterfaceDecl *superclass_interface_decl =
4973 class_interface_decl->getSuperClass();
4974 if (superclass_interface_decl) {
4975 if (omit_empty_base_classes) {
4976 if (ObjCDeclHasIVars(superclass_interface_decl, true))
4977 ++num_children;
4978 } else
4979 ++num_children;
4980 }
4981
4982 num_children += class_interface_decl->ivar_size();
4983 }
4984 }
4985 }
4986 break;
4987
4988 case clang::Type::ObjCObjectPointer: {
4989 const clang::ObjCObjectPointerType *pointer_type =
4990 llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4991 clang::QualType pointee_type = pointer_type->getPointeeType();
4992 uint32_t num_pointee_children =
4993 GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
4994 // If this type points to a simple type, then it has 1 child
4995 if (num_pointee_children == 0)
4996 num_children = 1;
4997 else
4998 num_children = num_pointee_children;
4999 } break;
5000
5001 case clang::Type::Vector:
5002 case clang::Type::ExtVector:
5003 num_children =
5004 llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5005 break;
5006
5007 case clang::Type::ConstantArray:
5008 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())
5009 ->getSize()
5010 .getLimitedValue();
5011 break;
5012 case clang::Type::IncompleteArray:
5013 if (auto array_info =
5014 GetDynamicArrayInfo(*this, GetSymbolFile(), qual_type, exe_ctx))
5015 // Only 1-dimensional arrays are supported.
5016 num_children = array_info->element_orders.size()
5017 ? array_info->element_orders.back()
5018 : 0;
5019 break;
5020
5021 case clang::Type::Pointer: {
5022 const clang::PointerType *pointer_type =
5023 llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5024 clang::QualType pointee_type(pointer_type->getPointeeType());
5025 uint32_t num_pointee_children =
5026 GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
5027 if (num_pointee_children == 0) {
5028 // We have a pointer to a pointee type that claims it has no children. We
5029 // will want to look at
5030 num_children = GetNumPointeeChildren(pointee_type);
5031 } else
5032 num_children = num_pointee_children;
5033 } break;
5034
5035 case clang::Type::LValueReference:
5036 case clang::Type::RValueReference: {
5037 const clang::ReferenceType *reference_type =
5038 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5039 clang::QualType pointee_type = reference_type->getPointeeType();
5040 uint32_t num_pointee_children =
5041 GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
5042 // If this type points to a simple type, then it has 1 child
5043 if (num_pointee_children == 0)
5044 num_children = 1;
5045 else
5046 num_children = num_pointee_children;
5047 } break;
5048
5049 default:
5050 break;
5051 }
5052 return num_children;
5053 }
5054
GetBuiltinTypeByName(ConstString name)5055 CompilerType ClangASTContext::GetBuiltinTypeByName(ConstString name) {
5056 return GetBasicType(GetBasicTypeEnumeration(name));
5057 }
5058
5059 lldb::BasicType
GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type)5060 ClangASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
5061 if (type) {
5062 clang::QualType qual_type(GetQualType(type));
5063 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5064 if (type_class == clang::Type::Builtin) {
5065 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
5066 case clang::BuiltinType::Void:
5067 return eBasicTypeVoid;
5068 case clang::BuiltinType::Bool:
5069 return eBasicTypeBool;
5070 case clang::BuiltinType::Char_S:
5071 return eBasicTypeSignedChar;
5072 case clang::BuiltinType::Char_U:
5073 return eBasicTypeUnsignedChar;
5074 case clang::BuiltinType::Char16:
5075 return eBasicTypeChar16;
5076 case clang::BuiltinType::Char32:
5077 return eBasicTypeChar32;
5078 case clang::BuiltinType::UChar:
5079 return eBasicTypeUnsignedChar;
5080 case clang::BuiltinType::SChar:
5081 return eBasicTypeSignedChar;
5082 case clang::BuiltinType::WChar_S:
5083 return eBasicTypeSignedWChar;
5084 case clang::BuiltinType::WChar_U:
5085 return eBasicTypeUnsignedWChar;
5086 case clang::BuiltinType::Short:
5087 return eBasicTypeShort;
5088 case clang::BuiltinType::UShort:
5089 return eBasicTypeUnsignedShort;
5090 case clang::BuiltinType::Int:
5091 return eBasicTypeInt;
5092 case clang::BuiltinType::UInt:
5093 return eBasicTypeUnsignedInt;
5094 case clang::BuiltinType::Long:
5095 return eBasicTypeLong;
5096 case clang::BuiltinType::ULong:
5097 return eBasicTypeUnsignedLong;
5098 case clang::BuiltinType::LongLong:
5099 return eBasicTypeLongLong;
5100 case clang::BuiltinType::ULongLong:
5101 return eBasicTypeUnsignedLongLong;
5102 case clang::BuiltinType::Int128:
5103 return eBasicTypeInt128;
5104 case clang::BuiltinType::UInt128:
5105 return eBasicTypeUnsignedInt128;
5106
5107 case clang::BuiltinType::Half:
5108 return eBasicTypeHalf;
5109 case clang::BuiltinType::Float:
5110 return eBasicTypeFloat;
5111 case clang::BuiltinType::Double:
5112 return eBasicTypeDouble;
5113 case clang::BuiltinType::LongDouble:
5114 return eBasicTypeLongDouble;
5115
5116 case clang::BuiltinType::NullPtr:
5117 return eBasicTypeNullPtr;
5118 case clang::BuiltinType::ObjCId:
5119 return eBasicTypeObjCID;
5120 case clang::BuiltinType::ObjCClass:
5121 return eBasicTypeObjCClass;
5122 case clang::BuiltinType::ObjCSel:
5123 return eBasicTypeObjCSel;
5124 default:
5125 return eBasicTypeOther;
5126 }
5127 }
5128 }
5129 return eBasicTypeInvalid;
5130 }
5131
ForEachEnumerator(lldb::opaque_compiler_type_t type,std::function<bool (const CompilerType & integer_type,ConstString name,const llvm::APSInt & value)> const & callback)5132 void ClangASTContext::ForEachEnumerator(
5133 lldb::opaque_compiler_type_t type,
5134 std::function<bool(const CompilerType &integer_type,
5135 ConstString name,
5136 const llvm::APSInt &value)> const &callback) {
5137 const clang::EnumType *enum_type =
5138 llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5139 if (enum_type) {
5140 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5141 if (enum_decl) {
5142 CompilerType integer_type = GetType(enum_decl->getIntegerType());
5143
5144 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5145 for (enum_pos = enum_decl->enumerator_begin(),
5146 enum_end_pos = enum_decl->enumerator_end();
5147 enum_pos != enum_end_pos; ++enum_pos) {
5148 ConstString name(enum_pos->getNameAsString().c_str());
5149 if (!callback(integer_type, name, enum_pos->getInitVal()))
5150 break;
5151 }
5152 }
5153 }
5154 }
5155
5156 #pragma mark Aggregate Types
5157
GetNumFields(lldb::opaque_compiler_type_t type)5158 uint32_t ClangASTContext::GetNumFields(lldb::opaque_compiler_type_t type) {
5159 if (!type)
5160 return 0;
5161
5162 uint32_t count = 0;
5163 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
5164 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5165 switch (type_class) {
5166 case clang::Type::Record:
5167 if (GetCompleteType(type)) {
5168 const clang::RecordType *record_type =
5169 llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5170 if (record_type) {
5171 clang::RecordDecl *record_decl = record_type->getDecl();
5172 if (record_decl) {
5173 uint32_t field_idx = 0;
5174 clang::RecordDecl::field_iterator field, field_end;
5175 for (field = record_decl->field_begin(),
5176 field_end = record_decl->field_end();
5177 field != field_end; ++field)
5178 ++field_idx;
5179 count = field_idx;
5180 }
5181 }
5182 }
5183 break;
5184
5185 case clang::Type::ObjCObjectPointer: {
5186 const clang::ObjCObjectPointerType *objc_class_type =
5187 qual_type->getAs<clang::ObjCObjectPointerType>();
5188 const clang::ObjCInterfaceType *objc_interface_type =
5189 objc_class_type->getInterfaceType();
5190 if (objc_interface_type &&
5191 GetCompleteType(static_cast<lldb::opaque_compiler_type_t>(
5192 const_cast<clang::ObjCInterfaceType *>(objc_interface_type)))) {
5193 clang::ObjCInterfaceDecl *class_interface_decl =
5194 objc_interface_type->getDecl();
5195 if (class_interface_decl) {
5196 count = class_interface_decl->ivar_size();
5197 }
5198 }
5199 break;
5200 }
5201
5202 case clang::Type::ObjCObject:
5203 case clang::Type::ObjCInterface:
5204 if (GetCompleteType(type)) {
5205 const clang::ObjCObjectType *objc_class_type =
5206 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5207 if (objc_class_type) {
5208 clang::ObjCInterfaceDecl *class_interface_decl =
5209 objc_class_type->getInterface();
5210
5211 if (class_interface_decl)
5212 count = class_interface_decl->ivar_size();
5213 }
5214 }
5215 break;
5216
5217 default:
5218 break;
5219 }
5220 return count;
5221 }
5222
5223 static lldb::opaque_compiler_type_t
GetObjCFieldAtIndex(clang::ASTContext * ast,clang::ObjCInterfaceDecl * class_interface_decl,size_t idx,std::string & name,uint64_t * bit_offset_ptr,uint32_t * bitfield_bit_size_ptr,bool * is_bitfield_ptr)5224 GetObjCFieldAtIndex(clang::ASTContext *ast,
5225 clang::ObjCInterfaceDecl *class_interface_decl, size_t idx,
5226 std::string &name, uint64_t *bit_offset_ptr,
5227 uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr) {
5228 if (class_interface_decl) {
5229 if (idx < (class_interface_decl->ivar_size())) {
5230 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos,
5231 ivar_end = class_interface_decl->ivar_end();
5232 uint32_t ivar_idx = 0;
5233
5234 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end;
5235 ++ivar_pos, ++ivar_idx) {
5236 if (ivar_idx == idx) {
5237 const clang::ObjCIvarDecl *ivar_decl = *ivar_pos;
5238
5239 clang::QualType ivar_qual_type(ivar_decl->getType());
5240
5241 name.assign(ivar_decl->getNameAsString());
5242
5243 if (bit_offset_ptr) {
5244 const clang::ASTRecordLayout &interface_layout =
5245 ast->getASTObjCInterfaceLayout(class_interface_decl);
5246 *bit_offset_ptr = interface_layout.getFieldOffset(ivar_idx);
5247 }
5248
5249 const bool is_bitfield = ivar_pos->isBitField();
5250
5251 if (bitfield_bit_size_ptr) {
5252 *bitfield_bit_size_ptr = 0;
5253
5254 if (is_bitfield && ast) {
5255 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5256 clang::Expr::EvalResult result;
5257 if (bitfield_bit_size_expr &&
5258 bitfield_bit_size_expr->EvaluateAsInt(result, *ast)) {
5259 llvm::APSInt bitfield_apsint = result.Val.getInt();
5260 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5261 }
5262 }
5263 }
5264 if (is_bitfield_ptr)
5265 *is_bitfield_ptr = is_bitfield;
5266
5267 return ivar_qual_type.getAsOpaquePtr();
5268 }
5269 }
5270 }
5271 }
5272 return nullptr;
5273 }
5274
GetFieldAtIndex(lldb::opaque_compiler_type_t type,size_t idx,std::string & name,uint64_t * bit_offset_ptr,uint32_t * bitfield_bit_size_ptr,bool * is_bitfield_ptr)5275 CompilerType ClangASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type,
5276 size_t idx, std::string &name,
5277 uint64_t *bit_offset_ptr,
5278 uint32_t *bitfield_bit_size_ptr,
5279 bool *is_bitfield_ptr) {
5280 if (!type)
5281 return CompilerType();
5282
5283 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
5284 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5285 switch (type_class) {
5286 case clang::Type::Record:
5287 if (GetCompleteType(type)) {
5288 const clang::RecordType *record_type =
5289 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5290 const clang::RecordDecl *record_decl = record_type->getDecl();
5291 uint32_t field_idx = 0;
5292 clang::RecordDecl::field_iterator field, field_end;
5293 for (field = record_decl->field_begin(),
5294 field_end = record_decl->field_end();
5295 field != field_end; ++field, ++field_idx) {
5296 if (idx == field_idx) {
5297 // Print the member type if requested
5298 // Print the member name and equal sign
5299 name.assign(field->getNameAsString());
5300
5301 // Figure out the type byte size (field_type_info.first) and
5302 // alignment (field_type_info.second) from the AST context.
5303 if (bit_offset_ptr) {
5304 const clang::ASTRecordLayout &record_layout =
5305 getASTContext().getASTRecordLayout(record_decl);
5306 *bit_offset_ptr = record_layout.getFieldOffset(field_idx);
5307 }
5308
5309 const bool is_bitfield = field->isBitField();
5310
5311 if (bitfield_bit_size_ptr) {
5312 *bitfield_bit_size_ptr = 0;
5313
5314 if (is_bitfield) {
5315 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5316 clang::Expr::EvalResult result;
5317 if (bitfield_bit_size_expr &&
5318 bitfield_bit_size_expr->EvaluateAsInt(result,
5319 getASTContext())) {
5320 llvm::APSInt bitfield_apsint = result.Val.getInt();
5321 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5322 }
5323 }
5324 }
5325 if (is_bitfield_ptr)
5326 *is_bitfield_ptr = is_bitfield;
5327
5328 return GetType(field->getType());
5329 }
5330 }
5331 }
5332 break;
5333
5334 case clang::Type::ObjCObjectPointer: {
5335 const clang::ObjCObjectPointerType *objc_class_type =
5336 qual_type->getAs<clang::ObjCObjectPointerType>();
5337 const clang::ObjCInterfaceType *objc_interface_type =
5338 objc_class_type->getInterfaceType();
5339 if (objc_interface_type &&
5340 GetCompleteType(static_cast<lldb::opaque_compiler_type_t>(
5341 const_cast<clang::ObjCInterfaceType *>(objc_interface_type)))) {
5342 clang::ObjCInterfaceDecl *class_interface_decl =
5343 objc_interface_type->getDecl();
5344 if (class_interface_decl) {
5345 return CompilerType(
5346 this, GetObjCFieldAtIndex(&getASTContext(), class_interface_decl,
5347 idx, name, bit_offset_ptr,
5348 bitfield_bit_size_ptr, is_bitfield_ptr));
5349 }
5350 }
5351 break;
5352 }
5353
5354 case clang::Type::ObjCObject:
5355 case clang::Type::ObjCInterface:
5356 if (GetCompleteType(type)) {
5357 const clang::ObjCObjectType *objc_class_type =
5358 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5359 assert(objc_class_type);
5360 if (objc_class_type) {
5361 clang::ObjCInterfaceDecl *class_interface_decl =
5362 objc_class_type->getInterface();
5363 return CompilerType(
5364 this, GetObjCFieldAtIndex(&getASTContext(), class_interface_decl,
5365 idx, name, bit_offset_ptr,
5366 bitfield_bit_size_ptr, is_bitfield_ptr));
5367 }
5368 }
5369 break;
5370
5371 default:
5372 break;
5373 }
5374 return CompilerType();
5375 }
5376
5377 uint32_t
GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type)5378 ClangASTContext::GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) {
5379 uint32_t count = 0;
5380 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
5381 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5382 switch (type_class) {
5383 case clang::Type::Record:
5384 if (GetCompleteType(type)) {
5385 const clang::CXXRecordDecl *cxx_record_decl =
5386 qual_type->getAsCXXRecordDecl();
5387 if (cxx_record_decl)
5388 count = cxx_record_decl->getNumBases();
5389 }
5390 break;
5391
5392 case clang::Type::ObjCObjectPointer:
5393 count = GetPointeeType(type).GetNumDirectBaseClasses();
5394 break;
5395
5396 case clang::Type::ObjCObject:
5397 if (GetCompleteType(type)) {
5398 const clang::ObjCObjectType *objc_class_type =
5399 qual_type->getAsObjCQualifiedInterfaceType();
5400 if (objc_class_type) {
5401 clang::ObjCInterfaceDecl *class_interface_decl =
5402 objc_class_type->getInterface();
5403
5404 if (class_interface_decl && class_interface_decl->getSuperClass())
5405 count = 1;
5406 }
5407 }
5408 break;
5409 case clang::Type::ObjCInterface:
5410 if (GetCompleteType(type)) {
5411 const clang::ObjCInterfaceType *objc_interface_type =
5412 qual_type->getAs<clang::ObjCInterfaceType>();
5413 if (objc_interface_type) {
5414 clang::ObjCInterfaceDecl *class_interface_decl =
5415 objc_interface_type->getInterface();
5416
5417 if (class_interface_decl && class_interface_decl->getSuperClass())
5418 count = 1;
5419 }
5420 }
5421 break;
5422
5423 default:
5424 break;
5425 }
5426 return count;
5427 }
5428
5429 uint32_t
GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type)5430 ClangASTContext::GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) {
5431 uint32_t count = 0;
5432 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
5433 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5434 switch (type_class) {
5435 case clang::Type::Record:
5436 if (GetCompleteType(type)) {
5437 const clang::CXXRecordDecl *cxx_record_decl =
5438 qual_type->getAsCXXRecordDecl();
5439 if (cxx_record_decl)
5440 count = cxx_record_decl->getNumVBases();
5441 }
5442 break;
5443
5444 default:
5445 break;
5446 }
5447 return count;
5448 }
5449
GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type,size_t idx,uint32_t * bit_offset_ptr)5450 CompilerType ClangASTContext::GetDirectBaseClassAtIndex(
5451 lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
5452 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
5453 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5454 switch (type_class) {
5455 case clang::Type::Record:
5456 if (GetCompleteType(type)) {
5457 const clang::CXXRecordDecl *cxx_record_decl =
5458 qual_type->getAsCXXRecordDecl();
5459 if (cxx_record_decl) {
5460 uint32_t curr_idx = 0;
5461 clang::CXXRecordDecl::base_class_const_iterator base_class,
5462 base_class_end;
5463 for (base_class = cxx_record_decl->bases_begin(),
5464 base_class_end = cxx_record_decl->bases_end();
5465 base_class != base_class_end; ++base_class, ++curr_idx) {
5466 if (curr_idx == idx) {
5467 if (bit_offset_ptr) {
5468 const clang::ASTRecordLayout &record_layout =
5469 getASTContext().getASTRecordLayout(cxx_record_decl);
5470 const clang::CXXRecordDecl *base_class_decl =
5471 llvm::cast<clang::CXXRecordDecl>(
5472 base_class->getType()
5473 ->getAs<clang::RecordType>()
5474 ->getDecl());
5475 if (base_class->isVirtual())
5476 *bit_offset_ptr =
5477 record_layout.getVBaseClassOffset(base_class_decl)
5478 .getQuantity() *
5479 8;
5480 else
5481 *bit_offset_ptr =
5482 record_layout.getBaseClassOffset(base_class_decl)
5483 .getQuantity() *
5484 8;
5485 }
5486 return GetType(base_class->getType());
5487 }
5488 }
5489 }
5490 }
5491 break;
5492
5493 case clang::Type::ObjCObjectPointer:
5494 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5495
5496 case clang::Type::ObjCObject:
5497 if (idx == 0 && GetCompleteType(type)) {
5498 const clang::ObjCObjectType *objc_class_type =
5499 qual_type->getAsObjCQualifiedInterfaceType();
5500 if (objc_class_type) {
5501 clang::ObjCInterfaceDecl *class_interface_decl =
5502 objc_class_type->getInterface();
5503
5504 if (class_interface_decl) {
5505 clang::ObjCInterfaceDecl *superclass_interface_decl =
5506 class_interface_decl->getSuperClass();
5507 if (superclass_interface_decl) {
5508 if (bit_offset_ptr)
5509 *bit_offset_ptr = 0;
5510 return GetType(getASTContext().getObjCInterfaceType(
5511 superclass_interface_decl));
5512 }
5513 }
5514 }
5515 }
5516 break;
5517 case clang::Type::ObjCInterface:
5518 if (idx == 0 && GetCompleteType(type)) {
5519 const clang::ObjCObjectType *objc_interface_type =
5520 qual_type->getAs<clang::ObjCInterfaceType>();
5521 if (objc_interface_type) {
5522 clang::ObjCInterfaceDecl *class_interface_decl =
5523 objc_interface_type->getInterface();
5524
5525 if (class_interface_decl) {
5526 clang::ObjCInterfaceDecl *superclass_interface_decl =
5527 class_interface_decl->getSuperClass();
5528 if (superclass_interface_decl) {
5529 if (bit_offset_ptr)
5530 *bit_offset_ptr = 0;
5531 return GetType(getASTContext().getObjCInterfaceType(
5532 superclass_interface_decl));
5533 }
5534 }
5535 }
5536 }
5537 break;
5538
5539 default:
5540 break;
5541 }
5542 return CompilerType();
5543 }
5544
GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type,size_t idx,uint32_t * bit_offset_ptr)5545 CompilerType ClangASTContext::GetVirtualBaseClassAtIndex(
5546 lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
5547 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
5548 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5549 switch (type_class) {
5550 case clang::Type::Record:
5551 if (GetCompleteType(type)) {
5552 const clang::CXXRecordDecl *cxx_record_decl =
5553 qual_type->getAsCXXRecordDecl();
5554 if (cxx_record_decl) {
5555 uint32_t curr_idx = 0;
5556 clang::CXXRecordDecl::base_class_const_iterator base_class,
5557 base_class_end;
5558 for (base_class = cxx_record_decl->vbases_begin(),
5559 base_class_end = cxx_record_decl->vbases_end();
5560 base_class != base_class_end; ++base_class, ++curr_idx) {
5561 if (curr_idx == idx) {
5562 if (bit_offset_ptr) {
5563 const clang::ASTRecordLayout &record_layout =
5564 getASTContext().getASTRecordLayout(cxx_record_decl);
5565 const clang::CXXRecordDecl *base_class_decl =
5566 llvm::cast<clang::CXXRecordDecl>(
5567 base_class->getType()
5568 ->getAs<clang::RecordType>()
5569 ->getDecl());
5570 *bit_offset_ptr =
5571 record_layout.getVBaseClassOffset(base_class_decl)
5572 .getQuantity() *
5573 8;
5574 }
5575 return GetType(base_class->getType());
5576 }
5577 }
5578 }
5579 }
5580 break;
5581
5582 default:
5583 break;
5584 }
5585 return CompilerType();
5586 }
5587
5588 // If a pointer to a pointee type (the clang_type arg) says that it has no
5589 // children, then we either need to trust it, or override it and return a
5590 // different result. For example, an "int *" has one child that is an integer,
5591 // but a function pointer doesn't have any children. Likewise if a Record type
5592 // claims it has no children, then there really is nothing to show.
GetNumPointeeChildren(clang::QualType type)5593 uint32_t ClangASTContext::GetNumPointeeChildren(clang::QualType type) {
5594 if (type.isNull())
5595 return 0;
5596
5597 clang::QualType qual_type = RemoveWrappingTypes(type.getCanonicalType());
5598 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5599 switch (type_class) {
5600 case clang::Type::Builtin:
5601 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
5602 case clang::BuiltinType::UnknownAny:
5603 case clang::BuiltinType::Void:
5604 case clang::BuiltinType::NullPtr:
5605 case clang::BuiltinType::OCLEvent:
5606 case clang::BuiltinType::OCLImage1dRO:
5607 case clang::BuiltinType::OCLImage1dWO:
5608 case clang::BuiltinType::OCLImage1dRW:
5609 case clang::BuiltinType::OCLImage1dArrayRO:
5610 case clang::BuiltinType::OCLImage1dArrayWO:
5611 case clang::BuiltinType::OCLImage1dArrayRW:
5612 case clang::BuiltinType::OCLImage1dBufferRO:
5613 case clang::BuiltinType::OCLImage1dBufferWO:
5614 case clang::BuiltinType::OCLImage1dBufferRW:
5615 case clang::BuiltinType::OCLImage2dRO:
5616 case clang::BuiltinType::OCLImage2dWO:
5617 case clang::BuiltinType::OCLImage2dRW:
5618 case clang::BuiltinType::OCLImage2dArrayRO:
5619 case clang::BuiltinType::OCLImage2dArrayWO:
5620 case clang::BuiltinType::OCLImage2dArrayRW:
5621 case clang::BuiltinType::OCLImage3dRO:
5622 case clang::BuiltinType::OCLImage3dWO:
5623 case clang::BuiltinType::OCLImage3dRW:
5624 case clang::BuiltinType::OCLSampler:
5625 return 0;
5626 case clang::BuiltinType::Bool:
5627 case clang::BuiltinType::Char_U:
5628 case clang::BuiltinType::UChar:
5629 case clang::BuiltinType::WChar_U:
5630 case clang::BuiltinType::Char16:
5631 case clang::BuiltinType::Char32:
5632 case clang::BuiltinType::UShort:
5633 case clang::BuiltinType::UInt:
5634 case clang::BuiltinType::ULong:
5635 case clang::BuiltinType::ULongLong:
5636 case clang::BuiltinType::UInt128:
5637 case clang::BuiltinType::Char_S:
5638 case clang::BuiltinType::SChar:
5639 case clang::BuiltinType::WChar_S:
5640 case clang::BuiltinType::Short:
5641 case clang::BuiltinType::Int:
5642 case clang::BuiltinType::Long:
5643 case clang::BuiltinType::LongLong:
5644 case clang::BuiltinType::Int128:
5645 case clang::BuiltinType::Float:
5646 case clang::BuiltinType::Double:
5647 case clang::BuiltinType::LongDouble:
5648 case clang::BuiltinType::Dependent:
5649 case clang::BuiltinType::Overload:
5650 case clang::BuiltinType::ObjCId:
5651 case clang::BuiltinType::ObjCClass:
5652 case clang::BuiltinType::ObjCSel:
5653 case clang::BuiltinType::BoundMember:
5654 case clang::BuiltinType::Half:
5655 case clang::BuiltinType::ARCUnbridgedCast:
5656 case clang::BuiltinType::PseudoObject:
5657 case clang::BuiltinType::BuiltinFn:
5658 case clang::BuiltinType::OMPArraySection:
5659 return 1;
5660 default:
5661 return 0;
5662 }
5663 break;
5664
5665 case clang::Type::Complex:
5666 return 1;
5667 case clang::Type::Pointer:
5668 return 1;
5669 case clang::Type::BlockPointer:
5670 return 0; // If block pointers don't have debug info, then no children for
5671 // them
5672 case clang::Type::LValueReference:
5673 return 1;
5674 case clang::Type::RValueReference:
5675 return 1;
5676 case clang::Type::MemberPointer:
5677 return 0;
5678 case clang::Type::ConstantArray:
5679 return 0;
5680 case clang::Type::IncompleteArray:
5681 return 0;
5682 case clang::Type::VariableArray:
5683 return 0;
5684 case clang::Type::DependentSizedArray:
5685 return 0;
5686 case clang::Type::DependentSizedExtVector:
5687 return 0;
5688 case clang::Type::Vector:
5689 return 0;
5690 case clang::Type::ExtVector:
5691 return 0;
5692 case clang::Type::FunctionProto:
5693 return 0; // When we function pointers, they have no children...
5694 case clang::Type::FunctionNoProto:
5695 return 0; // When we function pointers, they have no children...
5696 case clang::Type::UnresolvedUsing:
5697 return 0;
5698 case clang::Type::Record:
5699 return 0;
5700 case clang::Type::Enum:
5701 return 1;
5702 case clang::Type::TemplateTypeParm:
5703 return 1;
5704 case clang::Type::SubstTemplateTypeParm:
5705 return 1;
5706 case clang::Type::TemplateSpecialization:
5707 return 1;
5708 case clang::Type::InjectedClassName:
5709 return 0;
5710 case clang::Type::DependentName:
5711 return 1;
5712 case clang::Type::DependentTemplateSpecialization:
5713 return 1;
5714 case clang::Type::ObjCObject:
5715 return 0;
5716 case clang::Type::ObjCInterface:
5717 return 0;
5718 case clang::Type::ObjCObjectPointer:
5719 return 1;
5720 default:
5721 break;
5722 }
5723 return 0;
5724 }
5725
GetChildCompilerTypeAtIndex(lldb::opaque_compiler_type_t type,ExecutionContext * exe_ctx,size_t idx,bool transparent_pointers,bool omit_empty_base_classes,bool ignore_array_bounds,std::string & child_name,uint32_t & child_byte_size,int32_t & child_byte_offset,uint32_t & child_bitfield_bit_size,uint32_t & child_bitfield_bit_offset,bool & child_is_base_class,bool & child_is_deref_of_parent,ValueObject * valobj,uint64_t & language_flags)5726 CompilerType ClangASTContext::GetChildCompilerTypeAtIndex(
5727 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
5728 bool transparent_pointers, bool omit_empty_base_classes,
5729 bool ignore_array_bounds, std::string &child_name,
5730 uint32_t &child_byte_size, int32_t &child_byte_offset,
5731 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
5732 bool &child_is_base_class, bool &child_is_deref_of_parent,
5733 ValueObject *valobj, uint64_t &language_flags) {
5734 if (!type)
5735 return CompilerType();
5736
5737 auto get_exe_scope = [&exe_ctx]() {
5738 return exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
5739 };
5740
5741 clang::QualType parent_qual_type(
5742 RemoveWrappingTypes(GetCanonicalQualType(type)));
5743 const clang::Type::TypeClass parent_type_class =
5744 parent_qual_type->getTypeClass();
5745 child_bitfield_bit_size = 0;
5746 child_bitfield_bit_offset = 0;
5747 child_is_base_class = false;
5748 language_flags = 0;
5749
5750 const bool idx_is_valid =
5751 idx < GetNumChildren(type, omit_empty_base_classes, exe_ctx);
5752 int32_t bit_offset;
5753 switch (parent_type_class) {
5754 case clang::Type::Builtin:
5755 if (idx_is_valid) {
5756 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind()) {
5757 case clang::BuiltinType::ObjCId:
5758 case clang::BuiltinType::ObjCClass:
5759 child_name = "isa";
5760 child_byte_size =
5761 getASTContext().getTypeSize(getASTContext().ObjCBuiltinClassTy) /
5762 CHAR_BIT;
5763 return GetType(getASTContext().ObjCBuiltinClassTy);
5764
5765 default:
5766 break;
5767 }
5768 }
5769 break;
5770
5771 case clang::Type::Record:
5772 if (idx_is_valid && GetCompleteType(type)) {
5773 const clang::RecordType *record_type =
5774 llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5775 const clang::RecordDecl *record_decl = record_type->getDecl();
5776 assert(record_decl);
5777 const clang::ASTRecordLayout &record_layout =
5778 getASTContext().getASTRecordLayout(record_decl);
5779 uint32_t child_idx = 0;
5780
5781 const clang::CXXRecordDecl *cxx_record_decl =
5782 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5783 if (cxx_record_decl) {
5784 // We might have base classes to print out first
5785 clang::CXXRecordDecl::base_class_const_iterator base_class,
5786 base_class_end;
5787 for (base_class = cxx_record_decl->bases_begin(),
5788 base_class_end = cxx_record_decl->bases_end();
5789 base_class != base_class_end; ++base_class) {
5790 const clang::CXXRecordDecl *base_class_decl = nullptr;
5791
5792 // Skip empty base classes
5793 if (omit_empty_base_classes) {
5794 base_class_decl = llvm::cast<clang::CXXRecordDecl>(
5795 base_class->getType()->getAs<clang::RecordType>()->getDecl());
5796 if (!ClangASTContext::RecordHasFields(base_class_decl))
5797 continue;
5798 }
5799
5800 if (idx == child_idx) {
5801 if (base_class_decl == nullptr)
5802 base_class_decl = llvm::cast<clang::CXXRecordDecl>(
5803 base_class->getType()->getAs<clang::RecordType>()->getDecl());
5804
5805 if (base_class->isVirtual()) {
5806 bool handled = false;
5807 if (valobj) {
5808 clang::VTableContextBase *vtable_ctx =
5809 getASTContext().getVTableContext();
5810 if (vtable_ctx)
5811 handled = GetVBaseBitOffset(*vtable_ctx, *valobj,
5812 record_layout, cxx_record_decl,
5813 base_class_decl, bit_offset);
5814 }
5815 if (!handled)
5816 bit_offset = record_layout.getVBaseClassOffset(base_class_decl)
5817 .getQuantity() *
5818 8;
5819 } else
5820 bit_offset = record_layout.getBaseClassOffset(base_class_decl)
5821 .getQuantity() *
5822 8;
5823
5824 // Base classes should be a multiple of 8 bits in size
5825 child_byte_offset = bit_offset / 8;
5826 CompilerType base_class_clang_type = GetType(base_class->getType());
5827 child_name = base_class_clang_type.GetTypeName().AsCString("");
5828 Optional<uint64_t> size =
5829 base_class_clang_type.GetBitSize(get_exe_scope());
5830 if (!size)
5831 return {};
5832 uint64_t base_class_clang_type_bit_size = *size;
5833
5834 // Base classes bit sizes should be a multiple of 8 bits in size
5835 assert(base_class_clang_type_bit_size % 8 == 0);
5836 child_byte_size = base_class_clang_type_bit_size / 8;
5837 child_is_base_class = true;
5838 return base_class_clang_type;
5839 }
5840 // We don't increment the child index in the for loop since we might
5841 // be skipping empty base classes
5842 ++child_idx;
5843 }
5844 }
5845 // Make sure index is in range...
5846 uint32_t field_idx = 0;
5847 clang::RecordDecl::field_iterator field, field_end;
5848 for (field = record_decl->field_begin(),
5849 field_end = record_decl->field_end();
5850 field != field_end; ++field, ++field_idx, ++child_idx) {
5851 if (idx == child_idx) {
5852 // Print the member type if requested
5853 // Print the member name and equal sign
5854 child_name.assign(field->getNameAsString());
5855
5856 // Figure out the type byte size (field_type_info.first) and
5857 // alignment (field_type_info.second) from the AST context.
5858 CompilerType field_clang_type = GetType(field->getType());
5859 assert(field_idx < record_layout.getFieldCount());
5860 Optional<uint64_t> size =
5861 field_clang_type.GetByteSize(get_exe_scope());
5862 if (!size)
5863 return {};
5864 child_byte_size = *size;
5865 const uint32_t child_bit_size = child_byte_size * 8;
5866
5867 // Figure out the field offset within the current struct/union/class
5868 // type
5869 bit_offset = record_layout.getFieldOffset(field_idx);
5870 if (FieldIsBitfield(*field, child_bitfield_bit_size)) {
5871 child_bitfield_bit_offset = bit_offset % child_bit_size;
5872 const uint32_t child_bit_offset =
5873 bit_offset - child_bitfield_bit_offset;
5874 child_byte_offset = child_bit_offset / 8;
5875 } else {
5876 child_byte_offset = bit_offset / 8;
5877 }
5878
5879 return field_clang_type;
5880 }
5881 }
5882 }
5883 break;
5884
5885 case clang::Type::ObjCObject:
5886 case clang::Type::ObjCInterface:
5887 if (idx_is_valid && GetCompleteType(type)) {
5888 const clang::ObjCObjectType *objc_class_type =
5889 llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5890 assert(objc_class_type);
5891 if (objc_class_type) {
5892 uint32_t child_idx = 0;
5893 clang::ObjCInterfaceDecl *class_interface_decl =
5894 objc_class_type->getInterface();
5895
5896 if (class_interface_decl) {
5897
5898 const clang::ASTRecordLayout &interface_layout =
5899 getASTContext().getASTObjCInterfaceLayout(class_interface_decl);
5900 clang::ObjCInterfaceDecl *superclass_interface_decl =
5901 class_interface_decl->getSuperClass();
5902 if (superclass_interface_decl) {
5903 if (omit_empty_base_classes) {
5904 CompilerType base_class_clang_type =
5905 GetType(getASTContext().getObjCInterfaceType(
5906 superclass_interface_decl));
5907 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes,
5908 exe_ctx) > 0) {
5909 if (idx == 0) {
5910 clang::QualType ivar_qual_type(
5911 getASTContext().getObjCInterfaceType(
5912 superclass_interface_decl));
5913
5914 child_name.assign(
5915 superclass_interface_decl->getNameAsString());
5916
5917 clang::TypeInfo ivar_type_info =
5918 getASTContext().getTypeInfo(ivar_qual_type.getTypePtr());
5919
5920 child_byte_size = ivar_type_info.Width / 8;
5921 child_byte_offset = 0;
5922 child_is_base_class = true;
5923
5924 return GetType(ivar_qual_type);
5925 }
5926
5927 ++child_idx;
5928 }
5929 } else
5930 ++child_idx;
5931 }
5932
5933 const uint32_t superclass_idx = child_idx;
5934
5935 if (idx < (child_idx + class_interface_decl->ivar_size())) {
5936 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos,
5937 ivar_end = class_interface_decl->ivar_end();
5938
5939 for (ivar_pos = class_interface_decl->ivar_begin();
5940 ivar_pos != ivar_end; ++ivar_pos) {
5941 if (child_idx == idx) {
5942 clang::ObjCIvarDecl *ivar_decl = *ivar_pos;
5943
5944 clang::QualType ivar_qual_type(ivar_decl->getType());
5945
5946 child_name.assign(ivar_decl->getNameAsString());
5947
5948 clang::TypeInfo ivar_type_info =
5949 getASTContext().getTypeInfo(ivar_qual_type.getTypePtr());
5950
5951 child_byte_size = ivar_type_info.Width / 8;
5952
5953 // Figure out the field offset within the current
5954 // struct/union/class type For ObjC objects, we can't trust the
5955 // bit offset we get from the Clang AST, since that doesn't
5956 // account for the space taken up by unbacked properties, or
5957 // from the changing size of base classes that are newer than
5958 // this class. So if we have a process around that we can ask
5959 // about this object, do so.
5960 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5961 Process *process = nullptr;
5962 if (exe_ctx)
5963 process = exe_ctx->GetProcessPtr();
5964 if (process) {
5965 ObjCLanguageRuntime *objc_runtime =
5966 ObjCLanguageRuntime::Get(*process);
5967 if (objc_runtime != nullptr) {
5968 CompilerType parent_ast_type = GetType(parent_qual_type);
5969 child_byte_offset = objc_runtime->GetByteOffsetForIvar(
5970 parent_ast_type, ivar_decl->getNameAsString().c_str());
5971 }
5972 }
5973
5974 // Setting this to INT32_MAX to make sure we don't compute it
5975 // twice...
5976 bit_offset = INT32_MAX;
5977
5978 if (child_byte_offset ==
5979 static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET)) {
5980 bit_offset = interface_layout.getFieldOffset(child_idx -
5981 superclass_idx);
5982 child_byte_offset = bit_offset / 8;
5983 }
5984
5985 // Note, the ObjC Ivar Byte offset is just that, it doesn't
5986 // account for the bit offset of a bitfield within its
5987 // containing object. So regardless of where we get the byte
5988 // offset from, we still need to get the bit offset for
5989 // bitfields from the layout.
5990
5991 if (FieldIsBitfield(ivar_decl, child_bitfield_bit_size)) {
5992 if (bit_offset == INT32_MAX)
5993 bit_offset = interface_layout.getFieldOffset(
5994 child_idx - superclass_idx);
5995
5996 child_bitfield_bit_offset = bit_offset % 8;
5997 }
5998 return GetType(ivar_qual_type);
5999 }
6000 ++child_idx;
6001 }
6002 }
6003 }
6004 }
6005 }
6006 break;
6007
6008 case clang::Type::ObjCObjectPointer:
6009 if (idx_is_valid) {
6010 CompilerType pointee_clang_type(GetPointeeType(type));
6011
6012 if (transparent_pointers && pointee_clang_type.IsAggregateType()) {
6013 child_is_deref_of_parent = false;
6014 bool tmp_child_is_deref_of_parent = false;
6015 return pointee_clang_type.GetChildCompilerTypeAtIndex(
6016 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
6017 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
6018 child_bitfield_bit_size, child_bitfield_bit_offset,
6019 child_is_base_class, tmp_child_is_deref_of_parent, valobj,
6020 language_flags);
6021 } else {
6022 child_is_deref_of_parent = true;
6023 const char *parent_name =
6024 valobj ? valobj->GetName().GetCString() : nullptr;
6025 if (parent_name) {
6026 child_name.assign(1, '*');
6027 child_name += parent_name;
6028 }
6029
6030 // We have a pointer to an simple type
6031 if (idx == 0 && pointee_clang_type.GetCompleteType()) {
6032 if (Optional<uint64_t> size =
6033 pointee_clang_type.GetByteSize(get_exe_scope())) {
6034 child_byte_size = *size;
6035 child_byte_offset = 0;
6036 return pointee_clang_type;
6037 }
6038 }
6039 }
6040 }
6041 break;
6042
6043 case clang::Type::Vector:
6044 case clang::Type::ExtVector:
6045 if (idx_is_valid) {
6046 const clang::VectorType *array =
6047 llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6048 if (array) {
6049 CompilerType element_type = GetType(array->getElementType());
6050 if (element_type.GetCompleteType()) {
6051 char element_name[64];
6052 ::snprintf(element_name, sizeof(element_name), "[%" PRIu64 "]",
6053 static_cast<uint64_t>(idx));
6054 child_name.assign(element_name);
6055 if (Optional<uint64_t> size =
6056 element_type.GetByteSize(get_exe_scope())) {
6057 child_byte_size = *size;
6058 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6059 return element_type;
6060 }
6061 }
6062 }
6063 }
6064 break;
6065
6066 case clang::Type::ConstantArray:
6067 case clang::Type::IncompleteArray:
6068 if (ignore_array_bounds || idx_is_valid) {
6069 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6070 if (array) {
6071 CompilerType element_type = GetType(array->getElementType());
6072 if (element_type.GetCompleteType()) {
6073 child_name = llvm::formatv("[{0}]", idx);
6074 if (Optional<uint64_t> size =
6075 element_type.GetByteSize(get_exe_scope())) {
6076 child_byte_size = *size;
6077 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6078 return element_type;
6079 }
6080 }
6081 }
6082 }
6083 break;
6084
6085 case clang::Type::Pointer: {
6086 CompilerType pointee_clang_type(GetPointeeType(type));
6087
6088 // Don't dereference "void *" pointers
6089 if (pointee_clang_type.IsVoidType())
6090 return CompilerType();
6091
6092 if (transparent_pointers && pointee_clang_type.IsAggregateType()) {
6093 child_is_deref_of_parent = false;
6094 bool tmp_child_is_deref_of_parent = false;
6095 return pointee_clang_type.GetChildCompilerTypeAtIndex(
6096 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
6097 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
6098 child_bitfield_bit_size, child_bitfield_bit_offset,
6099 child_is_base_class, tmp_child_is_deref_of_parent, valobj,
6100 language_flags);
6101 } else {
6102 child_is_deref_of_parent = true;
6103
6104 const char *parent_name =
6105 valobj ? valobj->GetName().GetCString() : nullptr;
6106 if (parent_name) {
6107 child_name.assign(1, '*');
6108 child_name += parent_name;
6109 }
6110
6111 // We have a pointer to an simple type
6112 if (idx == 0) {
6113 if (Optional<uint64_t> size =
6114 pointee_clang_type.GetByteSize(get_exe_scope())) {
6115 child_byte_size = *size;
6116 child_byte_offset = 0;
6117 return pointee_clang_type;
6118 }
6119 }
6120 }
6121 break;
6122 }
6123
6124 case clang::Type::LValueReference:
6125 case clang::Type::RValueReference:
6126 if (idx_is_valid) {
6127 const clang::ReferenceType *reference_type =
6128 llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
6129 CompilerType pointee_clang_type =
6130 GetType(reference_type->getPointeeType());
6131 if (transparent_pointers && pointee_clang_type.IsAggregateType()) {
6132 child_is_deref_of_parent = false;
6133 bool tmp_child_is_deref_of_parent = false;
6134 return pointee_clang_type.GetChildCompilerTypeAtIndex(
6135 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
6136 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
6137 child_bitfield_bit_size, child_bitfield_bit_offset,
6138 child_is_base_class, tmp_child_is_deref_of_parent, valobj,
6139 language_flags);
6140 } else {
6141 const char *parent_name =
6142 valobj ? valobj->GetName().GetCString() : nullptr;
6143 if (parent_name) {
6144 child_name.assign(1, '&');
6145 child_name += parent_name;
6146 }
6147
6148 // We have a pointer to an simple type
6149 if (idx == 0) {
6150 if (Optional<uint64_t> size =
6151 pointee_clang_type.GetByteSize(get_exe_scope())) {
6152 child_byte_size = *size;
6153 child_byte_offset = 0;
6154 return pointee_clang_type;
6155 }
6156 }
6157 }
6158 }
6159 break;
6160
6161 default:
6162 break;
6163 }
6164 return CompilerType();
6165 }
6166
GetIndexForRecordBase(const clang::RecordDecl * record_decl,const clang::CXXBaseSpecifier * base_spec,bool omit_empty_base_classes)6167 static uint32_t GetIndexForRecordBase(const clang::RecordDecl *record_decl,
6168 const clang::CXXBaseSpecifier *base_spec,
6169 bool omit_empty_base_classes) {
6170 uint32_t child_idx = 0;
6171
6172 const clang::CXXRecordDecl *cxx_record_decl =
6173 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6174
6175 // const char *super_name = record_decl->getNameAsCString();
6176 // const char *base_name =
6177 // base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6178 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6179 //
6180 if (cxx_record_decl) {
6181 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6182 for (base_class = cxx_record_decl->bases_begin(),
6183 base_class_end = cxx_record_decl->bases_end();
6184 base_class != base_class_end; ++base_class) {
6185 if (omit_empty_base_classes) {
6186 if (BaseSpecifierIsEmpty(base_class))
6187 continue;
6188 }
6189
6190 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
6191 // super_name, base_name,
6192 // child_idx,
6193 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6194 //
6195 //
6196 if (base_class == base_spec)
6197 return child_idx;
6198 ++child_idx;
6199 }
6200 }
6201
6202 return UINT32_MAX;
6203 }
6204
GetIndexForRecordChild(const clang::RecordDecl * record_decl,clang::NamedDecl * canonical_decl,bool omit_empty_base_classes)6205 static uint32_t GetIndexForRecordChild(const clang::RecordDecl *record_decl,
6206 clang::NamedDecl *canonical_decl,
6207 bool omit_empty_base_classes) {
6208 uint32_t child_idx = ClangASTContext::GetNumBaseClasses(
6209 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6210 omit_empty_base_classes);
6211
6212 clang::RecordDecl::field_iterator field, field_end;
6213 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6214 field != field_end; ++field, ++child_idx) {
6215 if (field->getCanonicalDecl() == canonical_decl)
6216 return child_idx;
6217 }
6218
6219 return UINT32_MAX;
6220 }
6221
6222 // Look for a child member (doesn't include base classes, but it does include
6223 // their members) in the type hierarchy. Returns an index path into
6224 // "clang_type" on how to reach the appropriate member.
6225 //
6226 // class A
6227 // {
6228 // public:
6229 // int m_a;
6230 // int m_b;
6231 // };
6232 //
6233 // class B
6234 // {
6235 // };
6236 //
6237 // class C :
6238 // public B,
6239 // public A
6240 // {
6241 // };
6242 //
6243 // If we have a clang type that describes "class C", and we wanted to looked
6244 // "m_b" in it:
6245 //
6246 // With omit_empty_base_classes == false we would get an integer array back
6247 // with: { 1, 1 } The first index 1 is the child index for "class A" within
6248 // class C The second index 1 is the child index for "m_b" within class A
6249 //
6250 // With omit_empty_base_classes == true we would get an integer array back
6251 // with: { 0, 1 } The first index 0 is the child index for "class A" within
6252 // class C (since class B doesn't have any members it doesn't count) The second
6253 // index 1 is the child index for "m_b" within class A
6254
GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type,const char * name,bool omit_empty_base_classes,std::vector<uint32_t> & child_indexes)6255 size_t ClangASTContext::GetIndexOfChildMemberWithName(
6256 lldb::opaque_compiler_type_t type, const char *name,
6257 bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) {
6258 if (type && name && name[0]) {
6259 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
6260 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6261 switch (type_class) {
6262 case clang::Type::Record:
6263 if (GetCompleteType(type)) {
6264 const clang::RecordType *record_type =
6265 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6266 const clang::RecordDecl *record_decl = record_type->getDecl();
6267
6268 assert(record_decl);
6269 uint32_t child_idx = 0;
6270
6271 const clang::CXXRecordDecl *cxx_record_decl =
6272 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6273
6274 // Try and find a field that matches NAME
6275 clang::RecordDecl::field_iterator field, field_end;
6276 llvm::StringRef name_sref(name);
6277 for (field = record_decl->field_begin(),
6278 field_end = record_decl->field_end();
6279 field != field_end; ++field, ++child_idx) {
6280 llvm::StringRef field_name = field->getName();
6281 if (field_name.empty()) {
6282 CompilerType field_type = GetType(field->getType());
6283 child_indexes.push_back(child_idx);
6284 if (field_type.GetIndexOfChildMemberWithName(
6285 name, omit_empty_base_classes, child_indexes))
6286 return child_indexes.size();
6287 child_indexes.pop_back();
6288
6289 } else if (field_name.equals(name_sref)) {
6290 // We have to add on the number of base classes to this index!
6291 child_indexes.push_back(
6292 child_idx + ClangASTContext::GetNumBaseClasses(
6293 cxx_record_decl, omit_empty_base_classes));
6294 return child_indexes.size();
6295 }
6296 }
6297
6298 if (cxx_record_decl) {
6299 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6300
6301 // printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6302
6303 // const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6304 // Didn't find things easily, lets let clang do its thang...
6305 clang::IdentifierInfo &ident_ref =
6306 getASTContext().Idents.get(name_sref);
6307 clang::DeclarationName decl_name(&ident_ref);
6308
6309 clang::CXXBasePaths paths;
6310 if (cxx_record_decl->lookupInBases(
6311 [decl_name](const clang::CXXBaseSpecifier *specifier,
6312 clang::CXXBasePath &path) {
6313 return clang::CXXRecordDecl::FindOrdinaryMember(
6314 specifier, path, decl_name);
6315 },
6316 paths)) {
6317 clang::CXXBasePaths::const_paths_iterator path,
6318 path_end = paths.end();
6319 for (path = paths.begin(); path != path_end; ++path) {
6320 const size_t num_path_elements = path->size();
6321 for (size_t e = 0; e < num_path_elements; ++e) {
6322 clang::CXXBasePathElement elem = (*path)[e];
6323
6324 child_idx = GetIndexForRecordBase(parent_record_decl, elem.Base,
6325 omit_empty_base_classes);
6326 if (child_idx == UINT32_MAX) {
6327 child_indexes.clear();
6328 return 0;
6329 } else {
6330 child_indexes.push_back(child_idx);
6331 parent_record_decl = llvm::cast<clang::RecordDecl>(
6332 elem.Base->getType()
6333 ->getAs<clang::RecordType>()
6334 ->getDecl());
6335 }
6336 }
6337 for (clang::NamedDecl *path_decl : path->Decls) {
6338 child_idx = GetIndexForRecordChild(
6339 parent_record_decl, path_decl, omit_empty_base_classes);
6340 if (child_idx == UINT32_MAX) {
6341 child_indexes.clear();
6342 return 0;
6343 } else {
6344 child_indexes.push_back(child_idx);
6345 }
6346 }
6347 }
6348 return child_indexes.size();
6349 }
6350 }
6351 }
6352 break;
6353
6354 case clang::Type::ObjCObject:
6355 case clang::Type::ObjCInterface:
6356 if (GetCompleteType(type)) {
6357 llvm::StringRef name_sref(name);
6358 const clang::ObjCObjectType *objc_class_type =
6359 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6360 assert(objc_class_type);
6361 if (objc_class_type) {
6362 uint32_t child_idx = 0;
6363 clang::ObjCInterfaceDecl *class_interface_decl =
6364 objc_class_type->getInterface();
6365
6366 if (class_interface_decl) {
6367 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos,
6368 ivar_end = class_interface_decl->ivar_end();
6369 clang::ObjCInterfaceDecl *superclass_interface_decl =
6370 class_interface_decl->getSuperClass();
6371
6372 for (ivar_pos = class_interface_decl->ivar_begin();
6373 ivar_pos != ivar_end; ++ivar_pos, ++child_idx) {
6374 const clang::ObjCIvarDecl *ivar_decl = *ivar_pos;
6375
6376 if (ivar_decl->getName().equals(name_sref)) {
6377 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6378 (omit_empty_base_classes &&
6379 ObjCDeclHasIVars(superclass_interface_decl, true)))
6380 ++child_idx;
6381
6382 child_indexes.push_back(child_idx);
6383 return child_indexes.size();
6384 }
6385 }
6386
6387 if (superclass_interface_decl) {
6388 // The super class index is always zero for ObjC classes, so we
6389 // push it onto the child indexes in case we find an ivar in our
6390 // superclass...
6391 child_indexes.push_back(0);
6392
6393 CompilerType superclass_clang_type =
6394 GetType(getASTContext().getObjCInterfaceType(
6395 superclass_interface_decl));
6396 if (superclass_clang_type.GetIndexOfChildMemberWithName(
6397 name, omit_empty_base_classes, child_indexes)) {
6398 // We did find an ivar in a superclass so just return the
6399 // results!
6400 return child_indexes.size();
6401 }
6402
6403 // We didn't find an ivar matching "name" in our superclass, pop
6404 // the superclass zero index that we pushed on above.
6405 child_indexes.pop_back();
6406 }
6407 }
6408 }
6409 }
6410 break;
6411
6412 case clang::Type::ObjCObjectPointer: {
6413 CompilerType objc_object_clang_type = GetType(
6414 llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())
6415 ->getPointeeType());
6416 return objc_object_clang_type.GetIndexOfChildMemberWithName(
6417 name, omit_empty_base_classes, child_indexes);
6418 } break;
6419
6420 case clang::Type::ConstantArray: {
6421 // const clang::ConstantArrayType *array =
6422 // llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6423 // const uint64_t element_count =
6424 // array->getSize().getLimitedValue();
6425 //
6426 // if (idx < element_count)
6427 // {
6428 // std::pair<uint64_t, unsigned> field_type_info =
6429 // ast->getTypeInfo(array->getElementType());
6430 //
6431 // char element_name[32];
6432 // ::snprintf (element_name, sizeof (element_name),
6433 // "%s[%u]", parent_name ? parent_name : "", idx);
6434 //
6435 // child_name.assign(element_name);
6436 // assert(field_type_info.first % 8 == 0);
6437 // child_byte_size = field_type_info.first / 8;
6438 // child_byte_offset = idx * child_byte_size;
6439 // return array->getElementType().getAsOpaquePtr();
6440 // }
6441 } break;
6442
6443 // case clang::Type::MemberPointerType:
6444 // {
6445 // MemberPointerType *mem_ptr_type =
6446 // llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6447 // clang::QualType pointee_type =
6448 // mem_ptr_type->getPointeeType();
6449 //
6450 // if (ClangASTContext::IsAggregateType
6451 // (pointee_type.getAsOpaquePtr()))
6452 // {
6453 // return GetIndexOfChildWithName (ast,
6454 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6455 // name);
6456 // }
6457 // }
6458 // break;
6459 //
6460 case clang::Type::LValueReference:
6461 case clang::Type::RValueReference: {
6462 const clang::ReferenceType *reference_type =
6463 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6464 clang::QualType pointee_type(reference_type->getPointeeType());
6465 CompilerType pointee_clang_type = GetType(pointee_type);
6466
6467 if (pointee_clang_type.IsAggregateType()) {
6468 return pointee_clang_type.GetIndexOfChildMemberWithName(
6469 name, omit_empty_base_classes, child_indexes);
6470 }
6471 } break;
6472
6473 case clang::Type::Pointer: {
6474 CompilerType pointee_clang_type(GetPointeeType(type));
6475
6476 if (pointee_clang_type.IsAggregateType()) {
6477 return pointee_clang_type.GetIndexOfChildMemberWithName(
6478 name, omit_empty_base_classes, child_indexes);
6479 }
6480 } break;
6481
6482 default:
6483 break;
6484 }
6485 }
6486 return 0;
6487 }
6488
6489 // Get the index of the child of "clang_type" whose name matches. This function
6490 // doesn't descend into the children, but only looks one level deep and name
6491 // matches can include base class names.
6492
6493 uint32_t
GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,const char * name,bool omit_empty_base_classes)6494 ClangASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
6495 const char *name,
6496 bool omit_empty_base_classes) {
6497 if (type && name && name[0]) {
6498 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
6499
6500 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6501
6502 switch (type_class) {
6503 case clang::Type::Record:
6504 if (GetCompleteType(type)) {
6505 const clang::RecordType *record_type =
6506 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6507 const clang::RecordDecl *record_decl = record_type->getDecl();
6508
6509 assert(record_decl);
6510 uint32_t child_idx = 0;
6511
6512 const clang::CXXRecordDecl *cxx_record_decl =
6513 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6514
6515 if (cxx_record_decl) {
6516 clang::CXXRecordDecl::base_class_const_iterator base_class,
6517 base_class_end;
6518 for (base_class = cxx_record_decl->bases_begin(),
6519 base_class_end = cxx_record_decl->bases_end();
6520 base_class != base_class_end; ++base_class) {
6521 // Skip empty base classes
6522 clang::CXXRecordDecl *base_class_decl =
6523 llvm::cast<clang::CXXRecordDecl>(
6524 base_class->getType()
6525 ->getAs<clang::RecordType>()
6526 ->getDecl());
6527 if (omit_empty_base_classes &&
6528 !ClangASTContext::RecordHasFields(base_class_decl))
6529 continue;
6530
6531 CompilerType base_class_clang_type = GetType(base_class->getType());
6532 std::string base_class_type_name(
6533 base_class_clang_type.GetTypeName().AsCString(""));
6534 if (base_class_type_name == name)
6535 return child_idx;
6536 ++child_idx;
6537 }
6538 }
6539
6540 // Try and find a field that matches NAME
6541 clang::RecordDecl::field_iterator field, field_end;
6542 llvm::StringRef name_sref(name);
6543 for (field = record_decl->field_begin(),
6544 field_end = record_decl->field_end();
6545 field != field_end; ++field, ++child_idx) {
6546 if (field->getName().equals(name_sref))
6547 return child_idx;
6548 }
6549 }
6550 break;
6551
6552 case clang::Type::ObjCObject:
6553 case clang::Type::ObjCInterface:
6554 if (GetCompleteType(type)) {
6555 llvm::StringRef name_sref(name);
6556 const clang::ObjCObjectType *objc_class_type =
6557 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6558 assert(objc_class_type);
6559 if (objc_class_type) {
6560 uint32_t child_idx = 0;
6561 clang::ObjCInterfaceDecl *class_interface_decl =
6562 objc_class_type->getInterface();
6563
6564 if (class_interface_decl) {
6565 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos,
6566 ivar_end = class_interface_decl->ivar_end();
6567 clang::ObjCInterfaceDecl *superclass_interface_decl =
6568 class_interface_decl->getSuperClass();
6569
6570 for (ivar_pos = class_interface_decl->ivar_begin();
6571 ivar_pos != ivar_end; ++ivar_pos, ++child_idx) {
6572 const clang::ObjCIvarDecl *ivar_decl = *ivar_pos;
6573
6574 if (ivar_decl->getName().equals(name_sref)) {
6575 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6576 (omit_empty_base_classes &&
6577 ObjCDeclHasIVars(superclass_interface_decl, true)))
6578 ++child_idx;
6579
6580 return child_idx;
6581 }
6582 }
6583
6584 if (superclass_interface_decl) {
6585 if (superclass_interface_decl->getName().equals(name_sref))
6586 return 0;
6587 }
6588 }
6589 }
6590 }
6591 break;
6592
6593 case clang::Type::ObjCObjectPointer: {
6594 CompilerType pointee_clang_type = GetType(
6595 llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())
6596 ->getPointeeType());
6597 return pointee_clang_type.GetIndexOfChildWithName(
6598 name, omit_empty_base_classes);
6599 } break;
6600
6601 case clang::Type::ConstantArray: {
6602 // const clang::ConstantArrayType *array =
6603 // llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6604 // const uint64_t element_count =
6605 // array->getSize().getLimitedValue();
6606 //
6607 // if (idx < element_count)
6608 // {
6609 // std::pair<uint64_t, unsigned> field_type_info =
6610 // ast->getTypeInfo(array->getElementType());
6611 //
6612 // char element_name[32];
6613 // ::snprintf (element_name, sizeof (element_name),
6614 // "%s[%u]", parent_name ? parent_name : "", idx);
6615 //
6616 // child_name.assign(element_name);
6617 // assert(field_type_info.first % 8 == 0);
6618 // child_byte_size = field_type_info.first / 8;
6619 // child_byte_offset = idx * child_byte_size;
6620 // return array->getElementType().getAsOpaquePtr();
6621 // }
6622 } break;
6623
6624 // case clang::Type::MemberPointerType:
6625 // {
6626 // MemberPointerType *mem_ptr_type =
6627 // llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6628 // clang::QualType pointee_type =
6629 // mem_ptr_type->getPointeeType();
6630 //
6631 // if (ClangASTContext::IsAggregateType
6632 // (pointee_type.getAsOpaquePtr()))
6633 // {
6634 // return GetIndexOfChildWithName (ast,
6635 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6636 // name);
6637 // }
6638 // }
6639 // break;
6640 //
6641 case clang::Type::LValueReference:
6642 case clang::Type::RValueReference: {
6643 const clang::ReferenceType *reference_type =
6644 llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6645 CompilerType pointee_type = GetType(reference_type->getPointeeType());
6646
6647 if (pointee_type.IsAggregateType()) {
6648 return pointee_type.GetIndexOfChildWithName(name,
6649 omit_empty_base_classes);
6650 }
6651 } break;
6652
6653 case clang::Type::Pointer: {
6654 const clang::PointerType *pointer_type =
6655 llvm::cast<clang::PointerType>(qual_type.getTypePtr());
6656 CompilerType pointee_type = GetType(pointer_type->getPointeeType());
6657
6658 if (pointee_type.IsAggregateType()) {
6659 return pointee_type.GetIndexOfChildWithName(name,
6660 omit_empty_base_classes);
6661 } else {
6662 // if (parent_name)
6663 // {
6664 // child_name.assign(1, '*');
6665 // child_name += parent_name;
6666 // }
6667 //
6668 // // We have a pointer to an simple type
6669 // if (idx == 0)
6670 // {
6671 // std::pair<uint64_t, unsigned> clang_type_info
6672 // = ast->getTypeInfo(pointee_type);
6673 // assert(clang_type_info.first % 8 == 0);
6674 // child_byte_size = clang_type_info.first / 8;
6675 // child_byte_offset = 0;
6676 // return pointee_type.getAsOpaquePtr();
6677 // }
6678 }
6679 } break;
6680
6681 default:
6682 break;
6683 }
6684 }
6685 return UINT32_MAX;
6686 }
6687
6688 size_t
GetNumTemplateArguments(lldb::opaque_compiler_type_t type)6689 ClangASTContext::GetNumTemplateArguments(lldb::opaque_compiler_type_t type) {
6690 if (!type)
6691 return 0;
6692
6693 clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
6694 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6695 switch (type_class) {
6696 case clang::Type::Record:
6697 if (GetCompleteType(type)) {
6698 const clang::CXXRecordDecl *cxx_record_decl =
6699 qual_type->getAsCXXRecordDecl();
6700 if (cxx_record_decl) {
6701 const clang::ClassTemplateSpecializationDecl *template_decl =
6702 llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(
6703 cxx_record_decl);
6704 if (template_decl)
6705 return template_decl->getTemplateArgs().size();
6706 }
6707 }
6708 break;
6709
6710 default:
6711 break;
6712 }
6713
6714 return 0;
6715 }
6716
6717 const clang::ClassTemplateSpecializationDecl *
GetAsTemplateSpecialization(lldb::opaque_compiler_type_t type)6718 ClangASTContext::GetAsTemplateSpecialization(
6719 lldb::opaque_compiler_type_t type) {
6720 if (!type)
6721 return nullptr;
6722
6723 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
6724 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6725 switch (type_class) {
6726 case clang::Type::Record: {
6727 if (! GetCompleteType(type))
6728 return nullptr;
6729 const clang::CXXRecordDecl *cxx_record_decl =
6730 qual_type->getAsCXXRecordDecl();
6731 if (!cxx_record_decl)
6732 return nullptr;
6733 return llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(
6734 cxx_record_decl);
6735 }
6736
6737 default:
6738 return nullptr;
6739 }
6740 }
6741
6742 lldb::TemplateArgumentKind
GetTemplateArgumentKind(lldb::opaque_compiler_type_t type,size_t arg_idx)6743 ClangASTContext::GetTemplateArgumentKind(lldb::opaque_compiler_type_t type,
6744 size_t arg_idx) {
6745 const clang::ClassTemplateSpecializationDecl *template_decl =
6746 GetAsTemplateSpecialization(type);
6747 if (! template_decl || arg_idx >= template_decl->getTemplateArgs().size())
6748 return eTemplateArgumentKindNull;
6749
6750 switch (template_decl->getTemplateArgs()[arg_idx].getKind()) {
6751 case clang::TemplateArgument::Null:
6752 return eTemplateArgumentKindNull;
6753
6754 case clang::TemplateArgument::NullPtr:
6755 return eTemplateArgumentKindNullPtr;
6756
6757 case clang::TemplateArgument::Type:
6758 return eTemplateArgumentKindType;
6759
6760 case clang::TemplateArgument::Declaration:
6761 return eTemplateArgumentKindDeclaration;
6762
6763 case clang::TemplateArgument::Integral:
6764 return eTemplateArgumentKindIntegral;
6765
6766 case clang::TemplateArgument::Template:
6767 return eTemplateArgumentKindTemplate;
6768
6769 case clang::TemplateArgument::TemplateExpansion:
6770 return eTemplateArgumentKindTemplateExpansion;
6771
6772 case clang::TemplateArgument::Expression:
6773 return eTemplateArgumentKindExpression;
6774
6775 case clang::TemplateArgument::Pack:
6776 return eTemplateArgumentKindPack;
6777 }
6778 llvm_unreachable("Unhandled clang::TemplateArgument::ArgKind");
6779 }
6780
6781 CompilerType
GetTypeTemplateArgument(lldb::opaque_compiler_type_t type,size_t idx)6782 ClangASTContext::GetTypeTemplateArgument(lldb::opaque_compiler_type_t type,
6783 size_t idx) {
6784 const clang::ClassTemplateSpecializationDecl *template_decl =
6785 GetAsTemplateSpecialization(type);
6786 if (!template_decl || idx >= template_decl->getTemplateArgs().size())
6787 return CompilerType();
6788
6789 const clang::TemplateArgument &template_arg =
6790 template_decl->getTemplateArgs()[idx];
6791 if (template_arg.getKind() != clang::TemplateArgument::Type)
6792 return CompilerType();
6793
6794 return GetType(template_arg.getAsType());
6795 }
6796
6797 Optional<CompilerType::IntegralTemplateArgument>
GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type,size_t idx)6798 ClangASTContext::GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type,
6799 size_t idx) {
6800 const clang::ClassTemplateSpecializationDecl *template_decl =
6801 GetAsTemplateSpecialization(type);
6802 if (! template_decl || idx >= template_decl->getTemplateArgs().size())
6803 return llvm::None;
6804
6805 const clang::TemplateArgument &template_arg =
6806 template_decl->getTemplateArgs()[idx];
6807 if (template_arg.getKind() != clang::TemplateArgument::Integral)
6808 return llvm::None;
6809
6810 return {
6811 {template_arg.getAsIntegral(), GetType(template_arg.getIntegralType())}};
6812 }
6813
GetTypeForFormatters(void * type)6814 CompilerType ClangASTContext::GetTypeForFormatters(void *type) {
6815 if (type)
6816 return ClangUtil::RemoveFastQualifiers(CompilerType(this, type));
6817 return CompilerType();
6818 }
6819
GetAsEnumDecl(const CompilerType & type)6820 clang::EnumDecl *ClangASTContext::GetAsEnumDecl(const CompilerType &type) {
6821 const clang::EnumType *enutype =
6822 llvm::dyn_cast<clang::EnumType>(ClangUtil::GetCanonicalQualType(type));
6823 if (enutype)
6824 return enutype->getDecl();
6825 return nullptr;
6826 }
6827
GetAsRecordDecl(const CompilerType & type)6828 clang::RecordDecl *ClangASTContext::GetAsRecordDecl(const CompilerType &type) {
6829 const clang::RecordType *record_type =
6830 llvm::dyn_cast<clang::RecordType>(ClangUtil::GetCanonicalQualType(type));
6831 if (record_type)
6832 return record_type->getDecl();
6833 return nullptr;
6834 }
6835
GetAsTagDecl(const CompilerType & type)6836 clang::TagDecl *ClangASTContext::GetAsTagDecl(const CompilerType &type) {
6837 return ClangUtil::GetAsTagDecl(type);
6838 }
6839
6840 clang::TypedefNameDecl *
GetAsTypedefDecl(const CompilerType & type)6841 ClangASTContext::GetAsTypedefDecl(const CompilerType &type) {
6842 const clang::TypedefType *typedef_type =
6843 llvm::dyn_cast<clang::TypedefType>(ClangUtil::GetQualType(type));
6844 if (typedef_type)
6845 return typedef_type->getDecl();
6846 return nullptr;
6847 }
6848
6849 clang::CXXRecordDecl *
GetAsCXXRecordDecl(lldb::opaque_compiler_type_t type)6850 ClangASTContext::GetAsCXXRecordDecl(lldb::opaque_compiler_type_t type) {
6851 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
6852 }
6853
6854 clang::ObjCInterfaceDecl *
GetAsObjCInterfaceDecl(const CompilerType & type)6855 ClangASTContext::GetAsObjCInterfaceDecl(const CompilerType &type) {
6856 const clang::ObjCObjectType *objc_class_type =
6857 llvm::dyn_cast<clang::ObjCObjectType>(
6858 ClangUtil::GetCanonicalQualType(type));
6859 if (objc_class_type)
6860 return objc_class_type->getInterface();
6861 return nullptr;
6862 }
6863
AddFieldToRecordType(const CompilerType & type,llvm::StringRef name,const CompilerType & field_clang_type,AccessType access,uint32_t bitfield_bit_size)6864 clang::FieldDecl *ClangASTContext::AddFieldToRecordType(
6865 const CompilerType &type, llvm::StringRef name,
6866 const CompilerType &field_clang_type, AccessType access,
6867 uint32_t bitfield_bit_size) {
6868 if (!type.IsValid() || !field_clang_type.IsValid())
6869 return nullptr;
6870 ClangASTContext *ast =
6871 llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
6872 if (!ast)
6873 return nullptr;
6874 clang::ASTContext &clang_ast = ast->getASTContext();
6875 clang::IdentifierInfo *ident = nullptr;
6876 if (!name.empty())
6877 ident = &clang_ast.Idents.get(name);
6878
6879 clang::FieldDecl *field = nullptr;
6880
6881 clang::Expr *bit_width = nullptr;
6882 if (bitfield_bit_size != 0) {
6883 llvm::APInt bitfield_bit_size_apint(clang_ast.getTypeSize(clang_ast.IntTy),
6884 bitfield_bit_size);
6885 bit_width = new (clang_ast)
6886 clang::IntegerLiteral(clang_ast, bitfield_bit_size_apint,
6887 clang_ast.IntTy, clang::SourceLocation());
6888 }
6889
6890 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
6891 if (record_decl) {
6892 field = clang::FieldDecl::Create(
6893 clang_ast, record_decl, clang::SourceLocation(),
6894 clang::SourceLocation(),
6895 ident, // Identifier
6896 ClangUtil::GetQualType(field_clang_type), // Field type
6897 nullptr, // TInfo *
6898 bit_width, // BitWidth
6899 false, // Mutable
6900 clang::ICIS_NoInit); // HasInit
6901
6902 if (name.empty()) {
6903 // Determine whether this field corresponds to an anonymous struct or
6904 // union.
6905 if (const clang::TagType *TagT =
6906 field->getType()->getAs<clang::TagType>()) {
6907 if (clang::RecordDecl *Rec =
6908 llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
6909 if (!Rec->getDeclName()) {
6910 Rec->setAnonymousStructOrUnion(true);
6911 field->setImplicit();
6912 }
6913 }
6914 }
6915
6916 if (field) {
6917 field->setAccess(
6918 ClangASTContext::ConvertAccessTypeToAccessSpecifier(access));
6919
6920 record_decl->addDecl(field);
6921
6922 #ifdef LLDB_CONFIGURATION_DEBUG
6923 VerifyDecl(field);
6924 #endif
6925 }
6926 } else {
6927 clang::ObjCInterfaceDecl *class_interface_decl =
6928 ast->GetAsObjCInterfaceDecl(type);
6929
6930 if (class_interface_decl) {
6931 const bool is_synthesized = false;
6932
6933 field_clang_type.GetCompleteType();
6934
6935 field = clang::ObjCIvarDecl::Create(
6936 clang_ast, class_interface_decl, clang::SourceLocation(),
6937 clang::SourceLocation(),
6938 ident, // Identifier
6939 ClangUtil::GetQualType(field_clang_type), // Field type
6940 nullptr, // TypeSourceInfo *
6941 ConvertAccessTypeToObjCIvarAccessControl(access), bit_width,
6942 is_synthesized);
6943
6944 if (field) {
6945 class_interface_decl->addDecl(field);
6946
6947 #ifdef LLDB_CONFIGURATION_DEBUG
6948 VerifyDecl(field);
6949 #endif
6950 }
6951 }
6952 }
6953 return field;
6954 }
6955
BuildIndirectFields(const CompilerType & type)6956 void ClangASTContext::BuildIndirectFields(const CompilerType &type) {
6957 if (!type)
6958 return;
6959
6960 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
6961 if (!ast)
6962 return;
6963
6964 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
6965
6966 if (!record_decl)
6967 return;
6968
6969 typedef llvm::SmallVector<clang::IndirectFieldDecl *, 1> IndirectFieldVector;
6970
6971 IndirectFieldVector indirect_fields;
6972 clang::RecordDecl::field_iterator field_pos;
6973 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
6974 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
6975 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos;
6976 last_field_pos = field_pos++) {
6977 if (field_pos->isAnonymousStructOrUnion()) {
6978 clang::QualType field_qual_type = field_pos->getType();
6979
6980 const clang::RecordType *field_record_type =
6981 field_qual_type->getAs<clang::RecordType>();
6982
6983 if (!field_record_type)
6984 continue;
6985
6986 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
6987
6988 if (!field_record_decl)
6989 continue;
6990
6991 for (clang::RecordDecl::decl_iterator
6992 di = field_record_decl->decls_begin(),
6993 de = field_record_decl->decls_end();
6994 di != de; ++di) {
6995 if (clang::FieldDecl *nested_field_decl =
6996 llvm::dyn_cast<clang::FieldDecl>(*di)) {
6997 clang::NamedDecl **chain =
6998 new (ast->getASTContext()) clang::NamedDecl *[2];
6999 chain[0] = *field_pos;
7000 chain[1] = nested_field_decl;
7001 clang::IndirectFieldDecl *indirect_field =
7002 clang::IndirectFieldDecl::Create(
7003 ast->getASTContext(), record_decl, clang::SourceLocation(),
7004 nested_field_decl->getIdentifier(),
7005 nested_field_decl->getType(), {chain, 2});
7006
7007 indirect_field->setImplicit();
7008
7009 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(
7010 field_pos->getAccess(), nested_field_decl->getAccess()));
7011
7012 indirect_fields.push_back(indirect_field);
7013 } else if (clang::IndirectFieldDecl *nested_indirect_field_decl =
7014 llvm::dyn_cast<clang::IndirectFieldDecl>(*di)) {
7015 size_t nested_chain_size =
7016 nested_indirect_field_decl->getChainingSize();
7017 clang::NamedDecl **chain = new (ast->getASTContext())
7018 clang::NamedDecl *[nested_chain_size + 1];
7019 chain[0] = *field_pos;
7020
7021 int chain_index = 1;
7022 for (clang::IndirectFieldDecl::chain_iterator
7023 nci = nested_indirect_field_decl->chain_begin(),
7024 nce = nested_indirect_field_decl->chain_end();
7025 nci < nce; ++nci) {
7026 chain[chain_index] = *nci;
7027 chain_index++;
7028 }
7029
7030 clang::IndirectFieldDecl *indirect_field =
7031 clang::IndirectFieldDecl::Create(
7032 ast->getASTContext(), record_decl, clang::SourceLocation(),
7033 nested_indirect_field_decl->getIdentifier(),
7034 nested_indirect_field_decl->getType(),
7035 {chain, nested_chain_size + 1});
7036
7037 indirect_field->setImplicit();
7038
7039 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(
7040 field_pos->getAccess(), nested_indirect_field_decl->getAccess()));
7041
7042 indirect_fields.push_back(indirect_field);
7043 }
7044 }
7045 }
7046 }
7047
7048 // Check the last field to see if it has an incomplete array type as its last
7049 // member and if it does, the tell the record decl about it
7050 if (last_field_pos != field_end_pos) {
7051 if (last_field_pos->getType()->isIncompleteArrayType())
7052 record_decl->hasFlexibleArrayMember();
7053 }
7054
7055 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(),
7056 ife = indirect_fields.end();
7057 ifi < ife; ++ifi) {
7058 record_decl->addDecl(*ifi);
7059 }
7060 }
7061
SetIsPacked(const CompilerType & type)7062 void ClangASTContext::SetIsPacked(const CompilerType &type) {
7063 if (type) {
7064 ClangASTContext *ast =
7065 llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7066 if (ast) {
7067 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
7068
7069 if (!record_decl)
7070 return;
7071
7072 record_decl->addAttr(
7073 clang::PackedAttr::CreateImplicit(ast->getASTContext()));
7074 }
7075 }
7076 }
7077
AddVariableToRecordType(const CompilerType & type,llvm::StringRef name,const CompilerType & var_type,AccessType access)7078 clang::VarDecl *ClangASTContext::AddVariableToRecordType(
7079 const CompilerType &type, llvm::StringRef name,
7080 const CompilerType &var_type, AccessType access) {
7081 if (!type.IsValid() || !var_type.IsValid())
7082 return nullptr;
7083
7084 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7085 if (!ast)
7086 return nullptr;
7087
7088 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7089 if (!record_decl)
7090 return nullptr;
7091
7092 clang::VarDecl *var_decl = nullptr;
7093 clang::IdentifierInfo *ident = nullptr;
7094 if (!name.empty())
7095 ident = &ast->getASTContext().Idents.get(name);
7096
7097 var_decl = clang::VarDecl::Create(
7098 ast->getASTContext(), // ASTContext &
7099 record_decl, // DeclContext *
7100 clang::SourceLocation(), // clang::SourceLocation StartLoc
7101 clang::SourceLocation(), // clang::SourceLocation IdLoc
7102 ident, // clang::IdentifierInfo *
7103 ClangUtil::GetQualType(var_type), // Variable clang::QualType
7104 nullptr, // TypeSourceInfo *
7105 clang::SC_Static); // StorageClass
7106 if (!var_decl)
7107 return nullptr;
7108
7109 var_decl->setAccess(
7110 ClangASTContext::ConvertAccessTypeToAccessSpecifier(access));
7111 record_decl->addDecl(var_decl);
7112
7113 #ifdef LLDB_CONFIGURATION_DEBUG
7114 VerifyDecl(var_decl);
7115 #endif
7116
7117 return var_decl;
7118 }
7119
AddMethodToCXXRecordType(lldb::opaque_compiler_type_t type,llvm::StringRef name,const char * mangled_name,const CompilerType & method_clang_type,lldb::AccessType access,bool is_virtual,bool is_static,bool is_inline,bool is_explicit,bool is_attr_used,bool is_artificial)7120 clang::CXXMethodDecl *ClangASTContext::AddMethodToCXXRecordType(
7121 lldb::opaque_compiler_type_t type, llvm::StringRef name,
7122 const char *mangled_name, const CompilerType &method_clang_type,
7123 lldb::AccessType access, bool is_virtual, bool is_static, bool is_inline,
7124 bool is_explicit, bool is_attr_used, bool is_artificial) {
7125 if (!type || !method_clang_type.IsValid() || name.empty())
7126 return nullptr;
7127
7128 clang::QualType record_qual_type(GetCanonicalQualType(type));
7129
7130 clang::CXXRecordDecl *cxx_record_decl =
7131 record_qual_type->getAsCXXRecordDecl();
7132
7133 if (cxx_record_decl == nullptr)
7134 return nullptr;
7135
7136 clang::QualType method_qual_type(ClangUtil::GetQualType(method_clang_type));
7137
7138 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7139
7140 clang::DeclarationName decl_name(&getASTContext().Idents.get(name));
7141
7142 const clang::FunctionType *function_type =
7143 llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7144
7145 if (function_type == nullptr)
7146 return nullptr;
7147
7148 const clang::FunctionProtoType *method_function_prototype(
7149 llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7150
7151 if (!method_function_prototype)
7152 return nullptr;
7153
7154 unsigned int num_params = method_function_prototype->getNumParams();
7155
7156 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7157 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7158
7159 if (is_artificial)
7160 return nullptr; // skip everything artificial
7161
7162 const clang::ExplicitSpecifier explicit_spec(
7163 nullptr /*expr*/, is_explicit
7164 ? clang::ExplicitSpecKind::ResolvedTrue
7165 : clang::ExplicitSpecKind::ResolvedFalse);
7166 if (name.startswith("~")) {
7167 cxx_dtor_decl = clang::CXXDestructorDecl::Create(
7168 getASTContext(), cxx_record_decl, clang::SourceLocation(),
7169 clang::DeclarationNameInfo(
7170 getASTContext().DeclarationNames.getCXXDestructorName(
7171 getASTContext().getCanonicalType(record_qual_type)),
7172 clang::SourceLocation()),
7173 method_qual_type, nullptr, is_inline, is_artificial,
7174 ConstexprSpecKind::CSK_unspecified);
7175 cxx_method_decl = cxx_dtor_decl;
7176 } else if (decl_name == cxx_record_decl->getDeclName()) {
7177 cxx_ctor_decl = clang::CXXConstructorDecl::Create(
7178 getASTContext(), cxx_record_decl, clang::SourceLocation(),
7179 clang::DeclarationNameInfo(
7180 getASTContext().DeclarationNames.getCXXConstructorName(
7181 getASTContext().getCanonicalType(record_qual_type)),
7182 clang::SourceLocation()),
7183 method_qual_type,
7184 nullptr, // TypeSourceInfo *
7185 explicit_spec, is_inline, is_artificial, CSK_unspecified);
7186 cxx_method_decl = cxx_ctor_decl;
7187 } else {
7188 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7189 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7190
7191 if (IsOperator(name, op_kind)) {
7192 if (op_kind != clang::NUM_OVERLOADED_OPERATORS) {
7193 // Check the number of operator parameters. Sometimes we have seen bad
7194 // DWARF that doesn't correctly describe operators and if we try to
7195 // create a method and add it to the class, clang will assert and
7196 // crash, so we need to make sure things are acceptable.
7197 const bool is_method = true;
7198 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount(
7199 is_method, op_kind, num_params))
7200 return nullptr;
7201 cxx_method_decl = clang::CXXMethodDecl::Create(
7202 getASTContext(), cxx_record_decl, clang::SourceLocation(),
7203 clang::DeclarationNameInfo(
7204 getASTContext().DeclarationNames.getCXXOperatorName(op_kind),
7205 clang::SourceLocation()),
7206 method_qual_type,
7207 nullptr, // TypeSourceInfo *
7208 SC, is_inline, CSK_unspecified, clang::SourceLocation());
7209 } else if (num_params == 0) {
7210 // Conversion operators don't take params...
7211 cxx_method_decl = clang::CXXConversionDecl::Create(
7212 getASTContext(), cxx_record_decl, clang::SourceLocation(),
7213 clang::DeclarationNameInfo(
7214 getASTContext().DeclarationNames.getCXXConversionFunctionName(
7215 getASTContext().getCanonicalType(
7216 function_type->getReturnType())),
7217 clang::SourceLocation()),
7218 method_qual_type,
7219 nullptr, // TypeSourceInfo *
7220 is_inline, explicit_spec, CSK_unspecified, clang::SourceLocation());
7221 }
7222 }
7223
7224 if (cxx_method_decl == nullptr) {
7225 cxx_method_decl = clang::CXXMethodDecl::Create(
7226 getASTContext(), cxx_record_decl, clang::SourceLocation(),
7227 clang::DeclarationNameInfo(decl_name, clang::SourceLocation()),
7228 method_qual_type,
7229 nullptr, // TypeSourceInfo *
7230 SC, is_inline, CSK_unspecified, clang::SourceLocation());
7231 }
7232 }
7233
7234 clang::AccessSpecifier access_specifier =
7235 ClangASTContext::ConvertAccessTypeToAccessSpecifier(access);
7236
7237 cxx_method_decl->setAccess(access_specifier);
7238 cxx_method_decl->setVirtualAsWritten(is_virtual);
7239
7240 if (is_attr_used)
7241 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(getASTContext()));
7242
7243 if (mangled_name != nullptr) {
7244 cxx_method_decl->addAttr(clang::AsmLabelAttr::CreateImplicit(
7245 getASTContext(), mangled_name, /*literal=*/false));
7246 }
7247
7248 // Populate the method decl with parameter decls
7249
7250 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7251
7252 for (unsigned param_index = 0; param_index < num_params; ++param_index) {
7253 params.push_back(clang::ParmVarDecl::Create(
7254 getASTContext(), cxx_method_decl, clang::SourceLocation(),
7255 clang::SourceLocation(),
7256 nullptr, // anonymous
7257 method_function_prototype->getParamType(param_index), nullptr,
7258 clang::SC_None, nullptr));
7259 }
7260
7261 cxx_method_decl->setParams(llvm::ArrayRef<clang::ParmVarDecl *>(params));
7262
7263 cxx_record_decl->addDecl(cxx_method_decl);
7264
7265 // Sometimes the debug info will mention a constructor (default/copy/move),
7266 // destructor, or assignment operator (copy/move) but there won't be any
7267 // version of this in the code. So we check if the function was artificially
7268 // generated and if it is trivial and this lets the compiler/backend know
7269 // that it can inline the IR for these when it needs to and we can avoid a
7270 // "missing function" error when running expressions.
7271
7272 if (is_artificial) {
7273 if (cxx_ctor_decl && ((cxx_ctor_decl->isDefaultConstructor() &&
7274 cxx_record_decl->hasTrivialDefaultConstructor()) ||
7275 (cxx_ctor_decl->isCopyConstructor() &&
7276 cxx_record_decl->hasTrivialCopyConstructor()) ||
7277 (cxx_ctor_decl->isMoveConstructor() &&
7278 cxx_record_decl->hasTrivialMoveConstructor()))) {
7279 cxx_ctor_decl->setDefaulted();
7280 cxx_ctor_decl->setTrivial(true);
7281 } else if (cxx_dtor_decl) {
7282 if (cxx_record_decl->hasTrivialDestructor()) {
7283 cxx_dtor_decl->setDefaulted();
7284 cxx_dtor_decl->setTrivial(true);
7285 }
7286 } else if ((cxx_method_decl->isCopyAssignmentOperator() &&
7287 cxx_record_decl->hasTrivialCopyAssignment()) ||
7288 (cxx_method_decl->isMoveAssignmentOperator() &&
7289 cxx_record_decl->hasTrivialMoveAssignment())) {
7290 cxx_method_decl->setDefaulted();
7291 cxx_method_decl->setTrivial(true);
7292 }
7293 }
7294
7295 #ifdef LLDB_CONFIGURATION_DEBUG
7296 VerifyDecl(cxx_method_decl);
7297 #endif
7298
7299 return cxx_method_decl;
7300 }
7301
AddMethodOverridesForCXXRecordType(lldb::opaque_compiler_type_t type)7302 void ClangASTContext::AddMethodOverridesForCXXRecordType(
7303 lldb::opaque_compiler_type_t type) {
7304 if (auto *record = GetAsCXXRecordDecl(type))
7305 for (auto *method : record->methods())
7306 addOverridesForMethod(method);
7307 }
7308
7309 #pragma mark C++ Base Classes
7310
7311 std::unique_ptr<clang::CXXBaseSpecifier>
CreateBaseClassSpecifier(lldb::opaque_compiler_type_t type,AccessType access,bool is_virtual,bool base_of_class)7312 ClangASTContext::CreateBaseClassSpecifier(lldb::opaque_compiler_type_t type,
7313 AccessType access, bool is_virtual,
7314 bool base_of_class) {
7315 if (!type)
7316 return nullptr;
7317
7318 return std::make_unique<clang::CXXBaseSpecifier>(
7319 clang::SourceRange(), is_virtual, base_of_class,
7320 ClangASTContext::ConvertAccessTypeToAccessSpecifier(access),
7321 getASTContext().getTrivialTypeSourceInfo(GetQualType(type)),
7322 clang::SourceLocation());
7323 }
7324
TransferBaseClasses(lldb::opaque_compiler_type_t type,std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> bases)7325 bool ClangASTContext::TransferBaseClasses(
7326 lldb::opaque_compiler_type_t type,
7327 std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> bases) {
7328 if (!type)
7329 return false;
7330 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7331 if (!cxx_record_decl)
7332 return false;
7333 std::vector<clang::CXXBaseSpecifier *> raw_bases;
7334 raw_bases.reserve(bases.size());
7335
7336 // Clang will make a copy of them, so it's ok that we pass pointers that we're
7337 // about to destroy.
7338 for (auto &b : bases)
7339 raw_bases.push_back(b.get());
7340 cxx_record_decl->setBases(raw_bases.data(), raw_bases.size());
7341 return true;
7342 }
7343
SetObjCSuperClass(const CompilerType & type,const CompilerType & superclass_clang_type)7344 bool ClangASTContext::SetObjCSuperClass(
7345 const CompilerType &type, const CompilerType &superclass_clang_type) {
7346 ClangASTContext *ast =
7347 llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
7348 if (!ast)
7349 return false;
7350 clang::ASTContext &clang_ast = ast->getASTContext();
7351
7352 if (type && superclass_clang_type.IsValid() &&
7353 superclass_clang_type.GetTypeSystem() == type.GetTypeSystem()) {
7354 clang::ObjCInterfaceDecl *class_interface_decl =
7355 GetAsObjCInterfaceDecl(type);
7356 clang::ObjCInterfaceDecl *super_interface_decl =
7357 GetAsObjCInterfaceDecl(superclass_clang_type);
7358 if (class_interface_decl && super_interface_decl) {
7359 class_interface_decl->setSuperClass(clang_ast.getTrivialTypeSourceInfo(
7360 clang_ast.getObjCInterfaceType(super_interface_decl)));
7361 return true;
7362 }
7363 }
7364 return false;
7365 }
7366
AddObjCClassProperty(const CompilerType & type,const char * property_name,const CompilerType & property_clang_type,clang::ObjCIvarDecl * ivar_decl,const char * property_setter_name,const char * property_getter_name,uint32_t property_attributes,ClangASTMetadata * metadata)7367 bool ClangASTContext::AddObjCClassProperty(
7368 const CompilerType &type, const char *property_name,
7369 const CompilerType &property_clang_type, clang::ObjCIvarDecl *ivar_decl,
7370 const char *property_setter_name, const char *property_getter_name,
7371 uint32_t property_attributes, ClangASTMetadata *metadata) {
7372 if (!type || !property_clang_type.IsValid() || property_name == nullptr ||
7373 property_name[0] == '\0')
7374 return false;
7375 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7376 if (!ast)
7377 return false;
7378 clang::ASTContext &clang_ast = ast->getASTContext();
7379
7380 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7381 if (!class_interface_decl)
7382 return false;
7383
7384 CompilerType property_clang_type_to_access;
7385
7386 if (property_clang_type.IsValid())
7387 property_clang_type_to_access = property_clang_type;
7388 else if (ivar_decl)
7389 property_clang_type_to_access = ast->GetType(ivar_decl->getType());
7390
7391 if (!class_interface_decl || !property_clang_type_to_access.IsValid())
7392 return false;
7393
7394 clang::TypeSourceInfo *prop_type_source;
7395 if (ivar_decl)
7396 prop_type_source = clang_ast.getTrivialTypeSourceInfo(ivar_decl->getType());
7397 else
7398 prop_type_source = clang_ast.getTrivialTypeSourceInfo(
7399 ClangUtil::GetQualType(property_clang_type));
7400
7401 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create(
7402 clang_ast, class_interface_decl,
7403 clang::SourceLocation(), // Source Location
7404 &clang_ast.Idents.get(property_name),
7405 clang::SourceLocation(), // Source Location for AT
7406 clang::SourceLocation(), // Source location for (
7407 ivar_decl ? ivar_decl->getType()
7408 : ClangUtil::GetQualType(property_clang_type),
7409 prop_type_source);
7410
7411 if (!property_decl)
7412 return false;
7413
7414 if (metadata)
7415 ast->SetMetadata(property_decl, *metadata);
7416
7417 class_interface_decl->addDecl(property_decl);
7418
7419 clang::Selector setter_sel, getter_sel;
7420
7421 if (property_setter_name) {
7422 std::string property_setter_no_colon(property_setter_name,
7423 strlen(property_setter_name) - 1);
7424 clang::IdentifierInfo *setter_ident =
7425 &clang_ast.Idents.get(property_setter_no_colon);
7426 setter_sel = clang_ast.Selectors.getSelector(1, &setter_ident);
7427 } else if (!(property_attributes & DW_APPLE_PROPERTY_readonly)) {
7428 std::string setter_sel_string("set");
7429 setter_sel_string.push_back(::toupper(property_name[0]));
7430 setter_sel_string.append(&property_name[1]);
7431 clang::IdentifierInfo *setter_ident =
7432 &clang_ast.Idents.get(setter_sel_string);
7433 setter_sel = clang_ast.Selectors.getSelector(1, &setter_ident);
7434 }
7435 property_decl->setSetterName(setter_sel);
7436 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_setter);
7437
7438 if (property_getter_name != nullptr) {
7439 clang::IdentifierInfo *getter_ident =
7440 &clang_ast.Idents.get(property_getter_name);
7441 getter_sel = clang_ast.Selectors.getSelector(0, &getter_ident);
7442 } else {
7443 clang::IdentifierInfo *getter_ident = &clang_ast.Idents.get(property_name);
7444 getter_sel = clang_ast.Selectors.getSelector(0, &getter_ident);
7445 }
7446 property_decl->setGetterName(getter_sel);
7447 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_getter);
7448
7449 if (ivar_decl)
7450 property_decl->setPropertyIvarDecl(ivar_decl);
7451
7452 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7453 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
7454 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7455 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readwrite);
7456 if (property_attributes & DW_APPLE_PROPERTY_assign)
7457 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
7458 if (property_attributes & DW_APPLE_PROPERTY_retain)
7459 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_retain);
7460 if (property_attributes & DW_APPLE_PROPERTY_copy)
7461 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_copy);
7462 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7463 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
7464 if (property_attributes & ObjCPropertyDecl::OBJC_PR_nullability)
7465 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nullability);
7466 if (property_attributes & ObjCPropertyDecl::OBJC_PR_null_resettable)
7467 property_decl->setPropertyAttributes(
7468 ObjCPropertyDecl::OBJC_PR_null_resettable);
7469 if (property_attributes & ObjCPropertyDecl::OBJC_PR_class)
7470 property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_class);
7471
7472 const bool isInstance =
7473 (property_attributes & ObjCPropertyDecl::OBJC_PR_class) == 0;
7474
7475 clang::ObjCMethodDecl *getter = nullptr;
7476 if (!getter_sel.isNull())
7477 getter = isInstance ? class_interface_decl->lookupInstanceMethod(getter_sel)
7478 : class_interface_decl->lookupClassMethod(getter_sel);
7479 if (!getter_sel.isNull() && !getter) {
7480 const bool isVariadic = false;
7481 const bool isPropertyAccessor = false;
7482 const bool isSynthesizedAccessorStub = false;
7483 const bool isImplicitlyDeclared = true;
7484 const bool isDefined = false;
7485 const clang::ObjCMethodDecl::ImplementationControl impControl =
7486 clang::ObjCMethodDecl::None;
7487 const bool HasRelatedResultType = false;
7488
7489 getter = clang::ObjCMethodDecl::Create(
7490 clang_ast, clang::SourceLocation(), clang::SourceLocation(), getter_sel,
7491 ClangUtil::GetQualType(property_clang_type_to_access), nullptr,
7492 class_interface_decl, isInstance, isVariadic, isPropertyAccessor,
7493 isSynthesizedAccessorStub, isImplicitlyDeclared, isDefined, impControl,
7494 HasRelatedResultType);
7495
7496 if (getter) {
7497 if (metadata)
7498 ast->SetMetadata(getter, *metadata);
7499
7500 getter->setMethodParams(clang_ast, llvm::ArrayRef<clang::ParmVarDecl *>(),
7501 llvm::ArrayRef<clang::SourceLocation>());
7502 class_interface_decl->addDecl(getter);
7503 }
7504 }
7505 if (getter) {
7506 getter->setPropertyAccessor(true);
7507 property_decl->setGetterMethodDecl(getter);
7508 }
7509
7510 clang::ObjCMethodDecl *setter = nullptr;
7511 setter = isInstance ? class_interface_decl->lookupInstanceMethod(setter_sel)
7512 : class_interface_decl->lookupClassMethod(setter_sel);
7513 if (!setter_sel.isNull() && !setter) {
7514 clang::QualType result_type = clang_ast.VoidTy;
7515 const bool isVariadic = false;
7516 const bool isPropertyAccessor = true;
7517 const bool isSynthesizedAccessorStub = false;
7518 const bool isImplicitlyDeclared = true;
7519 const bool isDefined = false;
7520 const clang::ObjCMethodDecl::ImplementationControl impControl =
7521 clang::ObjCMethodDecl::None;
7522 const bool HasRelatedResultType = false;
7523
7524 setter = clang::ObjCMethodDecl::Create(
7525 clang_ast, clang::SourceLocation(), clang::SourceLocation(), setter_sel,
7526 result_type, nullptr, class_interface_decl, isInstance, isVariadic,
7527 isPropertyAccessor, isSynthesizedAccessorStub, isImplicitlyDeclared,
7528 isDefined, impControl, HasRelatedResultType);
7529
7530 if (setter) {
7531 if (metadata)
7532 ast->SetMetadata(setter, *metadata);
7533
7534 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7535 params.push_back(clang::ParmVarDecl::Create(
7536 clang_ast, setter, clang::SourceLocation(), clang::SourceLocation(),
7537 nullptr, // anonymous
7538 ClangUtil::GetQualType(property_clang_type_to_access), nullptr,
7539 clang::SC_Auto, nullptr));
7540
7541 setter->setMethodParams(clang_ast,
7542 llvm::ArrayRef<clang::ParmVarDecl *>(params),
7543 llvm::ArrayRef<clang::SourceLocation>());
7544
7545 class_interface_decl->addDecl(setter);
7546 }
7547 }
7548 if (setter) {
7549 setter->setPropertyAccessor(true);
7550 property_decl->setSetterMethodDecl(setter);
7551 }
7552
7553 return true;
7554 }
7555
IsObjCClassTypeAndHasIVars(const CompilerType & type,bool check_superclass)7556 bool ClangASTContext::IsObjCClassTypeAndHasIVars(const CompilerType &type,
7557 bool check_superclass) {
7558 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7559 if (class_interface_decl)
7560 return ObjCDeclHasIVars(class_interface_decl, check_superclass);
7561 return false;
7562 }
7563
AddMethodToObjCObjectType(const CompilerType & type,const char * name,const CompilerType & method_clang_type,lldb::AccessType access,bool is_artificial,bool is_variadic,bool is_objc_direct_call)7564 clang::ObjCMethodDecl *ClangASTContext::AddMethodToObjCObjectType(
7565 const CompilerType &type,
7566 const char *name, // the full symbol name as seen in the symbol table
7567 // (lldb::opaque_compiler_type_t type, "-[NString
7568 // stringWithCString:]")
7569 const CompilerType &method_clang_type, lldb::AccessType access,
7570 bool is_artificial, bool is_variadic, bool is_objc_direct_call) {
7571 if (!type || !method_clang_type.IsValid())
7572 return nullptr;
7573
7574 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7575
7576 if (class_interface_decl == nullptr)
7577 return nullptr;
7578 ClangASTContext *lldb_ast =
7579 llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7580 if (lldb_ast == nullptr)
7581 return nullptr;
7582 clang::ASTContext &ast = lldb_ast->getASTContext();
7583
7584 const char *selector_start = ::strchr(name, ' ');
7585 if (selector_start == nullptr)
7586 return nullptr;
7587
7588 selector_start++;
7589 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7590
7591 size_t len = 0;
7592 const char *start;
7593 // printf ("name = '%s'\n", name);
7594
7595 unsigned num_selectors_with_args = 0;
7596 for (start = selector_start; start && *start != '\0' && *start != ']';
7597 start += len) {
7598 len = ::strcspn(start, ":]");
7599 bool has_arg = (start[len] == ':');
7600 if (has_arg)
7601 ++num_selectors_with_args;
7602 selector_idents.push_back(&ast.Idents.get(llvm::StringRef(start, len)));
7603 if (has_arg)
7604 len += 1;
7605 }
7606
7607 if (selector_idents.size() == 0)
7608 return nullptr;
7609
7610 clang::Selector method_selector = ast.Selectors.getSelector(
7611 num_selectors_with_args ? selector_idents.size() : 0,
7612 selector_idents.data());
7613
7614 clang::QualType method_qual_type(ClangUtil::GetQualType(method_clang_type));
7615
7616 // Populate the method decl with parameter decls
7617 const clang::Type *method_type(method_qual_type.getTypePtr());
7618
7619 if (method_type == nullptr)
7620 return nullptr;
7621
7622 const clang::FunctionProtoType *method_function_prototype(
7623 llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7624
7625 if (!method_function_prototype)
7626 return nullptr;
7627
7628 const bool isInstance = (name[0] == '-');
7629 const bool isVariadic = is_variadic;
7630 const bool isPropertyAccessor = false;
7631 const bool isSynthesizedAccessorStub = false;
7632 /// Force this to true because we don't have source locations.
7633 const bool isImplicitlyDeclared = true;
7634 const bool isDefined = false;
7635 const clang::ObjCMethodDecl::ImplementationControl impControl =
7636 clang::ObjCMethodDecl::None;
7637 const bool HasRelatedResultType = false;
7638
7639 const unsigned num_args = method_function_prototype->getNumParams();
7640
7641 if (num_args != num_selectors_with_args)
7642 return nullptr; // some debug information is corrupt. We are not going to
7643 // deal with it.
7644
7645 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create(
7646 ast,
7647 clang::SourceLocation(), // beginLoc,
7648 clang::SourceLocation(), // endLoc,
7649 method_selector, method_function_prototype->getReturnType(),
7650 nullptr, // TypeSourceInfo *ResultTInfo,
7651 lldb_ast->GetDeclContextForType(ClangUtil::GetQualType(type)), isInstance,
7652 isVariadic, isPropertyAccessor, isSynthesizedAccessorStub,
7653 isImplicitlyDeclared, isDefined, impControl, HasRelatedResultType);
7654
7655 if (objc_method_decl == nullptr)
7656 return nullptr;
7657
7658 if (num_args > 0) {
7659 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7660
7661 for (unsigned param_index = 0; param_index < num_args; ++param_index) {
7662 params.push_back(clang::ParmVarDecl::Create(
7663 ast, objc_method_decl, clang::SourceLocation(),
7664 clang::SourceLocation(),
7665 nullptr, // anonymous
7666 method_function_prototype->getParamType(param_index), nullptr,
7667 clang::SC_Auto, nullptr));
7668 }
7669
7670 objc_method_decl->setMethodParams(
7671 ast, llvm::ArrayRef<clang::ParmVarDecl *>(params),
7672 llvm::ArrayRef<clang::SourceLocation>());
7673 }
7674
7675 if (is_objc_direct_call) {
7676 // Add a the objc_direct attribute to the declaration we generate that
7677 // we generate a direct method call for this ObjCMethodDecl.
7678 objc_method_decl->addAttr(
7679 clang::ObjCDirectAttr::CreateImplicit(ast, SourceLocation()));
7680 // Usually Sema is creating implicit parameters (e.g., self) when it
7681 // parses the method. We don't have a parsing Sema when we build our own
7682 // AST here so we manually need to create these implicit parameters to
7683 // make the direct call code generation happy.
7684 objc_method_decl->createImplicitParams(ast, class_interface_decl);
7685 }
7686
7687 class_interface_decl->addDecl(objc_method_decl);
7688
7689 #ifdef LLDB_CONFIGURATION_DEBUG
7690 VerifyDecl(objc_method_decl);
7691 #endif
7692
7693 return objc_method_decl;
7694 }
7695
SetHasExternalStorage(lldb::opaque_compiler_type_t type,bool has_extern)7696 bool ClangASTContext::SetHasExternalStorage(lldb::opaque_compiler_type_t type,
7697 bool has_extern) {
7698 if (!type)
7699 return false;
7700
7701 clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type)));
7702
7703 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7704 switch (type_class) {
7705 case clang::Type::Record: {
7706 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7707 if (cxx_record_decl) {
7708 cxx_record_decl->setHasExternalLexicalStorage(has_extern);
7709 cxx_record_decl->setHasExternalVisibleStorage(has_extern);
7710 return true;
7711 }
7712 } break;
7713
7714 case clang::Type::Enum: {
7715 clang::EnumDecl *enum_decl =
7716 llvm::cast<clang::EnumType>(qual_type)->getDecl();
7717 if (enum_decl) {
7718 enum_decl->setHasExternalLexicalStorage(has_extern);
7719 enum_decl->setHasExternalVisibleStorage(has_extern);
7720 return true;
7721 }
7722 } break;
7723
7724 case clang::Type::ObjCObject:
7725 case clang::Type::ObjCInterface: {
7726 const clang::ObjCObjectType *objc_class_type =
7727 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7728 assert(objc_class_type);
7729 if (objc_class_type) {
7730 clang::ObjCInterfaceDecl *class_interface_decl =
7731 objc_class_type->getInterface();
7732
7733 if (class_interface_decl) {
7734 class_interface_decl->setHasExternalLexicalStorage(has_extern);
7735 class_interface_decl->setHasExternalVisibleStorage(has_extern);
7736 return true;
7737 }
7738 }
7739 } break;
7740
7741 default:
7742 break;
7743 }
7744 return false;
7745 }
7746
7747 #pragma mark TagDecl
7748
StartTagDeclarationDefinition(const CompilerType & type)7749 bool ClangASTContext::StartTagDeclarationDefinition(const CompilerType &type) {
7750 clang::QualType qual_type(ClangUtil::GetQualType(type));
7751 if (!qual_type.isNull()) {
7752 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
7753 if (tag_type) {
7754 clang::TagDecl *tag_decl = tag_type->getDecl();
7755 if (tag_decl) {
7756 tag_decl->startDefinition();
7757 return true;
7758 }
7759 }
7760
7761 const clang::ObjCObjectType *object_type =
7762 qual_type->getAs<clang::ObjCObjectType>();
7763 if (object_type) {
7764 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
7765 if (interface_decl) {
7766 interface_decl->startDefinition();
7767 return true;
7768 }
7769 }
7770 }
7771 return false;
7772 }
7773
CompleteTagDeclarationDefinition(const CompilerType & type)7774 bool ClangASTContext::CompleteTagDeclarationDefinition(
7775 const CompilerType &type) {
7776 clang::QualType qual_type(ClangUtil::GetQualType(type));
7777 if (qual_type.isNull())
7778 return false;
7779
7780 // Make sure we use the same methodology as
7781 // ClangASTContext::StartTagDeclarationDefinition() as to how we start/end
7782 // the definition.
7783 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
7784 if (tag_type) {
7785 clang::TagDecl *tag_decl = tag_type->getDecl();
7786
7787 if (auto *cxx_record_decl = llvm::dyn_cast<CXXRecordDecl>(tag_decl)) {
7788 if (!cxx_record_decl->isCompleteDefinition())
7789 cxx_record_decl->completeDefinition();
7790 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
7791 cxx_record_decl->setHasExternalLexicalStorage(false);
7792 cxx_record_decl->setHasExternalVisibleStorage(false);
7793 return true;
7794 }
7795 }
7796
7797 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
7798
7799 if (!enutype)
7800 return false;
7801 clang::EnumDecl *enum_decl = enutype->getDecl();
7802
7803 if (enum_decl->isCompleteDefinition())
7804 return true;
7805
7806 ClangASTContext *lldb_ast =
7807 llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7808 if (lldb_ast == nullptr)
7809 return false;
7810 clang::ASTContext &ast = lldb_ast->getASTContext();
7811
7812 /// TODO This really needs to be fixed.
7813
7814 QualType integer_type(enum_decl->getIntegerType());
7815 if (!integer_type.isNull()) {
7816 unsigned NumPositiveBits = 1;
7817 unsigned NumNegativeBits = 0;
7818
7819 clang::QualType promotion_qual_type;
7820 // If the enum integer type is less than an integer in bit width,
7821 // then we must promote it to an integer size.
7822 if (ast.getTypeSize(enum_decl->getIntegerType()) <
7823 ast.getTypeSize(ast.IntTy)) {
7824 if (enum_decl->getIntegerType()->isSignedIntegerType())
7825 promotion_qual_type = ast.IntTy;
7826 else
7827 promotion_qual_type = ast.UnsignedIntTy;
7828 } else
7829 promotion_qual_type = enum_decl->getIntegerType();
7830
7831 enum_decl->completeDefinition(enum_decl->getIntegerType(),
7832 promotion_qual_type, NumPositiveBits,
7833 NumNegativeBits);
7834 }
7835 return true;
7836 }
7837
AddEnumerationValueToEnumerationType(const CompilerType & enum_type,const Declaration & decl,const char * name,const llvm::APSInt & value)7838 clang::EnumConstantDecl *ClangASTContext::AddEnumerationValueToEnumerationType(
7839 const CompilerType &enum_type, const Declaration &decl, const char *name,
7840 const llvm::APSInt &value) {
7841
7842 if (!enum_type || ConstString(name).IsEmpty())
7843 return nullptr;
7844
7845 lldbassert(enum_type.GetTypeSystem() == static_cast<TypeSystem *>(this));
7846
7847 lldb::opaque_compiler_type_t enum_opaque_compiler_type =
7848 enum_type.GetOpaqueQualType();
7849
7850 if (!enum_opaque_compiler_type)
7851 return nullptr;
7852
7853 clang::QualType enum_qual_type(
7854 GetCanonicalQualType(enum_opaque_compiler_type));
7855
7856 const clang::Type *clang_type = enum_qual_type.getTypePtr();
7857
7858 if (!clang_type)
7859 return nullptr;
7860
7861 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
7862
7863 if (!enutype)
7864 return nullptr;
7865
7866 clang::EnumConstantDecl *enumerator_decl = clang::EnumConstantDecl::Create(
7867 getASTContext(), enutype->getDecl(), clang::SourceLocation(),
7868 name ? &getASTContext().Idents.get(name) : nullptr, // Identifier
7869 clang::QualType(enutype, 0), nullptr, value);
7870
7871 if (!enumerator_decl)
7872 return nullptr;
7873
7874 enutype->getDecl()->addDecl(enumerator_decl);
7875
7876 #ifdef LLDB_CONFIGURATION_DEBUG
7877 VerifyDecl(enumerator_decl);
7878 #endif
7879
7880 return enumerator_decl;
7881 }
7882
AddEnumerationValueToEnumerationType(const CompilerType & enum_type,const Declaration & decl,const char * name,int64_t enum_value,uint32_t enum_value_bit_size)7883 clang::EnumConstantDecl *ClangASTContext::AddEnumerationValueToEnumerationType(
7884 const CompilerType &enum_type, const Declaration &decl, const char *name,
7885 int64_t enum_value, uint32_t enum_value_bit_size) {
7886 CompilerType underlying_type =
7887 GetEnumerationIntegerType(enum_type.GetOpaqueQualType());
7888 bool is_signed = false;
7889 underlying_type.IsIntegerType(is_signed);
7890
7891 llvm::APSInt value(enum_value_bit_size, is_signed);
7892 value = enum_value;
7893
7894 return AddEnumerationValueToEnumerationType(enum_type, decl, name, value);
7895 }
7896
7897 CompilerType
GetEnumerationIntegerType(lldb::opaque_compiler_type_t type)7898 ClangASTContext::GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) {
7899 clang::QualType enum_qual_type(GetCanonicalQualType(type));
7900 const clang::Type *clang_type = enum_qual_type.getTypePtr();
7901 if (clang_type) {
7902 const clang::EnumType *enutype =
7903 llvm::dyn_cast<clang::EnumType>(clang_type);
7904 if (enutype) {
7905 clang::EnumDecl *enum_decl = enutype->getDecl();
7906 if (enum_decl)
7907 return GetType(enum_decl->getIntegerType());
7908 }
7909 }
7910 return CompilerType();
7911 }
7912
7913 CompilerType
CreateMemberPointerType(const CompilerType & type,const CompilerType & pointee_type)7914 ClangASTContext::CreateMemberPointerType(const CompilerType &type,
7915 const CompilerType &pointee_type) {
7916 if (type && pointee_type.IsValid() &&
7917 type.GetTypeSystem() == pointee_type.GetTypeSystem()) {
7918 ClangASTContext *ast =
7919 llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7920 if (!ast)
7921 return CompilerType();
7922 return ast->GetType(ast->getASTContext().getMemberPointerType(
7923 ClangUtil::GetQualType(pointee_type),
7924 ClangUtil::GetQualType(type).getTypePtr()));
7925 }
7926 return CompilerType();
7927 }
7928
7929 // Dumping types
7930 #define DEPTH_INCREMENT 2
7931
7932 #ifndef NDEBUG
7933 LLVM_DUMP_METHOD void
dump(lldb::opaque_compiler_type_t type) const7934 ClangASTContext::dump(lldb::opaque_compiler_type_t type) const {
7935 if (!type)
7936 return;
7937 clang::QualType qual_type(GetQualType(type));
7938 qual_type.dump();
7939 }
7940 #endif
7941
Dump(Stream & s)7942 void ClangASTContext::Dump(Stream &s) {
7943 Decl *tu = Decl::castFromDeclContext(GetTranslationUnitDecl());
7944 tu->dump(s.AsRawOstream());
7945 }
7946
DumpFromSymbolFile(Stream & s,llvm::StringRef symbol_name)7947 void ClangASTContext::DumpFromSymbolFile(Stream &s,
7948 llvm::StringRef symbol_name) {
7949 SymbolFile *symfile = GetSymbolFile();
7950
7951 if (!symfile)
7952 return;
7953
7954 lldb_private::TypeList type_list;
7955 symfile->GetTypes(nullptr, eTypeClassAny, type_list);
7956 size_t ntypes = type_list.GetSize();
7957
7958 for (size_t i = 0; i < ntypes; ++i) {
7959 TypeSP type = type_list.GetTypeAtIndex(i);
7960
7961 if (!symbol_name.empty())
7962 if (symbol_name != type->GetName().GetStringRef())
7963 continue;
7964
7965 s << type->GetName().AsCString() << "\n";
7966
7967 CompilerType full_type = type->GetFullCompilerType();
7968 if (clang::TagDecl *tag_decl = GetAsTagDecl(full_type)) {
7969 tag_decl->dump(s.AsRawOstream());
7970 continue;
7971 }
7972 if (clang::TypedefNameDecl *typedef_decl = GetAsTypedefDecl(full_type)) {
7973 typedef_decl->dump(s.AsRawOstream());
7974 continue;
7975 }
7976 if (auto *objc_obj = llvm::dyn_cast<clang::ObjCObjectType>(
7977 ClangUtil::GetQualType(full_type).getTypePtr())) {
7978 if (clang::ObjCInterfaceDecl *interface_decl = objc_obj->getInterface()) {
7979 interface_decl->dump(s.AsRawOstream());
7980 continue;
7981 }
7982 }
7983 GetCanonicalQualType(full_type.GetOpaqueQualType()).dump(s.AsRawOstream());
7984 }
7985 }
7986
DumpValue(lldb::opaque_compiler_type_t type,ExecutionContext * exe_ctx,Stream * s,lldb::Format format,const lldb_private::DataExtractor & data,lldb::offset_t data_byte_offset,size_t data_byte_size,uint32_t bitfield_bit_size,uint32_t bitfield_bit_offset,bool show_types,bool show_summary,bool verbose,uint32_t depth)7987 void ClangASTContext::DumpValue(
7988 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s,
7989 lldb::Format format, const lldb_private::DataExtractor &data,
7990 lldb::offset_t data_byte_offset, size_t data_byte_size,
7991 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool show_types,
7992 bool show_summary, bool verbose, uint32_t depth) {
7993 if (!type)
7994 return;
7995
7996 clang::QualType qual_type(GetQualType(type));
7997 switch (qual_type->getTypeClass()) {
7998 case clang::Type::Record:
7999 if (GetCompleteType(type)) {
8000 const clang::RecordType *record_type =
8001 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8002 const clang::RecordDecl *record_decl = record_type->getDecl();
8003 assert(record_decl);
8004 uint32_t field_bit_offset = 0;
8005 uint32_t field_byte_offset = 0;
8006 const clang::ASTRecordLayout &record_layout =
8007 getASTContext().getASTRecordLayout(record_decl);
8008 uint32_t child_idx = 0;
8009
8010 const clang::CXXRecordDecl *cxx_record_decl =
8011 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8012 if (cxx_record_decl) {
8013 // We might have base classes to print out first
8014 clang::CXXRecordDecl::base_class_const_iterator base_class,
8015 base_class_end;
8016 for (base_class = cxx_record_decl->bases_begin(),
8017 base_class_end = cxx_record_decl->bases_end();
8018 base_class != base_class_end; ++base_class) {
8019 const clang::CXXRecordDecl *base_class_decl =
8020 llvm::cast<clang::CXXRecordDecl>(
8021 base_class->getType()->getAs<clang::RecordType>()->getDecl());
8022
8023 // Skip empty base classes
8024 if (!verbose && !ClangASTContext::RecordHasFields(base_class_decl))
8025 continue;
8026
8027 if (base_class->isVirtual())
8028 field_bit_offset =
8029 record_layout.getVBaseClassOffset(base_class_decl)
8030 .getQuantity() *
8031 8;
8032 else
8033 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl)
8034 .getQuantity() *
8035 8;
8036 field_byte_offset = field_bit_offset / 8;
8037 assert(field_bit_offset % 8 == 0);
8038 if (child_idx == 0)
8039 s->PutChar('{');
8040 else
8041 s->PutChar(',');
8042
8043 clang::QualType base_class_qual_type = base_class->getType();
8044 std::string base_class_type_name(base_class_qual_type.getAsString());
8045
8046 // Indent and print the base class type name
8047 s->Format("\n{0}{1}", llvm::fmt_repeat(" ", depth + DEPTH_INCREMENT),
8048 base_class_type_name);
8049
8050 clang::TypeInfo base_class_type_info =
8051 getASTContext().getTypeInfo(base_class_qual_type);
8052
8053 // Dump the value of the member
8054 CompilerType base_clang_type = GetType(base_class_qual_type);
8055 base_clang_type.DumpValue(
8056 exe_ctx,
8057 s, // Stream to dump to
8058 base_clang_type
8059 .GetFormat(), // The format with which to display the member
8060 data, // Data buffer containing all bytes for this type
8061 data_byte_offset + field_byte_offset, // Offset into "data" where
8062 // to grab value from
8063 base_class_type_info.Width / 8, // Size of this type in bytes
8064 0, // Bitfield bit size
8065 0, // Bitfield bit offset
8066 show_types, // Boolean indicating if we should show the variable
8067 // types
8068 show_summary, // Boolean indicating if we should show a summary
8069 // for the current type
8070 verbose, // Verbose output?
8071 depth + DEPTH_INCREMENT); // Scope depth for any types that have
8072 // children
8073
8074 ++child_idx;
8075 }
8076 }
8077 uint32_t field_idx = 0;
8078 clang::RecordDecl::field_iterator field, field_end;
8079 for (field = record_decl->field_begin(),
8080 field_end = record_decl->field_end();
8081 field != field_end; ++field, ++field_idx, ++child_idx) {
8082 // Print the starting squiggly bracket (if this is the first member) or
8083 // comma (for member 2 and beyond) for the struct/union/class member.
8084 if (child_idx == 0)
8085 s->PutChar('{');
8086 else
8087 s->PutChar(',');
8088
8089 // Indent
8090 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8091
8092 clang::QualType field_type = field->getType();
8093 // Print the member type if requested
8094 // Figure out the type byte size (field_type_info.first) and alignment
8095 // (field_type_info.second) from the AST context.
8096 clang::TypeInfo field_type_info =
8097 getASTContext().getTypeInfo(field_type);
8098 assert(field_idx < record_layout.getFieldCount());
8099 // Figure out the field offset within the current struct/union/class
8100 // type
8101 field_bit_offset = record_layout.getFieldOffset(field_idx);
8102 field_byte_offset = field_bit_offset / 8;
8103 uint32_t field_bitfield_bit_size = 0;
8104 uint32_t field_bitfield_bit_offset = 0;
8105 if (FieldIsBitfield(*field, field_bitfield_bit_size))
8106 field_bitfield_bit_offset = field_bit_offset % 8;
8107
8108 if (show_types) {
8109 std::string field_type_name(field_type.getAsString());
8110 if (field_bitfield_bit_size > 0)
8111 s->Printf("(%s:%u) ", field_type_name.c_str(),
8112 field_bitfield_bit_size);
8113 else
8114 s->Printf("(%s) ", field_type_name.c_str());
8115 }
8116 // Print the member name and equal sign
8117 s->Printf("%s = ", field->getNameAsString().c_str());
8118
8119 // Dump the value of the member
8120 CompilerType field_clang_type = GetType(field_type);
8121 field_clang_type.DumpValue(
8122 exe_ctx,
8123 s, // Stream to dump to
8124 field_clang_type
8125 .GetFormat(), // The format with which to display the member
8126 data, // Data buffer containing all bytes for this type
8127 data_byte_offset + field_byte_offset, // Offset into "data" where to
8128 // grab value from
8129 field_type_info.Width / 8, // Size of this type in bytes
8130 field_bitfield_bit_size, // Bitfield bit size
8131 field_bitfield_bit_offset, // Bitfield bit offset
8132 show_types, // Boolean indicating if we should show the variable
8133 // types
8134 show_summary, // Boolean indicating if we should show a summary for
8135 // the current type
8136 verbose, // Verbose output?
8137 depth + DEPTH_INCREMENT); // Scope depth for any types that have
8138 // children
8139 }
8140
8141 // Indent the trailing squiggly bracket
8142 if (child_idx > 0)
8143 s->Printf("\n%*s}", depth, "");
8144 }
8145 return;
8146
8147 case clang::Type::Enum:
8148 if (GetCompleteType(type)) {
8149 const clang::EnumType *enutype =
8150 llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8151 const clang::EnumDecl *enum_decl = enutype->getDecl();
8152 assert(enum_decl);
8153 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8154 lldb::offset_t offset = data_byte_offset;
8155 const int64_t enum_value = data.GetMaxU64Bitfield(
8156 &offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8157 for (enum_pos = enum_decl->enumerator_begin(),
8158 enum_end_pos = enum_decl->enumerator_end();
8159 enum_pos != enum_end_pos; ++enum_pos) {
8160 if (enum_pos->getInitVal() == enum_value) {
8161 s->Printf("%s", enum_pos->getNameAsString().c_str());
8162 return;
8163 }
8164 }
8165 // If we have gotten here we didn't get find the enumerator in the enum
8166 // decl, so just print the integer.
8167 s->Printf("%" PRIi64, enum_value);
8168 }
8169 return;
8170
8171 case clang::Type::ConstantArray: {
8172 const clang::ConstantArrayType *array =
8173 llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8174 bool is_array_of_characters = false;
8175 clang::QualType element_qual_type = array->getElementType();
8176
8177 const clang::Type *canonical_type =
8178 element_qual_type->getCanonicalTypeInternal().getTypePtr();
8179 if (canonical_type)
8180 is_array_of_characters = canonical_type->isCharType();
8181
8182 const uint64_t element_count = array->getSize().getLimitedValue();
8183
8184 clang::TypeInfo field_type_info =
8185 getASTContext().getTypeInfo(element_qual_type);
8186
8187 uint32_t element_idx = 0;
8188 uint32_t element_offset = 0;
8189 uint64_t element_byte_size = field_type_info.Width / 8;
8190 uint32_t element_stride = element_byte_size;
8191
8192 if (is_array_of_characters) {
8193 s->PutChar('"');
8194 DumpDataExtractor(data, s, data_byte_offset, lldb::eFormatChar,
8195 element_byte_size, element_count, UINT32_MAX,
8196 LLDB_INVALID_ADDRESS, 0, 0);
8197 s->PutChar('"');
8198 return;
8199 } else {
8200 CompilerType element_clang_type = GetType(element_qual_type);
8201 lldb::Format element_format = element_clang_type.GetFormat();
8202
8203 for (element_idx = 0; element_idx < element_count; ++element_idx) {
8204 // Print the starting squiggly bracket (if this is the first member) or
8205 // comman (for member 2 and beyong) for the struct/union/class member.
8206 if (element_idx == 0)
8207 s->PutChar('{');
8208 else
8209 s->PutChar(',');
8210
8211 // Indent and print the index
8212 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8213
8214 // Figure out the field offset within the current struct/union/class
8215 // type
8216 element_offset = element_idx * element_stride;
8217
8218 // Dump the value of the member
8219 element_clang_type.DumpValue(
8220 exe_ctx,
8221 s, // Stream to dump to
8222 element_format, // The format with which to display the element
8223 data, // Data buffer containing all bytes for this type
8224 data_byte_offset +
8225 element_offset, // Offset into "data" where to grab value from
8226 element_byte_size, // Size of this type in bytes
8227 0, // Bitfield bit size
8228 0, // Bitfield bit offset
8229 show_types, // Boolean indicating if we should show the variable
8230 // types
8231 show_summary, // Boolean indicating if we should show a summary for
8232 // the current type
8233 verbose, // Verbose output?
8234 depth + DEPTH_INCREMENT); // Scope depth for any types that have
8235 // children
8236 }
8237
8238 // Indent the trailing squiggly bracket
8239 if (element_idx > 0)
8240 s->Printf("\n%*s}", depth, "");
8241 }
8242 }
8243 return;
8244
8245 case clang::Type::Typedef: {
8246 clang::QualType typedef_qual_type =
8247 llvm::cast<clang::TypedefType>(qual_type)
8248 ->getDecl()
8249 ->getUnderlyingType();
8250
8251 CompilerType typedef_clang_type = GetType(typedef_qual_type);
8252 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8253 clang::TypeInfo typedef_type_info =
8254 getASTContext().getTypeInfo(typedef_qual_type);
8255 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8256
8257 return typedef_clang_type.DumpValue(
8258 exe_ctx,
8259 s, // Stream to dump to
8260 typedef_format, // The format with which to display the element
8261 data, // Data buffer containing all bytes for this type
8262 data_byte_offset, // Offset into "data" where to grab value from
8263 typedef_byte_size, // Size of this type in bytes
8264 bitfield_bit_size, // Bitfield bit size
8265 bitfield_bit_offset, // Bitfield bit offset
8266 show_types, // Boolean indicating if we should show the variable types
8267 show_summary, // Boolean indicating if we should show a summary for the
8268 // current type
8269 verbose, // Verbose output?
8270 depth); // Scope depth for any types that have children
8271 } break;
8272
8273 case clang::Type::Auto: {
8274 clang::QualType elaborated_qual_type =
8275 llvm::cast<clang::AutoType>(qual_type)->getDeducedType();
8276 CompilerType elaborated_clang_type = GetType(elaborated_qual_type);
8277 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8278 clang::TypeInfo elaborated_type_info =
8279 getASTContext().getTypeInfo(elaborated_qual_type);
8280 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8281
8282 return elaborated_clang_type.DumpValue(
8283 exe_ctx,
8284 s, // Stream to dump to
8285 elaborated_format, // The format with which to display the element
8286 data, // Data buffer containing all bytes for this type
8287 data_byte_offset, // Offset into "data" where to grab value from
8288 elaborated_byte_size, // Size of this type in bytes
8289 bitfield_bit_size, // Bitfield bit size
8290 bitfield_bit_offset, // Bitfield bit offset
8291 show_types, // Boolean indicating if we should show the variable types
8292 show_summary, // Boolean indicating if we should show a summary for the
8293 // current type
8294 verbose, // Verbose output?
8295 depth); // Scope depth for any types that have children
8296 } break;
8297
8298 case clang::Type::Elaborated: {
8299 clang::QualType elaborated_qual_type =
8300 llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
8301 CompilerType elaborated_clang_type = GetType(elaborated_qual_type);
8302 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8303 clang::TypeInfo elaborated_type_info =
8304 getASTContext().getTypeInfo(elaborated_qual_type);
8305 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8306
8307 return elaborated_clang_type.DumpValue(
8308 exe_ctx,
8309 s, // Stream to dump to
8310 elaborated_format, // The format with which to display the element
8311 data, // Data buffer containing all bytes for this type
8312 data_byte_offset, // Offset into "data" where to grab value from
8313 elaborated_byte_size, // Size of this type in bytes
8314 bitfield_bit_size, // Bitfield bit size
8315 bitfield_bit_offset, // Bitfield bit offset
8316 show_types, // Boolean indicating if we should show the variable types
8317 show_summary, // Boolean indicating if we should show a summary for the
8318 // current type
8319 verbose, // Verbose output?
8320 depth); // Scope depth for any types that have children
8321 } break;
8322
8323 case clang::Type::Paren: {
8324 clang::QualType desugar_qual_type =
8325 llvm::cast<clang::ParenType>(qual_type)->desugar();
8326 CompilerType desugar_clang_type = GetType(desugar_qual_type);
8327
8328 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8329 clang::TypeInfo desugar_type_info =
8330 getASTContext().getTypeInfo(desugar_qual_type);
8331 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8332
8333 return desugar_clang_type.DumpValue(
8334 exe_ctx,
8335 s, // Stream to dump to
8336 desugar_format, // The format with which to display the element
8337 data, // Data buffer containing all bytes for this type
8338 data_byte_offset, // Offset into "data" where to grab value from
8339 desugar_byte_size, // Size of this type in bytes
8340 bitfield_bit_size, // Bitfield bit size
8341 bitfield_bit_offset, // Bitfield bit offset
8342 show_types, // Boolean indicating if we should show the variable types
8343 show_summary, // Boolean indicating if we should show a summary for the
8344 // current type
8345 verbose, // Verbose output?
8346 depth); // Scope depth for any types that have children
8347 } break;
8348
8349 default:
8350 // We are down to a scalar type that we just need to display.
8351 DumpDataExtractor(data, s, data_byte_offset, format, data_byte_size, 1,
8352 UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size,
8353 bitfield_bit_offset);
8354
8355 if (show_summary)
8356 DumpSummary(type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8357 break;
8358 }
8359 }
8360
DumpEnumValue(const clang::QualType & qual_type,Stream * s,const DataExtractor & data,lldb::offset_t byte_offset,size_t byte_size,uint32_t bitfield_bit_offset,uint32_t bitfield_bit_size)8361 static bool DumpEnumValue(const clang::QualType &qual_type, Stream *s,
8362 const DataExtractor &data, lldb::offset_t byte_offset,
8363 size_t byte_size, uint32_t bitfield_bit_offset,
8364 uint32_t bitfield_bit_size) {
8365 const clang::EnumType *enutype =
8366 llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8367 const clang::EnumDecl *enum_decl = enutype->getDecl();
8368 assert(enum_decl);
8369 lldb::offset_t offset = byte_offset;
8370 const uint64_t enum_svalue = data.GetMaxS64Bitfield(
8371 &offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8372 bool can_be_bitfield = true;
8373 uint64_t covered_bits = 0;
8374 int num_enumerators = 0;
8375
8376 // Try to find an exact match for the value.
8377 // At the same time, we're applying a heuristic to determine whether we want
8378 // to print this enum as a bitfield. We're likely dealing with a bitfield if
8379 // every enumrator is either a one bit value or a superset of the previous
8380 // enumerators. Also 0 doesn't make sense when the enumerators are used as
8381 // flags.
8382 for (auto enumerator : enum_decl->enumerators()) {
8383 uint64_t val = enumerator->getInitVal().getSExtValue();
8384 val = llvm::SignExtend64(val, 8*byte_size);
8385 if (llvm::countPopulation(val) != 1 && (val & ~covered_bits) != 0)
8386 can_be_bitfield = false;
8387 covered_bits |= val;
8388 ++num_enumerators;
8389 if (val == enum_svalue) {
8390 // Found an exact match, that's all we need to do.
8391 s->PutCString(enumerator->getNameAsString());
8392 return true;
8393 }
8394 }
8395
8396 // Unsigned values make more sense for flags.
8397 offset = byte_offset;
8398 const uint64_t enum_uvalue = data.GetMaxU64Bitfield(
8399 &offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8400
8401 // No exact match, but we don't think this is a bitfield. Print the value as
8402 // decimal.
8403 if (!can_be_bitfield) {
8404 if (qual_type->isSignedIntegerOrEnumerationType())
8405 s->Printf("%" PRIi64, enum_svalue);
8406 else
8407 s->Printf("%" PRIu64, enum_uvalue);
8408 return true;
8409 }
8410
8411 uint64_t remaining_value = enum_uvalue;
8412 std::vector<std::pair<uint64_t, llvm::StringRef>> values;
8413 values.reserve(num_enumerators);
8414 for (auto enumerator : enum_decl->enumerators())
8415 if (auto val = enumerator->getInitVal().getZExtValue())
8416 values.emplace_back(val, enumerator->getName());
8417
8418 // Sort in reverse order of the number of the population count, so that in
8419 // `enum {A, B, ALL = A|B }` we visit ALL first. Use a stable sort so that
8420 // A | C where A is declared before C is displayed in this order.
8421 std::stable_sort(values.begin(), values.end(), [](const auto &a, const auto &b) {
8422 return llvm::countPopulation(a.first) > llvm::countPopulation(b.first);
8423 });
8424
8425 for (const auto &val : values) {
8426 if ((remaining_value & val.first) != val.first)
8427 continue;
8428 remaining_value &= ~val.first;
8429 s->PutCString(val.second);
8430 if (remaining_value)
8431 s->PutCString(" | ");
8432 }
8433
8434 // If there is a remainder that is not covered by the value, print it as hex.
8435 if (remaining_value)
8436 s->Printf("0x%" PRIx64, remaining_value);
8437
8438 return true;
8439 }
8440
DumpTypeValue(lldb::opaque_compiler_type_t type,Stream * s,lldb::Format format,const lldb_private::DataExtractor & data,lldb::offset_t byte_offset,size_t byte_size,uint32_t bitfield_bit_size,uint32_t bitfield_bit_offset,ExecutionContextScope * exe_scope)8441 bool ClangASTContext::DumpTypeValue(
8442 lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format,
8443 const lldb_private::DataExtractor &data, lldb::offset_t byte_offset,
8444 size_t byte_size, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
8445 ExecutionContextScope *exe_scope) {
8446 if (!type)
8447 return false;
8448 if (IsAggregateType(type)) {
8449 return false;
8450 } else {
8451 clang::QualType qual_type(GetQualType(type));
8452
8453 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8454
8455 if (type_class == clang::Type::Elaborated) {
8456 qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
8457 return DumpTypeValue(qual_type.getAsOpaquePtr(), s, format, data, byte_offset, byte_size,
8458 bitfield_bit_size, bitfield_bit_offset, exe_scope);
8459 }
8460
8461 switch (type_class) {
8462 case clang::Type::Typedef: {
8463 clang::QualType typedef_qual_type =
8464 llvm::cast<clang::TypedefType>(qual_type)
8465 ->getDecl()
8466 ->getUnderlyingType();
8467 CompilerType typedef_clang_type = GetType(typedef_qual_type);
8468 if (format == eFormatDefault)
8469 format = typedef_clang_type.GetFormat();
8470 clang::TypeInfo typedef_type_info =
8471 getASTContext().getTypeInfo(typedef_qual_type);
8472 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8473
8474 return typedef_clang_type.DumpTypeValue(
8475 s,
8476 format, // The format with which to display the element
8477 data, // Data buffer containing all bytes for this type
8478 byte_offset, // Offset into "data" where to grab value from
8479 typedef_byte_size, // Size of this type in bytes
8480 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't
8481 // treat as a bitfield
8482 bitfield_bit_offset, // Offset in bits of a bitfield value if
8483 // bitfield_bit_size != 0
8484 exe_scope);
8485 } break;
8486
8487 case clang::Type::Enum:
8488 // If our format is enum or default, show the enumeration value as its
8489 // enumeration string value, else just display it as requested.
8490 if ((format == eFormatEnum || format == eFormatDefault) &&
8491 GetCompleteType(type))
8492 return DumpEnumValue(qual_type, s, data, byte_offset, byte_size,
8493 bitfield_bit_offset, bitfield_bit_size);
8494 // format was not enum, just fall through and dump the value as
8495 // requested....
8496 LLVM_FALLTHROUGH;
8497
8498 default:
8499 // We are down to a scalar type that we just need to display.
8500 {
8501 uint32_t item_count = 1;
8502 // A few formats, we might need to modify our size and count for
8503 // depending
8504 // on how we are trying to display the value...
8505 switch (format) {
8506 default:
8507 case eFormatBoolean:
8508 case eFormatBinary:
8509 case eFormatComplex:
8510 case eFormatCString: // NULL terminated C strings
8511 case eFormatDecimal:
8512 case eFormatEnum:
8513 case eFormatHex:
8514 case eFormatHexUppercase:
8515 case eFormatFloat:
8516 case eFormatOctal:
8517 case eFormatOSType:
8518 case eFormatUnsigned:
8519 case eFormatPointer:
8520 case eFormatVectorOfChar:
8521 case eFormatVectorOfSInt8:
8522 case eFormatVectorOfUInt8:
8523 case eFormatVectorOfSInt16:
8524 case eFormatVectorOfUInt16:
8525 case eFormatVectorOfSInt32:
8526 case eFormatVectorOfUInt32:
8527 case eFormatVectorOfSInt64:
8528 case eFormatVectorOfUInt64:
8529 case eFormatVectorOfFloat32:
8530 case eFormatVectorOfFloat64:
8531 case eFormatVectorOfUInt128:
8532 break;
8533
8534 case eFormatChar:
8535 case eFormatCharPrintable:
8536 case eFormatCharArray:
8537 case eFormatBytes:
8538 case eFormatBytesWithASCII:
8539 item_count = byte_size;
8540 byte_size = 1;
8541 break;
8542
8543 case eFormatUnicode16:
8544 item_count = byte_size / 2;
8545 byte_size = 2;
8546 break;
8547
8548 case eFormatUnicode32:
8549 item_count = byte_size / 4;
8550 byte_size = 4;
8551 break;
8552 }
8553 return DumpDataExtractor(data, s, byte_offset, format, byte_size,
8554 item_count, UINT32_MAX, LLDB_INVALID_ADDRESS,
8555 bitfield_bit_size, bitfield_bit_offset,
8556 exe_scope);
8557 }
8558 break;
8559 }
8560 }
8561 return false;
8562 }
8563
DumpSummary(lldb::opaque_compiler_type_t type,ExecutionContext * exe_ctx,Stream * s,const lldb_private::DataExtractor & data,lldb::offset_t data_byte_offset,size_t data_byte_size)8564 void ClangASTContext::DumpSummary(lldb::opaque_compiler_type_t type,
8565 ExecutionContext *exe_ctx, Stream *s,
8566 const lldb_private::DataExtractor &data,
8567 lldb::offset_t data_byte_offset,
8568 size_t data_byte_size) {
8569 uint32_t length = 0;
8570 if (IsCStringType(type, length)) {
8571 if (exe_ctx) {
8572 Process *process = exe_ctx->GetProcessPtr();
8573 if (process) {
8574 lldb::offset_t offset = data_byte_offset;
8575 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8576 std::vector<uint8_t> buf;
8577 if (length > 0)
8578 buf.resize(length);
8579 else
8580 buf.resize(256);
8581
8582 DataExtractor cstr_data(&buf.front(), buf.size(),
8583 process->GetByteOrder(), 4);
8584 buf.back() = '\0';
8585 size_t bytes_read;
8586 size_t total_cstr_len = 0;
8587 Status error;
8588 while ((bytes_read = process->ReadMemory(pointer_address, &buf.front(),
8589 buf.size(), error)) > 0) {
8590 const size_t len = strlen((const char *)&buf.front());
8591 if (len == 0)
8592 break;
8593 if (total_cstr_len == 0)
8594 s->PutCString(" \"");
8595 DumpDataExtractor(cstr_data, s, 0, lldb::eFormatChar, 1, len,
8596 UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8597 total_cstr_len += len;
8598 if (len < buf.size())
8599 break;
8600 pointer_address += total_cstr_len;
8601 }
8602 if (total_cstr_len > 0)
8603 s->PutChar('"');
8604 }
8605 }
8606 }
8607 }
8608
DumpTypeDescription(lldb::opaque_compiler_type_t type)8609 void ClangASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type) {
8610 StreamFile s(stdout, false);
8611 DumpTypeDescription(type, &s);
8612
8613 CompilerType ct(this, type);
8614 const clang::Type *clang_type = ClangUtil::GetQualType(ct).getTypePtr();
8615 ClangASTMetadata *metadata = GetMetadata(clang_type);
8616 if (metadata) {
8617 metadata->Dump(&s);
8618 }
8619 }
8620
DumpTypeDescription(lldb::opaque_compiler_type_t type,Stream * s)8621 void ClangASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
8622 Stream *s) {
8623 if (type) {
8624 clang::QualType qual_type =
8625 RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef});
8626
8627 llvm::SmallVector<char, 1024> buf;
8628 llvm::raw_svector_ostream llvm_ostrm(buf);
8629
8630 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8631 switch (type_class) {
8632 case clang::Type::ObjCObject:
8633 case clang::Type::ObjCInterface: {
8634 GetCompleteType(type);
8635
8636 const clang::ObjCObjectType *objc_class_type =
8637 llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8638 assert(objc_class_type);
8639 if (objc_class_type) {
8640 clang::ObjCInterfaceDecl *class_interface_decl =
8641 objc_class_type->getInterface();
8642 if (class_interface_decl) {
8643 clang::PrintingPolicy policy = getASTContext().getPrintingPolicy();
8644 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8645 }
8646 }
8647 } break;
8648
8649 case clang::Type::Typedef: {
8650 const clang::TypedefType *typedef_type =
8651 qual_type->getAs<clang::TypedefType>();
8652 if (typedef_type) {
8653 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8654 std::string clang_typedef_name(
8655 typedef_decl->getQualifiedNameAsString());
8656 if (!clang_typedef_name.empty()) {
8657 s->PutCString("typedef ");
8658 s->PutCString(clang_typedef_name);
8659 }
8660 }
8661 } break;
8662
8663 case clang::Type::Record: {
8664 GetCompleteType(type);
8665
8666 const clang::RecordType *record_type =
8667 llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8668 const clang::RecordDecl *record_decl = record_type->getDecl();
8669 const clang::CXXRecordDecl *cxx_record_decl =
8670 llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8671
8672 if (cxx_record_decl)
8673 cxx_record_decl->print(llvm_ostrm, getASTContext().getPrintingPolicy(),
8674 s->GetIndentLevel());
8675 else
8676 record_decl->print(llvm_ostrm, getASTContext().getPrintingPolicy(),
8677 s->GetIndentLevel());
8678 } break;
8679
8680 default: {
8681 const clang::TagType *tag_type =
8682 llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8683 if (tag_type) {
8684 clang::TagDecl *tag_decl = tag_type->getDecl();
8685 if (tag_decl)
8686 tag_decl->print(llvm_ostrm, 0);
8687 } else {
8688 std::string clang_type_name(qual_type.getAsString());
8689 if (!clang_type_name.empty())
8690 s->PutCString(clang_type_name);
8691 }
8692 }
8693 }
8694
8695 if (buf.size() > 0) {
8696 s->Write(buf.data(), buf.size());
8697 }
8698 }
8699 }
8700
DumpTypeName(const CompilerType & type)8701 void ClangASTContext::DumpTypeName(const CompilerType &type) {
8702 if (ClangUtil::IsClangType(type)) {
8703 clang::QualType qual_type(
8704 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
8705
8706 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8707 switch (type_class) {
8708 case clang::Type::Record: {
8709 const clang::CXXRecordDecl *cxx_record_decl =
8710 qual_type->getAsCXXRecordDecl();
8711 if (cxx_record_decl)
8712 printf("class %s", cxx_record_decl->getName().str().c_str());
8713 } break;
8714
8715 case clang::Type::Enum: {
8716 clang::EnumDecl *enum_decl =
8717 llvm::cast<clang::EnumType>(qual_type)->getDecl();
8718 if (enum_decl) {
8719 printf("enum %s", enum_decl->getName().str().c_str());
8720 }
8721 } break;
8722
8723 case clang::Type::ObjCObject:
8724 case clang::Type::ObjCInterface: {
8725 const clang::ObjCObjectType *objc_class_type =
8726 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8727 if (objc_class_type) {
8728 clang::ObjCInterfaceDecl *class_interface_decl =
8729 objc_class_type->getInterface();
8730 // We currently can't complete objective C types through the newly
8731 // added ASTContext because it only supports TagDecl objects right
8732 // now...
8733 if (class_interface_decl)
8734 printf("@class %s", class_interface_decl->getName().str().c_str());
8735 }
8736 } break;
8737
8738 case clang::Type::Typedef:
8739 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)
8740 ->getDecl()
8741 ->getName()
8742 .str()
8743 .c_str());
8744 break;
8745
8746 case clang::Type::Auto:
8747 printf("auto ");
8748 return DumpTypeName(CompilerType(type.GetTypeSystem(),
8749 llvm::cast<clang::AutoType>(qual_type)
8750 ->getDeducedType()
8751 .getAsOpaquePtr()));
8752
8753 case clang::Type::Elaborated:
8754 printf("elaborated ");
8755 return DumpTypeName(CompilerType(
8756 type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)
8757 ->getNamedType()
8758 .getAsOpaquePtr()));
8759
8760 case clang::Type::Paren:
8761 printf("paren ");
8762 return DumpTypeName(CompilerType(
8763 type.GetTypeSystem(),
8764 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8765
8766 default:
8767 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
8768 break;
8769 }
8770 }
8771 }
8772
ParseClassTemplateDecl(clang::DeclContext * decl_ctx,lldb::AccessType access_type,const char * parent_name,int tag_decl_kind,const ClangASTContext::TemplateParameterInfos & template_param_infos)8773 clang::ClassTemplateDecl *ClangASTContext::ParseClassTemplateDecl(
8774 clang::DeclContext *decl_ctx, lldb::AccessType access_type,
8775 const char *parent_name, int tag_decl_kind,
8776 const ClangASTContext::TemplateParameterInfos &template_param_infos) {
8777 if (template_param_infos.IsValid()) {
8778 std::string template_basename(parent_name);
8779 template_basename.erase(template_basename.find('<'));
8780
8781 return CreateClassTemplateDecl(decl_ctx, access_type,
8782 template_basename.c_str(), tag_decl_kind,
8783 template_param_infos);
8784 }
8785 return nullptr;
8786 }
8787
CompleteTagDecl(clang::TagDecl * decl)8788 void ClangASTContext::CompleteTagDecl(clang::TagDecl *decl) {
8789 SymbolFile *sym_file = GetSymbolFile();
8790 if (sym_file) {
8791 CompilerType clang_type = GetTypeForDecl(decl);
8792 if (clang_type)
8793 sym_file->CompleteType(clang_type);
8794 }
8795 }
8796
CompleteObjCInterfaceDecl(clang::ObjCInterfaceDecl * decl)8797 void ClangASTContext::CompleteObjCInterfaceDecl(
8798 clang::ObjCInterfaceDecl *decl) {
8799 SymbolFile *sym_file = GetSymbolFile();
8800 if (sym_file) {
8801 CompilerType clang_type = GetTypeForDecl(decl);
8802 if (clang_type)
8803 sym_file->CompleteType(clang_type);
8804 }
8805 }
8806
GetDWARFParser()8807 DWARFASTParser *ClangASTContext::GetDWARFParser() {
8808 if (!m_dwarf_ast_parser_up)
8809 m_dwarf_ast_parser_up.reset(new DWARFASTParserClang(*this));
8810 return m_dwarf_ast_parser_up.get();
8811 }
8812
8813 #ifdef LLDB_ENABLE_ALL
GetPDBParser()8814 PDBASTParser *ClangASTContext::GetPDBParser() {
8815 if (!m_pdb_ast_parser_up)
8816 m_pdb_ast_parser_up.reset(new PDBASTParser(*this));
8817 return m_pdb_ast_parser_up.get();
8818 }
8819 #endif // LLDB_ENABLE_ALL
8820
LayoutRecordType(const clang::RecordDecl * record_decl,uint64_t & bit_size,uint64_t & alignment,llvm::DenseMap<const clang::FieldDecl *,uint64_t> & field_offsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & base_offsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & vbase_offsets)8821 bool ClangASTContext::LayoutRecordType(
8822 const clang::RecordDecl *record_decl, uint64_t &bit_size,
8823 uint64_t &alignment,
8824 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
8825 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
8826 &base_offsets,
8827 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
8828 &vbase_offsets) {
8829 lldb_private::ClangASTImporter *importer = nullptr;
8830 if (m_dwarf_ast_parser_up)
8831 importer = &m_dwarf_ast_parser_up->GetClangASTImporter();
8832 #ifdef LLDB_ENABLE_ALL
8833 if (!importer && m_pdb_ast_parser_up)
8834 importer = &m_pdb_ast_parser_up->GetClangASTImporter();
8835 #endif // LLDB_ENABLE_ALL
8836 if (!importer)
8837 return false;
8838
8839 return importer->LayoutRecordType(record_decl, bit_size, alignment,
8840 field_offsets, base_offsets, vbase_offsets);
8841 }
8842
8843 // CompilerDecl override functions
8844
DeclGetName(void * opaque_decl)8845 ConstString ClangASTContext::DeclGetName(void *opaque_decl) {
8846 if (opaque_decl) {
8847 clang::NamedDecl *nd =
8848 llvm::dyn_cast<NamedDecl>((clang::Decl *)opaque_decl);
8849 if (nd != nullptr)
8850 return ConstString(nd->getDeclName().getAsString());
8851 }
8852 return ConstString();
8853 }
8854
DeclGetMangledName(void * opaque_decl)8855 ConstString ClangASTContext::DeclGetMangledName(void *opaque_decl) {
8856 if (opaque_decl) {
8857 clang::NamedDecl *nd =
8858 llvm::dyn_cast<clang::NamedDecl>((clang::Decl *)opaque_decl);
8859 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd)) {
8860 clang::MangleContext *mc = getMangleContext();
8861 if (mc && mc->shouldMangleCXXName(nd)) {
8862 llvm::SmallVector<char, 1024> buf;
8863 llvm::raw_svector_ostream llvm_ostrm(buf);
8864 if (llvm::isa<clang::CXXConstructorDecl>(nd)) {
8865 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd),
8866 Ctor_Complete, llvm_ostrm);
8867 } else if (llvm::isa<clang::CXXDestructorDecl>(nd)) {
8868 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd),
8869 Dtor_Complete, llvm_ostrm);
8870 } else {
8871 mc->mangleName(nd, llvm_ostrm);
8872 }
8873 if (buf.size() > 0)
8874 return ConstString(buf.data(), buf.size());
8875 }
8876 }
8877 }
8878 return ConstString();
8879 }
8880
DeclGetDeclContext(void * opaque_decl)8881 CompilerDeclContext ClangASTContext::DeclGetDeclContext(void *opaque_decl) {
8882 if (opaque_decl)
8883 return CreateDeclContext(((clang::Decl *)opaque_decl)->getDeclContext());
8884 return CompilerDeclContext();
8885 }
8886
DeclGetFunctionReturnType(void * opaque_decl)8887 CompilerType ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl) {
8888 if (clang::FunctionDecl *func_decl =
8889 llvm::dyn_cast<clang::FunctionDecl>((clang::Decl *)opaque_decl))
8890 return GetType(func_decl->getReturnType());
8891 if (clang::ObjCMethodDecl *objc_method =
8892 llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl *)opaque_decl))
8893 return GetType(objc_method->getReturnType());
8894 else
8895 return CompilerType();
8896 }
8897
DeclGetFunctionNumArguments(void * opaque_decl)8898 size_t ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl) {
8899 if (clang::FunctionDecl *func_decl =
8900 llvm::dyn_cast<clang::FunctionDecl>((clang::Decl *)opaque_decl))
8901 return func_decl->param_size();
8902 if (clang::ObjCMethodDecl *objc_method =
8903 llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl *)opaque_decl))
8904 return objc_method->param_size();
8905 else
8906 return 0;
8907 }
8908
DeclGetFunctionArgumentType(void * opaque_decl,size_t idx)8909 CompilerType ClangASTContext::DeclGetFunctionArgumentType(void *opaque_decl,
8910 size_t idx) {
8911 if (clang::FunctionDecl *func_decl =
8912 llvm::dyn_cast<clang::FunctionDecl>((clang::Decl *)opaque_decl)) {
8913 if (idx < func_decl->param_size()) {
8914 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
8915 if (var_decl)
8916 return GetType(var_decl->getOriginalType());
8917 }
8918 } else if (clang::ObjCMethodDecl *objc_method =
8919 llvm::dyn_cast<clang::ObjCMethodDecl>(
8920 (clang::Decl *)opaque_decl)) {
8921 if (idx < objc_method->param_size())
8922 return GetType(objc_method->parameters()[idx]->getOriginalType());
8923 }
8924 return CompilerType();
8925 }
8926
8927 // CompilerDeclContext functions
8928
DeclContextFindDeclByName(void * opaque_decl_ctx,ConstString name,const bool ignore_using_decls)8929 std::vector<CompilerDecl> ClangASTContext::DeclContextFindDeclByName(
8930 void *opaque_decl_ctx, ConstString name, const bool ignore_using_decls) {
8931 std::vector<CompilerDecl> found_decls;
8932 if (opaque_decl_ctx) {
8933 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
8934 std::set<DeclContext *> searched;
8935 std::multimap<DeclContext *, DeclContext *> search_queue;
8936 SymbolFile *symbol_file = GetSymbolFile();
8937
8938 for (clang::DeclContext *decl_context = root_decl_ctx;
8939 decl_context != nullptr && found_decls.empty();
8940 decl_context = decl_context->getParent()) {
8941 search_queue.insert(std::make_pair(decl_context, decl_context));
8942
8943 for (auto it = search_queue.find(decl_context); it != search_queue.end();
8944 it++) {
8945 if (!searched.insert(it->second).second)
8946 continue;
8947 symbol_file->ParseDeclsForContext(
8948 CreateDeclContext(it->second));
8949
8950 for (clang::Decl *child : it->second->decls()) {
8951 if (clang::UsingDirectiveDecl *ud =
8952 llvm::dyn_cast<clang::UsingDirectiveDecl>(child)) {
8953 if (ignore_using_decls)
8954 continue;
8955 clang::DeclContext *from = ud->getCommonAncestor();
8956 if (searched.find(ud->getNominatedNamespace()) == searched.end())
8957 search_queue.insert(
8958 std::make_pair(from, ud->getNominatedNamespace()));
8959 } else if (clang::UsingDecl *ud =
8960 llvm::dyn_cast<clang::UsingDecl>(child)) {
8961 if (ignore_using_decls)
8962 continue;
8963 for (clang::UsingShadowDecl *usd : ud->shadows()) {
8964 clang::Decl *target = usd->getTargetDecl();
8965 if (clang::NamedDecl *nd =
8966 llvm::dyn_cast<clang::NamedDecl>(target)) {
8967 IdentifierInfo *ii = nd->getIdentifier();
8968 if (ii != nullptr &&
8969 ii->getName().equals(name.AsCString(nullptr)))
8970 found_decls.push_back(CompilerDecl(this, nd));
8971 }
8972 }
8973 } else if (clang::NamedDecl *nd =
8974 llvm::dyn_cast<clang::NamedDecl>(child)) {
8975 IdentifierInfo *ii = nd->getIdentifier();
8976 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
8977 found_decls.push_back(CompilerDecl(this, nd));
8978 }
8979 }
8980 }
8981 }
8982 }
8983 return found_decls;
8984 }
8985
8986 // Look for child_decl_ctx's lookup scope in frame_decl_ctx and its parents,
8987 // and return the number of levels it took to find it, or
8988 // LLDB_INVALID_DECL_LEVEL if not found. If the decl was imported via a using
8989 // declaration, its name and/or type, if set, will be used to check that the
8990 // decl found in the scope is a match.
8991 //
8992 // The optional name is required by languages (like C++) to handle using
8993 // declarations like:
8994 //
8995 // void poo();
8996 // namespace ns {
8997 // void foo();
8998 // void goo();
8999 // }
9000 // void bar() {
9001 // using ns::foo;
9002 // // CountDeclLevels returns 0 for 'foo', 1 for 'poo', and
9003 // // LLDB_INVALID_DECL_LEVEL for 'goo'.
9004 // }
9005 //
9006 // The optional type is useful in the case that there's a specific overload
9007 // that we're looking for that might otherwise be shadowed, like:
9008 //
9009 // void foo(int);
9010 // namespace ns {
9011 // void foo();
9012 // }
9013 // void bar() {
9014 // using ns::foo;
9015 // // CountDeclLevels returns 0 for { 'foo', void() },
9016 // // 1 for { 'foo', void(int) }, and
9017 // // LLDB_INVALID_DECL_LEVEL for { 'foo', void(int, int) }.
9018 // }
9019 //
9020 // NOTE: Because file statics are at the TranslationUnit along with globals, a
9021 // function at file scope will return the same level as a function at global
9022 // scope. Ideally we'd like to treat the file scope as an additional scope just
9023 // below the global scope. More work needs to be done to recognise that, if
9024 // the decl we're trying to look up is static, we should compare its source
9025 // file with that of the current scope and return a lower number for it.
CountDeclLevels(clang::DeclContext * frame_decl_ctx,clang::DeclContext * child_decl_ctx,ConstString * child_name,CompilerType * child_type)9026 uint32_t ClangASTContext::CountDeclLevels(clang::DeclContext *frame_decl_ctx,
9027 clang::DeclContext *child_decl_ctx,
9028 ConstString *child_name,
9029 CompilerType *child_type) {
9030 if (frame_decl_ctx) {
9031 std::set<DeclContext *> searched;
9032 std::multimap<DeclContext *, DeclContext *> search_queue;
9033 SymbolFile *symbol_file = GetSymbolFile();
9034
9035 // Get the lookup scope for the decl we're trying to find.
9036 clang::DeclContext *parent_decl_ctx = child_decl_ctx->getParent();
9037
9038 // Look for it in our scope's decl context and its parents.
9039 uint32_t level = 0;
9040 for (clang::DeclContext *decl_ctx = frame_decl_ctx; decl_ctx != nullptr;
9041 decl_ctx = decl_ctx->getParent()) {
9042 if (!decl_ctx->isLookupContext())
9043 continue;
9044 if (decl_ctx == parent_decl_ctx)
9045 // Found it!
9046 return level;
9047 search_queue.insert(std::make_pair(decl_ctx, decl_ctx));
9048 for (auto it = search_queue.find(decl_ctx); it != search_queue.end();
9049 it++) {
9050 if (searched.find(it->second) != searched.end())
9051 continue;
9052
9053 // Currently DWARF has one shared translation unit for all Decls at top
9054 // level, so this would erroneously find using statements anywhere. So
9055 // don't look at the top-level translation unit.
9056 // TODO fix this and add a testcase that depends on it.
9057
9058 if (llvm::isa<clang::TranslationUnitDecl>(it->second))
9059 continue;
9060
9061 searched.insert(it->second);
9062 symbol_file->ParseDeclsForContext(
9063 CreateDeclContext(it->second));
9064
9065 for (clang::Decl *child : it->second->decls()) {
9066 if (clang::UsingDirectiveDecl *ud =
9067 llvm::dyn_cast<clang::UsingDirectiveDecl>(child)) {
9068 clang::DeclContext *ns = ud->getNominatedNamespace();
9069 if (ns == parent_decl_ctx)
9070 // Found it!
9071 return level;
9072 clang::DeclContext *from = ud->getCommonAncestor();
9073 if (searched.find(ns) == searched.end())
9074 search_queue.insert(std::make_pair(from, ns));
9075 } else if (child_name) {
9076 if (clang::UsingDecl *ud =
9077 llvm::dyn_cast<clang::UsingDecl>(child)) {
9078 for (clang::UsingShadowDecl *usd : ud->shadows()) {
9079 clang::Decl *target = usd->getTargetDecl();
9080 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target);
9081 if (!nd)
9082 continue;
9083 // Check names.
9084 IdentifierInfo *ii = nd->getIdentifier();
9085 if (ii == nullptr ||
9086 !ii->getName().equals(child_name->AsCString(nullptr)))
9087 continue;
9088 // Check types, if one was provided.
9089 if (child_type) {
9090 CompilerType clang_type = GetTypeForDecl(nd);
9091 if (!AreTypesSame(clang_type, *child_type,
9092 /*ignore_qualifiers=*/true))
9093 continue;
9094 }
9095 // Found it!
9096 return level;
9097 }
9098 }
9099 }
9100 }
9101 }
9102 ++level;
9103 }
9104 }
9105 return LLDB_INVALID_DECL_LEVEL;
9106 }
9107
DeclContextGetName(void * opaque_decl_ctx)9108 ConstString ClangASTContext::DeclContextGetName(void *opaque_decl_ctx) {
9109 if (opaque_decl_ctx) {
9110 clang::NamedDecl *named_decl =
9111 llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
9112 if (named_decl)
9113 return ConstString(named_decl->getName());
9114 }
9115 return ConstString();
9116 }
9117
9118 ConstString
DeclContextGetScopeQualifiedName(void * opaque_decl_ctx)9119 ClangASTContext::DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) {
9120 if (opaque_decl_ctx) {
9121 clang::NamedDecl *named_decl =
9122 llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
9123 if (named_decl)
9124 return ConstString(
9125 llvm::StringRef(named_decl->getQualifiedNameAsString()));
9126 }
9127 return ConstString();
9128 }
9129
DeclContextIsClassMethod(void * opaque_decl_ctx,lldb::LanguageType * language_ptr,bool * is_instance_method_ptr,ConstString * language_object_name_ptr)9130 bool ClangASTContext::DeclContextIsClassMethod(
9131 void *opaque_decl_ctx, lldb::LanguageType *language_ptr,
9132 bool *is_instance_method_ptr, ConstString *language_object_name_ptr) {
9133 if (opaque_decl_ctx) {
9134 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
9135 if (ObjCMethodDecl *objc_method =
9136 llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx)) {
9137 if (is_instance_method_ptr)
9138 *is_instance_method_ptr = objc_method->isInstanceMethod();
9139 if (language_ptr)
9140 *language_ptr = eLanguageTypeObjC;
9141 if (language_object_name_ptr)
9142 language_object_name_ptr->SetCString("self");
9143 return true;
9144 } else if (CXXMethodDecl *cxx_method =
9145 llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx)) {
9146 if (is_instance_method_ptr)
9147 *is_instance_method_ptr = cxx_method->isInstance();
9148 if (language_ptr)
9149 *language_ptr = eLanguageTypeC_plus_plus;
9150 if (language_object_name_ptr)
9151 language_object_name_ptr->SetCString("this");
9152 return true;
9153 } else if (clang::FunctionDecl *function_decl =
9154 llvm::dyn_cast<clang::FunctionDecl>(decl_ctx)) {
9155 ClangASTMetadata *metadata = GetMetadata(function_decl);
9156 if (metadata && metadata->HasObjectPtr()) {
9157 if (is_instance_method_ptr)
9158 *is_instance_method_ptr = true;
9159 if (language_ptr)
9160 *language_ptr = eLanguageTypeObjC;
9161 if (language_object_name_ptr)
9162 language_object_name_ptr->SetCString(metadata->GetObjectPtrName());
9163 return true;
9164 }
9165 }
9166 }
9167 return false;
9168 }
9169
DeclContextIsContainedInLookup(void * opaque_decl_ctx,void * other_opaque_decl_ctx)9170 bool ClangASTContext::DeclContextIsContainedInLookup(
9171 void *opaque_decl_ctx, void *other_opaque_decl_ctx) {
9172 auto *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
9173 auto *other = (clang::DeclContext *)other_opaque_decl_ctx;
9174
9175 do {
9176 // A decl context always includes its own contents in its lookup.
9177 if (decl_ctx == other)
9178 return true;
9179
9180 // If we have an inline namespace, then the lookup of the parent context
9181 // also includes the inline namespace contents.
9182 } while (other->isInlineNamespace() && (other = other->getParent()));
9183
9184 return false;
9185 }
9186
IsClangDeclContext(const CompilerDeclContext & dc)9187 static bool IsClangDeclContext(const CompilerDeclContext &dc) {
9188 return dc.IsValid() && isa<ClangASTContext>(dc.GetTypeSystem());
9189 }
9190
9191 clang::DeclContext *
DeclContextGetAsDeclContext(const CompilerDeclContext & dc)9192 ClangASTContext::DeclContextGetAsDeclContext(const CompilerDeclContext &dc) {
9193 if (IsClangDeclContext(dc))
9194 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
9195 return nullptr;
9196 }
9197
9198 ObjCMethodDecl *
DeclContextGetAsObjCMethodDecl(const CompilerDeclContext & dc)9199 ClangASTContext::DeclContextGetAsObjCMethodDecl(const CompilerDeclContext &dc) {
9200 if (IsClangDeclContext(dc))
9201 return llvm::dyn_cast<clang::ObjCMethodDecl>(
9202 (clang::DeclContext *)dc.GetOpaqueDeclContext());
9203 return nullptr;
9204 }
9205
9206 CXXMethodDecl *
DeclContextGetAsCXXMethodDecl(const CompilerDeclContext & dc)9207 ClangASTContext::DeclContextGetAsCXXMethodDecl(const CompilerDeclContext &dc) {
9208 if (IsClangDeclContext(dc))
9209 return llvm::dyn_cast<clang::CXXMethodDecl>(
9210 (clang::DeclContext *)dc.GetOpaqueDeclContext());
9211 return nullptr;
9212 }
9213
9214 clang::FunctionDecl *
DeclContextGetAsFunctionDecl(const CompilerDeclContext & dc)9215 ClangASTContext::DeclContextGetAsFunctionDecl(const CompilerDeclContext &dc) {
9216 if (IsClangDeclContext(dc))
9217 return llvm::dyn_cast<clang::FunctionDecl>(
9218 (clang::DeclContext *)dc.GetOpaqueDeclContext());
9219 return nullptr;
9220 }
9221
9222 clang::NamespaceDecl *
DeclContextGetAsNamespaceDecl(const CompilerDeclContext & dc)9223 ClangASTContext::DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc) {
9224 if (IsClangDeclContext(dc))
9225 return llvm::dyn_cast<clang::NamespaceDecl>(
9226 (clang::DeclContext *)dc.GetOpaqueDeclContext());
9227 return nullptr;
9228 }
9229
9230 ClangASTMetadata *
DeclContextGetMetaData(const CompilerDeclContext & dc,const Decl * object)9231 ClangASTContext::DeclContextGetMetaData(const CompilerDeclContext &dc,
9232 const Decl *object) {
9233 ClangASTContext *ast = llvm::cast<ClangASTContext>(dc.GetTypeSystem());
9234 return ast->GetMetadata(object);
9235 }
9236
9237 clang::ASTContext *
DeclContextGetClangASTContext(const CompilerDeclContext & dc)9238 ClangASTContext::DeclContextGetClangASTContext(const CompilerDeclContext &dc) {
9239 ClangASTContext *ast =
9240 llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
9241 if (ast)
9242 return &ast->getASTContext();
9243 return nullptr;
9244 }
9245
ClangASTContextForExpressions(Target & target,llvm::Triple triple)9246 ClangASTContextForExpressions::ClangASTContextForExpressions(
9247 Target &target, llvm::Triple triple)
9248 : ClangASTContext(triple), m_target_wp(target.shared_from_this()),
9249 m_persistent_variables(new ClangPersistentVariables) {
9250 m_scratch_ast_source_up.reset(new ClangASTSource(
9251 target.shared_from_this(), target.GetClangASTImporter()));
9252 m_scratch_ast_source_up->InstallASTContext(*this);
9253 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(
9254 m_scratch_ast_source_up->CreateProxy());
9255 SetExternalSource(proxy_ast_source);
9256 }
9257
Finalize()9258 void ClangASTContextForExpressions::Finalize() {
9259 ClangASTContext::Finalize();
9260 m_scratch_ast_source_up.reset();
9261 }
9262
GetUserExpression(llvm::StringRef expr,llvm::StringRef prefix,lldb::LanguageType language,Expression::ResultType desired_type,const EvaluateExpressionOptions & options,ValueObject * ctx_obj)9263 UserExpression *ClangASTContextForExpressions::GetUserExpression(
9264 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language,
9265 Expression::ResultType desired_type,
9266 const EvaluateExpressionOptions &options,
9267 ValueObject *ctx_obj) {
9268 TargetSP target_sp = m_target_wp.lock();
9269 if (!target_sp)
9270 return nullptr;
9271
9272 return new ClangUserExpression(*target_sp.get(), expr, prefix, language,
9273 desired_type, options, ctx_obj);
9274 }
9275
GetFunctionCaller(const CompilerType & return_type,const Address & function_address,const ValueList & arg_value_list,const char * name)9276 FunctionCaller *ClangASTContextForExpressions::GetFunctionCaller(
9277 const CompilerType &return_type, const Address &function_address,
9278 const ValueList &arg_value_list, const char *name) {
9279 TargetSP target_sp = m_target_wp.lock();
9280 if (!target_sp)
9281 return nullptr;
9282
9283 Process *process = target_sp->GetProcessSP().get();
9284 if (!process)
9285 return nullptr;
9286
9287 return new ClangFunctionCaller(*process, return_type, function_address,
9288 arg_value_list, name);
9289 }
9290
9291 UtilityFunction *
GetUtilityFunction(const char * text,const char * name)9292 ClangASTContextForExpressions::GetUtilityFunction(const char *text,
9293 const char *name) {
9294 TargetSP target_sp = m_target_wp.lock();
9295 if (!target_sp)
9296 return nullptr;
9297
9298 return new ClangUtilityFunction(*target_sp.get(), text, name);
9299 }
9300
9301 PersistentExpressionState *
GetPersistentExpressionState()9302 ClangASTContextForExpressions::GetPersistentExpressionState() {
9303 return m_persistent_variables.get();
9304 }
9305