ClangASTContext.h revision 314564
1//===-- ClangASTContext.h ---------------------------------------*- 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#ifndef liblldb_ClangASTContext_h_ 11#define liblldb_ClangASTContext_h_ 12 13// C Includes 14#include <stdint.h> 15 16// C++ Includes 17#include <functional> 18#include <initializer_list> 19#include <map> 20#include <memory> 21#include <set> 22#include <string> 23#include <utility> 24#include <vector> 25 26// Other libraries and framework includes 27#include "clang/AST/ASTContext.h" 28#include "clang/AST/TemplateBase.h" 29#include "llvm/ADT/SmallVector.h" 30 31// Project includes 32#include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 33#include "lldb/Core/ClangForward.h" 34#include "lldb/Core/ConstString.h" 35#include "lldb/Symbol/CompilerType.h" 36#include "lldb/Symbol/TypeSystem.h" 37#include "lldb/lldb-enumerations.h" 38 39class DWARFASTParserClang; 40//class PDBASTParser; 41 42namespace lldb_private { 43 44class Declaration; 45 46class ClangASTContext : public TypeSystem { 47public: 48 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); 49 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, 50 clang::ObjCInterfaceDecl *); 51 52 //------------------------------------------------------------------ 53 // llvm casting support 54 //------------------------------------------------------------------ 55 static bool classof(const TypeSystem *ts) { 56 return ts->getKind() == TypeSystem::eKindClang; 57 } 58 59 //------------------------------------------------------------------ 60 // Constructors and Destructors 61 //------------------------------------------------------------------ 62 ClangASTContext(const char *triple = nullptr); 63 64 ~ClangASTContext() override; 65 66 void Finalize() override; 67 68 //------------------------------------------------------------------ 69 // PluginInterface functions 70 //------------------------------------------------------------------ 71 ConstString GetPluginName() override; 72 73 uint32_t GetPluginVersion() override; 74 75 static ConstString GetPluginNameStatic(); 76 77 static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, 78 Module *module, Target *target); 79 80 static void EnumerateSupportedLanguages( 81 std::set<lldb::LanguageType> &languages_for_types, 82 std::set<lldb::LanguageType> &languages_for_expressions); 83 84 static void Initialize(); 85 86 static void Terminate(); 87 88 static ClangASTContext *GetASTContext(clang::ASTContext *ast_ctx); 89 90 clang::ASTContext *getASTContext(); 91 92 void setASTContext(clang::ASTContext *ast_ctx); 93 94 clang::Builtin::Context *getBuiltinContext(); 95 96 clang::IdentifierTable *getIdentifierTable(); 97 98 clang::LangOptions *getLanguageOptions(); 99 100 clang::SelectorTable *getSelectorTable(); 101 102 clang::FileManager *getFileManager(); 103 104 clang::SourceManager *getSourceManager(); 105 106 clang::DiagnosticsEngine *getDiagnosticsEngine(); 107 108 clang::DiagnosticConsumer *getDiagnosticConsumer(); 109 110 clang::MangleContext *getMangleContext(); 111 112 std::shared_ptr<clang::TargetOptions> &getTargetOptions(); 113 114 clang::TargetInfo *getTargetInfo(); 115 116 void Clear(); 117 118 const char *GetTargetTriple(); 119 120 void SetTargetTriple(const char *target_triple); 121 122 void SetArchitecture(const ArchSpec &arch); 123 124 bool HasExternalSource(); 125 126 void SetExternalSource( 127 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> &ast_source_ap); 128 129 void RemoveExternalSource(); 130 131 bool GetCompleteDecl(clang::Decl *decl) { 132 return ClangASTContext::GetCompleteDecl(getASTContext(), decl); 133 } 134 135 static void DumpDeclHiearchy(clang::Decl *decl); 136 137 static void DumpDeclContextHiearchy(clang::DeclContext *decl_ctx); 138 139 static bool DeclsAreEquivalent(clang::Decl *lhs_decl, clang::Decl *rhs_decl); 140 141 static bool GetCompleteDecl(clang::ASTContext *ast, clang::Decl *decl); 142 143 void SetMetadataAsUserID(const void *object, lldb::user_id_t user_id); 144 145 void SetMetadata(const void *object, ClangASTMetadata &meta_data) { 146 SetMetadata(getASTContext(), object, meta_data); 147 } 148 149 static void SetMetadata(clang::ASTContext *ast, const void *object, 150 ClangASTMetadata &meta_data); 151 152 ClangASTMetadata *GetMetadata(const void *object) { 153 return GetMetadata(getASTContext(), object); 154 } 155 156 static ClangASTMetadata *GetMetadata(clang::ASTContext *ast, 157 const void *object); 158 159 //------------------------------------------------------------------ 160 // Basic Types 161 //------------------------------------------------------------------ 162 CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, 163 size_t bit_size) override; 164 165 static CompilerType GetBuiltinTypeForEncodingAndBitSize( 166 clang::ASTContext *ast, lldb::Encoding encoding, uint32_t bit_size); 167 168 CompilerType GetBasicType(lldb::BasicType type); 169 170 static CompilerType GetBasicType(clang::ASTContext *ast, 171 lldb::BasicType type); 172 173 static CompilerType GetBasicType(clang::ASTContext *ast, 174 const ConstString &name); 175 176 static lldb::BasicType GetBasicTypeEnumeration(const ConstString &name); 177 178 CompilerType GetBuiltinTypeForDWARFEncodingAndBitSize(const char *type_name, 179 uint32_t dw_ate, 180 uint32_t bit_size); 181 182 CompilerType GetCStringType(bool is_const); 183 184 static CompilerType GetUnknownAnyType(clang::ASTContext *ast); 185 186 CompilerType GetUnknownAnyType() { 187 return ClangASTContext::GetUnknownAnyType(getASTContext()); 188 } 189 190 static clang::DeclContext *GetDeclContextForType(clang::QualType type); 191 192 static clang::DeclContext *GetDeclContextForType(const CompilerType &type); 193 194 uint32_t GetPointerByteSize() override; 195 196 static clang::DeclContext *GetTranslationUnitDecl(clang::ASTContext *ast); 197 198 clang::DeclContext *GetTranslationUnitDecl() { 199 return GetTranslationUnitDecl(getASTContext()); 200 } 201 202 static clang::Decl *CopyDecl(clang::ASTContext *dest_context, 203 clang::ASTContext *source_context, 204 clang::Decl *source_decl); 205 206 static bool AreTypesSame(CompilerType type1, CompilerType type2, 207 bool ignore_qualifiers = false); 208 209 static CompilerType GetTypeForDecl(clang::NamedDecl *decl); 210 211 static CompilerType GetTypeForDecl(clang::TagDecl *decl); 212 213 static CompilerType GetTypeForDecl(clang::ObjCInterfaceDecl *objc_decl); 214 215 template <typename RecordDeclType> 216 CompilerType GetTypeForIdentifier(const ConstString &type_name) { 217 CompilerType compiler_type; 218 219 if (type_name.GetLength()) { 220 clang::ASTContext *ast = getASTContext(); 221 if (ast) { 222 clang::IdentifierInfo &myIdent = 223 ast->Idents.get(type_name.GetCString()); 224 clang::DeclarationName myName = 225 ast->DeclarationNames.getIdentifier(&myIdent); 226 227 clang::DeclContext::lookup_result result = 228 ast->getTranslationUnitDecl()->lookup(myName); 229 230 if (!result.empty()) { 231 clang::NamedDecl *named_decl = result[0]; 232 if (const RecordDeclType *record_decl = 233 llvm::dyn_cast<RecordDeclType>(named_decl)) 234 compiler_type.SetCompilerType( 235 ast, clang::QualType(record_decl->getTypeForDecl(), 0)); 236 } 237 } 238 } 239 240 return compiler_type; 241 } 242 243 CompilerType CreateStructForIdentifier( 244 const ConstString &type_name, 245 const std::initializer_list<std::pair<const char *, CompilerType>> 246 &type_fields, 247 bool packed = false); 248 249 CompilerType GetOrCreateStructForIdentifier( 250 const ConstString &type_name, 251 const std::initializer_list<std::pair<const char *, CompilerType>> 252 &type_fields, 253 bool packed = false); 254 255 //------------------------------------------------------------------ 256 // Structure, Unions, Classes 257 //------------------------------------------------------------------ 258 259 static clang::AccessSpecifier 260 ConvertAccessTypeToAccessSpecifier(lldb::AccessType access); 261 262 static clang::AccessSpecifier 263 UnifyAccessSpecifiers(clang::AccessSpecifier lhs, clang::AccessSpecifier rhs); 264 265 static uint32_t GetNumBaseClasses(const clang::CXXRecordDecl *cxx_record_decl, 266 bool omit_empty_base_classes); 267 268 CompilerType CreateRecordType(clang::DeclContext *decl_ctx, 269 lldb::AccessType access_type, const char *name, 270 int kind, lldb::LanguageType language, 271 ClangASTMetadata *metadata = nullptr); 272 273 class TemplateParameterInfos { 274 public: 275 bool IsValid() const { 276 if (args.empty()) 277 return false; 278 return args.size() == names.size(); 279 } 280 281 size_t GetSize() const { 282 if (IsValid()) 283 return args.size(); 284 return 0; 285 } 286 287 llvm::SmallVector<const char *, 2> names; 288 llvm::SmallVector<clang::TemplateArgument, 2> args; 289 }; 290 291 clang::FunctionTemplateDecl * 292 CreateFunctionTemplateDecl(clang::DeclContext *decl_ctx, 293 clang::FunctionDecl *func_decl, const char *name, 294 const TemplateParameterInfos &infos); 295 296 void CreateFunctionTemplateSpecializationInfo( 297 clang::FunctionDecl *func_decl, clang::FunctionTemplateDecl *Template, 298 const TemplateParameterInfos &infos); 299 300 clang::ClassTemplateDecl * 301 CreateClassTemplateDecl(clang::DeclContext *decl_ctx, 302 lldb::AccessType access_type, const char *class_name, 303 int kind, const TemplateParameterInfos &infos); 304 305 clang::ClassTemplateSpecializationDecl *CreateClassTemplateSpecializationDecl( 306 clang::DeclContext *decl_ctx, 307 clang::ClassTemplateDecl *class_template_decl, int kind, 308 const TemplateParameterInfos &infos); 309 310 CompilerType 311 CreateClassTemplateSpecializationType(clang::ClassTemplateSpecializationDecl * 312 class_template_specialization_decl); 313 314 static clang::DeclContext * 315 GetAsDeclContext(clang::CXXMethodDecl *cxx_method_decl); 316 317 static clang::DeclContext * 318 GetAsDeclContext(clang::ObjCMethodDecl *objc_method_decl); 319 320 static bool CheckOverloadedOperatorKindParameterCount( 321 bool is_method, clang::OverloadedOperatorKind op_kind, 322 uint32_t num_params); 323 324 bool FieldIsBitfield(clang::FieldDecl *field, uint32_t &bitfield_bit_size); 325 326 static bool FieldIsBitfield(clang::ASTContext *ast, clang::FieldDecl *field, 327 uint32_t &bitfield_bit_size); 328 329 static bool RecordHasFields(const clang::RecordDecl *record_decl); 330 331 CompilerType CreateObjCClass(const char *name, clang::DeclContext *decl_ctx, 332 bool isForwardDecl, bool isInternal, 333 ClangASTMetadata *metadata = nullptr); 334 335 bool SetTagTypeKind(clang::QualType type, int kind) const; 336 337 bool SetDefaultAccessForRecordFields(clang::RecordDecl *record_decl, 338 int default_accessibility, 339 int *assigned_accessibilities, 340 size_t num_assigned_accessibilities); 341 342 // Returns a mask containing bits from the ClangASTContext::eTypeXXX 343 // enumerations 344 345 //------------------------------------------------------------------ 346 // Namespace Declarations 347 //------------------------------------------------------------------ 348 349 clang::NamespaceDecl * 350 GetUniqueNamespaceDeclaration(const char *name, clang::DeclContext *decl_ctx); 351 352 static clang::NamespaceDecl * 353 GetUniqueNamespaceDeclaration(clang::ASTContext *ast, const char *name, 354 clang::DeclContext *decl_ctx); 355 356 //------------------------------------------------------------------ 357 // Function Types 358 //------------------------------------------------------------------ 359 360 clang::FunctionDecl * 361 CreateFunctionDeclaration(clang::DeclContext *decl_ctx, const char *name, 362 const CompilerType &function_Type, int storage, 363 bool is_inline); 364 365 static CompilerType CreateFunctionType(clang::ASTContext *ast, 366 const CompilerType &result_type, 367 const CompilerType *args, 368 unsigned num_args, bool is_variadic, 369 unsigned type_quals); 370 371 CompilerType CreateFunctionType(const CompilerType &result_type, 372 const CompilerType *args, unsigned num_args, 373 bool is_variadic, unsigned type_quals) { 374 return ClangASTContext::CreateFunctionType( 375 getASTContext(), result_type, args, num_args, is_variadic, type_quals); 376 } 377 378 clang::ParmVarDecl *CreateParameterDeclaration(const char *name, 379 const CompilerType ¶m_type, 380 int storage); 381 382 void SetFunctionParameters(clang::FunctionDecl *function_decl, 383 clang::ParmVarDecl **params, unsigned num_params); 384 385 CompilerType CreateBlockPointerType(const CompilerType &function_type); 386 387 //------------------------------------------------------------------ 388 // Array Types 389 //------------------------------------------------------------------ 390 391 CompilerType CreateArrayType(const CompilerType &element_type, 392 size_t element_count, bool is_vector); 393 394 //------------------------------------------------------------------ 395 // Enumeration Types 396 //------------------------------------------------------------------ 397 CompilerType CreateEnumerationType(const char *name, 398 clang::DeclContext *decl_ctx, 399 const Declaration &decl, 400 const CompilerType &integer_qual_type); 401 402 //------------------------------------------------------------------ 403 // Integer type functions 404 //------------------------------------------------------------------ 405 406 static CompilerType GetIntTypeFromBitSize(clang::ASTContext *ast, 407 size_t bit_size, bool is_signed); 408 409 CompilerType GetPointerSizedIntType(bool is_signed) { 410 return GetPointerSizedIntType(getASTContext(), is_signed); 411 } 412 413 static CompilerType GetPointerSizedIntType(clang::ASTContext *ast, 414 bool is_signed); 415 416 //------------------------------------------------------------------ 417 // Floating point functions 418 //------------------------------------------------------------------ 419 420 static CompilerType GetFloatTypeFromBitSize(clang::ASTContext *ast, 421 size_t bit_size); 422 423 //------------------------------------------------------------------ 424 // TypeSystem methods 425 //------------------------------------------------------------------ 426 DWARFASTParser *GetDWARFParser() override; 427 //PDBASTParser *GetPDBParser(); 428 429 //------------------------------------------------------------------ 430 // ClangASTContext callbacks for external source lookups. 431 //------------------------------------------------------------------ 432 static void CompleteTagDecl(void *baton, clang::TagDecl *); 433 434 static void CompleteObjCInterfaceDecl(void *baton, 435 clang::ObjCInterfaceDecl *); 436 437 static bool LayoutRecordType( 438 void *baton, const clang::RecordDecl *record_decl, uint64_t &size, 439 uint64_t &alignment, 440 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, 441 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 442 &base_offsets, 443 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 444 &vbase_offsets); 445 446 //---------------------------------------------------------------------- 447 // CompilerDecl override functions 448 //---------------------------------------------------------------------- 449 ConstString DeclGetName(void *opaque_decl) override; 450 451 ConstString DeclGetMangledName(void *opaque_decl) override; 452 453 CompilerDeclContext DeclGetDeclContext(void *opaque_decl) override; 454 455 CompilerType DeclGetFunctionReturnType(void *opaque_decl) override; 456 457 size_t DeclGetFunctionNumArguments(void *opaque_decl) override; 458 459 CompilerType DeclGetFunctionArgumentType(void *opaque_decl, 460 size_t arg_idx) override; 461 462 //---------------------------------------------------------------------- 463 // CompilerDeclContext override functions 464 //---------------------------------------------------------------------- 465 466 std::vector<CompilerDecl> 467 DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name, 468 const bool ignore_using_decls) override; 469 470 bool DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override; 471 472 ConstString DeclContextGetName(void *opaque_decl_ctx) override; 473 474 ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override; 475 476 bool DeclContextIsClassMethod(void *opaque_decl_ctx, 477 lldb::LanguageType *language_ptr, 478 bool *is_instance_method_ptr, 479 ConstString *language_object_name_ptr) override; 480 481 //---------------------------------------------------------------------- 482 // Clang specific clang::DeclContext functions 483 //---------------------------------------------------------------------- 484 485 static clang::DeclContext * 486 DeclContextGetAsDeclContext(const CompilerDeclContext &dc); 487 488 static clang::ObjCMethodDecl * 489 DeclContextGetAsObjCMethodDecl(const CompilerDeclContext &dc); 490 491 static clang::CXXMethodDecl * 492 DeclContextGetAsCXXMethodDecl(const CompilerDeclContext &dc); 493 494 static clang::FunctionDecl * 495 DeclContextGetAsFunctionDecl(const CompilerDeclContext &dc); 496 497 static clang::NamespaceDecl * 498 DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc); 499 500 static ClangASTMetadata *DeclContextGetMetaData(const CompilerDeclContext &dc, 501 const void *object); 502 503 static clang::ASTContext * 504 DeclContextGetClangASTContext(const CompilerDeclContext &dc); 505 506 //---------------------------------------------------------------------- 507 // Tests 508 //---------------------------------------------------------------------- 509 510 bool IsArrayType(lldb::opaque_compiler_type_t type, 511 CompilerType *element_type, uint64_t *size, 512 bool *is_incomplete) override; 513 514 bool IsVectorType(lldb::opaque_compiler_type_t type, 515 CompilerType *element_type, uint64_t *size) override; 516 517 bool IsAggregateType(lldb::opaque_compiler_type_t type) override; 518 519 bool IsAnonymousType(lldb::opaque_compiler_type_t type) override; 520 521 bool IsBeingDefined(lldb::opaque_compiler_type_t type) override; 522 523 bool IsCharType(lldb::opaque_compiler_type_t type) override; 524 525 bool IsCompleteType(lldb::opaque_compiler_type_t type) override; 526 527 bool IsConst(lldb::opaque_compiler_type_t type) override; 528 529 bool IsCStringType(lldb::opaque_compiler_type_t type, 530 uint32_t &length) override; 531 532 static bool IsCXXClassType(const CompilerType &type); 533 534 bool IsDefined(lldb::opaque_compiler_type_t type) override; 535 536 bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, 537 bool &is_complex) override; 538 539 bool IsFunctionType(lldb::opaque_compiler_type_t type, 540 bool *is_variadic_ptr) override; 541 542 uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, 543 CompilerType *base_type_ptr) override; 544 545 size_t 546 GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override; 547 548 CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, 549 const size_t index) override; 550 551 bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override; 552 553 bool IsBlockPointerType(lldb::opaque_compiler_type_t type, 554 CompilerType *function_pointer_type_ptr) override; 555 556 bool IsIntegerType(lldb::opaque_compiler_type_t type, 557 bool &is_signed) override; 558 559 bool IsEnumerationType(lldb::opaque_compiler_type_t type, 560 bool &is_signed) override; 561 562 static bool IsObjCClassType(const CompilerType &type); 563 564 static bool IsObjCClassTypeAndHasIVars(const CompilerType &type, 565 bool check_superclass); 566 567 static bool IsObjCObjectOrInterfaceType(const CompilerType &type); 568 569 static bool IsObjCObjectPointerType(const CompilerType &type, 570 CompilerType *target_type = nullptr); 571 572 bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override; 573 574 static bool IsClassType(lldb::opaque_compiler_type_t type); 575 576 static bool IsEnumType(lldb::opaque_compiler_type_t type); 577 578 bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, 579 CompilerType *target_type, // Can pass nullptr 580 bool check_cplusplus, bool check_objc) override; 581 582 bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override; 583 584 bool IsPointerType(lldb::opaque_compiler_type_t type, 585 CompilerType *pointee_type) override; 586 587 bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, 588 CompilerType *pointee_type) override; 589 590 bool IsReferenceType(lldb::opaque_compiler_type_t type, 591 CompilerType *pointee_type, bool *is_rvalue) override; 592 593 bool IsScalarType(lldb::opaque_compiler_type_t type) override; 594 595 bool IsTypedefType(lldb::opaque_compiler_type_t type) override; 596 597 bool IsVoidType(lldb::opaque_compiler_type_t type) override; 598 599 bool SupportsLanguage(lldb::LanguageType language) override; 600 601 static bool GetCXXClassName(const CompilerType &type, 602 std::string &class_name); 603 604 static bool GetObjCClassName(const CompilerType &type, 605 std::string &class_name); 606 607 //---------------------------------------------------------------------- 608 // Type Completion 609 //---------------------------------------------------------------------- 610 611 bool GetCompleteType(lldb::opaque_compiler_type_t type) override; 612 613 //---------------------------------------------------------------------- 614 // Accessors 615 //---------------------------------------------------------------------- 616 617 ConstString GetTypeName(lldb::opaque_compiler_type_t type) override; 618 619 uint32_t GetTypeInfo(lldb::opaque_compiler_type_t type, 620 CompilerType *pointee_or_element_compiler_type) override; 621 622 lldb::LanguageType 623 GetMinimumLanguage(lldb::opaque_compiler_type_t type) override; 624 625 lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override; 626 627 unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override; 628 629 //---------------------------------------------------------------------- 630 // Creating related types 631 //---------------------------------------------------------------------- 632 633 // Using the current type, create a new typedef to that type using 634 // "typedef_name" 635 // as the name and "decl_ctx" as the decl context. 636 static CompilerType 637 CreateTypedefType(const CompilerType &type, const char *typedef_name, 638 const CompilerDeclContext &compiler_decl_ctx); 639 640 CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, 641 uint64_t *stride) override; 642 643 CompilerType GetArrayType(lldb::opaque_compiler_type_t type, 644 uint64_t size) override; 645 646 CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override; 647 648 CompilerType 649 GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override; 650 651 // Returns -1 if this isn't a function of if the function doesn't have a 652 // prototype 653 // Returns a value >= 0 if there is a prototype. 654 int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override; 655 656 CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, 657 size_t idx) override; 658 659 CompilerType 660 GetFunctionReturnType(lldb::opaque_compiler_type_t type) override; 661 662 size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override; 663 664 TypeMemberFunctionImpl 665 GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, 666 size_t idx) override; 667 668 CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override; 669 670 CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override; 671 672 CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override; 673 674 CompilerType 675 GetLValueReferenceType(lldb::opaque_compiler_type_t type) override; 676 677 CompilerType 678 GetRValueReferenceType(lldb::opaque_compiler_type_t type) override; 679 680 CompilerType AddConstModifier(lldb::opaque_compiler_type_t type) override; 681 682 CompilerType AddVolatileModifier(lldb::opaque_compiler_type_t type) override; 683 684 CompilerType AddRestrictModifier(lldb::opaque_compiler_type_t type) override; 685 686 CompilerType CreateTypedef(lldb::opaque_compiler_type_t type, 687 const char *name, 688 const CompilerDeclContext &decl_ctx) override; 689 690 // If the current object represents a typedef type, get the underlying type 691 CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override; 692 693 //---------------------------------------------------------------------- 694 // Create related types using the current type's AST 695 //---------------------------------------------------------------------- 696 CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override; 697 698 //---------------------------------------------------------------------- 699 // Exploring the type 700 //---------------------------------------------------------------------- 701 702 uint64_t GetByteSize(lldb::opaque_compiler_type_t type, 703 ExecutionContextScope *exe_scope) { 704 return (GetBitSize(type, exe_scope) + 7) / 8; 705 } 706 707 uint64_t GetBitSize(lldb::opaque_compiler_type_t type, 708 ExecutionContextScope *exe_scope) override; 709 710 lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type, 711 uint64_t &count) override; 712 713 lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override; 714 715 size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override; 716 717 uint32_t GetNumChildren(lldb::opaque_compiler_type_t type, 718 bool omit_empty_base_classes) override; 719 720 CompilerType GetBuiltinTypeByName(const ConstString &name) override; 721 722 lldb::BasicType 723 GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override; 724 725 static lldb::BasicType 726 GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type, 727 const ConstString &name); 728 729 void ForEachEnumerator( 730 lldb::opaque_compiler_type_t type, 731 std::function<bool(const CompilerType &integer_type, 732 const ConstString &name, 733 const llvm::APSInt &value)> const &callback) override; 734 735 uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override; 736 737 CompilerType GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, 738 std::string &name, uint64_t *bit_offset_ptr, 739 uint32_t *bitfield_bit_size_ptr, 740 bool *is_bitfield_ptr) override; 741 742 uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override; 743 744 uint32_t GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override; 745 746 CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, 747 size_t idx, 748 uint32_t *bit_offset_ptr) override; 749 750 CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, 751 size_t idx, 752 uint32_t *bit_offset_ptr) override; 753 754 static uint32_t GetNumPointeeChildren(clang::QualType type); 755 756 CompilerType GetChildCompilerTypeAtIndex( 757 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx, 758 bool transparent_pointers, bool omit_empty_base_classes, 759 bool ignore_array_bounds, std::string &child_name, 760 uint32_t &child_byte_size, int32_t &child_byte_offset, 761 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, 762 bool &child_is_base_class, bool &child_is_deref_of_parent, 763 ValueObject *valobj, uint64_t &language_flags) override; 764 765 // Lookup a child given a name. This function will match base class names 766 // and member member names in "clang_type" only, not descendants. 767 uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, 768 const char *name, 769 bool omit_empty_base_classes) override; 770 771 // Lookup a child member given a name. This function will match member names 772 // only and will descend into "clang_type" children in search for the first 773 // member in this class, or any base class that matches "name". 774 // TODO: Return all matches for a given name by returning a 775 // vector<vector<uint32_t>> 776 // so we catch all names that match a given child name, not just the first. 777 size_t 778 GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, 779 const char *name, bool omit_empty_base_classes, 780 std::vector<uint32_t> &child_indexes) override; 781 782 size_t GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override; 783 784 CompilerType GetTemplateArgument(lldb::opaque_compiler_type_t type, 785 size_t idx, 786 lldb::TemplateArgumentKind &kind) override; 787 788 CompilerType GetTypeForFormatters(void *type) override; 789 790#define LLDB_INVALID_DECL_LEVEL UINT32_MAX 791 // LLDB_INVALID_DECL_LEVEL is returned by CountDeclLevels if 792 // child_decl_ctx could not be found in decl_ctx. 793 uint32_t CountDeclLevels(clang::DeclContext *frame_decl_ctx, 794 clang::DeclContext *child_decl_ctx, 795 ConstString *child_name = nullptr, 796 CompilerType *child_type = nullptr); 797 798 //---------------------------------------------------------------------- 799 // Modifying RecordType 800 //---------------------------------------------------------------------- 801 static clang::FieldDecl *AddFieldToRecordType(const CompilerType &type, 802 const char *name, 803 const CompilerType &field_type, 804 lldb::AccessType access, 805 uint32_t bitfield_bit_size); 806 807 static void BuildIndirectFields(const CompilerType &type); 808 809 static void SetIsPacked(const CompilerType &type); 810 811 static clang::VarDecl *AddVariableToRecordType(const CompilerType &type, 812 const char *name, 813 const CompilerType &var_type, 814 lldb::AccessType access); 815 816 clang::CXXMethodDecl * 817 AddMethodToCXXRecordType(lldb::opaque_compiler_type_t type, const char *name, 818 const CompilerType &method_type, 819 lldb::AccessType access, bool is_virtual, 820 bool is_static, bool is_inline, bool is_explicit, 821 bool is_attr_used, bool is_artificial); 822 823 // C++ Base Classes 824 clang::CXXBaseSpecifier * 825 CreateBaseClassSpecifier(lldb::opaque_compiler_type_t type, 826 lldb::AccessType access, bool is_virtual, 827 bool base_of_class); 828 829 static void DeleteBaseClassSpecifiers(clang::CXXBaseSpecifier **base_classes, 830 unsigned num_base_classes); 831 832 bool 833 SetBaseClassesForClassType(lldb::opaque_compiler_type_t type, 834 clang::CXXBaseSpecifier const *const *base_classes, 835 unsigned num_base_classes); 836 837 static bool SetObjCSuperClass(const CompilerType &type, 838 const CompilerType &superclass_compiler_type); 839 840 static bool AddObjCClassProperty(const CompilerType &type, 841 const char *property_name, 842 const CompilerType &property_compiler_type, 843 clang::ObjCIvarDecl *ivar_decl, 844 const char *property_setter_name, 845 const char *property_getter_name, 846 uint32_t property_attributes, 847 ClangASTMetadata *metadata); 848 849 static clang::ObjCMethodDecl *AddMethodToObjCObjectType( 850 const CompilerType &type, 851 const char *name, // the full symbol name as seen in the symbol table 852 // (lldb::opaque_compiler_type_t type, "-[NString 853 // stringWithCString:]") 854 const CompilerType &method_compiler_type, lldb::AccessType access, 855 bool is_artificial, bool is_variadic); 856 857 static bool SetHasExternalStorage(lldb::opaque_compiler_type_t type, 858 bool has_extern); 859 860 static bool GetHasExternalStorage(const CompilerType &type); 861 //------------------------------------------------------------------ 862 // Tag Declarations 863 //------------------------------------------------------------------ 864 static bool StartTagDeclarationDefinition(const CompilerType &type); 865 866 static bool CompleteTagDeclarationDefinition(const CompilerType &type); 867 868 //---------------------------------------------------------------------- 869 // Modifying Enumeration types 870 //---------------------------------------------------------------------- 871 bool AddEnumerationValueToEnumerationType( 872 lldb::opaque_compiler_type_t type, 873 const CompilerType &enumerator_qual_type, const Declaration &decl, 874 const char *name, int64_t enum_value, uint32_t enum_value_bit_size); 875 876 CompilerType GetEnumerationIntegerType(lldb::opaque_compiler_type_t type); 877 878 //------------------------------------------------------------------ 879 // Pointers & References 880 //------------------------------------------------------------------ 881 882 // Call this function using the class type when you want to make a 883 // member pointer type to pointee_type. 884 static CompilerType CreateMemberPointerType(const CompilerType &type, 885 const CompilerType &pointee_type); 886 887 // Converts "s" to a floating point value and place resulting floating 888 // point bytes in the "dst" buffer. 889 size_t ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, 890 const char *s, uint8_t *dst, 891 size_t dst_size) override; 892 893 //---------------------------------------------------------------------- 894 // Dumping types 895 //---------------------------------------------------------------------- 896 void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, 897 Stream *s, lldb::Format format, const DataExtractor &data, 898 lldb::offset_t data_offset, size_t data_byte_size, 899 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, 900 bool show_types, bool show_summary, bool verbose, 901 uint32_t depth) override; 902 903 bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s, 904 lldb::Format format, const DataExtractor &data, 905 lldb::offset_t data_offset, size_t data_byte_size, 906 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, 907 ExecutionContextScope *exe_scope) override; 908 909 void DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, 910 Stream *s, const DataExtractor &data, 911 lldb::offset_t data_offset, size_t data_byte_size) override; 912 913 void DumpTypeDescription( 914 lldb::opaque_compiler_type_t type) override; // Dump to stdout 915 916 void DumpTypeDescription(lldb::opaque_compiler_type_t type, 917 Stream *s) override; 918 919 static void DumpTypeName(const CompilerType &type); 920 921 static clang::EnumDecl *GetAsEnumDecl(const CompilerType &type); 922 923 static clang::RecordDecl *GetAsRecordDecl(const CompilerType &type); 924 925 static clang::TagDecl *GetAsTagDecl(const CompilerType &type); 926 927 clang::CXXRecordDecl *GetAsCXXRecordDecl(lldb::opaque_compiler_type_t type); 928 929 static clang::ObjCInterfaceDecl * 930 GetAsObjCInterfaceDecl(const CompilerType &type); 931 932 clang::ClassTemplateDecl *ParseClassTemplateDecl( 933 clang::DeclContext *decl_ctx, lldb::AccessType access_type, 934 const char *parent_name, int tag_decl_kind, 935 const ClangASTContext::TemplateParameterInfos &template_param_infos); 936 937 clang::BlockDecl *CreateBlockDeclaration(clang::DeclContext *ctx); 938 939 clang::UsingDirectiveDecl * 940 CreateUsingDirectiveDeclaration(clang::DeclContext *decl_ctx, 941 clang::NamespaceDecl *ns_decl); 942 943 clang::UsingDecl *CreateUsingDeclaration(clang::DeclContext *current_decl_ctx, 944 clang::NamedDecl *target); 945 946 clang::VarDecl *CreateVariableDeclaration(clang::DeclContext *decl_context, 947 const char *name, 948 clang::QualType type); 949 950 static lldb::opaque_compiler_type_t 951 GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type); 952 953 static clang::QualType GetQualType(lldb::opaque_compiler_type_t type) { 954 if (type) 955 return clang::QualType::getFromOpaquePtr(type); 956 return clang::QualType(); 957 } 958 959 static clang::QualType 960 GetCanonicalQualType(lldb::opaque_compiler_type_t type) { 961 if (type) 962 return clang::QualType::getFromOpaquePtr(type).getCanonicalType(); 963 return clang::QualType(); 964 } 965 966 clang::DeclarationName 967 GetDeclarationName(const char *name, const CompilerType &function_clang_type); 968 969protected: 970 //------------------------------------------------------------------ 971 // Classes that inherit from ClangASTContext can see and modify these 972 //------------------------------------------------------------------ 973 // clang-format off 974 std::string m_target_triple; 975 std::unique_ptr<clang::ASTContext> m_ast_ap; 976 std::unique_ptr<clang::LangOptions> m_language_options_ap; 977 std::unique_ptr<clang::FileManager> m_file_manager_ap; 978 std::unique_ptr<clang::FileSystemOptions> m_file_system_options_ap; 979 std::unique_ptr<clang::SourceManager> m_source_manager_ap; 980 std::unique_ptr<clang::DiagnosticsEngine> m_diagnostics_engine_ap; 981 std::unique_ptr<clang::DiagnosticConsumer> m_diagnostic_consumer_ap; 982 std::shared_ptr<clang::TargetOptions> m_target_options_rp; 983 std::unique_ptr<clang::TargetInfo> m_target_info_ap; 984 std::unique_ptr<clang::IdentifierTable> m_identifier_table_ap; 985 std::unique_ptr<clang::SelectorTable> m_selector_table_ap; 986 std::unique_ptr<clang::Builtin::Context> m_builtins_ap; 987 std::unique_ptr<DWARFASTParserClang> m_dwarf_ast_parser_ap; 988// std::unique_ptr<PDBASTParser> m_pdb_ast_parser_ap; 989 std::unique_ptr<ClangASTSource> m_scratch_ast_source_ap; 990 std::unique_ptr<clang::MangleContext> m_mangle_ctx_ap; 991 CompleteTagDeclCallback m_callback_tag_decl; 992 CompleteObjCInterfaceDeclCallback m_callback_objc_decl; 993 void * m_callback_baton; 994 uint32_t m_pointer_byte_size; 995 bool m_ast_owned; 996 bool m_can_evaluate_expressions; 997 // clang-format on 998private: 999 //------------------------------------------------------------------ 1000 // For ClangASTContext only 1001 //------------------------------------------------------------------ 1002 ClangASTContext(const ClangASTContext &); 1003 const ClangASTContext &operator=(const ClangASTContext &); 1004}; 1005 1006class ClangASTContextForExpressions : public ClangASTContext { 1007public: 1008 ClangASTContextForExpressions(Target &target); 1009 1010 ~ClangASTContextForExpressions() override = default; 1011 1012 UserExpression * 1013 GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, 1014 lldb::LanguageType language, 1015 Expression::ResultType desired_type, 1016 const EvaluateExpressionOptions &options) override; 1017 1018 FunctionCaller *GetFunctionCaller(const CompilerType &return_type, 1019 const Address &function_address, 1020 const ValueList &arg_value_list, 1021 const char *name) override; 1022 1023 UtilityFunction *GetUtilityFunction(const char *text, 1024 const char *name) override; 1025 1026 PersistentExpressionState *GetPersistentExpressionState() override; 1027 1028private: 1029 lldb::TargetWP m_target_wp; 1030 lldb::ClangPersistentVariablesUP m_persistent_variables; ///< These are the 1031 ///persistent 1032 ///variables 1033 ///associated with 1034 ///this process for 1035 ///the expression 1036 ///parser. 1037}; 1038 1039} // namespace lldb_private 1040 1041#endif // liblldb_ClangASTContext_h_ 1042