Index: lldb/include/lldb/Symbol/ClangASTContext.h =================================================================== --- lldb/include/lldb/Symbol/ClangASTContext.h +++ lldb/include/lldb/Symbol/ClangASTContext.h @@ -644,6 +644,8 @@ CompilerType GetRValueReferenceType(lldb::opaque_compiler_type_t type) override; + CompilerType GetAtomicType(lldb::opaque_compiler_type_t type) override; + CompilerType AddConstModifier(lldb::opaque_compiler_type_t type) override; CompilerType AddVolatileModifier(lldb::opaque_compiler_type_t type) override; Index: lldb/include/lldb/Symbol/CompilerType.h =================================================================== --- lldb/include/lldb/Symbol/CompilerType.h +++ lldb/include/lldb/Symbol/CompilerType.h @@ -218,6 +218,11 @@ // an invalid type. CompilerType AddVolatileModifier() const; + // Return a new CompilerType that is the atomic type of this type. If this + // type is not valid or the type system doesn't support atomic types, this + // returns an invalid type. + CompilerType GetAtomicType() const; + // Return a new CompilerType adds a restrict modifier to this type if this // type is valid and the type system supports restrict modifiers, else return // an invalid type. Index: lldb/include/lldb/Symbol/Type.h =================================================================== --- lldb/include/lldb/Symbol/Type.h +++ lldb/include/lldb/Symbol/Type.h @@ -80,7 +80,9 @@ eEncodingIsLValueReferenceUID, ///< This type is L value reference to a type /// whose UID is m_encoding_uid eEncodingIsRValueReferenceUID, ///< This type is R value reference to a type - /// whose UID is m_encoding_uid + /// whose UID is m_encoding_uid, + eEncodingIsAtomicUID, ///< This type is the type whose UID is + /// m_encoding_uid as an atomic type. eEncodingIsSyntheticUID }; Index: lldb/include/lldb/Symbol/TypeSystem.h =================================================================== --- lldb/include/lldb/Symbol/TypeSystem.h +++ lldb/include/lldb/Symbol/TypeSystem.h @@ -228,6 +228,8 @@ virtual CompilerType GetRValueReferenceType(lldb::opaque_compiler_type_t type); + virtual CompilerType GetAtomicType(lldb::opaque_compiler_type_t type); + virtual CompilerType AddConstModifier(lldb::opaque_compiler_type_t type); virtual CompilerType AddVolatileModifier(lldb::opaque_compiler_type_t type); Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -474,6 +474,7 @@ case DW_TAG_const_type: case DW_TAG_restrict_type: case DW_TAG_volatile_type: + case DW_TAG_atomic_type: case DW_TAG_unspecified_type: { type_sp = ParseTypeModifier(sc, die, attrs); break; @@ -618,6 +619,9 @@ case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break; + case DW_TAG_atomic_type: + encoding_data_type = Type::eEncodingIsAtomicUID; + break; } if (!clang_type && (encoding_data_type == Type::eEncodingIsPointerUID || Index: lldb/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/source/Symbol/ClangASTContext.cpp +++ lldb/source/Symbol/ClangASTContext.cpp @@ -4066,6 +4066,11 @@ ->getUnderlyingType() .getAsOpaquePtr()) .GetTypeInfo(pointee_or_element_clang_type); + case clang::Type::Atomic: + return CompilerType(this, llvm::cast(qual_type) + ->getValueType() + .getAsOpaquePtr()) + .GetTypeInfo(pointee_or_element_clang_type); case clang::Type::UnresolvedUsing: return 0; @@ -4760,6 +4765,13 @@ return CompilerType(); } +CompilerType ClangASTContext::GetAtomicType(lldb::opaque_compiler_type_t type) { + if (!type) + return CompilerType(); + return CompilerType( + this, getASTContext()->getAtomicType(GetQualType(type)).getAsOpaquePtr()); +} + CompilerType ClangASTContext::AddConstModifier(lldb::opaque_compiler_type_t type) { if (type) { @@ -5364,6 +5376,11 @@ ->getUnderlyingType() .getAsOpaquePtr()) .GetFormat(); + case clang::Type::Atomic: + return CompilerType(this, llvm::cast(qual_type) + ->getValueType() + .getAsOpaquePtr()) + .GetFormat(); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -5379,7 +5396,6 @@ case clang::Type::TemplateSpecialization: case clang::Type::DeducedTemplateSpecialization: - case clang::Type::Atomic: case clang::Type::Adjusted: case clang::Type::Pipe: break; Index: lldb/source/Symbol/CompilerType.cpp =================================================================== --- lldb/source/Symbol/CompilerType.cpp +++ lldb/source/Symbol/CompilerType.cpp @@ -427,6 +427,12 @@ return CompilerType(); } +CompilerType CompilerType::GetAtomicType() const { + if (IsValid()) + return m_type_system->GetAtomicType(m_type); + return CompilerType(); +} + CompilerType CompilerType::AddConstModifier() const { if (IsValid()) return m_type_system->AddConstModifier(m_type); Index: lldb/source/Symbol/Type.cpp =================================================================== --- lldb/source/Symbol/Type.cpp +++ lldb/source/Symbol/Type.cpp @@ -213,6 +213,9 @@ case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break; + case eEncodingIsAtomicUID: + s->PutCString(" (unresolved atomic type)"); + break; case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break; @@ -271,6 +274,9 @@ case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break; + case eEncodingIsAtomicUID: + s->PutCString(" (unresolved atomic type)"); + break; case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break; @@ -343,6 +349,7 @@ case eEncodingIsConstUID: case eEncodingIsRestrictUID: case eEncodingIsVolatileUID: + case eEncodingIsAtomicUID: case eEncodingIsTypedefUID: { Type *encoding_type = GetEncodingType(); if (encoding_type) @@ -491,6 +498,11 @@ encoding_type->GetForwardCompilerType().AddVolatileModifier(); break; + case eEncodingIsAtomicUID: + m_compiler_type = + encoding_type->GetForwardCompilerType().GetAtomicType(); + break; + case eEncodingIsTypedefUID: m_compiler_type = encoding_type->GetForwardCompilerType().CreateTypedef( m_name.AsCString("__lldb_invalid_typedef_name"), @@ -545,6 +557,10 @@ m_compiler_type = void_compiler_type.AddVolatileModifier(); break; + case eEncodingIsAtomicUID: + m_compiler_type = void_compiler_type.GetAtomicType(); + break; + case eEncodingIsTypedefUID: m_compiler_type = void_compiler_type.CreateTypedef( m_name.AsCString("__lldb_invalid_typedef_name"), Index: lldb/source/Symbol/TypeSystem.cpp =================================================================== --- lldb/source/Symbol/TypeSystem.cpp +++ lldb/source/Symbol/TypeSystem.cpp @@ -89,6 +89,10 @@ return CompilerType(); } +CompilerType TypeSystem::GetAtomicType(lldb::opaque_compiler_type_t type) { + return CompilerType(); +} + CompilerType TypeSystem::AddConstModifier(lldb::opaque_compiler_type_t type) { return CompilerType(); } Index: lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s =================================================================== --- /dev/null +++ lldb/test/Shell/SymbolFile/DWARF/dwarf5-atomic.s @@ -0,0 +1,104 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s > %t +# RUN: %lldb %t -o "target variable integer structure" -o exit | FileCheck %s + +# CHECK: (_Atomic(int)) integer = 14159 +# CHECK: (_Atomic(struct_type)) structure = {} + + .data +integer: + .long 14159 +structure: + .byte 0 + + .section .debug_abbrev,"",@progbits + .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 1 # DW_CHILDREN_yes + .byte 37 # DW_AT_producer + .byte 8 # DW_FORM_string + .byte 19 # DW_AT_language + .byte 5 # DW_FORM_data2 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 2 # Abbreviation Code + .byte 52 # DW_TAG_variable + .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 2 # DW_AT_location + .byte 24 # DW_FORM_exprloc + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 3 # Abbreviation Code + .byte 71 # DW_TAG_atomic_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 4 # Abbreviation Code + .byte 36 # DW_TAG_base_type + .byte 0 # DW_CHILDREN_no + .byte 3 # DW_AT_name + .byte 8 # DW_FORM_string + .byte 62 # DW_AT_encoding + .byte 11 # DW_FORM_data1 + .byte 11 # DW_AT_byte_size + .byte 11 # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 5 # Abbreviation Code + .byte 19 # DW_TAG_structure_type + .byte 0 # DW_CHILDREN_no + .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 0 # EOM(3) + + .section .debug_info,"",@progbits +.Lcu_begin0: + .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit +.Ldebug_info_start0: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev # Offset Into Abbrev. Section + .byte 1 # Abbrev [1] 0xb:0x50 DW_TAG_compile_unit + .asciz "Hand-written DWARF" # DW_AT_producer + .short 12 # DW_AT_language + .byte 2 # Abbrev [2] DW_TAG_variable + .asciz "integer" # DW_AT_name + .long .Latomic_int # DW_AT_type + .byte 9 # DW_AT_location + .byte 3 + .quad integer + .byte 2 # Abbrev [2] DW_TAG_variable + .asciz "structure" # DW_AT_name + .long .Latomic_struct # DW_AT_type + .byte 9 # DW_AT_location + .byte 3 + .quad structure +.Latomic_int: + .byte 3 # Abbrev [3] DW_TAG_atomic_type + .long .Lint # DW_AT_type +.Lint: + .byte 4 # Abbrev [4] 0x53:0x7 DW_TAG_base_type + .asciz "int" # DW_AT_name + .byte 5 # DW_AT_encoding + .byte 4 # DW_AT_byte_size +.Latomic_struct: + .byte 3 # Abbrev [3] DW_TAG_atomic_type + .long .Lstruct # DW_AT_type +.Lstruct: + .byte 5 # Abbrev [5] DW_TAG_structure_type + .asciz "struct_type" # DW_AT_name + .byte 0 # DW_AT_byte_size + .byte 0 # End Of Children Mark +.Ldebug_info_end0: