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