LLDB mainline
TypeSystemClang.cpp File Reference
#include "TypeSystemClang.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/ExprCXX.h"
#include "clang/Frontend/ASTConsumers.h"
#include "llvm/ADT/ScopeExit.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/QualTypeNames.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/Debugger.h"
#include "lldb/Core/DumpDataExtractor.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/UniqueCStringMap.h"
#include "lldb/Expression/Expression.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/AArch64ACLETypes.def"
#include "clang/Basic/RISCVVTypes.def"
#include "clang/Basic/AMDGPUTypes.def"

Go to the source code of this file.

Classes

class  NullDiagnosticConsumer

Macros

#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)
#define SVE_TYPE(Name, Id, SingletonId)
#define RVV_TYPE(Name, Id, SingletonId)
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)
#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 const clang::RecordType * GetCompleteRecordType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion)
 Returns the clang::RecordType of the specified qual_type.
static const clang::EnumType * GetCompleteEnumType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion)
 Returns the clang::EnumType of the specified qual_type.
static const clang::ObjCObjectType * GetCompleteObjCObjectType (clang::ASTContext *ast, QualType qual_type, bool allow_completion)
 Returns the clang::ObjCObjectType of the specified qual_type.
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)
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 ConstString ExtractMangledNameFromFunctionCallLabel (llvm::StringRef label)
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

◆ AMDGPU_TYPE

#define AMDGPU_TYPE ( Name,
Id,
SingletonId,
Width,
Align )
Value:
case clang::BuiltinType::Id:

◆ DEPTH_INCREMENT

#define DEPTH_INCREMENT   2

Definition at line 8524 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 )
Value:
case clang::BuiltinType::Id:

◆ SVE_TYPE

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

Typedef Documentation

◆ ClangASTMap

Definition at line 321 of file TypeSystemClang.cpp.

Function Documentation

◆ check_op_param()

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

Definition at line 1704 of file TypeSystemClang.cpp.

◆ ClassTemplateAllowsToInstantiationArgs()

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

◆ ConvertAccessTypeToObjCIvarAccessControl()

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

◆ CreateTemplateParameterList()

◆ DumpEnumValue()

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

◆ ExtractMangledNameFromFunctionCallLabel()

ConstString ExtractMangledNameFromFunctionCallLabel ( llvm::StringRef label)
static

◆ FindLCABetweenDecls()

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

◆ GetASTMap()

◆ GetCompilerKind()

◆ GetCompleteEnumType()

const clang::EnumType * GetCompleteEnumType ( clang::ASTContext * ast,
clang::QualType qual_type,
bool allow_completion )
static

Returns the clang::EnumType of the specified qual_type.

This function will try to complete the type if necessary (and allowed by the specified allow_completion). If we fail to return a complete type, returns nullptr.

Definition at line 2671 of file TypeSystemClang.cpp.

Referenced by GetCompleteQualType().

◆ GetCompleteObjCObjectType()

const clang::ObjCObjectType * GetCompleteObjCObjectType ( clang::ASTContext * ast,
QualType qual_type,
bool allow_completion )
static

Returns the clang::ObjCObjectType of the specified qual_type.

This function will try to complete the type if necessary (and allowed by the specified allow_completion). If we fail to return a complete type, returns nullptr.

Definition at line 2708 of file TypeSystemClang.cpp.

Referenced by GetCompleteQualType().

◆ GetCompleteQualType()

◆ GetCompleteRecordType()

const clang::RecordType * GetCompleteRecordType ( clang::ASTContext * ast,
clang::QualType qual_type,
bool allow_completion )
static

Returns the clang::RecordType of the specified qual_type.

This function will try to complete the type if necessary (and allowed by the specified allow_completion). If we fail to return a complete type, returns nullptr.

Definition at line 2625 of file TypeSystemClang.cpp.

Referenced by GetCompleteQualType().

◆ GetDynamicArrayInfo()

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

◆ GetFullyUnqualifiedType_Impl()

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

◆ GetNameForIsolatedASTKind()

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

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

Definition at line 9687 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()

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()

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

◆ GetVBaseBitOffset()

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()

◆ InsertCompilerContext()

◆ IsClangDeclContext()

◆ ObjCDeclHasIVars()

bool ObjCDeclHasIVars ( clang::ObjCInterfaceDecl * class_interface_decl)
static

◆ ParseLangArgs()

void ParseLangArgs ( LangOptions & Opts,
ArchSpec arch )
static

◆ QualTypeMatchesBitSize()

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

◆ ReadVBaseOffsetFromVTable()

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()

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 2566 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::GetStaticFieldWithName(), 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()

◆ TemplateParameterAllowsValue()

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 1461 of file TypeSystemClang.cpp.

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

Referenced by ClassTemplateAllowsToInstantiationArgs().