labath updated this revision to Diff 233080. labath added a comment. rename to RemoveWrappingTypes
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71262/new/ https://reviews.llvm.org/D71262 Files: lldb/source/Symbol/ClangASTContext.cpp lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s
Index: lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s +++ lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s @@ -4,13 +4,13 @@ # RUN: %lldb %t -o "target variable integer structure" -o exit | FileCheck %s # CHECK: (_Atomic(int)) integer = 14159 -# CHECK: (_Atomic(struct_type)) structure = {} +# CHECK: (_Atomic(struct_type)) structure = (member = 71828) .data integer: .long 14159 structure: - .byte 0 + .long 71828 .section .debug_abbrev,"",@progbits .byte 1 # Abbreviation Code @@ -53,13 +53,24 @@ .byte 0 # EOM(2) .byte 5 # Abbreviation Code .byte 19 # DW_TAG_structure_type - .byte 0 # DW_CHILDREN_no + .byte 1 # DW_CHILDREN_yes .byte 3 # DW_AT_name .byte 8 # DW_FORM_string .byte 11 # DW_AT_byte_size .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) + .byte 6 # Abbreviation Code + .byte 13 # DW_TAG_member + .byte 0 # DW_CHILDREN_no + .byte 3 # DW_AT_name + .byte 8 # DW_FORM_string + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 56 # DW_AT_data_member_location + .byte 11 # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) .byte 0 # EOM(3) .section .debug_info,"",@progbits @@ -99,6 +110,11 @@ .Lstruct: .byte 5 # Abbrev [5] DW_TAG_structure_type .asciz "struct_type" # DW_AT_name - .byte 0 # DW_AT_byte_size + .byte 4 # DW_AT_byte_size + .byte 6 # Abbrev [6] DW_TAG_member + .asciz "member" # DW_AT_name + .long .Lint # DW_AT_type + .byte 0 # DW_AT_data_member_location + .byte 0 # End Of Children Mark .byte 0 # End Of Children Mark .Ldebug_info_end0: Index: lldb/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/source/Symbol/ClangASTContext.cpp +++ lldb/source/Symbol/ClangASTContext.cpp @@ -2470,12 +2470,17 @@ /// syntactic sugar and other constructs one typically wants to ignore. /// The \p mask argument allows one to skip certain kinds of simplifications, /// when one wishes to handle a certain kind of type directly. -static QualType Desugar(QualType type, - ArrayRef<clang::Type::TypeClass> mask = {}) { +static QualType +RemoveWrappingTypes(QualType type, ArrayRef<clang::Type::TypeClass> mask = {}) { while (true) { if (find(mask, type->getTypeClass()) != mask.end()) return type; switch (type->getTypeClass()) { + // This is not fully correct as _Atomic is more than sugar, but it is + // sufficient for the purposes we care about. + case clang::Type::Atomic: + type = cast<clang::AtomicType>(type)->getValueType(); + break; case clang::Type::Auto: case clang::Type::Elaborated: case clang::Type::Paren: @@ -2493,7 +2498,7 @@ if (type.isNull()) return nullptr; - clang::QualType qual_type = Desugar(type.getCanonicalType()); + clang::QualType qual_type = RemoveWrappingTypes(type.getCanonicalType()); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::ObjCInterface: @@ -2517,7 +2522,7 @@ static bool GetCompleteQualType(clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true) { - qual_type = Desugar(qual_type); + qual_type = RemoveWrappingTypes(qual_type); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::ConstantArray: @@ -2651,7 +2656,7 @@ // Tests bool ClangASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) { - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -2672,7 +2677,7 @@ } bool ClangASTContext::IsAnonymousType(lldb::opaque_compiler_type_t type) { - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -2696,7 +2701,7 @@ bool ClangASTContext::IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type_ptr, uint64_t *size, bool *is_incomplete) { - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -2860,7 +2865,7 @@ bool ClangASTContext::IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); if (qual_type->isFunctionType()) { if (is_variadic_ptr) { @@ -2898,7 +2903,7 @@ if (!type) return 0; - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -3003,7 +3008,7 @@ bool ClangASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); if (qual_type->isFunctionPointerType()) return true; @@ -3030,7 +3035,7 @@ lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); if (qual_type->isBlockPointerType()) { if (function_pointer_type_ptr) { @@ -3101,7 +3106,7 @@ bool ClangASTContext::IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Builtin: @@ -3153,7 +3158,7 @@ bool ClangASTContext::IsPointerOrReferenceType( lldb::opaque_compiler_type_t type, CompilerType *pointee_type) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Builtin: @@ -3219,7 +3224,7 @@ CompilerType *pointee_type, bool *is_rvalue) { if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -3382,7 +3387,7 @@ bool check_objc) { clang::QualType pointee_qual_type; if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); bool success = false; const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -3639,7 +3644,7 @@ pointee_or_element_clang_type->Clear(); clang::QualType qual_type = - Desugar(GetQualType(type), {clang::Type::Typedef}); + RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef}); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -3826,11 +3831,6 @@ ->getUnderlyingType() .getAsOpaquePtr()) .GetTypeInfo(pointee_or_element_clang_type); - case clang::Type::Atomic: - return CompilerType(this, llvm::cast<clang::AtomicType>(qual_type) - ->getValueType() - .getAsOpaquePtr()) - .GetTypeInfo(pointee_or_element_clang_type); case clang::Type::UnresolvedUsing: return 0; @@ -3944,13 +3944,14 @@ return lldb::eTypeClassInvalid; clang::QualType qual_type = - Desugar(GetQualType(type), {clang::Type::Typedef}); + RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef}); switch (qual_type->getTypeClass()) { + case clang::Type::Atomic: case clang::Type::Auto: case clang::Type::Elaborated: case clang::Type::Paren: - llvm_unreachable("Handled in Desugar!"); + llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: break; case clang::Type::FunctionNoProto: @@ -4051,8 +4052,6 @@ break; case clang::Type::DeducedTemplateSpecialization: break; - case clang::Type::Atomic: - break; case clang::Type::Pipe: break; @@ -4201,7 +4200,7 @@ ClangASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) { size_t num_functions = 0; if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); switch (qual_type->getTypeClass()) { case clang::Type::Record: if (GetCompleteQualType(getASTContext(), qual_type)) { @@ -4265,7 +4264,7 @@ CompilerType clang_type; CompilerDecl clang_decl; if (type) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); switch (qual_type->getTypeClass()) { case clang::Type::Record: if (GetCompleteQualType(getASTContext(), qual_type)) { @@ -4657,14 +4656,15 @@ return lldb::eEncodingInvalid; count = 1; - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); switch (qual_type->getTypeClass()) { + case clang::Type::Atomic: case clang::Type::Auto: case clang::Type::Elaborated: case clang::Type::Paren: case clang::Type::Typedef: - llvm_unreachable("Handled in Desugar!"); + llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: break; @@ -4902,7 +4902,6 @@ case clang::Type::TemplateSpecialization: case clang::Type::DeducedTemplateSpecialization: - case clang::Type::Atomic: case clang::Type::Adjusted: case clang::Type::Pipe: break; @@ -4926,14 +4925,15 @@ if (!type) return lldb::eFormatDefault; - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); switch (qual_type->getTypeClass()) { + case clang::Type::Atomic: case clang::Type::Auto: case clang::Type::Elaborated: case clang::Type::Paren: case clang::Type::Typedef: - llvm_unreachable("Handled in Desugar!"); + llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: break; @@ -5042,11 +5042,6 @@ ->getUnderlyingType() .getAsOpaquePtr()) .GetFormat(); - case clang::Type::Atomic: - return CompilerType(this, llvm::cast<clang::AtomicType>(qual_type) - ->getValueType() - .getAsOpaquePtr()) - .GetFormat(); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -5113,7 +5108,7 @@ return 0; uint32_t num_children = 0; - clang::QualType qual_type(Desugar(GetQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Builtin: @@ -5380,7 +5375,7 @@ return 0; uint32_t count = 0; - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5500,7 +5495,7 @@ if (!type) return CompilerType(); - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5597,7 +5592,7 @@ uint32_t ClangASTContext::GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) { uint32_t count = 0; - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5649,7 +5644,7 @@ uint32_t ClangASTContext::GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) { uint32_t count = 0; - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5669,7 +5664,7 @@ CompilerType ClangASTContext::GetDirectBaseClassAtIndex( lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5767,7 +5762,7 @@ CompilerType ClangASTContext::GetVirtualBaseClassAtIndex( lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -5817,7 +5812,7 @@ if (type.isNull()) return 0; - clang::QualType qual_type = Desugar(type.getCanonicalType()); + clang::QualType qual_type = RemoveWrappingTypes(type.getCanonicalType()); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Builtin: @@ -5971,7 +5966,8 @@ return exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr; }; - clang::QualType parent_qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType parent_qual_type( + RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); child_bitfield_bit_size = 0; @@ -6495,7 +6491,7 @@ lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) { if (type && name && name[0]) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -6736,7 +6732,7 @@ const char *name, bool omit_empty_base_classes) { if (type && name && name[0]) { - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); @@ -6935,7 +6931,7 @@ if (!type) return 0; - clang::QualType qual_type = Desugar(GetCanonicalQualType(type)); + clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: @@ -6965,7 +6961,7 @@ if (!type) return nullptr; - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { case clang::Type::Record: { @@ -7938,7 +7934,7 @@ if (!type) return false; - clang::QualType qual_type(Desugar(GetCanonicalQualType(type))); + clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); const clang::Type::TypeClass type_class = qual_type->getTypeClass(); switch (type_class) { @@ -8870,7 +8866,7 @@ Stream *s) { if (type) { clang::QualType qual_type = - Desugar(GetQualType(type), {clang::Type::Typedef}); + RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef}); llvm::SmallVector<char, 1024> buf; llvm::raw_svector_ostream llvm_ostrm(buf);
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits