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;
// 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.
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
};
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);
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;
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 ||
->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;
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) {
->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:
case clang::Type::TemplateSpecialization:
case clang::Type::DeducedTemplateSpecialization:
- case clang::Type::Atomic:
case clang::Type::Adjusted:
case clang::Type::Pipe:
break;
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);
case eEncodingIsVolatileUID:
s->PutCString(" (unresolved volatile type)");
break;
+ case eEncodingIsAtomicUID:
+ s->PutCString(" (unresolved atomic type)");
+ break;
case eEncodingIsTypedefUID:
s->PutCString(" (unresolved typedef)");
break;
case eEncodingIsVolatileUID:
s->PutCString(" (unresolved volatile type)");
break;
+ case eEncodingIsAtomicUID:
+ s->PutCString(" (unresolved atomic type)");
+ break;
case eEncodingIsTypedefUID:
s->PutCString(" (unresolved typedef)");
break;
case eEncodingIsConstUID:
case eEncodingIsRestrictUID:
case eEncodingIsVolatileUID:
+ case eEncodingIsAtomicUID:
case eEncodingIsTypedefUID: {
Type *encoding_type = GetEncodingType();
if (encoding_type)
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"),
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"),
return CompilerType();
}
+CompilerType TypeSystem::GetAtomicType(lldb::opaque_compiler_type_t type) {
+ return CompilerType();
+}
+
CompilerType TypeSystem::AddConstModifier(lldb::opaque_compiler_type_t type) {
return CompilerType();
}
--- /dev/null
+# 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: