diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF')
4 files changed, 160 insertions, 192 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index fa2d05819c4..b8d73d4bf2f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -407,11 +407,11 @@ SymbolFileDWARF::GetTypes (SymbolContextScope *sc_scope, // }); // } - std::set<clang_type_t> clang_type_set; + std::set<ClangASTType> clang_type_set; size_t num_types_added = 0; for (Type *type : type_set) { - clang_type_t clang_type = type->GetClangForwardType(); + ClangASTType clang_type = type->GetClangForwardType(); if (clang_type_set.find(clang_type) == clang_type_set.end()) { clang_type_set.insert(clang_type); @@ -1424,7 +1424,7 @@ SymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu, attributes); const char *name = NULL; Type *lldb_type = NULL; - clang_type_t clang_type = NULL; + ClangASTType clang_type; uint64_t uval64 = 0; bool uval64_valid = false; if (num_attributes > 0) @@ -1465,7 +1465,7 @@ SymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu, clang::ASTContext *ast = GetClangASTContext().getASTContext(); if (!clang_type) - clang_type = ast->VoidTy.getAsOpaquePtr(); + clang_type = GetClangASTContext().GetBasicType(eBasicTypeVoid); if (clang_type) { @@ -1475,20 +1475,19 @@ SymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu, else template_param_infos.names.push_back(NULL); - clang::QualType clang_qual_type (clang::QualType::getFromOpaquePtr (clang_type)); if (tag == DW_TAG_template_value_parameter && lldb_type != NULL && - ClangASTContext::IsIntegerType (clang_type, is_signed) && + clang_type.IsIntegerType (is_signed) && uval64_valid) { llvm::APInt apint (lldb_type->GetByteSize() * 8, uval64, is_signed); template_param_infos.args.push_back (clang::TemplateArgument (*ast, llvm::APSInt(apint), - clang_qual_type)); + clang_type.GetQualType())); } else { - template_param_infos.args.push_back (clang::TemplateArgument (clang_qual_type)); + template_param_infos.args.push_back (clang::TemplateArgument (clang_type.GetQualType())); } } else @@ -1565,17 +1564,15 @@ class SymbolFileDWARF::DelayedAddObjCClassProperty public: DelayedAddObjCClassProperty ( - clang::ASTContext *ast, - lldb::clang_type_t class_opaque_type, + const ClangASTType &class_opaque_type, const char *property_name, - lldb::clang_type_t property_opaque_type, // The property type is only required if you don't have an ivar decl + const ClangASTType &property_opaque_type, // The property type is only required if you don't have an ivar decl clang::ObjCIvarDecl *ivar_decl, const char *property_setter_name, const char *property_getter_name, uint32_t property_attributes, const ClangASTMetadata *metadata ) : - m_ast (ast), m_class_opaque_type (class_opaque_type), m_property_name (property_name), m_property_opaque_type (property_opaque_type), @@ -1593,12 +1590,11 @@ public: DelayedAddObjCClassProperty (const DelayedAddObjCClassProperty &rhs) { - *this = rhs; + *this = rhs; } DelayedAddObjCClassProperty& operator= (const DelayedAddObjCClassProperty &rhs) { - m_ast = rhs.m_ast; m_class_opaque_type = rhs.m_class_opaque_type; m_property_name = rhs.m_property_name; m_property_opaque_type = rhs.m_property_opaque_type; @@ -1615,23 +1611,21 @@ public: return *this; } - bool Finalize() const - { - return ClangASTContext::AddObjCClassProperty (m_ast, - m_class_opaque_type, - m_property_name, - m_property_opaque_type, - m_ivar_decl, - m_property_setter_name, - m_property_getter_name, - m_property_attributes, - m_metadata_ap.get()); + bool + Finalize() + { + return m_class_opaque_type.AddObjCClassProperty (m_property_name, + m_property_opaque_type, + m_ivar_decl, + m_property_setter_name, + m_property_getter_name, + m_property_attributes, + m_metadata_ap.get()); } private: - clang::ASTContext *m_ast; - lldb::clang_type_t m_class_opaque_type; + ClangASTType m_class_opaque_type; const char *m_property_name; - lldb::clang_type_t m_property_opaque_type; + ClangASTType m_property_opaque_type; clang::ObjCIvarDecl *m_ivar_decl; const char *m_property_setter_name; const char *m_property_getter_name; @@ -1693,7 +1687,7 @@ SymbolFileDWARF::ParseChildMembers const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *parent_die, - clang_type_t class_clang_type, + ClangASTType &class_clang_type, const LanguageType class_language, std::vector<clang::CXXBaseSpecifier *>& base_classes, std::vector<int>& member_accessibilities, @@ -1772,7 +1766,6 @@ SymbolFileDWARF::ParseChildMembers uint32_t block_length = form_value.Unsigned(); uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); if (DWARFExpression::Evaluate(NULL, // ExecutionContext * - NULL, // clang::ASTContext * NULL, // ClangExpressionVariableList * NULL, // ClangExpressionDeclMap * NULL, // RegisterContext * @@ -1784,7 +1777,7 @@ SymbolFileDWARF::ParseChildMembers memberOffset, NULL)) { - member_byte_offset = memberOffset.ResolveValue(NULL, NULL).UInt(); + member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); } } break; @@ -1891,10 +1884,9 @@ SymbolFileDWARF::ParseChildMembers if (var_type) { - GetClangASTContext().AddVariableToRecordType (class_clang_type, - name, - var_type->GetClangLayoutType(), - accessibility); + class_clang_type.AddVariableToRecordType (name, + var_type->GetClangLayoutType(), + accessibility); } break; } @@ -2008,32 +2000,30 @@ SymbolFileDWARF::ParseChildMembers if (anon_field_info.IsValid()) { - clang::FieldDecl *unnamed_bitfield_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type, - NULL, - GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width), - accessibility, - anon_field_info.bit_size); + clang::FieldDecl *unnamed_bitfield_decl = class_clang_type.AddFieldToRecordType (NULL, + GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width), + accessibility, + anon_field_info.bit_size); layout_info.field_offsets.insert(std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset)); } } } - clang_type_t member_clang_type = member_type->GetClangLayoutType(); + ClangASTType member_clang_type = member_type->GetClangLayoutType(); { // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>). // If the current field is at the end of the structure, then there is definitely no room for extra // elements and we override the type to array[0]. - clang_type_t member_array_element_type; + ClangASTType member_array_element_type; uint64_t member_array_size; bool member_array_is_incomplete; - if (GetClangASTContext().IsArrayType(member_clang_type, - &member_array_element_type, - &member_array_size, - &member_array_is_incomplete) && + if (member_clang_type.IsArrayType(&member_array_element_type, + &member_array_size, + &member_array_is_incomplete) && !member_array_is_incomplete) { uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, UINT64_MAX); @@ -2054,11 +2044,10 @@ SymbolFileDWARF::ParseChildMembers } } - field_decl = GetClangASTContext().AddFieldToRecordType (class_clang_type, - name, - member_clang_type, - accessibility, - bit_size); + field_decl = class_clang_type.AddFieldToRecordType (name, + member_clang_type, + accessibility, + bit_size); GetClangASTContext().SetMetadataAsUserID (field_decl, MakeUserID(die->GetOffset())); @@ -2094,8 +2083,7 @@ SymbolFileDWARF::ParseChildMembers ClangASTMetadata metadata; metadata.SetUserID (MakeUserID(die->GetOffset())); - delayed_properties.push_back(DelayedAddObjCClassProperty(GetClangASTContext().getASTContext(), - class_clang_type, + delayed_properties.push_back(DelayedAddObjCClassProperty(class_clang_type, prop_name, member_type->GetClangLayoutType(), ivar_decl, @@ -2162,7 +2150,6 @@ SymbolFileDWARF::ParseChildMembers if (DWARFExpression::Evaluate (NULL, NULL, NULL, - NULL, NULL, debug_info_data, block_offset, @@ -2172,7 +2159,7 @@ SymbolFileDWARF::ParseChildMembers memberOffset, NULL)) { - member_byte_offset = memberOffset.ResolveValue(NULL, NULL).UInt(); + member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); } } break; @@ -2192,27 +2179,26 @@ SymbolFileDWARF::ParseChildMembers Type *base_class_type = ResolveTypeUID(encoding_uid); assert(base_class_type); - clang_type_t base_class_clang_type = base_class_type->GetClangFullType(); + ClangASTType base_class_clang_type = base_class_type->GetClangFullType(); assert (base_class_clang_type); if (class_language == eLanguageTypeObjC) { - GetClangASTContext().SetObjCSuperClass(class_clang_type, base_class_clang_type); + class_clang_type.SetObjCSuperClass(base_class_clang_type); } else { - base_classes.push_back (GetClangASTContext().CreateBaseClassSpecifier (base_class_clang_type, - accessibility, + base_classes.push_back (base_class_clang_type.CreateBaseClassSpecifier (accessibility, is_virtual, is_base_of_class)); if (is_virtual) { - layout_info.vbase_offsets.insert(std::make_pair(ClangASTType::GetAsCXXRecordDecl(class_clang_type), + layout_info.vbase_offsets.insert(std::make_pair(class_clang_type.GetAsCXXRecordDecl(), clang::CharUnits::fromQuantity(member_byte_offset))); } else { - layout_info.base_offsets.insert(std::make_pair(ClangASTType::GetAsCXXRecordDecl(class_clang_type), + layout_info.base_offsets.insert(std::make_pair(class_clang_type.GetAsCXXRecordDecl(), clang::CharUnits::fromQuantity(member_byte_offset))); } } @@ -2331,35 +2317,35 @@ SymbolFileDWARF::ResolveTypeUID (DWARFCompileUnit* cu, const DWARFDebugInfoEntry // SymbolFileDWARF objects to detect if this DWARF file is the one that // can resolve a clang_type. bool -SymbolFileDWARF::HasForwardDeclForClangType (lldb::clang_type_t clang_type) +SymbolFileDWARF::HasForwardDeclForClangType (const ClangASTType &clang_type) { - clang_type_t clang_type_no_qualifiers = ClangASTType::RemoveFastQualifiers(clang_type); - const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers); + ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers(); + const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType()); return die != NULL; } -lldb::clang_type_t -SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type) +bool +SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (ClangASTType &clang_type) { // We have a struct/union/class/enum that needs to be fully resolved. - clang_type_t clang_type_no_qualifiers = ClangASTType::RemoveFastQualifiers(clang_type); - const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers); + ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers(); + const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType()); if (die == NULL) { // We have already resolved this type... - return clang_type; + return true; } // Once we start resolving this type, remove it from the forward declaration // map in case anyone child members or other types require this type to get resolved. // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition // are done. - m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers); + m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType()); // Disable external storage for this type so we don't get anymore // clang::ExternalASTSource queries for this type. - ClangASTContext::SetHasExternalStorage (clang_type, false); + clang_type.SetHasExternalStorage (false); DWARFDebugInfo* debug_info = DebugInfo(); @@ -2381,8 +2367,6 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type assert (clang_type); DWARFDebugInfoEntry::Attributes attributes; - ClangASTContext &ast = GetClangASTContext(); - switch (tag) { case DW_TAG_structure_type: @@ -2396,13 +2380,12 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type { LanguageType class_language = eLanguageTypeUnknown; - bool is_objc_class = ClangASTContext::IsObjCClassType (clang_type); - if (is_objc_class) + if (clang_type.IsObjCObjectOrInterfaceType()) { class_language = eLanguageTypeObjC; // For objective C we don't start the definition when // the class is created. - ast.StartTagDeclarationDefinition (clang_type); + clang_type.StartTagDeclarationDefinition (); } int tag_decl_kind = -1; @@ -2456,7 +2439,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type if (class_language == eLanguageTypeObjC) { - std::string class_str (ClangASTType::GetTypeNameForOpaqueQualType(ast.getASTContext(), clang_type)); + std::string class_str (clang_type.GetTypeName()); if (!class_str.empty()) { @@ -2499,7 +2482,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type } } - for (DelayedPropertyList::const_iterator pi = delayed_properties.begin(), pe = delayed_properties.end(); + for (DelayedPropertyList::iterator pi = delayed_properties.begin(), pe = delayed_properties.end(); pi != pe; ++pi) pi->Finalize(); @@ -2511,7 +2494,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type if (class_language != eLanguageTypeObjC) { if (is_a_class && tag_decl_kind != clang::TTK_Class) - ast.SetTagTypeKind (clang_type, clang::TTK_Class); + clang_type.SetTagTypeKind (clang::TTK_Class); } // Since DW_TAG_structure_type gets used for both classes @@ -2528,29 +2511,26 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type { // This is a class and all members that didn't have // their access specified are private. - ast.SetDefaultAccessForRecordFields (clang_type, - eAccessPrivate, - &member_accessibilities.front(), - member_accessibilities.size()); + clang_type.SetDefaultAccessForRecordFields (eAccessPrivate, + &member_accessibilities.front(), + member_accessibilities.size()); } if (!base_classes.empty()) { - ast.SetBaseClassesForClassType (clang_type, - &base_classes.front(), - base_classes.size()); + clang_type.SetBaseClassesForClassType (&base_classes.front(), + base_classes.size()); // Clang will copy each CXXBaseSpecifier in "base_classes" // so we have to free them all. - ClangASTContext::DeleteBaseClassSpecifiers (&base_classes.front(), - base_classes.size()); + ClangASTType::DeleteBaseClassSpecifiers (&base_classes.front(), + base_classes.size()); } } } - ast.BuildIndirectFields (clang_type); - - ast.CompleteTagDeclarationDefinition (clang_type); + clang_type.BuildIndirectFields (); + clang_type.CompleteTagDeclarationDefinition (); if (!layout_info.field_offsets.empty() || !layout_info.base_offsets.empty() || @@ -2561,14 +2541,14 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type if (layout_info.bit_size == 0) layout_info.bit_size = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, 0) * 8; - clang::CXXRecordDecl *record_decl = ClangASTType::GetAsCXXRecordDecl(clang_type); + clang::CXXRecordDecl *record_decl = clang_type.GetAsCXXRecordDecl(); if (record_decl) { if (log) { GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])", - clang_type, + clang_type.GetOpaqueQualType(), record_decl, layout_info.bit_size, layout_info.alignment, @@ -2583,7 +2563,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type { GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }", - clang_type, + clang_type.GetOpaqueQualType(), idx, (uint32_t)pos->second, pos->first->getNameAsString().c_str()); @@ -2596,7 +2576,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type { GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }", - clang_type, + clang_type.GetOpaqueQualType(), idx, (uint32_t)base_pos->second.getQuantity(), base_pos->first->getNameAsString().c_str()); @@ -2608,7 +2588,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type { GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }", - clang_type, + clang_type.GetOpaqueQualType(), idx, (uint32_t)vbase_pos->second.getQuantity(), vbase_pos->first->getNameAsString().c_str()); @@ -2623,15 +2603,15 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type return clang_type; case DW_TAG_enumeration_type: - ast.StartTagDeclarationDefinition (clang_type); + clang_type.StartTagDeclarationDefinition (); if (die->HasChildren()) { SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); bool is_signed = false; - ast.IsIntegerType(clang_type, is_signed); + clang_type.IsIntegerType(is_signed); ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), dwarf_cu, die); } - ast.CompleteTagDeclarationDefinition (clang_type); + clang_type.CompleteTagDeclarationDefinition (); return clang_type; default: @@ -4142,7 +4122,7 @@ SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc, bool skip_artificial, bool &is_static, TypeList* type_list, - std::vector<clang_type_t>& function_param_types, + std::vector<ClangASTType>& function_param_types, std::vector<clang::ParmVarDecl*>& function_param_decls, unsigned &type_quals, ClangASTContext::TemplateParameterInfos &template_param_infos) @@ -4308,7 +4288,7 @@ size_t SymbolFileDWARF::ParseChildEnumerators ( const SymbolContext& sc, - clang_type_t enumerator_clang_type, + lldb_private::ClangASTType &clang_type, bool is_signed, uint32_t enumerator_byte_size, DWARFCompileUnit* dwarf_cu, @@ -4370,12 +4350,11 @@ SymbolFileDWARF::ParseChildEnumerators if (name && name[0] && got_value) { - GetClangASTContext().AddEnumerationValueToEnumerationType (enumerator_clang_type, - enumerator_clang_type, - decl, - name, - enum_value, - enumerator_byte_size * 8); + clang_type.AddEnumerationValueToEnumerationType (clang_type.GetEnumerationIntegerType(), + decl, + name, + enum_value, + enumerator_byte_size * 8); ++enumerators_added; } } @@ -4643,7 +4622,7 @@ SymbolFileDWARF::GetClangDeclContextContainingDIE (DWARFCompileUnit *cu, const D Type* type = ResolveType (cu, decl_ctx_die); if (type) { - clang::DeclContext *decl_ctx = ClangASTContext::GetDeclContextForType (type->GetClangForwardType ()); + clang::DeclContext *decl_ctx = type->GetClangForwardType().GetDeclContextForType (); if (decl_ctx) { LinkDeclContextToDIE (decl_ctx, decl_ctx_die); @@ -5671,7 +5650,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Declaration decl; Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID; - clang_type_t clang_type = NULL; + ClangASTType clang_type; dw_attr_t attr; @@ -5744,7 +5723,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, strcmp(type_name_cstr, "decltype(nullptr)") == 0 ) { resolve_state = Type::eResolveStateFull; - clang_type = ast.getASTContext()->NullPtrTy.getAsOpaquePtr(); + clang_type = ast.GetBasicType(eBasicTypeNullPtr); break; } // Fall through to base type below in case we can handle the type there... @@ -5765,7 +5744,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break; } - if (clang_type == NULL && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID) && sc.comp_unit != NULL) + if (!clang_type && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID) && sc.comp_unit != NULL) { bool translation_unit_is_objc = (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus); @@ -5784,7 +5763,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, dwarf_cu)); - clang_type = ast.GetBuiltInType_objc_id(); + clang_type = ast.GetBasicType(eBasicTypeObjCID); encoding_data_type = Type::eEncodingIsUID; encoding_uid = LLDB_INVALID_UID; resolve_state = Type::eResolveStateFull; @@ -5797,7 +5776,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, dwarf_cu)); - clang_type = ast.GetBuiltInType_objc_Class(); + clang_type = ast.GetBasicType(eBasicTypeObjCClass); encoding_data_type = Type::eEncodingIsUID; encoding_uid = LLDB_INVALID_UID; resolve_state = Type::eResolveStateFull; @@ -5809,7 +5788,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, dwarf_cu)); - clang_type = ast.GetBuiltInType_objc_selector(); + clang_type = ast.GetBasicType(eBasicTypeObjCSel); encoding_data_type = Type::eEncodingIsUID; encoding_uid = LLDB_INVALID_UID; resolve_state = Type::eResolveStateFull; @@ -5832,7 +5811,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, dwarf_cu)); - clang_type = ast.GetBuiltInType_objc_id(); + clang_type = ast.GetBasicType(eBasicTypeObjCID); encoding_data_type = Type::eEncodingIsUID; encoding_uid = LLDB_INVALID_UID; resolve_state = Type::eResolveStateFull; @@ -6109,8 +6088,8 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, } assert (tag_decl_kind != -1); bool clang_type_was_created = false; - clang_type = m_forward_decl_die_to_clang_type.lookup (die); - if (clang_type == NULL) + clang_type.SetClangType(ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die)); + if (!clang_type) { const DWARFDebugInfoEntry *decl_ctx_die; @@ -6166,7 +6145,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // Store a forward declaration to this class type in case any // parameters in any class methods need it for the clang // types for function prototypes. - LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); + LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die); type_sp.reset (new Type (MakeUserID(die->GetOffset()), this, type_name_const_str, @@ -6202,27 +6181,21 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (die->HasChildren() == false) { // No children for this struct/union/class, lets finish it - ast.StartTagDeclarationDefinition (clang_type); - ast.CompleteTagDeclarationDefinition (clang_type); + clang_type.StartTagDeclarationDefinition (); + clang_type.CompleteTagDeclarationDefinition (); if (tag == DW_TAG_structure_type) // this only applies in C { - clang::QualType qual_type = clang::QualType::getFromOpaquePtr (clang_type); - const clang::RecordType *record_type = qual_type->getAs<clang::RecordType> (); + clang::RecordDecl *record_decl = clang_type.GetAsRecordDecl(); - if (record_type) + if (record_decl) { - clang::RecordDecl *record_decl = record_type->getDecl(); + LayoutInfo layout_info; - if (record_decl) - { - LayoutInfo layout_info; - - layout_info.alignment = 0; - layout_info.bit_size = 0; - - m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); - } + layout_info.alignment = 0; + layout_info.bit_size = 0; + + m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); } } } @@ -6238,16 +6211,16 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (class_language != eLanguageTypeObjC && class_language != eLanguageTypeObjC_plus_plus) - ast.StartTagDeclarationDefinition (clang_type); + clang_type.StartTagDeclarationDefinition (); // Leave this as a forward declaration until we need // to know the details of the type. lldb_private::Type // will automatically call the SymbolFile virtual function // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)" // When the definition needs to be defined. - m_forward_decl_die_to_clang_type[die] = clang_type; - m_forward_decl_clang_type_to_die[ClangASTType::RemoveFastQualifiers (clang_type)] = die; - ClangASTContext::SetHasExternalStorage (clang_type, true); + m_forward_decl_die_to_clang_type[die] = clang_type.GetOpaqueQualType(); + m_forward_decl_clang_type_to_die[clang_type.RemoveFastQualifiers().GetOpaqueQualType()] = die; + clang_type.SetHasExternalStorage (true); } } @@ -6303,9 +6276,9 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); - clang_type_t enumerator_clang_type = NULL; - clang_type = m_forward_decl_die_to_clang_type.lookup (die); - if (clang_type == NULL) + ClangASTType enumerator_clang_type; + clang_type.SetClangType (ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die)); + if (!clang_type) { if (encoding_uid != DW_INVALID_OFFSET) { @@ -6314,7 +6287,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, enumerator_clang_type = enumerator_type->GetClangFullType(); } - if (enumerator_clang_type == NULL) + if (!enumerator_clang_type) enumerator_clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (NULL, DW_ATE_signed, byte_size * 8); @@ -6326,10 +6299,10 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, } else { - enumerator_clang_type = ClangASTContext::GetEnumerationIntegerType (clang_type); + enumerator_clang_type = clang_type.GetEnumerationIntegerType (); } - LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); + LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die); type_sp.reset( new Type (MakeUserID(die->GetOffset()), this, @@ -6342,15 +6315,15 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, clang_type, Type::eResolveStateForward)); - ast.StartTagDeclarationDefinition (clang_type); + clang_type.StartTagDeclarationDefinition (); if (die->HasChildren()) { SymbolContext cu_sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); bool is_signed = false; - ast.IsIntegerType(enumerator_clang_type, is_signed); + enumerator_clang_type.IsIntegerType(is_signed); ParseChildEnumerators(cu_sc, clang_type, is_signed, type_sp->GetByteSize(), dwarf_cu, die); } - ast.CompleteTagDeclarationDefinition (clang_type); + clang_type.CompleteTagDeclarationDefinition (); } } break; @@ -6473,7 +6446,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); - clang_type_t return_clang_type = NULL; + ClangASTType return_clang_type; Type *func_type = NULL; if (type_die_offset != DW_INVALID_OFFSET) @@ -6482,10 +6455,10 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (func_type) return_clang_type = func_type->GetClangForwardType(); else - return_clang_type = ast.GetBuiltInType_void(); + return_clang_type = ast.GetBasicType(eBasicTypeVoid); - std::vector<clang_type_t> function_param_types; + std::vector<ClangASTType> function_param_types; std::vector<clang::ParmVarDecl*> function_param_decls; // Parse the function children for the parameters @@ -6535,7 +6508,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (objc_method.IsValid(true)) { SymbolContext empty_sc; - clang_type_t class_opaque_type = NULL; + ClangASTType class_opaque_type; ConstString class_name(objc_method.GetClassName()); if (class_name) { @@ -6544,8 +6517,8 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (complete_objc_class_type_sp) { - clang_type_t type_clang_forward_type = complete_objc_class_type_sp->GetClangForwardType(); - if (ClangASTContext::IsObjCClassType (type_clang_forward_type)) + ClangASTType type_clang_forward_type = complete_objc_class_type_sp->GetClangForwardType(); + if (type_clang_forward_type.IsObjCObjectOrInterfaceType ()) class_opaque_type = type_clang_forward_type; } } @@ -6557,11 +6530,10 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (accessibility == eAccessNone) accessibility = eAccessPublic; - clang::ObjCMethodDecl *objc_method_decl = ast.AddMethodToObjCObjectType (class_opaque_type, - type_name_cstr, - clang_type, - accessibility, - is_artificial); + clang::ObjCMethodDecl *objc_method_decl = class_opaque_type.AddMethodToObjCObjectType (type_name_cstr, + clang_type, + accessibility, + is_artificial); type_handled = objc_method_decl != NULL; if (type_handled) { @@ -6680,10 +6652,10 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, } else { - clang_type_t class_opaque_type = class_type->GetClangForwardType(); - if (ClangASTContext::IsCXXClassType (class_opaque_type)) + ClangASTType class_opaque_type = class_type->GetClangForwardType(); + if (class_opaque_type.IsCXXClassType ()) { - if (ClangASTContext::IsBeingDefined (class_opaque_type)) + if (class_opaque_type.IsBeingDefined ()) { // Neither GCC 4.2 nor clang++ currently set a valid accessibility // in the DWARF for C++ methods... Default to public for now... @@ -6709,16 +6681,15 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const bool is_attr_used = false; - cxx_method_decl = ast.AddMethodToCXXRecordType (class_opaque_type, - type_name_cstr, - clang_type, - accessibility, - is_virtual, - is_static, - is_inline, - is_explicit, - is_attr_used, - is_artificial); + cxx_method_decl = class_opaque_type.AddMethodToCXXRecordType (type_name_cstr, + clang_type, + accessibility, + is_virtual, + is_static, + is_inline, + is_explicit, + is_attr_used, + is_artificial); type_handled = cxx_method_decl != NULL; @@ -6902,7 +6873,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, ParseChildArrayInfo(sc, dwarf_cu, die, first_index, element_orders, byte_stride, bit_stride); if (byte_stride == 0 && bit_stride == 0) byte_stride = element_type->GetByteSize(); - clang_type_t array_element_type = element_type->GetClangForwardType(); + ClangASTType array_element_type = element_type->GetClangForwardType(); uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride; uint64_t num_elements = 0; std::vector<uint64_t>::const_reverse_iterator pos; @@ -6961,14 +6932,12 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type *pointee_type = ResolveTypeUID(type_die_offset); Type *class_type = ResolveTypeUID(containing_type_die_offset); - clang_type_t pointee_clang_type = pointee_type->GetClangForwardType(); - clang_type_t class_clang_type = class_type->GetClangLayoutType(); + ClangASTType pointee_clang_type = pointee_type->GetClangForwardType(); + ClangASTType class_clang_type = class_type->GetClangLayoutType(); - clang_type = ast.CreateMemberPointerType(pointee_clang_type, - class_clang_type); + clang_type = pointee_clang_type.CreateMemberPointerType(class_clang_type); - byte_size = ClangASTType::GetClangTypeBitWidth (ast.getASTContext(), - clang_type) / 8; + byte_size = clang_type.GetByteSize(); type_sp.reset( new Type (MakeUserID(die->GetOffset()), this, @@ -7761,7 +7730,7 @@ void SymbolFileDWARF::CompleteTagDecl (void *baton, clang::TagDecl *decl) { SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); + ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); if (clang_type) symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); } @@ -7770,7 +7739,7 @@ void SymbolFileDWARF::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) { SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); + ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); if (clang_type) symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); } @@ -7844,8 +7813,7 @@ SymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context, Type *matching_type = ResolveType (dwarf_cu, die); - lldb::clang_type_t type = matching_type->GetClangForwardType(); - clang::QualType qual_type = clang::QualType::getFromOpaquePtr(type); + clang::QualType qual_type = matching_type->GetClangForwardType().GetQualType(); if (const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr())) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 0370bc3f595..b6c6d94782d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -107,7 +107,7 @@ public: virtual size_t ParseVariablesForContext (const lldb_private::SymbolContext& sc); virtual lldb_private::Type* ResolveTypeUID(lldb::user_id_t type_uid); - virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_opaque_type); + virtual bool ResolveClangOpaqueTypeDefinition (lldb_private::ClangASTType& clang_type); virtual lldb_private::Type* ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true); virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid); @@ -275,7 +275,7 @@ public: } bool - HasForwardDeclForClangType (lldb::clang_type_t clang_type); + HasForwardDeclForClangType (const lldb_private::ClangASTType &clang_type); protected: @@ -347,7 +347,7 @@ protected: const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, - lldb::clang_type_t class_clang_type, + lldb_private::ClangASTType &class_clang_type, const lldb::LanguageType class_language, std::vector<clang::CXXBaseSpecifier *>& base_classes, std::vector<int>& member_accessibilities, @@ -365,14 +365,14 @@ protected: bool skip_artificial, bool &is_static, lldb_private::TypeList* type_list, - std::vector<lldb::clang_type_t>& function_args, + std::vector<lldb_private::ClangASTType>& function_args, std::vector<clang::ParmVarDecl*>& function_param_decls, unsigned &type_quals, lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos); size_t ParseChildEnumerators( const lldb_private::SymbolContext& sc, - lldb::clang_type_t enumerator_qual_type, + lldb_private::ClangASTType &clang_type, bool is_signed, uint32_t enumerator_byte_size, DWARFCompileUnit* dwarf_cu, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 42107efe0aa..a0430e3d52b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -780,11 +780,11 @@ SymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) return NULL; } -lldb::clang_type_t -SymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type) +bool +SymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (ClangASTType& clang_type) { // We have a struct/union/class/enum that needs to be fully resolved. - return NULL; + return false; } uint32_t @@ -1385,7 +1385,7 @@ void SymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl) { SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; - clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); + ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); if (clang_type) { SymbolFileDWARF *oso_dwarf; @@ -1405,7 +1405,7 @@ void SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) { SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; - clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); + ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); if (clang_type) { SymbolFileDWARF *oso_dwarf; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index d38bf66725a..06330b98dc1 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -77,7 +77,7 @@ public: virtual lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid); virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid); virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid); - virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type); + virtual bool ResolveClangOpaqueTypeDefinition (lldb_private::ClangASTType& clang_type); virtual uint32_t ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc); virtual uint32_t ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list); virtual uint32_t FindGlobalVariables (const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::VariableList& variables); |