[llvm] r285624 - DebugInfo: make DW_TAG_atomic_type valid

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 31 12:45:14 PDT 2016


> On Oct 31, 2016, at 12:09 PM, Victor Leschuk via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: vleschuk
> Date: Mon Oct 31 14:09:38 2016
> New Revision: 285624
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=285624&view=rev
> Log:
> DebugInfo: make DW_TAG_atomic_type valid
> 
> DW_TAG_atomic_type was already included in Dwarf.defs and emitted correctly,
> however Verifier didn't recognize it as valid.
> Thus we introduce the following changes:
> 
>  * Make DW_TAG_atomic_type valid tag for IR and DWARF (enabled only with -gdwarf-5)
>  * Add it to related docs
>  * Add DebugInfo tests
> 
> Differential Revision: https://reviews.llvm.org/D26144
> 
> 
> Added:
>    llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-4.ll
>    llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-5.ll
> Modified:
>    llvm/trunk/docs/LangRef.rst
>    llvm/trunk/docs/SourceLevelDebugging.rst
>    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>    llvm/trunk/lib/IR/Verifier.cpp
>    llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> 
> Modified: llvm/trunk/docs/LangRef.rst
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/docs/LangRef.rst (original)
> +++ llvm/trunk/docs/LangRef.rst Mon Oct 31 14:09:38 2016
> @@ -4078,6 +4078,7 @@ The following ``tag:`` values are valid:
>   DW_TAG_friend             = 42
>   DW_TAG_volatile_type      = 53
>   DW_TAG_restrict_type      = 55
> +  DW_TAG_atomic_type        = 71
> 
> .. _DIDerivedTypeMember:
> 
> @@ -4094,8 +4095,8 @@ friends.
> ``DW_TAG_typedef`` is used to provide a name for the ``baseType:``.
> 
> ``DW_TAG_pointer_type``, ``DW_TAG_reference_type``, ``DW_TAG_const_type``,
> -``DW_TAG_volatile_type`` and ``DW_TAG_restrict_type`` are used to qualify the
> -``baseType:``.
> +``DW_TAG_volatile_type``, ``DW_TAG_restrict_type`` and ``DW_TAG_atomic_type``
> +are used to qualify the ``baseType:``.
> 
> Note that the ``void *`` type is expressed as a type derived from NULL.
> 
> 
> Modified: llvm/trunk/docs/SourceLevelDebugging.rst
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/SourceLevelDebugging.rst?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/docs/SourceLevelDebugging.rst (original)
> +++ llvm/trunk/docs/SourceLevelDebugging.rst Mon Oct 31 14:09:38 2016
> @@ -1264,6 +1264,7 @@ tag is one of:
> * DW_TAG_packed_type
> * DW_TAG_volatile_type
> * DW_TAG_restrict_type
> +* DW_TAG_atomic_type
> * DW_TAG_interface_type
> * DW_TAG_unspecified_type
> * DW_TAG_shared_type
> 
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h Mon Oct 31 14:09:38 2016
> @@ -276,6 +276,7 @@ enum class MethodOptions : uint16_t {
> CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(MethodOptions)
> 
> /// Equivalent to CV_modifier_t.
> +/// TODO: Add flag for _Atomic modifier
> enum class ModifierOptions : uint16_t {
>   None = 0x0000,
>   Const = 0x0001,
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Mon Oct 31 14:09:38 2016
> @@ -1091,6 +1091,7 @@ TypeIndex CodeViewDebug::lowerType(const
>     return lowerTypeMemberPointer(cast<DIDerivedType>(Ty));
>   case dwarf::DW_TAG_const_type:
>   case dwarf::DW_TAG_volatile_type:
> +  // TODO: add support for DW_TAG_atomic_type here
>     return lowerTypeModifier(cast<DIDerivedType>(Ty));
>   case dwarf::DW_TAG_subroutine_type:
>     if (ClassTy) {
> @@ -1399,7 +1400,7 @@ TypeIndex CodeViewDebug::lowerTypeModifi
>   bool IsModifier = true;
>   const DIType *BaseTy = Ty;
>   while (IsModifier && BaseTy) {
> -    // FIXME: Need to add DWARF tag for __unaligned.
> +    // FIXME: Need to add DWARF tags for __unaligned and _Atomic
>     switch (BaseTy->getTag()) {
>     case dwarf::DW_TAG_const_type:
>       Mods |= ModifierOptions::Const;
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp Mon Oct 31 14:09:38 2016
> @@ -98,7 +98,7 @@ uint64_t DebugHandlerBase::getBaseTypeSi
> 
>   if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
>       Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
> -      Tag != dwarf::DW_TAG_restrict_type)
> +      Tag != dwarf::DW_TAG_restrict_type && Tag != dwarf::DW_TAG_atomic_type)
>     return DDTy->getSizeInBits();
> 
>   DIType *BaseType = DDTy->getBaseType().resolve();
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Mon Oct 31 14:09:38 2016
> @@ -546,7 +546,7 @@ static bool isUnsignedDIType(DwarfDebug
>       return true;
>     assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
>            T == dwarf::DW_TAG_volatile_type ||
> -           T == dwarf::DW_TAG_restrict_type);
> +           T == dwarf::DW_TAG_restrict_type || T == dwarf::DW_TAG_atomic_type);
>     DITypeRef Deriv = DTy->getBaseType();
>     assert(Deriv && "Expected valid base type");
>     return isUnsignedDIType(DD, DD->resolve(Deriv));
> @@ -707,6 +707,10 @@ DIE *DwarfUnit::getOrCreateTypeDIE(const
>   if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
>     return getOrCreateTypeDIE(resolve(cast<DIDerivedType>(Ty)->getBaseType()));
> 
> +  // DW_TAG_atomic_type is not supported in DWARF < 5
> +  if (Ty->getTag() == dwarf::DW_TAG_atomic_type && DD->getDwarfVersion() < 5)
> +    return getOrCreateTypeDIE(resolve(cast<DIDerivedType>(Ty)->getBaseType()));
> +
>   // Construct the context before querying for the existence of the DIE in case
>   // such construction creates the DIE.
>   auto *Context = resolve(Ty->getScope());
> 
> Modified: llvm/trunk/lib/IR/Verifier.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Verifier.cpp (original)
> +++ llvm/trunk/lib/IR/Verifier.cpp Mon Oct 31 14:09:38 2016
> @@ -864,6 +864,7 @@ void Verifier::visitDIDerivedType(const
>                N.getTag() == dwarf::DW_TAG_const_type ||
>                N.getTag() == dwarf::DW_TAG_volatile_type ||
>                N.getTag() == dwarf::DW_TAG_restrict_type ||
> +               N.getTag() == dwarf::DW_TAG_atomic_type ||
>                N.getTag() == dwarf::DW_TAG_member ||
>                N.getTag() == dwarf::DW_TAG_inheritance ||
>                N.getTag() == dwarf::DW_TAG_friend,
> 
> Added: llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-4.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-4.ll?rev=285624&view=auto
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-4.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-4.ll Mon Oct 31 14:09:38 2016
> @@ -0,0 +1,36 @@
> +; RUN: %llc_dwarf -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
> +; REQUIRES: object-emission
> +
> +; Generated by clang -c -g -std=c11 -S -emit-llvm from the following C11 source
> +;
> +; _Atomic const int i;
> +;
> +
> +; CHECK: DW_TAG_variable
> +; CHECK: DW_TAG_const_type
> +; CHECK-NOT: DW_TAG_atomic_type
> +; CHECK: DW_TAG_base_type

Please check for the entire tree instead of just the occurrence of the words here.

> +
> +; ModuleID = 'atomic.c'
> +source_filename = "atomic.c"
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> + at i = common global i32 0, align 4, !dbg !0
> +
> +!llvm.dbg.cu = !{!1}
> +!llvm.module.flags = !{!9, !10}
> +!llvm.ident = !{!11}
> +
> +!0 = distinct !DIGlobalVariable(name: "i", scope: !1, file: !5, line: 1, type: !6, isLocal: false, isDefinition: true)
> +!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: "clang version 4.0.0 (http://llvm.org/git/clang.git cd238117e3a8a57271a82d0bb03d6df6ad8f073e) (http://llvm.org/git/llvm.git 9fd063832c1541aad3907cd60ac344d36997905f)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !3, globals: !4)
> +!2 = !DIFile(filename: "atomic.c", directory: "/tmp")
> +!3 = !{}
> +!4 = !{!0}
> +!5 = !DIFile(filename: "atomic.c", directory: "/tmp")
> +!6 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !7)
> +!7 = !DIDerivedType(tag: DW_TAG_atomic_type, baseType: !8)
> +!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!9 = !{i32 2, !"Dwarf Version", i32 4}
> +!10 = !{i32 2, !"Debug Info Version", i32 3}
> +!11 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git cd238117e3a8a57271a82d0bb03d6df6ad8f073e) (http://llvm.org/git/llvm.git 9fd063832c1541aad3907cd60ac344d36997905f)"}
> 
> Added: llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-5.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-5.ll?rev=285624&view=auto
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-5.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/atomic-c11-dwarf-5.ll Mon Oct 31 14:09:38 2016
> @@ -0,0 +1,37 @@
> +; RUN: %llc_dwarf -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
> +; REQUIRES: object-emission
> +
> +; Generated by clang -c -g -std=c11 -S -emit-llvm from the following C11 source
> +;
> +; _Atomic const int i;
> +;
> +
> +; CHECK: DW_TAG_variable
> +; CHECK: DW_TAG_const_type
> +; CHECK: DW_TAG_atomic_type
> +; CHECK-NOT: NULL
> +; CHECK: DW_TAG_base_type

ditto.

thanks,
adrian

> +
> +; ModuleID = 'atomic.c'
> +source_filename = "atomic.c"
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> + at i = common global i32 0, align 4, !dbg !0
> +
> +!llvm.dbg.cu = !{!1}
> +!llvm.module.flags = !{!9, !10}
> +!llvm.ident = !{!11}
> +
> +!0 = distinct !DIGlobalVariable(name: "i", scope: !1, file: !5, line: 1, type: !6, isLocal: false, isDefinition: true)
> +!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: "clang version 4.0.0 (http://llvm.org/git/clang.git cd238117e3a8a57271a82d0bb03d6df6ad8f073e) (http://llvm.org/git/llvm.git 9fd063832c1541aad3907cd60ac344d36997905f)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !3, globals: !4)
> +!2 = !DIFile(filename: "atomic.c", directory: "/tmp")
> +!3 = !{}
> +!4 = !{!0}
> +!5 = !DIFile(filename: "atomic.c", directory: "/tmp")
> +!6 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !7)
> +!7 = !DIDerivedType(tag: DW_TAG_atomic_type, baseType: !8)
> +!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!9 = !{i32 2, !"Dwarf Version", i32 5}
> +!10 = !{i32 2, !"Debug Info Version", i32 3}
> +!11 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git cd238117e3a8a57271a82d0bb03d6df6ad8f073e) (http://llvm.org/git/llvm.git 9fd063832c1541aad3907cd60ac344d36997905f)"}
> 
> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=285624&r1=285623&r2=285624&view=diff
> ==============================================================================
> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Mon Oct 31 14:09:38 2016
> @@ -2666,6 +2666,7 @@ static bool isTypeTag(uint16_t Tag) {
>   case dwarf::DW_TAG_packed_type:
>   case dwarf::DW_TAG_volatile_type:
>   case dwarf::DW_TAG_restrict_type:
> +  case dwarf::DW_TAG_atomic_type:
>   case dwarf::DW_TAG_interface_type:
>   case dwarf::DW_TAG_unspecified_type:
>   case dwarf::DW_TAG_shared_type:
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list