#include <cstdlib>
#include "DWARFASTParser.h"
#include "DWARFASTParserClang.h"
#include "DWARFDebugInfo.h"
#include "DWARFDeclContext.h"
#include "DWARFDefines.h"
#include "SymbolFileDWARF.h"
#include "SymbolFileDWARFDebugMap.h"
#include "SymbolFileDWARFDwo.h"
#include "UniqueDWARFASTType.h"
#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
#include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h"
#include "Plugins/ExpressionParser/Clang/ClangUtil.h"
#include "Plugins/Language/ObjC/ObjCLanguage.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/Value.h"
#include "lldb/Host/Host.h"
#include "lldb/Symbol/CompileUnit.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/SymbolFile.h"
#include "lldb/Symbol/TypeList.h"
#include "lldb/Symbol/TypeMap.h"
#include "lldb/Symbol/VariableList.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/LLDBAssert.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Type.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Demangle/Demangle.h"
#include <map>
#include <memory>
#include <optional>
#include <vector>
#ifdef ENABLE_DEBUG_PRINTF
#include <cstdio>
#define DEBUG_PRINTF …
#else
#define DEBUG_PRINTF(fmt, ...) …
#endif
usingnamespacelldb;
usingnamespacelldb_private;
usingnamespacelldb_private::dwarf;
usingnamespacelldb_private::plugin::dwarf;
DWARFASTParserClang::DWARFASTParserClang(TypeSystemClang &ast)
: … { … }
DWARFASTParserClang::~DWARFASTParserClang() = default;
static bool DeclKindIsCXXClass(clang::Decl::Kind decl_kind) { … }
ClangASTImporter &DWARFASTParserClang::GetClangASTImporter() { … }
static bool IsClangModuleFwdDecl(const DWARFDIE &Die) { … }
static DWARFDIE GetContainingClangModuleDIE(const DWARFDIE &die) { … }
static lldb::ModuleSP GetContainingClangModule(const DWARFDIE &die) { … }
static bool ShouldIgnoreArtificialField(llvm::StringRef FieldName) { … }
static bool TagIsRecordType(dw_tag_t tag) { … }
TypeSP DWARFASTParserClang::ParseTypeFromClangModule(const SymbolContext &sc,
const DWARFDIE &die,
Log *log) { … }
static void PrepareContextToReceiveMembers(TypeSystemClang &ast,
ClangASTImporter &ast_importer,
clang::DeclContext *decl_ctx,
DWARFDIE die,
const char *type_name_cstr) { … }
ParsedDWARFTypeAttributes::ParsedDWARFTypeAttributes(const DWARFDIE &die) { … }
static std::string GetUnitName(const DWARFDIE &die) { … }
TypeSP DWARFASTParserClang::ParseTypeFromDWARF(const SymbolContext &sc,
const DWARFDIE &die,
bool *type_is_new_ptr) { … }
static std::optional<uint32_t>
ExtractDataMemberLocation(DWARFDIE const &die, DWARFFormValue const &form_value,
ModuleSP module_sp) { … }
static TypePayloadClang GetPtrAuthMofidierPayload(const DWARFDIE &die) { … }
lldb::TypeSP
DWARFASTParserClang::ParseTypeModifier(const SymbolContext &sc,
const DWARFDIE &die,
ParsedDWARFTypeAttributes &attrs) { … }
std::string
DWARFASTParserClang::GetDIEClassTemplateParams(const DWARFDIE &die) { … }
void DWARFASTParserClang::MapDeclDIEToDefDIE(
const lldb_private::plugin::dwarf::DWARFDIE &decl_die,
const lldb_private::plugin::dwarf::DWARFDIE &def_die) { … }
TypeSP DWARFASTParserClang::ParseEnum(const SymbolContext &sc,
const DWARFDIE &decl_die,
ParsedDWARFTypeAttributes &attrs) { … }
static clang::CallingConv
ConvertDWARFCallingConventionToClang(const ParsedDWARFTypeAttributes &attrs) { … }
bool DWARFASTParserClang::ParseObjCMethod(
const ObjCLanguage::MethodName &objc_method, const DWARFDIE &die,
CompilerType clang_type, const ParsedDWARFTypeAttributes &attrs,
bool is_variadic) { … }
std::pair<bool, TypeSP> DWARFASTParserClang::ParseCXXMethod(
const DWARFDIE &die, CompilerType clang_type,
const ParsedDWARFTypeAttributes &attrs, const DWARFDIE &decl_ctx_die,
bool is_static, bool &ignore_containing_context) { … }
TypeSP
DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die,
const ParsedDWARFTypeAttributes &attrs) { … }
TypeSP
DWARFASTParserClang::ParseArrayType(const DWARFDIE &die,
const ParsedDWARFTypeAttributes &attrs) { … }
TypeSP DWARFASTParserClang::ParsePointerToMemberType(
const DWARFDIE &die, const ParsedDWARFTypeAttributes &attrs) { … }
void DWARFASTParserClang::ParseInheritance(
const DWARFDIE &die, const DWARFDIE &parent_die,
const CompilerType class_clang_type, const AccessType default_accessibility,
const lldb::ModuleSP &module_sp,
std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> &base_classes,
ClangASTImporter::LayoutInfo &layout_info) { … }
TypeSP DWARFASTParserClang::UpdateSymbolContextScopeForType(
const SymbolContext &sc, const DWARFDIE &die, TypeSP type_sp) { … }
void DWARFASTParserClang::GetUniqueTypeNameAndDeclaration(
const lldb_private::plugin::dwarf::DWARFDIE &die,
lldb::LanguageType language, lldb_private::ConstString &unique_typename,
lldb_private::Declaration &decl_declaration) { … }
TypeSP
DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc,
const DWARFDIE &die,
ParsedDWARFTypeAttributes &attrs) { … }
class DWARFASTParserClang::DelayedAddObjCClassProperty { … };
bool DWARFASTParserClang::ParseTemplateDIE(
const DWARFDIE &die,
TypeSystemClang::TemplateParameterInfos &template_param_infos) { … }
bool DWARFASTParserClang::ParseTemplateParameterInfos(
const DWARFDIE &parent_die,
TypeSystemClang::TemplateParameterInfos &template_param_infos) { … }
bool DWARFASTParserClang::CompleteRecordType(const DWARFDIE &die,
lldb_private::Type *type,
const CompilerType &clang_type) { … }
bool DWARFASTParserClang::CompleteEnumType(const DWARFDIE &die,
lldb_private::Type *type,
const CompilerType &clang_type) { … }
bool DWARFASTParserClang::CompleteTypeFromDWARF(
const DWARFDIE &die, lldb_private::Type *type,
const CompilerType &clang_type) { … }
void DWARFASTParserClang::EnsureAllDIEsInDeclContextHaveBeenParsed(
lldb_private::CompilerDeclContext decl_context) { … }
CompilerDecl DWARFASTParserClang::GetDeclForUIDFromDWARF(const DWARFDIE &die) { … }
CompilerDeclContext
DWARFASTParserClang::GetDeclContextForUIDFromDWARF(const DWARFDIE &die) { … }
CompilerDeclContext
DWARFASTParserClang::GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) { … }
size_t DWARFASTParserClang::ParseChildEnumerators(
const lldb_private::CompilerType &clang_type, bool is_signed,
uint32_t enumerator_byte_size, const DWARFDIE &parent_die) { … }
ConstString
DWARFASTParserClang::ConstructDemangledNameFromDWARF(const DWARFDIE &die) { … }
Function *
DWARFASTParserClang::ParseFunctionFromDWARF(CompileUnit &comp_unit,
const DWARFDIE &die,
const AddressRange &func_range) { … }
namespace {
struct PropertyAttributes { … };
struct DiscriminantValue { … };
struct VariantMember { … };
struct VariantPart { … };
}
ConstString VariantMember::GetName() const { … }
bool VariantMember::IsDefault() const { … }
VariantMember::VariantMember(DWARFDIE &die, lldb::ModuleSP module_sp) { … }
DiscriminantValue::DiscriminantValue(const DWARFDIE &die, ModuleSP module_sp) { … }
VariantPart::VariantPart(const DWARFDIE &die, const DWARFDIE &parent_die,
lldb::ModuleSP module_sp)
: … { … }
std::vector<VariantMember> &VariantPart::members() { … }
DiscriminantValue &VariantPart::discriminant() { … }
DWARFASTParserClang::MemberAttributes::MemberAttributes(
const DWARFDIE &die, const DWARFDIE &parent_die, ModuleSP module_sp) { … }
PropertyAttributes::PropertyAttributes(const DWARFDIE &die) { … }
void DWARFASTParserClang::ParseObjCProperty(
const DWARFDIE &die, const DWARFDIE &parent_die,
const lldb_private::CompilerType &class_clang_type,
DelayedPropertyList &delayed_properties) { … }
llvm::Expected<llvm::APInt> DWARFASTParserClang::ExtractIntFromFormValue(
const CompilerType &int_type, const DWARFFormValue &form_value) const { … }
void DWARFASTParserClang::CreateStaticMemberVariable(
const DWARFDIE &die, const MemberAttributes &attrs,
const lldb_private::CompilerType &class_clang_type) { … }
void DWARFASTParserClang::ParseSingleMember(
const DWARFDIE &die, const DWARFDIE &parent_die,
const lldb_private::CompilerType &class_clang_type,
lldb::AccessType default_accessibility,
lldb_private::ClangASTImporter::LayoutInfo &layout_info,
FieldInfo &last_field_info) { … }
bool DWARFASTParserClang::ParseChildMembers(
const DWARFDIE &parent_die, const CompilerType &class_clang_type,
std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> &base_classes,
std::vector<DWARFDIE> &member_function_dies,
std::vector<DWARFDIE> &contained_type_dies,
DelayedPropertyList &delayed_properties,
const AccessType default_accessibility,
ClangASTImporter::LayoutInfo &layout_info) { … }
size_t DWARFASTParserClang::ParseChildParameters(
clang::DeclContext *containing_decl_ctx, const DWARFDIE &parent_die,
bool skip_artificial, bool &is_static, bool &is_variadic,
bool &has_template_params, std::vector<CompilerType> &function_param_types,
std::vector<clang::ParmVarDecl *> &function_param_decls,
unsigned &type_quals) { … }
clang::Decl *DWARFASTParserClang::GetClangDeclForDIE(const DWARFDIE &die) { … }
clang::DeclContext *
DWARFASTParserClang::GetClangDeclContextForDIE(const DWARFDIE &die) { … }
OptionalClangModuleID
DWARFASTParserClang::GetOwningClangModule(const DWARFDIE &die) { … }
static bool IsSubroutine(const DWARFDIE &die) { … }
static DWARFDIE GetContainingFunctionWithAbstractOrigin(const DWARFDIE &die) { … }
static DWARFDIE FindAnyChildWithAbstractOrigin(const DWARFDIE &context) { … }
static DWARFDIE FindFirstChildWithAbstractOrigin(const DWARFDIE &block,
const DWARFDIE &function) { … }
clang::DeclContext *
DWARFASTParserClang::GetDeclContextForBlock(const DWARFDIE &die) { … }
clang::BlockDecl *DWARFASTParserClang::ResolveBlockDIE(const DWARFDIE &die) { … }
clang::NamespaceDecl *
DWARFASTParserClang::ResolveNamespaceDIE(const DWARFDIE &die) { … }
clang::NamespaceDecl *
DWARFASTParserClang::ResolveImportedDeclarationDIE(const DWARFDIE &die) { … }
clang::DeclContext *DWARFASTParserClang::GetClangDeclContextContainingDIE(
const DWARFDIE &die, DWARFDIE *decl_ctx_die_copy) { … }
clang::DeclContext *
DWARFASTParserClang::GetCachedClangDeclContextForDIE(const DWARFDIE &die) { … }
void DWARFASTParserClang::LinkDeclContextToDIE(clang::DeclContext *decl_ctx,
const DWARFDIE &die) { … }
bool DWARFASTParserClang::CopyUniqueClassMethodTypes(
const DWARFDIE &src_class_die, const DWARFDIE &dst_class_die,
lldb_private::Type *class_type, std::vector<DWARFDIE> &failures) { … }
bool DWARFASTParserClang::ShouldCreateUnnamedBitfield(
FieldInfo const &last_field_info, uint64_t last_field_end,
FieldInfo const &this_field_info,
lldb_private::ClangASTImporter::LayoutInfo const &layout_info) const { … }
void DWARFASTParserClang::ParseRustVariantPart(
DWARFDIE &die, const DWARFDIE &parent_die,
const CompilerType &class_clang_type,
const lldb::AccessType default_accesibility,
ClangASTImporter::LayoutInfo &layout_info) { … }