LLDB mainline
TypeSystemClang.h
Go to the documentation of this file.
1//===-- TypeSystemClang.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_SOURCE_PLUGINS_TYPESYSTEM_CLANG_TYPESYSTEMCLANG_H
10#define LLDB_SOURCE_PLUGINS_TYPESYSTEM_CLANG_TYPESYSTEMCLANG_H
11
12#include <cstdint>
13
14#include <functional>
15#include <initializer_list>
16#include <memory>
17#include <optional>
18#include <set>
19#include <string>
20#include <utility>
21#include <vector>
22
23#include "clang/AST/ASTContext.h"
24#include "clang/AST/ASTFwd.h"
25#include "clang/AST/TemplateBase.h"
26#include "clang/AST/Type.h"
27#include "clang/Basic/TargetInfo.h"
28#include "llvm/ADT/APSInt.h"
29#include "llvm/ADT/SmallVector.h"
30
35#include "lldb/Target/Target.h"
37#include "lldb/Utility/Flags.h"
38#include "lldb/Utility/Log.h"
40
42class PDBASTParser;
43
44namespace clang {
45class FileManager;
46class HeaderSearch;
47class ModuleMap;
48} // namespace clang
49
50namespace lldb_private {
51
52class ClangASTMetadata;
53class ClangASTSource;
54class Declaration;
55
56/// A Clang module ID.
58 unsigned m_id = 0;
59
60public:
62 explicit OptionalClangModuleID(unsigned id) : m_id(id) {}
63 bool HasValue() const { return m_id != 0; }
64 unsigned GetValue() const { return m_id; }
65};
66
67/// The implementation of lldb::Type's m_payload field for TypeSystemClang.
69 /// The Layout is as follows:
70 /// \verbatim
71 /// bit 0..30 ... Owning Module ID.
72 /// bit 31 ...... IsCompleteObjCClass.
73 /// \endverbatim
75
76public:
77 TypePayloadClang() = default;
78 explicit TypePayloadClang(OptionalClangModuleID owning_module,
79 bool is_complete_objc_class = false);
80 explicit TypePayloadClang(uint32_t opaque_payload) : m_payload(opaque_payload) {}
81 operator Type::Payload() { return m_payload; }
82
83 static constexpr unsigned ObjCClassBit = 1 << 31;
85 void SetIsCompleteObjCClass(bool is_complete_objc_class) {
86 m_payload = is_complete_objc_class ? Flags(m_payload).Set(ObjCClassBit)
88 }
91 }
93 /// \}
94};
95
96/// A TypeSystem implementation based on Clang.
97///
98/// This class uses a single clang::ASTContext as the backend for storing
99/// its types and declarations. Every clang::ASTContext should also just have
100/// a single associated TypeSystemClang instance that manages it.
101///
102/// The clang::ASTContext instance can either be created by TypeSystemClang
103/// itself or it can adopt an existing clang::ASTContext (for example, when
104/// it is necessary to provide a TypeSystem interface for an existing
105/// clang::ASTContext that was created by clang::CompilerInstance).
107 // LLVM RTTI support
108 static char ID;
109
110public:
111 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
112 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
113 clang::ObjCInterfaceDecl *);
114
115 // llvm casting support
116 bool isA(const void *ClassID) const override { return ClassID == &ID; }
117 static bool classof(const TypeSystem *ts) { return ts->isA(&ID); }
118
119 /// Constructs a TypeSystemClang with an ASTContext using the given triple.
120 ///
121 /// \param name The name for the TypeSystemClang (for logging purposes)
122 /// \param triple The llvm::Triple used for the ASTContext. The triple defines
123 /// certain characteristics of the ASTContext and its types
124 /// (e.g., whether certain primitive types exist or what their
125 /// signedness is).
126 explicit TypeSystemClang(llvm::StringRef name, llvm::Triple triple);
127
128 /// Constructs a TypeSystemClang that uses an existing ASTContext internally.
129 /// Useful when having an existing ASTContext created by Clang.
130 ///
131 /// \param name The name for the TypeSystemClang (for logging purposes)
132 /// \param existing_ctxt An existing ASTContext.
133 explicit TypeSystemClang(llvm::StringRef name,
134 clang::ASTContext &existing_ctxt);
135
136 ~TypeSystemClang() override;
137
138 void Finalize() override;
139
140 // PluginInterface functions
141 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
142
143 static llvm::StringRef GetPluginNameStatic() { return "clang"; }
144
145 static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language,
146 Module *module, Target *target);
147
150
151 static void Initialize();
152
153 static void Terminate();
154
155 static TypeSystemClang *GetASTContext(clang::ASTContext *ast_ctx);
156
157 /// Returns the display name of this TypeSystemClang that indicates what
158 /// purpose it serves in LLDB. Used for example in logs.
159 llvm::StringRef getDisplayName() const { return m_display_name; }
160
161 /// Returns the clang::ASTContext instance managed by this TypeSystemClang.
162 clang::ASTContext &getASTContext();
163
164 clang::MangleContext *getMangleContext();
165
166 std::shared_ptr<clang::TargetOptions> &getTargetOptions();
167
168 clang::TargetInfo *getTargetInfo();
169
170 void setSema(clang::Sema *s);
171 clang::Sema *getSema() { return m_sema; }
172
173 const char *GetTargetTriple();
174
176 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> &ast_source_up);
177
178 bool GetCompleteDecl(clang::Decl *decl) {
180 }
181
182 static void DumpDeclHiearchy(clang::Decl *decl);
183
184 static void DumpDeclContextHiearchy(clang::DeclContext *decl_ctx);
185
186 static bool DeclsAreEquivalent(clang::Decl *lhs_decl, clang::Decl *rhs_decl);
187
188 static bool GetCompleteDecl(clang::ASTContext *ast, clang::Decl *decl);
189
190 void SetMetadataAsUserID(const clang::Decl *decl, lldb::user_id_t user_id);
191 void SetMetadataAsUserID(const clang::Type *type, lldb::user_id_t user_id);
192
193 void SetMetadata(const clang::Decl *object, ClangASTMetadata &meta_data);
194
195 void SetMetadata(const clang::Type *object, ClangASTMetadata &meta_data);
196 ClangASTMetadata *GetMetadata(const clang::Decl *object);
197 ClangASTMetadata *GetMetadata(const clang::Type *object);
198
199 void SetCXXRecordDeclAccess(const clang::CXXRecordDecl *object,
200 clang::AccessSpecifier access);
201 clang::AccessSpecifier
202 GetCXXRecordDeclAccess(const clang::CXXRecordDecl *object);
203
204 // Basic Types
206 size_t bit_size) override;
207
209
211
213 GetBuiltinTypeForDWARFEncodingAndBitSize(llvm::StringRef type_name,
214 uint32_t dw_ate, uint32_t bit_size);
215
216 CompilerType GetCStringType(bool is_const);
217
218 static clang::DeclContext *GetDeclContextForType(clang::QualType type);
219
220 static clang::DeclContext *GetDeclContextForType(const CompilerType &type);
221
222 uint32_t GetPointerByteSize() override;
223
224 clang::TranslationUnitDecl *GetTranslationUnitDecl() {
225 return getASTContext().getTranslationUnitDecl();
226 }
227
228 static bool AreTypesSame(CompilerType type1, CompilerType type2,
229 bool ignore_qualifiers = false);
230
231 /// Creates a CompilerType from the given QualType with the current
232 /// TypeSystemClang instance as the CompilerType's typesystem.
233 /// \param qt The QualType for a type that belongs to the ASTContext of this
234 /// TypeSystemClang.
235 /// \return The CompilerType representing the given QualType. If the
236 /// QualType's type pointer is a nullptr then the function returns an
237 /// invalid CompilerType.
238 CompilerType GetType(clang::QualType qt) {
239 if (qt.getTypePtrOrNull() == nullptr)
240 return CompilerType();
241 // Check that the type actually belongs to this TypeSystemClang.
242 assert(qt->getAsTagDecl() == nullptr ||
243 &qt->getAsTagDecl()->getASTContext() == &getASTContext());
244 return CompilerType(weak_from_this(), qt.getAsOpaquePtr());
245 }
246
247 CompilerType GetTypeForDecl(clang::NamedDecl *decl);
248
249 CompilerType GetTypeForDecl(clang::TagDecl *decl);
250
251 CompilerType GetTypeForDecl(clang::ObjCInterfaceDecl *objc_decl);
252
253 template <typename RecordDeclType>
256 clang::DeclContext *decl_context = nullptr) {
257 CompilerType compiler_type;
258
259 if (type_name.GetLength()) {
260 clang::ASTContext &ast = getASTContext();
261 if (!decl_context)
262 decl_context = ast.getTranslationUnitDecl();
263
264 clang::IdentifierInfo &myIdent = ast.Idents.get(type_name.GetCString());
265 clang::DeclarationName myName =
266 ast.DeclarationNames.getIdentifier(&myIdent);
267
268 clang::DeclContext::lookup_result result = decl_context->lookup(myName);
269
270 if (!result.empty()) {
271 clang::NamedDecl *named_decl = *result.begin();
272 if (const RecordDeclType *record_decl =
273 llvm::dyn_cast<RecordDeclType>(named_decl))
274 compiler_type =
275 CompilerType(weak_from_this(),
276 clang::QualType(record_decl->getTypeForDecl(), 0)
277 .getAsOpaquePtr());
278 }
279 }
280
281 return compiler_type;
282 }
283
285 ConstString type_name,
286 const std::initializer_list<std::pair<const char *, CompilerType>>
287 &type_fields,
288 bool packed = false);
289
291 ConstString type_name,
292 const std::initializer_list<std::pair<const char *, CompilerType>>
293 &type_fields,
294 bool packed = false);
295
296 static bool IsOperator(llvm::StringRef name,
297 clang::OverloadedOperatorKind &op_kind);
298
299 // Structure, Unions, Classes
300
301 static clang::AccessSpecifier
303
304 static clang::AccessSpecifier
305 UnifyAccessSpecifiers(clang::AccessSpecifier lhs, clang::AccessSpecifier rhs);
306
307 uint32_t GetNumBaseClasses(const clang::CXXRecordDecl *cxx_record_decl,
308 bool omit_empty_base_classes);
309
310 uint32_t GetIndexForRecordChild(const clang::RecordDecl *record_decl,
311 clang::NamedDecl *canonical_decl,
312 bool omit_empty_base_classes);
313
314 uint32_t GetIndexForRecordBase(const clang::RecordDecl *record_decl,
315 const clang::CXXBaseSpecifier *base_spec,
316 bool omit_empty_base_classes);
317
318 /// Synthesize a clang::Module and return its ID or a default-constructed ID.
321 bool is_framework = false,
322 bool is_explicit = false);
323
324 CompilerType CreateRecordType(clang::DeclContext *decl_ctx,
325 OptionalClangModuleID owning_module,
326 lldb::AccessType access_type,
327 llvm::StringRef name, int kind,
328 lldb::LanguageType language,
329 ClangASTMetadata *metadata = nullptr,
330 bool exports_symbols = false);
331
333 public:
335 TemplateParameterInfos(llvm::ArrayRef<const char *> names_in,
336 llvm::ArrayRef<clang::TemplateArgument> args_in)
337 : names(names_in), args(args_in) {
338 assert(names.size() == args_in.size());
339 }
340
343
346
348
349 bool IsValid() const {
350 // Having a pack name but no packed args doesn't make sense, so mark
351 // these template parameters as invalid.
352 if (pack_name && !packed_args)
353 return false;
354 return args.size() == names.size() &&
355 (!packed_args || !packed_args->packed_args);
356 }
357
358 bool IsEmpty() const { return args.empty(); }
359 size_t Size() const { return args.size(); }
360
361 llvm::ArrayRef<clang::TemplateArgument> GetArgs() const { return args; }
362 llvm::ArrayRef<const char *> GetNames() const { return names; }
363
364 clang::TemplateArgument const &Front() const {
365 assert(!args.empty());
366 return args.front();
367 }
368
369 void InsertArg(char const *name, clang::TemplateArgument arg) {
370 args.emplace_back(std::move(arg));
371 names.push_back(name);
372 }
373
374 // Parameter pack related
375
376 bool hasParameterPack() const { return static_cast<bool>(packed_args); }
377
379 assert(packed_args != nullptr);
380 return *packed_args;
381 }
382
384 assert(packed_args != nullptr);
385 return *packed_args;
386 }
387
388 llvm::ArrayRef<clang::TemplateArgument> GetParameterPackArgs() const {
389 assert(packed_args != nullptr);
390 return packed_args->GetArgs();
391 }
392
393 bool HasPackName() const { return pack_name && pack_name[0]; }
394
395 llvm::StringRef GetPackName() const {
396 assert(HasPackName());
397 return pack_name;
398 }
399
400 void SetPackName(char const *name) { pack_name = name; }
401
402 void SetParameterPack(std::unique_ptr<TemplateParameterInfos> args) {
403 packed_args = std::move(args);
404 }
405
406 private:
407 /// Element 'names[i]' holds the template argument name
408 /// of 'args[i]'
409 llvm::SmallVector<const char *, 2> names;
410 llvm::SmallVector<clang::TemplateArgument, 2> args;
411
412 const char * pack_name = nullptr;
413 std::unique_ptr<TemplateParameterInfos> packed_args;
414 };
415
416 clang::FunctionTemplateDecl *CreateFunctionTemplateDecl(
417 clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
418 clang::FunctionDecl *func_decl, const TemplateParameterInfos &infos);
419
421 clang::FunctionDecl *func_decl, clang::FunctionTemplateDecl *Template,
422 const TemplateParameterInfos &infos);
423
424 clang::ClassTemplateDecl *CreateClassTemplateDecl(
425 clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
426 lldb::AccessType access_type, llvm::StringRef class_name, int kind,
427 const TemplateParameterInfos &infos);
428
429 clang::TemplateTemplateParmDecl *
430 CreateTemplateTemplateParmDecl(const char *template_name);
431
432 clang::ClassTemplateSpecializationDecl *CreateClassTemplateSpecializationDecl(
433 clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
434 clang::ClassTemplateDecl *class_template_decl, int kind,
435 const TemplateParameterInfos &infos);
436
438 CreateClassTemplateSpecializationType(clang::ClassTemplateSpecializationDecl *
439 class_template_specialization_decl);
440
441 static clang::DeclContext *
442 GetAsDeclContext(clang::FunctionDecl *function_decl);
443
445 bool is_method, clang::OverloadedOperatorKind op_kind,
446 uint32_t num_params);
447
448 bool FieldIsBitfield(clang::FieldDecl *field, uint32_t &bitfield_bit_size);
449
450 bool RecordHasFields(const clang::RecordDecl *record_decl);
451
452 bool BaseSpecifierIsEmpty(const clang::CXXBaseSpecifier *b);
453
454 CompilerType CreateObjCClass(llvm::StringRef name,
455 clang::DeclContext *decl_ctx,
456 OptionalClangModuleID owning_module,
457 bool isForwardDecl, bool isInternal,
458 ClangASTMetadata *metadata = nullptr);
459
460 // Returns a mask containing bits from the TypeSystemClang::eTypeXXX
461 // enumerations
462
463 // Namespace Declarations
464
465 clang::NamespaceDecl *
466 GetUniqueNamespaceDeclaration(const char *name, clang::DeclContext *decl_ctx,
467 OptionalClangModuleID owning_module,
468 bool is_inline = false);
469
470 // Function Types
471
472 clang::FunctionDecl *CreateFunctionDeclaration(
473 clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
474 llvm::StringRef name, const CompilerType &function_Type,
475 clang::StorageClass storage, bool is_inline);
476
478 CreateFunctionType(const CompilerType &result_type, const CompilerType *args,
479 unsigned num_args, bool is_variadic, unsigned type_quals,
480 clang::CallingConv cc = clang::CC_C,
481 clang::RefQualifierKind ref_qual = clang::RQ_None);
482
483 clang::ParmVarDecl *
484 CreateParameterDeclaration(clang::DeclContext *decl_ctx,
485 OptionalClangModuleID owning_module,
486 const char *name, const CompilerType &param_type,
487 int storage, bool add_decl = false);
488
489 void SetFunctionParameters(clang::FunctionDecl *function_decl,
490 llvm::ArrayRef<clang::ParmVarDecl *> params);
491
493
494 // Array Types
495
496 CompilerType CreateArrayType(const CompilerType &element_type,
497 size_t element_count, bool is_vector);
498
499 // Enumeration Types
500 CompilerType CreateEnumerationType(llvm::StringRef name,
501 clang::DeclContext *decl_ctx,
502 OptionalClangModuleID owning_module,
503 const Declaration &decl,
504 const CompilerType &integer_qual_type,
505 bool is_scoped);
506
507 // Integer type functions
508
509 CompilerType GetIntTypeFromBitSize(size_t bit_size, bool is_signed);
510
511 CompilerType GetPointerSizedIntType(bool is_signed);
512
513 // Floating point functions
514
515 static CompilerType GetFloatTypeFromBitSize(clang::ASTContext *ast,
516 size_t bit_size);
517
518 // TypeSystem methods
519 DWARFASTParser *GetDWARFParser() override;
520 PDBASTParser *GetPDBParser() override;
522
523 // TypeSystemClang callbacks for external source lookups.
524 void CompleteTagDecl(clang::TagDecl *);
525
526 void CompleteObjCInterfaceDecl(clang::ObjCInterfaceDecl *);
527
528 bool LayoutRecordType(
529 const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment,
530 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
531 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
532 &base_offsets,
533 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
534 &vbase_offsets);
535
536 /// Creates a CompilerDecl from the given Decl with the current
537 /// TypeSystemClang instance as its typesystem.
538 /// The Decl has to come from the ASTContext of this
539 /// TypeSystemClang.
540 CompilerDecl GetCompilerDecl(clang::Decl *decl) {
541 assert(&decl->getASTContext() == &getASTContext() &&
542 "CreateCompilerDecl for Decl from wrong ASTContext?");
543 return CompilerDecl(this, decl);
544 }
545
546 // CompilerDecl override functions
547 ConstString DeclGetName(void *opaque_decl) override;
548
549 ConstString DeclGetMangledName(void *opaque_decl) override;
550
551 CompilerDeclContext DeclGetDeclContext(void *opaque_decl) override;
552
553 CompilerType DeclGetFunctionReturnType(void *opaque_decl) override;
554
555 size_t DeclGetFunctionNumArguments(void *opaque_decl) override;
556
558 size_t arg_idx) override;
559
560 CompilerType GetTypeForDecl(void *opaque_decl) override;
561
562 // CompilerDeclContext override functions
563
564 /// Creates a CompilerDeclContext from the given DeclContext
565 /// with the current TypeSystemClang instance as its typesystem.
566 /// The DeclContext has to come from the ASTContext of this
567 /// TypeSystemClang.
568 CompilerDeclContext CreateDeclContext(clang::DeclContext *ctx);
569
570 /// Set the owning module for \p decl.
571 static void SetOwningModule(clang::Decl *decl,
572 OptionalClangModuleID owning_module);
573
574 std::vector<CompilerDecl>
575 DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
576 const bool ignore_using_decls) override;
577
578 ConstString DeclContextGetName(void *opaque_decl_ctx) override;
579
580 ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override;
581
582 bool DeclContextIsClassMethod(void *opaque_decl_ctx,
583 lldb::LanguageType *language_ptr,
584 bool *is_instance_method_ptr,
585 ConstString *language_object_name_ptr) override;
586
587 bool DeclContextIsContainedInLookup(void *opaque_decl_ctx,
588 void *other_opaque_decl_ctx) override;
589
590 // Clang specific clang::DeclContext functions
591
592 static clang::DeclContext *
594
595 static clang::ObjCMethodDecl *
597
598 static clang::CXXMethodDecl *
600
601 static clang::FunctionDecl *
603
604 static clang::NamespaceDecl *
606
608 const clang::Decl *object);
609
610 static clang::ASTContext *
612
613 // Tests
614
615#ifndef NDEBUG
616 bool Verify(lldb::opaque_compiler_type_t type) override;
617#endif
618
620 CompilerType *element_type, uint64_t *size,
621 bool *is_incomplete) override;
622
624 CompilerType *element_type, uint64_t *size) override;
625
627
629
631
632 bool IsCharType(lldb::opaque_compiler_type_t type) override;
633
635
636 bool IsConst(lldb::opaque_compiler_type_t type) override;
637
639 uint32_t &length) override;
640
641 static bool IsCXXClassType(const CompilerType &type);
642
643 bool IsDefined(lldb::opaque_compiler_type_t type) override;
644
646 bool &is_complex) override;
647
649
651 CompilerType *base_type_ptr) override;
652
653 size_t
655
657 const size_t index) override;
658
660
662 CompilerType *function_pointer_type_ptr) override;
663
665 bool &is_signed) override;
666
668 bool &is_signed) override;
669
671
672 static bool IsObjCClassType(const CompilerType &type);
673
674 static bool IsObjCClassTypeAndHasIVars(const CompilerType &type,
675 bool check_superclass);
676
677 static bool IsObjCObjectOrInterfaceType(const CompilerType &type);
678
679 static bool IsObjCObjectPointerType(const CompilerType &type,
680 CompilerType *target_type = nullptr);
681
683
685
687
689 CompilerType *target_type, // Can pass nullptr
690 bool check_cplusplus, bool check_objc) override;
691
693
695 CompilerType *pointee_type) override;
696
698 CompilerType *pointee_type) override;
699
701 CompilerType *pointee_type, bool *is_rvalue) override;
702
703 bool IsScalarType(lldb::opaque_compiler_type_t type) override;
704
706
707 bool IsVoidType(lldb::opaque_compiler_type_t type) override;
708
709 bool CanPassInRegisters(const CompilerType &type) override;
710
711 bool SupportsLanguage(lldb::LanguageType language) override;
712
713 static std::optional<std::string> GetCXXClassName(const CompilerType &type);
714
715 // Type Completion
716
718
720
721 // Accessors
722
724 bool base_only) override;
725
727
729 CompilerType *pointee_or_element_compiler_type) override;
730
733
734 lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override;
735
736 unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override;
737
738 // Creating related types
739
741 ExecutionContextScope *exe_scope) override;
742
744 uint64_t size) override;
745
747
750
753
754 // Returns -1 if this isn't a function of if the function doesn't have a
755 // prototype Returns a value >= 0 if there is a prototype.
757
759 size_t idx) override;
760
763
765
768 size_t idx) override;
769
771
773
775
778
781
783
785
787
789
790 /// Using the current type, create a new typedef to that type using
791 /// "typedef_name" as the name and "decl_ctx" as the decl context.
792 /// \param opaque_payload is an opaque TypePayloadClang.
794 const char *name,
795 const CompilerDeclContext &decl_ctx,
796 uint32_t opaque_payload) override;
797
798 // If the current object represents a typedef type, get the underlying type
800
801 // Create related types using the current type's AST
803
804 // Exploring the type
805
806 const llvm::fltSemantics &GetFloatTypeSemantics(size_t byte_size) override;
807
808 std::optional<uint64_t> GetByteSize(lldb::opaque_compiler_type_t type,
809 ExecutionContextScope *exe_scope) {
810 if (std::optional<uint64_t> bit_size = GetBitSize(type, exe_scope))
811 return (*bit_size + 7) / 8;
812 return std::nullopt;
813 }
814
815 std::optional<uint64_t> GetBitSize(lldb::opaque_compiler_type_t type,
816 ExecutionContextScope *exe_scope) override;
817
819 uint64_t &count) override;
820
822
823 std::optional<size_t>
825 ExecutionContextScope *exe_scope) override;
826
828 bool omit_empty_base_classes,
829 const ExecutionContext *exe_ctx) override;
830
832
835
836 static lldb::BasicType
838 ConstString name);
839
842 std::function<bool(const CompilerType &integer_type,
843 ConstString name,
844 const llvm::APSInt &value)> const &callback) override;
845
847
849 std::string &name, uint64_t *bit_offset_ptr,
850 uint32_t *bitfield_bit_size_ptr,
851 bool *is_bitfield_ptr) override;
852
854
856
858 size_t idx,
859 uint32_t *bit_offset_ptr) override;
860
862 size_t idx,
863 uint32_t *bit_offset_ptr) override;
864
865 static uint32_t GetNumPointeeChildren(clang::QualType type);
866
868 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
869 bool transparent_pointers, bool omit_empty_base_classes,
870 bool ignore_array_bounds, std::string &child_name,
871 uint32_t &child_byte_size, int32_t &child_byte_offset,
872 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
873 bool &child_is_base_class, bool &child_is_deref_of_parent,
874 ValueObject *valobj, uint64_t &language_flags) override;
875
876 // Lookup a child given a name. This function will match base class names and
877 // member member names in "clang_type" only, not descendants.
879 const char *name,
880 bool omit_empty_base_classes) override;
881
882 // Lookup a child member given a name. This function will match member names
883 // only and will descend into "clang_type" children in search for the first
884 // member in this class, or any base class that matches "name".
885 // TODO: Return all matches for a given name by returning a
886 // vector<vector<uint32_t>>
887 // so we catch all names that match a given child name, not just the first.
888 size_t
890 const char *name, bool omit_empty_base_classes,
891 std::vector<uint32_t> &child_indexes) override;
892
894
896 bool expand_pack) override;
897
900 bool expand_pack) override;
902 size_t idx, bool expand_pack) override;
903 std::optional<CompilerType::IntegralTemplateArgument>
905 bool expand_pack) override;
906
907 CompilerType GetTypeForFormatters(void *type) override;
908
909#define LLDB_INVALID_DECL_LEVEL UINT32_MAX
910 // LLDB_INVALID_DECL_LEVEL is returned by CountDeclLevels if child_decl_ctx
911 // could not be found in decl_ctx.
912 uint32_t CountDeclLevels(clang::DeclContext *frame_decl_ctx,
913 clang::DeclContext *child_decl_ctx,
914 ConstString *child_name = nullptr,
915 CompilerType *child_type = nullptr);
916
917 // Modifying RecordType
918 static clang::FieldDecl *AddFieldToRecordType(const CompilerType &type,
919 llvm::StringRef name,
920 const CompilerType &field_type,
921 lldb::AccessType access,
922 uint32_t bitfield_bit_size);
923
924 static void BuildIndirectFields(const CompilerType &type);
925
926 static void SetIsPacked(const CompilerType &type);
927
928 static clang::VarDecl *AddVariableToRecordType(const CompilerType &type,
929 llvm::StringRef name,
930 const CompilerType &var_type,
931 lldb::AccessType access);
932
933 /// Initializes a variable with an integer value.
934 /// \param var The variable to initialize. Must not already have an
935 /// initializer and must have an integer or enum type.
936 /// \param init_value The integer value that the variable should be
937 /// initialized to. Has to match the bit width of the
938 /// variable type.
939 static void SetIntegerInitializerForVariable(clang::VarDecl *var,
940 const llvm::APInt &init_value);
941
942 /// Initializes a variable with a floating point value.
943 /// \param var The variable to initialize. Must not already have an
944 /// initializer and must have a floating point type.
945 /// \param init_value The float value that the variable should be
946 /// initialized to.
947 static void
948 SetFloatingInitializerForVariable(clang::VarDecl *var,
949 const llvm::APFloat &init_value);
950
951 clang::CXXMethodDecl *AddMethodToCXXRecordType(
952 lldb::opaque_compiler_type_t type, llvm::StringRef name,
953 const char *mangled_name, const CompilerType &method_type,
954 lldb::AccessType access, bool is_virtual, bool is_static, bool is_inline,
955 bool is_explicit, bool is_attr_used, bool is_artificial);
956
958
959 // C++ Base Classes
960 std::unique_ptr<clang::CXXBaseSpecifier>
962 lldb::AccessType access, bool is_virtual,
963 bool base_of_class);
964
967 std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> bases);
968
969 static bool SetObjCSuperClass(const CompilerType &type,
970 const CompilerType &superclass_compiler_type);
971
972 static bool AddObjCClassProperty(const CompilerType &type,
973 const char *property_name,
974 const CompilerType &property_compiler_type,
975 clang::ObjCIvarDecl *ivar_decl,
976 const char *property_setter_name,
977 const char *property_getter_name,
978 uint32_t property_attributes,
979 ClangASTMetadata *metadata);
980
981 static clang::ObjCMethodDecl *AddMethodToObjCObjectType(
982 const CompilerType &type,
983 const char *name, // the full symbol name as seen in the symbol table
984 // (lldb::opaque_compiler_type_t type, "-[NString
985 // stringWithCString:]")
986 const CompilerType &method_compiler_type, lldb::AccessType access,
987 bool is_artificial, bool is_variadic, bool is_objc_direct_call);
988
990 bool has_extern);
991
992 // Tag Declarations
993 static bool StartTagDeclarationDefinition(const CompilerType &type);
994
995 static bool CompleteTagDeclarationDefinition(const CompilerType &type);
996
997 // Modifying Enumeration types
998 clang::EnumConstantDecl *AddEnumerationValueToEnumerationType(
999 const CompilerType &enum_type, const Declaration &decl, const char *name,
1000 int64_t enum_value, uint32_t enum_value_bit_size);
1001 clang::EnumConstantDecl *AddEnumerationValueToEnumerationType(
1002 const CompilerType &enum_type, const Declaration &decl, const char *name,
1003 const llvm::APSInt &value);
1004
1005 /// Returns the underlying integer type for an enum type. If the given type
1006 /// is invalid or not an enum-type, the function returns an invalid
1007 /// CompilerType.
1008 CompilerType GetEnumerationIntegerType(CompilerType type);
1009
1010 // Pointers & References
1011
1012 // Call this function using the class type when you want to make a member
1013 // pointer type to pointee_type.
1014 static CompilerType CreateMemberPointerType(const CompilerType &type,
1015 const CompilerType &pointee_type);
1016
1017 // Dumping types
1018#ifndef NDEBUG
1019 /// Convenience LLVM-style dump method for use in the debugger only.
1020 /// In contrast to the other \p Dump() methods this directly invokes
1021 /// \p clang::QualType::dump().
1022 LLVM_DUMP_METHOD void dump(lldb::opaque_compiler_type_t type) const override;
1023#endif
1024
1025 /// \see lldb_private::TypeSystem::Dump
1026 void Dump(llvm::raw_ostream &output) override;
1027
1028 /// Dump clang AST types from the symbol file.
1029 ///
1030 /// \param[in] s
1031 /// A stream to send the dumped AST node(s) to
1032 /// \param[in] symbol_name
1033 /// The name of the symbol to dump, if it is empty dump all the symbols
1034 void DumpFromSymbolFile(Stream &s, llvm::StringRef symbol_name);
1035
1036 void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
1037 Stream *s, lldb::Format format, const DataExtractor &data,
1038 lldb::offset_t data_offset, size_t data_byte_size,
1039 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
1040 bool show_types, bool show_summary, bool verbose,
1041 uint32_t depth) override;
1042
1043 bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,
1044 lldb::Format format, const DataExtractor &data,
1045 lldb::offset_t data_offset, size_t data_byte_size,
1046 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
1047 ExecutionContextScope *exe_scope) override;
1048
1049 void DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
1050 Stream *s, const DataExtractor &data,
1051 lldb::offset_t data_offset, size_t data_byte_size) override;
1052
1056
1058 lldb::opaque_compiler_type_t type, Stream *s,
1060
1061 static void DumpTypeName(const CompilerType &type);
1062
1063 static clang::EnumDecl *GetAsEnumDecl(const CompilerType &type);
1064
1065 static clang::RecordDecl *GetAsRecordDecl(const CompilerType &type);
1066
1067 static clang::TagDecl *GetAsTagDecl(const CompilerType &type);
1068
1069 static clang::TypedefNameDecl *GetAsTypedefDecl(const CompilerType &type);
1070
1071 static clang::CXXRecordDecl *
1073
1074 static clang::ObjCInterfaceDecl *
1075 GetAsObjCInterfaceDecl(const CompilerType &type);
1076
1077 clang::ClassTemplateDecl *ParseClassTemplateDecl(
1078 clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
1079 lldb::AccessType access_type, const char *parent_name, int tag_decl_kind,
1080 const TypeSystemClang::TemplateParameterInfos &template_param_infos);
1081
1082 clang::BlockDecl *CreateBlockDeclaration(clang::DeclContext *ctx,
1083 OptionalClangModuleID owning_module);
1084
1085 clang::UsingDirectiveDecl *
1086 CreateUsingDirectiveDeclaration(clang::DeclContext *decl_ctx,
1087 OptionalClangModuleID owning_module,
1088 clang::NamespaceDecl *ns_decl);
1089
1090 clang::UsingDecl *CreateUsingDeclaration(clang::DeclContext *current_decl_ctx,
1091 OptionalClangModuleID owning_module,
1092 clang::NamedDecl *target);
1093
1094 clang::VarDecl *CreateVariableDeclaration(clang::DeclContext *decl_context,
1095 OptionalClangModuleID owning_module,
1096 const char *name,
1097 clang::QualType type);
1098
1100 GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type);
1101
1102 static clang::QualType GetQualType(lldb::opaque_compiler_type_t type) {
1103 if (type)
1104 return clang::QualType::getFromOpaquePtr(type);
1105 return clang::QualType();
1106 }
1107
1108 static clang::QualType
1110 if (type)
1111 return clang::QualType::getFromOpaquePtr(type).getCanonicalType();
1112 return clang::QualType();
1113 }
1114
1115 clang::DeclarationName
1116 GetDeclarationName(llvm::StringRef name,
1117 const CompilerType &function_clang_type);
1118
1119 clang::LangOptions *GetLangOpts() const {
1120 return m_language_options_up.get();
1121 }
1122 clang::SourceManager *GetSourceMgr() const {
1123 return m_source_manager_up.get();
1124 }
1125
1126 /// Complete a type from debug info, or mark it as forcefully completed if
1127 /// there is no definition of the type in the current Module. Call this
1128 /// function in contexts where the usual C++ rules require a type to be
1129 /// complete (base class, member, etc.).
1130 static void RequireCompleteType(CompilerType type);
1131
1132 bool SetDeclIsForcefullyCompleted(const clang::TagDecl *td);
1133
1134 /// Return the template parameters (including surrounding <>) in string form.
1135 std::string
1136 PrintTemplateParams(const TemplateParameterInfos &template_param_infos);
1137
1138private:
1139 /// Returns the PrintingPolicy used when generating the internal type names.
1140 /// These type names are mostly used for the formatter selection.
1141 clang::PrintingPolicy GetTypePrintingPolicy();
1142 /// Returns the internal type name for the given NamedDecl using the
1143 /// type printing policy.
1144 std::string GetTypeNameForDecl(const clang::NamedDecl *named_decl,
1145 bool qualified = true);
1146
1147 const clang::ClassTemplateSpecializationDecl *
1149
1150 // Classes that inherit from TypeSystemClang can see and modify these
1151 std::string m_target_triple;
1152 std::unique_ptr<clang::ASTContext> m_ast_up;
1153 std::unique_ptr<clang::LangOptions> m_language_options_up;
1154 std::unique_ptr<clang::FileManager> m_file_manager_up;
1155 std::unique_ptr<clang::SourceManager> m_source_manager_up;
1156 std::unique_ptr<clang::DiagnosticsEngine> m_diagnostics_engine_up;
1157 std::unique_ptr<clang::DiagnosticConsumer> m_diagnostic_consumer_up;
1158 std::shared_ptr<clang::TargetOptions> m_target_options_rp;
1159 std::unique_ptr<clang::TargetInfo> m_target_info_up;
1160 std::unique_ptr<clang::IdentifierTable> m_identifier_table_up;
1161 std::unique_ptr<clang::SelectorTable> m_selector_table_up;
1162 std::unique_ptr<clang::Builtin::Context> m_builtins_up;
1163 std::unique_ptr<clang::HeaderSearch> m_header_search_up;
1164 std::unique_ptr<clang::ModuleMap> m_module_map_up;
1165 std::unique_ptr<DWARFASTParserClang> m_dwarf_ast_parser_up;
1166 std::unique_ptr<PDBASTParser> m_pdb_ast_parser_up;
1167 std::unique_ptr<npdb::PdbAstBuilder> m_native_pdb_ast_parser_up;
1168 std::unique_ptr<clang::MangleContext> m_mangle_ctx_up;
1170 bool m_ast_owned = false;
1171 /// A string describing what this TypeSystemClang represents (e.g.,
1172 /// AST for debug information, an expression, some other utility ClangAST).
1173 /// Useful for logging and debugging.
1174 std::string m_display_name;
1175
1176 typedef llvm::DenseMap<const clang::Decl *, ClangASTMetadata> DeclMetadataMap;
1177 /// Maps Decls to their associated ClangASTMetadata.
1179
1180 typedef llvm::DenseMap<const clang::Type *, ClangASTMetadata> TypeMetadataMap;
1181 /// Maps Types to their associated ClangASTMetadata.
1183
1184 typedef llvm::DenseMap<const clang::CXXRecordDecl *, clang::AccessSpecifier>
1186 /// Maps CXXRecordDecl to their most recent added method/field's
1187 /// AccessSpecifier.
1189
1190 /// The sema associated that is currently used to build this ASTContext.
1191 /// May be null if we are already done parsing this ASTContext or the
1192 /// ASTContext wasn't created by parsing source code.
1193 clang::Sema *m_sema = nullptr;
1194
1195 // For TypeSystemClang only
1198 /// Creates the internal ASTContext.
1199 void CreateASTContext();
1200 void SetTargetTriple(llvm::StringRef target_triple);
1201};
1202
1203/// The TypeSystemClang instance used for the scratch ASTContext in a
1204/// lldb::Target.
1206 /// LLVM RTTI support
1207 static char ID;
1208
1209public:
1210 ScratchTypeSystemClang(Target &target, llvm::Triple triple);
1211
1212 ~ScratchTypeSystemClang() override = default;
1213
1214 void Finalize() override;
1215
1216 /// The different kinds of isolated ASTs within the scratch TypeSystem.
1217 ///
1218 /// These ASTs are isolated from the main scratch AST and are each
1219 /// dedicated to a special language option/feature that makes the contained
1220 /// AST nodes incompatible with other AST nodes.
1222 /// The isolated AST for declarations/types from expressions that imported
1223 /// type information from a C++ module. The templates from a C++ module
1224 /// often conflict with the templates we generate from debug information,
1225 /// so we put these types in their own AST.
1228
1229 /// Alias for requesting the default scratch TypeSystemClang in GetForTarget.
1230 // This isn't constexpr as gtest/std::optional comparison logic is trying
1231 // to get the address of this for pretty-printing.
1232 static const std::nullopt_t DefaultAST;
1233
1234 /// Infers the appropriate sub-AST from Clang's LangOptions.
1235 static std::optional<IsolatedASTKind>
1236 InferIsolatedASTKindFromLangOpts(const clang::LangOptions &l) {
1237 // If modules are activated we want the dedicated C++ module AST.
1238 // See IsolatedASTKind::CppModules for more info.
1239 if (l.Modules)
1241 return DefaultAST;
1242 }
1243
1244 /// Returns the scratch TypeSystemClang for the given target.
1245 /// \param target The Target which scratch TypeSystemClang should be returned.
1246 /// \param ast_kind Allows requesting a specific sub-AST instead of the
1247 /// default scratch AST. See also `IsolatedASTKind`.
1248 /// \param create_on_demand If the scratch TypeSystemClang instance can be
1249 /// created by this call if it doesn't exist yet. If it doesn't exist yet and
1250 /// this parameter is false, this function returns a nullptr.
1251 /// \return The scratch type system of the target or a nullptr in case an
1252 /// error occurred.
1253 static lldb::TypeSystemClangSP
1254 GetForTarget(Target &target,
1255 std::optional<IsolatedASTKind> ast_kind = DefaultAST,
1256 bool create_on_demand = true);
1257
1258 /// Returns the scratch TypeSystemClang for the given target. The returned
1259 /// TypeSystemClang will be the scratch AST or a sub-AST, depending on which
1260 /// fits best to the passed LangOptions.
1261 /// \param target The Target which scratch TypeSystemClang should be returned.
1262 /// \param lang_opts The LangOptions of a clang ASTContext that the caller
1263 /// wants to export type information from. This is used to
1264 /// find the best matching sub-AST that will be returned.
1265 static lldb::TypeSystemClangSP
1266 GetForTarget(Target &target, const clang::LangOptions &lang_opts) {
1267 return GetForTarget(target, InferIsolatedASTKindFromLangOpts(lang_opts));
1268 }
1269
1270 /// \see lldb_private::TypeSystem::Dump
1271 void Dump(llvm::raw_ostream &output) override;
1272
1274 GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix,
1275 lldb::LanguageType language,
1276 Expression::ResultType desired_type,
1277 const EvaluateExpressionOptions &options,
1278 ValueObject *ctx_obj) override;
1279
1280 FunctionCaller *GetFunctionCaller(const CompilerType &return_type,
1281 const Address &function_address,
1282 const ValueList &arg_value_list,
1283 const char *name) override;
1284
1285 std::unique_ptr<UtilityFunction>
1286 CreateUtilityFunction(std::string text, std::string name) override;
1287
1289
1290 /// Unregisters the given ASTContext as a source from the scratch AST (and
1291 /// all sub-ASTs).
1292 /// \see ClangASTImporter::ForgetSource
1293 void ForgetSource(clang::ASTContext *src_ctx, ClangASTImporter &importer);
1294
1295 // llvm casting support
1296 bool isA(const void *ClassID) const override {
1297 return ClassID == &ID || TypeSystemClang::isA(ClassID);
1298 }
1299 static bool classof(const TypeSystem *ts) { return ts->isA(&ID); }
1300
1301private:
1302 std::unique_ptr<ClangASTSource> CreateASTSource();
1303 /// Returns the requested sub-AST.
1304 /// Will lazily create the sub-AST if it hasn't been created before.
1306
1307 /// The target triple.
1308 /// This was potentially adjusted and might not be identical to the triple
1309 /// of `m_target_wp`.
1310 llvm::Triple m_triple;
1311 lldb::TargetWP m_target_wp;
1312 /// The persistent variables associated with this process for the expression
1313 /// parser.
1314 std::unique_ptr<ClangPersistentVariables> m_persistent_variables;
1315 /// The ExternalASTSource that performs lookups and completes minimally
1316 /// imported types.
1317 std::unique_ptr<ClangASTSource> m_scratch_ast_source_up;
1318
1319 // FIXME: GCC 5.x doesn't support enum as map keys.
1320 typedef int IsolatedASTKey;
1321
1322 /// Map from IsolatedASTKind to their actual TypeSystemClang instance.
1323 /// This map is lazily filled with sub-ASTs and should be accessed via
1324 /// `GetSubAST` (which lazily fills this map).
1325 llvm::DenseMap<IsolatedASTKey, std::shared_ptr<TypeSystemClang>>
1327};
1328
1329} // namespace lldb_private
1330
1331#endif // LLDB_SOURCE_PLUGINS_TYPESYSTEM_CLANG_TYPESYSTEMCLANG_H
A section + offset based address class.
Definition: Address.h:59
Manages and observes all Clang AST node importing in LLDB.
Represents a generic declaration context in a program.
Represents a generic declaration such as a function declaration.
Definition: CompilerDecl.h:28
Generic representation of a type in a programming language.
Definition: CompilerType.h:36
A uniqued constant string class.
Definition: ConstString.h:39
size_t GetLength() const
Get the length in bytes of string value.
const char * GetCString() const
Get the string value as a C string.
Definition: ConstString.h:215
A class that describes the declaration location of a lldb object.
Definition: Declaration.h:24
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A class to manage flags.
Definition: Flags.h:22
ValueType Clear(ValueType mask=~static_cast< ValueType >(0))
Clear one or more flags.
Definition: Flags.h:61
bool Test(ValueType bit) const
Test a single flag bit.
Definition: Flags.h:96
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
Definition: Flags.h:73
Encapsulates a function that can be called.
A class that describes an executable image and its associated object and symbol files.
Definition: Module.h:88
The TypeSystemClang instance used for the scratch ASTContext in a lldb::Target.
static std::optional< IsolatedASTKind > InferIsolatedASTKindFromLangOpts(const clang::LangOptions &l)
Infers the appropriate sub-AST from Clang's LangOptions.
void Finalize() override
Free up any resources associated with this TypeSystem.
UserExpression * GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, Expression::ResultType desired_type, const EvaluateExpressionOptions &options, ValueObject *ctx_obj) override
static lldb::TypeSystemClangSP GetForTarget(Target &target, std::optional< IsolatedASTKind > ast_kind=DefaultAST, bool create_on_demand=true)
Returns the scratch TypeSystemClang for the given target.
llvm::Triple m_triple
The target triple.
std::unique_ptr< ClangASTSource > CreateASTSource()
TypeSystemClang & GetIsolatedAST(IsolatedASTKind feature)
Returns the requested sub-AST.
std::unique_ptr< ClangASTSource > m_scratch_ast_source_up
The ExternalASTSource that performs lookups and completes minimally imported types.
IsolatedASTKind
The different kinds of isolated ASTs within the scratch TypeSystem.
@ CppModules
The isolated AST for declarations/types from expressions that imported type information from a C++ mo...
std::unique_ptr< ClangPersistentVariables > m_persistent_variables
The persistent variables associated with this process for the expression parser.
bool isA(const void *ClassID) const override
static char ID
LLVM RTTI support.
PersistentExpressionState * GetPersistentExpressionState() override
static lldb::TypeSystemClangSP GetForTarget(Target &target, const clang::LangOptions &lang_opts)
Returns the scratch TypeSystemClang for the given target.
~ScratchTypeSystemClang() override=default
FunctionCaller * GetFunctionCaller(const CompilerType &return_type, const Address &function_address, const ValueList &arg_value_list, const char *name) override
std::unique_ptr< UtilityFunction > CreateUtilityFunction(std::string text, std::string name) override
void ForgetSource(clang::ASTContext *src_ctx, ClangASTImporter &importer)
Unregisters the given ASTContext as a source from the scratch AST (and all sub-ASTs).
static bool classof(const TypeSystem *ts)
void Dump(llvm::raw_ostream &output) override
static const std::nullopt_t DefaultAST
Alias for requesting the default scratch TypeSystemClang in GetForTarget.
llvm::DenseMap< IsolatedASTKey, std::shared_ptr< TypeSystemClang > > m_isolated_asts
Map from IsolatedASTKind to their actual TypeSystemClang instance.
The implementation of lldb::Type's m_payload field for TypeSystemClang.
void SetIsCompleteObjCClass(bool is_complete_objc_class)
TypePayloadClang(uint32_t opaque_payload)
OptionalClangModuleID GetOwningModule()
Type::Payload m_payload
The Layout is as follows:
void SetOwningModule(OptionalClangModuleID id)
static constexpr unsigned ObjCClassBit
llvm::ArrayRef< clang::TemplateArgument > GetParameterPackArgs() const
TemplateParameterInfos & operator=(TemplateParameterInfos &&)=delete
void SetParameterPack(std::unique_ptr< TemplateParameterInfos > args)
std::unique_ptr< TemplateParameterInfos > packed_args
clang::TemplateArgument const & Front() const
TemplateParameterInfos(TemplateParameterInfos &&)=delete
void InsertArg(char const *name, clang::TemplateArgument arg)
TemplateParameterInfos & operator=(TemplateParameterInfos const &)=delete
TemplateParameterInfos(TemplateParameterInfos const &)=delete
TemplateParameterInfos(llvm::ArrayRef< const char * > names_in, llvm::ArrayRef< clang::TemplateArgument > args_in)
llvm::SmallVector< clang::TemplateArgument, 2 > args
llvm::SmallVector< const char *, 2 > names
Element 'names[i]' holds the template argument name of 'args[i]'.
TemplateParameterInfos const & GetParameterPack() const
llvm::ArrayRef< const char * > GetNames() const
llvm::ArrayRef< clang::TemplateArgument > GetArgs() const
A TypeSystem implementation based on Clang.
clang::TranslationUnitDecl * GetTranslationUnitDecl()
static clang::TypedefNameDecl * GetAsTypedefDecl(const CompilerType &type)
std::string GetTypeNameForDecl(const clang::NamedDecl *named_decl, bool qualified=true)
Returns the internal type name for the given NamedDecl using the type printing policy.
static clang::ObjCInterfaceDecl * GetAsObjCInterfaceDecl(const CompilerType &type)
std::string m_display_name
A string describing what this TypeSystemClang represents (e.g., AST for debug information,...
void SetMetadata(const clang::Decl *object, ClangASTMetadata &meta_data)
uint32_t GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes, const ExecutionContext *exe_ctx) override
CompilerType 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) override
ConstString GetTypeName(lldb::opaque_compiler_type_t type, bool base_only) override
static void SetOwningModule(clang::Decl *decl, OptionalClangModuleID owning_module)
Set the owning module for decl.
std::unique_ptr< clang::TargetInfo > m_target_info_up
std::unique_ptr< clang::LangOptions > m_language_options_up
static clang::DeclContext * GetAsDeclContext(clang::FunctionDecl *function_decl)
bool BaseSpecifierIsEmpty(const clang::CXXBaseSpecifier *b)
static uint32_t GetNumPointeeChildren(clang::QualType type)
ConstString DeclGetMangledName(void *opaque_decl) override
CompilerType GetBasicType(lldb::BasicType type)
clang::ClassTemplateDecl * CreateClassTemplateDecl(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, lldb::AccessType access_type, llvm::StringRef class_name, int kind, const TemplateParameterInfos &infos)
void SetExternalSource(llvm::IntrusiveRefCntPtr< clang::ExternalASTSource > &ast_source_up)
clang::UsingDecl * CreateUsingDeclaration(clang::DeclContext *current_decl_ctx, OptionalClangModuleID owning_module, clang::NamedDecl *target)
static clang::AccessSpecifier ConvertAccessTypeToAccessSpecifier(lldb::AccessType access)
CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override
std::optional< uint64_t > GetByteSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
bool IsForcefullyCompleted(lldb::opaque_compiler_type_t type) override
bool SupportsLanguage(lldb::LanguageType language) override
uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override
OptionalClangModuleID GetOrCreateClangModule(llvm::StringRef name, OptionalClangModuleID parent, bool is_framework=false, bool is_explicit=false)
Synthesize a clang::Module and return its ID or a default-constructed ID.
void CompleteTagDecl(clang::TagDecl *)
static clang::FieldDecl * AddFieldToRecordType(const CompilerType &type, llvm::StringRef name, const CompilerType &field_type, lldb::AccessType access, uint32_t bitfield_bit_size)
std::shared_ptr< clang::TargetOptions > & getTargetOptions()
static TypeSystemClang * GetASTContext(clang::ASTContext *ast_ctx)
bool IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool *is_rvalue) override
CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size) override
TypeSystemClang(const TypeSystemClang &)
static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, Module *module, Target *target)
clang::TargetInfo * getTargetInfo()
clang::FunctionTemplateDecl * CreateFunctionTemplateDecl(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, clang::FunctionDecl *func_decl, const TemplateParameterInfos &infos)
static bool AreTypesSame(CompilerType type1, CompilerType type2, bool ignore_qualifiers=false)
std::optional< uint64_t > GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
void DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s, const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size) override
CompilerType GetArrayType(lldb::opaque_compiler_type_t type, uint64_t size) override
bool IsFunctionType(lldb::opaque_compiler_type_t type) override
CompilerType GetFunctionReturnType(lldb::opaque_compiler_type_t type) override
static bool IsObjCClassTypeAndHasIVars(const CompilerType &type, bool check_superclass)
CompilerType GetLValueReferenceType(lldb::opaque_compiler_type_t type) override
bool SetDeclIsForcefullyCompleted(const clang::TagDecl *td)
lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override
bool IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length) override
bool CanPassInRegisters(const CompilerType &type) override
static clang::DeclContext * GetDeclContextForType(clang::QualType type)
bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex) override
bool IsEnumerationType(lldb::opaque_compiler_type_t type, bool &is_signed) override
bool IsTemplateType(lldb::opaque_compiler_type_t type) override
CompilerType GetTypeTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx, bool expand_pack) override
llvm::DenseMap< const clang::CXXRecordDecl *, clang::AccessSpecifier > CXXRecordDeclAccessMap
static bool IsCXXClassType(const CompilerType &type)
bool IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed) override
void SetCXXRecordDeclAccess(const clang::CXXRecordDecl *object, clang::AccessSpecifier access)
static bool AddObjCClassProperty(const CompilerType &type, const char *property_name, const CompilerType &property_compiler_type, clang::ObjCIvarDecl *ivar_decl, const char *property_setter_name, const char *property_getter_name, uint32_t property_attributes, ClangASTMetadata *metadata)
uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override
static bool IsOperator(llvm::StringRef name, clang::OverloadedOperatorKind &op_kind)
bool IsCharType(lldb::opaque_compiler_type_t type) override
static void SetFloatingInitializerForVariable(clang::VarDecl *var, const llvm::APFloat &init_value)
Initializes a variable with a floating point value.
uint32_t GetTypeInfo(lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type) override
CompilerType GetType(clang::QualType qt)
Creates a CompilerType from the given QualType with the current TypeSystemClang instance as the Compi...
static clang::TagDecl * GetAsTagDecl(const CompilerType &type)
ConstString GetDisplayTypeName(lldb::opaque_compiler_type_t type) override
bool TransferBaseClasses(lldb::opaque_compiler_type_t type, std::vector< std::unique_ptr< clang::CXXBaseSpecifier > > bases)
bool IsBeingDefined(lldb::opaque_compiler_type_t type) override
ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override
std::unique_ptr< clang::IdentifierTable > m_identifier_table_up
static void SetIntegerInitializerForVariable(clang::VarDecl *var, const llvm::APInt &init_value)
Initializes a variable with an integer value.
bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override
CompilerType 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) override
bool LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &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)
uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes) override
bool IsScopedEnumerationType(lldb::opaque_compiler_type_t type) override
std::unique_ptr< clang::SourceManager > m_source_manager_up
bool IsVoidType(lldb::opaque_compiler_type_t type) override
static void SetIsPacked(const CompilerType &type)
void ForEachEnumerator(lldb::opaque_compiler_type_t type, std::function< bool(const CompilerType &integer_type, ConstString name, const llvm::APSInt &value)> const &callback) override
clang::AccessSpecifier GetCXXRecordDeclAccess(const clang::CXXRecordDecl *object)
CompilerType CreateClassTemplateSpecializationType(clang::ClassTemplateSpecializationDecl *class_template_specialization_decl)
static bool classof(const TypeSystem *ts)
bool IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override
void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s, lldb::Format format, const DataExtractor &data, lldb::offset_t data_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) override
void CreateFunctionTemplateSpecializationInfo(clang::FunctionDecl *func_decl, clang::FunctionTemplateDecl *Template, const TemplateParameterInfos &infos)
void(* CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *)
llvm::StringRef getDisplayName() const
Returns the display name of this TypeSystemClang that indicates what purpose it serves in LLDB.
CompilerType GetRValueReferenceType(lldb::opaque_compiler_type_t type) override
llvm::StringRef GetPluginName() override
CompilerDecl GetCompilerDecl(clang::Decl *decl)
Creates a CompilerDecl from the given Decl with the current TypeSystemClang instance as its typesyste...
CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override
bool GetCompleteType(lldb::opaque_compiler_type_t type) override
bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override
bool IsConst(lldb::opaque_compiler_type_t type) override
static clang::AccessSpecifier UnifyAccessSpecifiers(clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
std::unique_ptr< clang::CXXBaseSpecifier > CreateBaseClassSpecifier(lldb::opaque_compiler_type_t type, lldb::AccessType access, bool is_virtual, bool base_of_class)
CompilerType GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) override
std::vector< CompilerDecl > DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name, const bool ignore_using_decls) override
uint32_t GetPointerByteSize() override
bool IsCompleteType(lldb::opaque_compiler_type_t type) override
bool isA(const void *ClassID) const override
void Dump(llvm::raw_ostream &output) override
CompilerType GetIntTypeFromBitSize(size_t bit_size, bool is_signed)
clang::MangleContext * getMangleContext()
void CompleteObjCInterfaceDecl(clang::ObjCInterfaceDecl *)
CompilerType GetTypeForIdentifier(ConstString type_name, clang::DeclContext *decl_context=nullptr)
std::string PrintTemplateParams(const TemplateParameterInfos &template_param_infos)
Return the template parameters (including surrounding <>) in string form.
static void DumpDeclContextHiearchy(clang::DeclContext *decl_ctx)
TypeSystemClang(llvm::StringRef name, clang::ASTContext &existing_ctxt)
Constructs a TypeSystemClang that uses an existing ASTContext internally.
CompilerDeclContext CreateDeclContext(clang::DeclContext *ctx)
Creates a CompilerDeclContext from the given DeclContext with the current TypeSystemClang instance as...
CompilerType GetTypeForFormatters(void *type) override
void SetMetadataAsUserID(const clang::Decl *decl, lldb::user_id_t user_id)
bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override
const TypeSystemClang & operator=(const TypeSystemClang &)
static LanguageSet GetSupportedLanguagesForExpressions()
CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override
std::unique_ptr< clang::SelectorTable > m_selector_table_up
PDBASTParser * GetPDBParser() override
bool DeclContextIsClassMethod(void *opaque_decl_ctx, lldb::LanguageType *language_ptr, bool *is_instance_method_ptr, ConstString *language_object_name_ptr) override
std::optional< CompilerType::IntegralTemplateArgument > GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx, bool expand_pack) override
CompilerType GetTypeForDecl(clang::ObjCInterfaceDecl *objc_decl)
void SetTargetTriple(llvm::StringRef target_triple)
CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
static bool CheckOverloadedOperatorKindParameterCount(bool is_method, clang::OverloadedOperatorKind op_kind, uint32_t num_params)
clang::DeclarationName GetDeclarationName(llvm::StringRef name, const CompilerType &function_clang_type)
DeclMetadataMap m_decl_metadata
Maps Decls to their associated ClangASTMetadata.
static clang::CXXMethodDecl * DeclContextGetAsCXXMethodDecl(const CompilerDeclContext &dc)
CompilerType GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override
uint32_t CountDeclLevels(clang::DeclContext *frame_decl_ctx, clang::DeclContext *child_decl_ctx, ConstString *child_name=nullptr, CompilerType *child_type=nullptr)
static clang::QualType GetQualType(lldb::opaque_compiler_type_t type)
clang::PrintingPolicy GetTypePrintingPolicy()
Returns the PrintingPolicy used when generating the internal type names.
uint32_t GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override
static clang::RecordDecl * GetAsRecordDecl(const CompilerType &type)
CompilerType GetPointerSizedIntType(bool is_signed)
clang::FunctionDecl * CreateFunctionDeclaration(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, llvm::StringRef name, const CompilerType &function_Type, clang::StorageClass storage, bool is_inline)
uint32_t GetNumBaseClasses(const clang::CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
std::unique_ptr< DWARFASTParserClang > m_dwarf_ast_parser_up
CompilerType GetBuiltinTypeForDWARFEncodingAndBitSize(llvm::StringRef type_name, uint32_t dw_ate, uint32_t bit_size)
bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override
int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override
static void BuildIndirectFields(const CompilerType &type)
std::unique_ptr< clang::FileManager > m_file_manager_up
uint32_t GetIndexForRecordBase(const clang::RecordDecl *record_decl, const clang::CXXBaseSpecifier *base_spec, bool omit_empty_base_classes)
bool IsAnonymousType(lldb::opaque_compiler_type_t type) override
bool Verify(lldb::opaque_compiler_type_t type) override
Verify the integrity of the type to catch CompilerTypes that mix and match invalid TypeSystem/Opaque ...
void(* CompleteTagDeclCallback)(void *baton, clang::TagDecl *)
size_t GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override
void AddMethodOverridesForCXXRecordType(lldb::opaque_compiler_type_t type)
CompilerType CreateBlockPointerType(const CompilerType &function_type)
lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override
bool FieldIsBitfield(clang::FieldDecl *field, uint32_t &bitfield_bit_size)
clang::ClassTemplateSpecializationDecl * CreateClassTemplateSpecializationDecl(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, clang::ClassTemplateDecl *class_template_decl, int kind, const TemplateParameterInfos &infos)
clang::SourceManager * GetSourceMgr() const
std::unique_ptr< clang::HeaderSearch > m_header_search_up
void Finalize() override
Free up any resources associated with this TypeSystem.
static lldb::BasicType GetBasicTypeEnumeration(ConstString name)
clang::CXXMethodDecl * AddMethodToCXXRecordType(lldb::opaque_compiler_type_t type, llvm::StringRef name, const char *mangled_name, const CompilerType &method_type, lldb::AccessType access, bool is_virtual, bool is_static, bool is_inline, bool is_explicit, bool is_attr_used, bool is_artificial)
static clang::ASTContext * DeclContextGetTypeSystemClang(const CompilerDeclContext &dc)
uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr) override
clang::EnumConstantDecl * AddEnumerationValueToEnumerationType(const CompilerType &enum_type, const Declaration &decl, const char *name, int64_t enum_value, uint32_t enum_value_bit_size)
LLVM_DUMP_METHOD void dump(lldb::opaque_compiler_type_t type) const override
Convenience LLVM-style dump method for use in the debugger only.
CXXRecordDeclAccessMap m_cxx_record_decl_access
Maps CXXRecordDecl to their most recent added method/field's AccessSpecifier.
static CompilerType GetFloatTypeFromBitSize(clang::ASTContext *ast, size_t bit_size)
clang::NamespaceDecl * GetUniqueNamespaceDeclaration(const char *name, clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, bool is_inline=false)
std::unique_ptr< clang::ASTContext > m_ast_up
static clang::QualType GetCanonicalQualType(lldb::opaque_compiler_type_t type)
CompilerType DeclGetFunctionReturnType(void *opaque_decl) override
static bool IsEnumType(lldb::opaque_compiler_type_t type)
std::unique_ptr< npdb::PdbAstBuilder > m_native_pdb_ast_parser_up
static clang::CXXRecordDecl * GetAsCXXRecordDecl(lldb::opaque_compiler_type_t type)
static bool SetObjCSuperClass(const CompilerType &type, const CompilerType &superclass_compiler_type)
clang::UsingDirectiveDecl * CreateUsingDirectiveDeclaration(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, clang::NamespaceDecl *ns_decl)
static lldb::opaque_compiler_type_t GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type)
bool IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override
void DumpFromSymbolFile(Stream &s, llvm::StringRef symbol_name)
Dump clang AST types from the symbol file.
CompilerType AddConstModifier(lldb::opaque_compiler_type_t type) override
static void DumpDeclHiearchy(clang::Decl *decl)
static clang::ObjCMethodDecl * DeclContextGetAsObjCMethodDecl(const CompilerDeclContext &dc)
static clang::FunctionDecl * DeclContextGetAsFunctionDecl(const CompilerDeclContext &dc)
bool IsScalarType(lldb::opaque_compiler_type_t type) override
CompilerType GetOrCreateStructForIdentifier(ConstString type_name, const std::initializer_list< std::pair< const char *, CompilerType > > &type_fields, bool packed=false)
std::shared_ptr< clang::TargetOptions > m_target_options_rp
lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override
static bool IsClassType(lldb::opaque_compiler_type_t type)
bool IsDefined(lldb::opaque_compiler_type_t type) override
static bool IsObjCClassType(const CompilerType &type)
TypeMetadataMap m_type_metadata
Maps Types to their associated ClangASTMetadata.
clang::ASTContext & getASTContext()
Returns the clang::ASTContext instance managed by this TypeSystemClang.
const llvm::fltSemantics & GetFloatTypeSemantics(size_t byte_size) override
CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override
bool RecordHasFields(const clang::RecordDecl *record_decl)
static clang::ObjCMethodDecl * AddMethodToObjCObjectType(const CompilerType &type, const char *name, const CompilerType &method_compiler_type, lldb::AccessType access, bool is_artificial, bool is_variadic, bool is_objc_direct_call)
CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index) override
static bool CompleteTagDeclarationDefinition(const CompilerType &type)
unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override
bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format, const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, ExecutionContextScope *exe_scope) override
CompilerDeclContext DeclGetDeclContext(void *opaque_decl) override
bool DeclContextIsContainedInLookup(void *opaque_decl_ctx, void *other_opaque_decl_ctx) override
static bool SetHasExternalStorage(lldb::opaque_compiler_type_t type, bool has_extern)
CompilerType CreateEnumerationType(llvm::StringRef name, clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, const Declaration &decl, const CompilerType &integer_qual_type, bool is_scoped)
clang::ParmVarDecl * CreateParameterDeclaration(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, const char *name, const CompilerType &param_type, int storage, bool add_decl=false)
void DumpTypeDescription(lldb::opaque_compiler_type_t type, lldb::DescriptionLevel level=lldb::eDescriptionLevelFull) override
Dump the type to stdout.
CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override
static clang::NamespaceDecl * DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc)
npdb::PdbAstBuilder * GetNativePDBParser() override
std::unique_ptr< clang::DiagnosticConsumer > m_diagnostic_consumer_up
CompilerType GetTypeForDecl(clang::TagDecl *decl)
CompilerType CreateArrayType(const CompilerType &element_type, size_t element_count, bool is_vector)
CompilerType GetTypeForDecl(clang::NamedDecl *decl)
CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
ClangASTMetadata * GetMetadata(const clang::Decl *object)
CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
static clang::DeclContext * DeclContextGetAsDeclContext(const CompilerDeclContext &dc)
lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count) override
bool IsTypedefType(lldb::opaque_compiler_type_t type) override
CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override
std::optional< size_t > GetTypeBitAlign(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override
CompilerType CreateStructForIdentifier(ConstString type_name, const std::initializer_list< std::pair< const char *, CompilerType > > &type_fields, bool packed=false)
std::unique_ptr< clang::Builtin::Context > m_builtins_up
CompilerType GetBuiltinTypeByName(ConstString name) override
bool GetCompleteDecl(clang::Decl *decl)
static bool StartTagDeclarationDefinition(const CompilerType &type)
uint32_t GetIndexForRecordChild(const clang::RecordDecl *record_decl, clang::NamedDecl *canonical_decl, bool omit_empty_base_classes)
bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, CompilerType *target_type, bool check_cplusplus, bool check_objc) override
static ClangASTMetadata * DeclContextGetMetaData(const CompilerDeclContext &dc, const clang::Decl *object)
static llvm::StringRef GetPluginNameStatic()
clang::Sema * m_sema
The sema associated that is currently used to build this ASTContext.
size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override
clang::LangOptions * GetLangOpts() const
static clang::VarDecl * AddVariableToRecordType(const CompilerType &type, llvm::StringRef name, const CompilerType &var_type, lldb::AccessType access)
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override
const clang::ClassTemplateSpecializationDecl * GetAsTemplateSpecialization(lldb::opaque_compiler_type_t type)
std::unique_ptr< clang::MangleContext > m_mangle_ctx_up
TypeMemberFunctionImpl GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override
size_t DeclGetFunctionNumArguments(void *opaque_decl) override
CompilerType CreateFunctionType(const CompilerType &result_type, const CompilerType *args, unsigned num_args, bool is_variadic, unsigned type_quals, clang::CallingConv cc=clang::CC_C, clang::RefQualifierKind ref_qual=clang::RQ_None)
CompilerType GetAtomicType(lldb::opaque_compiler_type_t type) override
std::unique_ptr< PDBASTParser > m_pdb_ast_parser_up
std::unique_ptr< clang::DiagnosticsEngine > m_diagnostics_engine_up
static std::optional< std::string > GetCXXClassName(const CompilerType &type)
static void DumpTypeName(const CompilerType &type)
DWARFASTParser * GetDWARFParser() override
CompilerType DeclGetFunctionArgumentType(void *opaque_decl, size_t arg_idx) override
bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override
static clang::EnumDecl * GetAsEnumDecl(const CompilerType &type)
CompilerType AddVolatileModifier(lldb::opaque_compiler_type_t type) override
std::unique_ptr< clang::ModuleMap > m_module_map_up
CompilerType CreateObjCClass(llvm::StringRef name, clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, bool isForwardDecl, bool isInternal, ClangASTMetadata *metadata=nullptr)
void SetFunctionParameters(clang::FunctionDecl *function_decl, llvm::ArrayRef< clang::ParmVarDecl * > params)
static bool IsObjCObjectOrInterfaceType(const CompilerType &type)
CompilerType CreateRecordType(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, lldb::AccessType access_type, llvm::StringRef name, int kind, lldb::LanguageType language, ClangASTMetadata *metadata=nullptr, bool exports_symbols=false)
static void RequireCompleteType(CompilerType type)
Complete a type from debug info, or mark it as forcefully completed if there is no definition of the ...
CompilerType CreateTypedef(lldb::opaque_compiler_type_t type, const char *name, const CompilerDeclContext &decl_ctx, uint32_t opaque_payload) override
Using the current type, create a new typedef to that type using "typedef_name" as the name and "decl_...
llvm::DenseMap< const clang::Type *, ClangASTMetadata > TypeMetadataMap
CompilerType AddRestrictModifier(lldb::opaque_compiler_type_t type) override
clang::TemplateTemplateParmDecl * CreateTemplateTemplateParmDecl(const char *template_name)
lldb::TemplateArgumentKind GetTemplateArgumentKind(lldb::opaque_compiler_type_t type, size_t idx, bool expand_pack) override
clang::ClassTemplateDecl * ParseClassTemplateDecl(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, lldb::AccessType access_type, const char *parent_name, int tag_decl_kind, const TypeSystemClang::TemplateParameterInfos &template_param_infos)
static CompilerType CreateMemberPointerType(const CompilerType &type, const CompilerType &pointee_type)
void CreateASTContext()
Creates the internal ASTContext.
CompilerType GetCStringType(bool is_const)
bool IsAggregateType(lldb::opaque_compiler_type_t type) override
size_t GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) override
static bool IsObjCObjectPointerType(const CompilerType &type, CompilerType *target_type=nullptr)
bool IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size) override
static bool DeclsAreEquivalent(clang::Decl *lhs_decl, clang::Decl *rhs_decl)
static lldb::BasicType GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type, ConstString name)
static LanguageSet GetSupportedLanguagesForTypes()
clang::VarDecl * CreateVariableDeclaration(clang::DeclContext *decl_context, OptionalClangModuleID owning_module, const char *name, clang::QualType type)
clang::BlockDecl * CreateBlockDeclaration(clang::DeclContext *ctx, OptionalClangModuleID owning_module)
llvm::DenseMap< const clang::Decl *, ClangASTMetadata > DeclMetadataMap
ConstString DeclContextGetName(void *opaque_decl_ctx) override
size_t GetNumTemplateArguments(lldb::opaque_compiler_type_t type, bool expand_pack) override
ConstString DeclGetName(void *opaque_decl) override
Interface for representing a type system.
Definition: TypeSystem.h:77
virtual bool isA(const void *ClassID) const =0
uint32_t Payload
Definition: Type.h:203
Encapsulates a one-time expression for use in lldb.
A class that represents a running process on the host machine.
void * opaque_compiler_type_t
Definition: lldb-types.h:90
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
@ eDescriptionLevelFull
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
Format
Display format definitions.
uint64_t offset_t
Definition: lldb-types.h:87
LanguageType
Programming language type.
Encoding
Register encoding definitions.
uint64_t user_id_t
Definition: lldb-types.h:84
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
Definition: TypeSystem.h:45