LLDB mainline
Classes | Macros | Typedefs | Functions
TypeSystemClang.cpp File Reference
#include "TypeSystemClang.h"
#include "clang/AST/DeclBase.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/FormatAdapters.h"
#include "llvm/Support/FormatVariadic.h"
#include <mutex>
#include <memory>
#include <string>
#include <vector>
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTImporter.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/Type.h"
#include "clang/AST/VTableBuilder.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/FileSystemOptions.h"
#include "clang/Basic/LangStandard.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/FrontendOptions.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Lex/HeaderSearchOptions.h"
#include "clang/Lex/ModuleMap.h"
#include "clang/Sema/Sema.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/Threading.h"
#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
#include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h"
#include "Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h"
#include "Plugins/ExpressionParser/Clang/ClangFunctionCaller.h"
#include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
#include "Plugins/ExpressionParser/Clang/ClangUserExpression.h"
#include "Plugins/ExpressionParser/Clang/ClangUtil.h"
#include "Plugins/ExpressionParser/Clang/ClangUtilityFunction.h"
#include "lldb/Core/DumpDataExtractor.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/UniqueCStringMap.h"
#include "lldb/Host/StreamFile.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/SymbolFile.h"
#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/Language.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/DataExtractor.h"
#include "lldb/Utility/Flags.h"
#include "lldb/Utility/LLDBAssert.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/Utility/RegularExpression.h"
#include "lldb/Utility/Scalar.h"
#include "lldb/Utility/ThreadSafeDenseMap.h"
#include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
#include "Plugins/SymbolFile/PDB/PDBASTParser.h"
#include "Plugins/SymbolFile/NativePDB/PdbAstBuilder.h"
#include <cstdio>
#include <optional>
#include "clang/Basic/OperatorKinds.def"
#include "clang/Basic/RISCVVTypes.def"

Go to the source code of this file.

Classes

class  NullDiagnosticConsumer
 

Macros

#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)
 
#define RVV_TYPE(Name, Id, SingletonId)   case clang::BuiltinType::Id:
 
#define DEPTH_INCREMENT   2
 

Typedefs

typedef lldb_private::ThreadSafeDenseMap< clang::ASTContext *, TypeSystemClang * > ClangASTMap
 

Functions

static lldb::addr_t GetVTableAddress (Process &process, VTableContextBase &vtable_ctx, ValueObject &valobj, const ASTRecordLayout &record_layout)
 
static int64_t ReadVBaseOffsetFromVTable (Process &process, VTableContextBase &vtable_ctx, lldb::addr_t vtable_ptr, const CXXRecordDecl *cxx_record_decl, const CXXRecordDecl *base_class_decl)
 
static bool GetVBaseBitOffset (VTableContextBase &vtable_ctx, ValueObject &valobj, const ASTRecordLayout &record_layout, const CXXRecordDecl *cxx_record_decl, const CXXRecordDecl *base_class_decl, int32_t &bit_offset)
 
static ClangASTMapGetASTMap ()
 
static void SetMemberOwningModule (clang::Decl *member, const clang::Decl *parent)
 
static void ParseLangArgs (LangOptions &Opts, ArchSpec arch)
 
static bool QualTypeMatchesBitSize (const uint64_t bit_size, ASTContext &ast, QualType qual_type)
 
static TemplateParameterList * CreateTemplateParameterList (ASTContext &ast, const TypeSystemClang::TemplateParameterInfos &template_param_infos, llvm::SmallVector< NamedDecl *, 8 > &template_param_decls)
 
static bool TemplateParameterAllowsValue (NamedDecl *param, const TemplateArgument &value)
 Returns true if the given template parameter can represent the given value.
 
static bool ClassTemplateAllowsToInstantiationArgs (ClassTemplateDecl *class_template_decl, const TypeSystemClang::TemplateParameterInfos &instantiation_values)
 Returns true if the given class template declaration could produce an instantiation with the specified values.
 
static bool check_op_param (bool is_method, clang::OverloadedOperatorKind op_kind, bool unary, bool binary, uint32_t num_params)
 
clang::DeclContext * FindLCABetweenDecls (clang::DeclContext *left, clang::DeclContext *right, clang::DeclContext *root)
 
static QualType RemoveWrappingTypes (QualType type, ArrayRef< clang::Type::TypeClass > mask={})
 Aggressively desugar the provided type, skipping past various kinds of syntactic sugar and other constructs one typically wants to ignore.
 
static bool GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion=true)
 
static clang::ObjCIvarDecl::AccessControl ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
 
static clang::QualType GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
 
static bool ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
 
static std::optional< SymbolFile::ArrayInfoGetDynamicArrayInfo (TypeSystemClang &ast, SymbolFile *sym_file, clang::QualType qual_type, const ExecutionContext *exe_ctx)
 
static lldb::opaque_compiler_type_t GetObjCFieldAtIndex (clang::ASTContext *ast, clang::ObjCInterfaceDecl *class_interface_decl, size_t idx, std::string &name, uint64_t *bit_offset_ptr, uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr)
 
const TemplateArgument * GetNthTemplateArgument (const clang::ClassTemplateSpecializationDecl *decl, size_t idx, bool expand_pack)
 
static bool DumpEnumValue (const clang::QualType &qual_type, Stream &s, const DataExtractor &data, lldb::offset_t byte_offset, size_t byte_size, uint32_t bitfield_bit_offset, uint32_t bitfield_bit_size)
 
static CompilerContextKind GetCompilerKind (clang::Decl::Kind clang_kind, clang::DeclContext const *decl_ctx)
 
static void InsertCompilerContext (TypeSystemClang *ts, clang::DeclContext *decl_ctx, std::vector< lldb_private::CompilerContext > &context)
 
static bool IsClangDeclContext (const CompilerDeclContext &dc)
 
static llvm::StringRef GetNameForIsolatedASTKind (ScratchTypeSystemClang::IsolatedASTKind kind)
 Returns a human-readable name that uniquely identifiers the sub-AST kind.
 
static llvm::StringRef GetSpecializedASTName (ScratchTypeSystemClang::IsolatedASTKind feature)
 

Macro Definition Documentation

◆ DEPTH_INCREMENT

#define DEPTH_INCREMENT   2

Definition at line 8417 of file TypeSystemClang.cpp.

◆ OVERLOADED_OPERATOR

#define OVERLOADED_OPERATOR (   Name,
  Spelling,
  Token,
  Unary,
  Binary,
  MemberOnly 
)
Value:
case OO_##Name: \
return check_op_param(is_method, op_kind, Unary, Binary, num_params);
static bool check_op_param(bool is_method, clang::OverloadedOperatorKind op_kind, bool unary, bool binary, uint32_t num_params)

◆ RVV_TYPE

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)    case clang::BuiltinType::Id:

Typedef Documentation

◆ ClangASTMap

Definition at line 317 of file TypeSystemClang.cpp.

Function Documentation

◆ check_op_param()

static bool check_op_param ( bool  is_method,
clang::OverloadedOperatorKind  op_kind,
bool  unary,
bool  binary,
uint32_t  num_params 
)
inlinestatic

Definition at line 1670 of file TypeSystemClang.cpp.

◆ ClassTemplateAllowsToInstantiationArgs()

static bool ClassTemplateAllowsToInstantiationArgs ( ClassTemplateDecl *  class_template_decl,
const TypeSystemClang::TemplateParameterInfos instantiation_values 
)
static

◆ ConvertAccessTypeToObjCIvarAccessControl()

static clang::ObjCIvarDecl::AccessControl ConvertAccessTypeToObjCIvarAccessControl ( AccessType  access)
static

◆ CreateTemplateParameterList()

static TemplateParameterList * CreateTemplateParameterList ( ASTContext &  ast,
const TypeSystemClang::TemplateParameterInfos template_param_infos,
llvm::SmallVector< NamedDecl *, 8 > &  template_param_decls 
)
static

◆ DumpEnumValue()

static bool DumpEnumValue ( const clang::QualType &  qual_type,
Stream s,
const DataExtractor data,
lldb::offset_t  byte_offset,
size_t  byte_size,
uint32_t  bitfield_bit_offset,
uint32_t  bitfield_bit_size 
)
static

◆ FindLCABetweenDecls()

clang::DeclContext * FindLCABetweenDecls ( clang::DeclContext *  left,
clang::DeclContext *  right,
clang::DeclContext *  root 
)

◆ GetASTMap()

static ClangASTMap & GetASTMap ( )
static

◆ GetCompilerKind()

static CompilerContextKind GetCompilerKind ( clang::Decl::Kind  clang_kind,
clang::DeclContext const *  decl_ctx 
)
static

◆ GetCompleteQualType()

static bool GetCompleteQualType ( clang::ASTContext *  ast,
clang::QualType  qual_type,
bool  allow_completion = true 
)
static

◆ GetDynamicArrayInfo()

static std::optional< SymbolFile::ArrayInfo > GetDynamicArrayInfo ( TypeSystemClang ast,
SymbolFile sym_file,
clang::QualType  qual_type,
const ExecutionContext exe_ctx 
)
static

◆ GetFullyUnqualifiedType_Impl()

static clang::QualType GetFullyUnqualifiedType_Impl ( clang::ASTContext *  ast,
clang::QualType  qual_type 
)
static

◆ GetNameForIsolatedASTKind()

static llvm::StringRef GetNameForIsolatedASTKind ( ScratchTypeSystemClang::IsolatedASTKind  kind)
static

Returns a human-readable name that uniquely identifiers the sub-AST kind.

Definition at line 9503 of file TypeSystemClang.cpp.

References lldb_private::ScratchTypeSystemClang::CppModules.

Referenced by lldb_private::ScratchTypeSystemClang::Dump().

◆ GetNthTemplateArgument()

const TemplateArgument * GetNthTemplateArgument ( const clang::ClassTemplateSpecializationDecl *  decl,
size_t  idx,
bool  expand_pack 
)

◆ GetObjCFieldAtIndex()

static lldb::opaque_compiler_type_t GetObjCFieldAtIndex ( clang::ASTContext *  ast,
clang::ObjCInterfaceDecl *  class_interface_decl,
size_t  idx,
std::string &  name,
uint64_t *  bit_offset_ptr,
uint32_t *  bitfield_bit_size_ptr,
bool *  is_bitfield_ptr 
)
static

◆ GetSpecializedASTName()

static llvm::StringRef GetSpecializedASTName ( ScratchTypeSystemClang::IsolatedASTKind  feature)
static

◆ GetVBaseBitOffset()

static bool GetVBaseBitOffset ( VTableContextBase &  vtable_ctx,
ValueObject valobj,
const ASTRecordLayout &  record_layout,
const CXXRecordDecl *  cxx_record_decl,
const CXXRecordDecl *  base_class_decl,
int32_t &  bit_offset 
)
static

◆ GetVTableAddress()

static lldb::addr_t GetVTableAddress ( Process process,
VTableContextBase &  vtable_ctx,
ValueObject valobj,
const ASTRecordLayout &  record_layout 
)
static

◆ InsertCompilerContext()

static void InsertCompilerContext ( TypeSystemClang ts,
clang::DeclContext *  decl_ctx,
std::vector< lldb_private::CompilerContext > &  context 
)
static

◆ IsClangDeclContext()

static bool IsClangDeclContext ( const CompilerDeclContext dc)
static

◆ ObjCDeclHasIVars()

static bool ObjCDeclHasIVars ( clang::ObjCInterfaceDecl *  class_interface_decl,
bool  check_superclass 
)
static

◆ ParseLangArgs()

static void ParseLangArgs ( LangOptions &  Opts,
ArchSpec  arch 
)
static

◆ QualTypeMatchesBitSize()

static bool QualTypeMatchesBitSize ( const uint64_t  bit_size,
ASTContext &  ast,
QualType  qual_type 
)
inlinestatic

◆ ReadVBaseOffsetFromVTable()

static int64_t ReadVBaseOffsetFromVTable ( Process process,
VTableContextBase &  vtable_ctx,
lldb::addr_t  vtable_ptr,
const CXXRecordDecl *  cxx_record_decl,
const CXXRecordDecl *  base_class_decl 
)
static

◆ RemoveWrappingTypes()

static QualType RemoveWrappingTypes ( QualType  type,
ArrayRef< clang::Type::TypeClass >  mask = {} 
)
static

Aggressively desugar the provided type, skipping past various kinds of syntactic sugar and other constructs one typically wants to ignore.

The mask argument allows one to skip certain kinds of simplifications, when one wishes to handle a certain kind of type directly.

Definition at line 2506 of file TypeSystemClang.cpp.

Referenced by lldb_private::TypeSystemClang::DumpTypeDescription(), lldb_private::TypeSystemClang::GetAsTemplateSpecialization(), lldb_private::TypeSystemClang::GetChildCompilerTypeAtIndex(), GetCompleteQualType(), lldb_private::TypeSystemClang::GetDeclContextForType(), lldb_private::TypeSystemClang::GetDirectBaseClassAtIndex(), lldb_private::TypeSystemClang::GetDirectNestedTypeWithName(), lldb_private::TypeSystemClang::GetEncoding(), lldb_private::TypeSystemClang::GetFieldAtIndex(), lldb_private::TypeSystemClang::GetFormat(), lldb_private::TypeSystemClang::GetIndexOfChildMemberWithName(), lldb_private::TypeSystemClang::GetIndexOfChildWithName(), lldb_private::TypeSystemClang::GetMemberFunctionAtIndex(), lldb_private::TypeSystemClang::GetNumChildren(), lldb_private::TypeSystemClang::GetNumDirectBaseClasses(), lldb_private::TypeSystemClang::GetNumFields(), lldb_private::TypeSystemClang::GetNumMemberFunctions(), lldb_private::TypeSystemClang::GetNumPointeeChildren(), lldb_private::TypeSystemClang::GetNumTemplateArguments(), lldb_private::TypeSystemClang::GetNumVirtualBaseClasses(), lldb_private::TypeSystemClang::GetTypeClass(), lldb_private::TypeSystemClang::GetTypedefedType(), lldb_private::TypeSystemClang::GetTypeInfo(), lldb_private::TypeSystemClang::GetTypeName(), lldb_private::TypeSystemClang::GetVirtualBaseClassAtIndex(), lldb_private::TypeSystemClang::IsAggregateType(), lldb_private::TypeSystemClang::IsAnonymousType(), lldb_private::TypeSystemClang::IsArrayType(), lldb_private::TypeSystemClang::IsHomogeneousAggregate(), lldb_private::TypeSystemClang::IsPointerOrReferenceType(), lldb_private::TypeSystemClang::IsPointerType(), lldb_private::TypeSystemClang::IsPossibleDynamicType(), lldb_private::TypeSystemClang::IsReferenceType(), lldb_private::TypeSystemClang::IsTypedefType(), lldb_private::TypeSystemClang::IsTypeImpl(), and lldb_private::TypeSystemClang::SetHasExternalStorage().

◆ SetMemberOwningModule()

static void SetMemberOwningModule ( clang::Decl *  member,
const clang::Decl *  parent 
)
static

◆ TemplateParameterAllowsValue()

static bool TemplateParameterAllowsValue ( NamedDecl *  param,
const TemplateArgument &  value 
)
static

Returns true if the given template parameter can represent the given value.

For example, typename T can represent int but not integral values such as int I = 3.

Definition at line 1437 of file TypeSystemClang.cpp.

References lldb_private::Expressions, lldb_private::GetLog(), LLDB_LOG, and lldbassert.

Referenced by ClassTemplateAllowsToInstantiationArgs().