[llvm] r222195 - Debug Info: In DIBuilder, the context field of a global variable is updated to

Manman Ren mren at apple.com
Tue Nov 18 10:44:35 PST 2014


> On Nov 18, 2014, at 9:23 AM, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> On Mon, Nov 17, 2014 at 4:29 PM, Manman Ren <manman.ren at gmail.com <mailto:manman.ren at gmail.com>> wrote:
> Author: mren
> Date: Mon Nov 17 18:29:08 2014
> New Revision: 222195
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=222195&view=rev <http://llvm.org/viewvc/llvm-project?rev=222195&view=rev>
> Log:
> Debug Info: In DIBuilder, the context field of a global variable is updated to
> use DIScopeRef.
> 
> A paired commit at clang will follow to show cases where we will use an
> identifer for the context of a global variable.
> 
> rdar://18958417
> 
> Added:
>     llvm/trunk/test/DebugInfo/global-with-type-context.ll
> Modified:
>     llvm/trunk/include/llvm/IR/DebugInfo.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>     llvm/trunk/lib/IR/DIBuilder.cpp
>     llvm/trunk/lib/IR/DebugInfo.cpp
> 
> Modified: llvm/trunk/include/llvm/IR/DebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=222195&r1=222194&r2=222195&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=222195&r1=222194&r2=222195&view=diff>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DebugInfo.h (original)
> +++ llvm/trunk/include/llvm/IR/DebugInfo.h Mon Nov 17 18:29:08 2014
> @@ -763,7 +763,7 @@ public:
>    unsigned isLocalToUnit() const { return getHeaderFieldAs<bool>(5); }
>    unsigned isDefinition() const { return getHeaderFieldAs<bool>(6); }
> 
> -  DIScope getContext() const { return getFieldAs<DIScope>(1); }
> +  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(1); }
>    StringRef getFilename() const { return getFieldAs<DIFile>(2).getFilename(); }
>    StringRef getDirectory() const {
>      return getFieldAs<DIFile>(2).getDirectory();
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=222195&r1=222194&r2=222195&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=222195&r1=222194&r2=222195&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Nov 17 18:29:08 2014
> @@ -103,7 +103,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobal
> 
>    assert(GV.isGlobalVariable());
> 
> -  DIScope GVContext = GV.getContext();
> +  DIScope GVContext = DD->resolve(GV.getContext());
>    DIType GTy = DD->resolve(GV.getType());
> 
>    // Construct the context before querying for the existence of the DIE in
> @@ -122,7 +122,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobal
>      DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl);
>      addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
>    } else {
> -    DeclContext = GV.getContext();
> +    DeclContext = resolve(GV.getContext());
>      // Add name and type.
>      addString(*VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
>      addType(*VariableDIE, GTy);
> 
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=222195&r1=222194&r2=222195&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=222195&r1=222194&r2=222195&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Mon Nov 17 18:29:08 2014
> @@ -844,7 +844,7 @@ static DIGlobalVariable createGlobalVari
>                         .concat(isLocalToUnit)
>                         .concat(isDefinition)
>                         .get(VMContext),
> -                   getNonCompileUnitScope(Context), F, Ty, Val,
> +                   DIScope(getNonCompileUnitScope(Context)).getRef(), F, Ty, Val,
>                     DIDescriptor(Decl)};
> 
>    return DIGlobalVariable(CreateFunc(Elts));
> 
> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=222195&r1=222194&r2=222195&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=222195&r1=222194&r2=222195&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
> +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Nov 17 18:29:08 2014
> @@ -567,8 +567,8 @@ bool DIGlobalVariable::Verify() const {
> 
>    if (getDisplayName().empty())
>      return false;
> -  // Make sure context @ field 1 is an MDNode.
> -  if (!fieldIsMDNode(DbgNode, 1))
> +  // Make sure context @ field 1 is a ScopeRef.
> +  if (!fieldIsScopeRef(DbgNode, 1))
>      return false;
>    // Make sure that type @ field 3 is a DITypeRef.
>    if (!fieldIsTypeRef(DbgNode, 3))
> @@ -1005,7 +1005,7 @@ void DebugInfoFinder::processModule(cons
>        for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
>          DIGlobalVariable DIG(GVs.getElement(i));
>          if (addGlobalVariable(DIG)) {
> -          processScope(DIG.getContext());
> +          processScope(DIG.getContext().resolve(TypeIdentifierMap));
>            processType(DIG.getType().resolve(TypeIdentifierMap));
>          }
>        }
> 
> Added: llvm/trunk/test/DebugInfo/global-with-type-context.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/global-with-type-context.ll?rev=222195&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/global-with-type-context.ll?rev=222195&view=auto>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/global-with-type-context.ll (added)
> +++ llvm/trunk/test/DebugInfo/global-with-type-context.ll Mon Nov 17 18:29:08 2014
> @@ -0,0 +1,154 @@
> +; REQUIRES: object-emission
> +
> +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t
> +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> +
> +; IR generated from clang -g with the following source:
> +; struct F {
> +;   static const int i = 2;
> +;   virtual ~F();
> +; };
> +;
> +; void f1() {
> +;   int i = F::i;
> +; }
> +
> +; Make sure we correctly handle context of a global variable being a type identifier.
> +; CHECK:  [[STRUCT:.*]]: DW_TAG_structure_type
> +; CHECK: DW_AT_name [DW_FORM_strp] {{.*}}= "F")
> +; CHECK: DW_TAG_variable
> 
> This isn't a feature, it's a bug. http://llvm.org/bugs/show_bug.cgi?id=21511 <http://llvm.org/bugs/show_bug.cgi?id=21511> one that I need to fix (probably in the next few days).
> 
> Once this bug is fixed, is your change needed?

Hi David,

If we are sure that the context of a global variable is never going to be a type with identifier, this change will not be needed (it is redundant but it does not hurt).
If that is the case, we need to add an assertion to make sure it is never going to happen.
Otherwise, we still need this patch to link to the uniqued type context.

If bug21511 is fixed, this testing case may no longer be valid (i,e we are not going to generate the .ll file from the .cpp file) and I will need to find another testing case.

Thanks,
Manman

>  
> +; CHECK-NEXT: DW_AT_specification {{.*}} "i"
> +; CHECK-NEXT: DW_AT_const_value [DW_FORM_sdata] (2)
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-darwin14.0.0"
> +
> +; Function Attrs: nounwind
> +define void @_Z2f1v() #0 {
> +entry:
> +  %i = alloca i32, align 4
> +  call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !29, metadata !30), !dbg !31
> +  store i32 2, i32* %i, align 4, !dbg !31
> +  ret void, !dbg !32
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
> +
> +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone }
> +
> +!llvm.dbg.cu <http://llvm.dbg.cu/> = !{!0}
> +!llvm.module.flags = !{!26, !27}
> +!llvm.ident = !{!28}
> +
> +!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 (trunk 222175)\000\00\000\00\001", metadata !1, metadata !2, metadata !3, metadata !20, metadata !24, metadata !2} ; [ DW_TAG_compile_unit ] [<stdin>] [DW_LANG_C_plus_plus]
> +!1 = metadata !{metadata !"<stdin>", metadata !"."}
> +!2 = metadata !{}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{metadata !"0x13\00F\001\0064\0064\000\000\000", metadata !5, null, null, metadata !6, metadata !"_ZTS1F", null, metadata !"_ZTS1F"} ; [ DW_TAG_structure_type ] [F] [line 1, size 64, align 64, offset 0] [def] [from ]
> +!5 = metadata !{metadata !"test.cpp", metadata !"."}
> +!6 = metadata !{metadata !7, metadata !14, metadata !16}
> +!7 = metadata !{metadata !"0xd\00_vptr$F\000\0064\000\000\0064", metadata !5, metadata !8, metadata !9} ; [ DW_TAG_member ] [_vptr$F] [line 0, size 64, align 0, offset 0] [artificial] [from ]
> +!8 = metadata !{metadata !"0x29", metadata !5}    ; [ DW_TAG_file_type ]
> +!9 = metadata !{metadata !"0xf\00\000\0064\000\000\000", null, null, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __vtbl_ptr_type]
> +!10 = metadata !{metadata !"0xf\00__vtbl_ptr_type\000\0064\000\000\000", null, null, metadata !11} ; [ DW_TAG_pointer_type ] [__vtbl_ptr_type] [line 0, size 64, align 0, offset 0] [from ]
> +!11 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !12, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!12 = metadata !{metadata !13}
> +!13 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
> +!14 = metadata !{metadata !"0xd\00i\002\000\000\000\004096", metadata !5, metadata !"_ZTS1F", metadata !15, i32 2} ; [ DW_TAG_member ] [i] [line 2, size 0, align 0, offset 0] [static] [from ]
> +!15 = metadata !{metadata !"0x26\00\000\000\000\000\000", null, null, metadata !13} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from int]
> +!16 = metadata !{metadata !"0x2e\00~F\00~F\00\003\000\000\001\000\00256\000\003", metadata !5, metadata !"_ZTS1F", metadata !17, metadata !"_ZTS1F", null, null, null, null} ; [ DW_TAG_subprogram ] [line 3] [~F]
> +!17 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !18, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!18 = metadata !{null, metadata !19}
> +!19 = metadata !{metadata !"0xf\00\000\0064\0064\000\001088\00", null, null, metadata !"_ZTS1F"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1F]
> +!20 = metadata !{metadata !21}
> +!21 = metadata !{metadata !"0x2e\00f1\00f1\00_Z2f1v\006\000\001\000\000\00256\000\006", metadata !5, metadata !8, metadata !22, null, void ()* @_Z2f1v, null, null, metadata !2} ; [ DW_TAG_subprogram ] [line 6] [def] [f1]
> +!22 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !23, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!23 = metadata !{null}
> +!24 = metadata !{metadata !25}
> +!25 = metadata !{metadata !"0x34\00i\00i\00\002\001\001", metadata !"_ZTS1F", metadata !8, metadata !15, i32 2, metadata !14} ; [ DW_TAG_variable ] [i] [line 2] [local] [def]
> +!26 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> +!27 = metadata !{i32 2, metadata !"Debug Info Version", i32 2}
> +!28 = metadata !{metadata !"clang version 3.6.0 (trunk 222175)"}
> +!29 = metadata !{metadata !"0x100\00i\007\000", metadata !21, metadata !8, metadata !13} ; [ DW_TAG_auto_variable ] [i] [line 7]
> +!30 = metadata !{metadata !"0x102"}               ; [ DW_TAG_expression ]
> +!31 = metadata !{i32 7, i32 0, metadata !21, null}
> +!32 = metadata !{i32 8, i32 0, metadata !21, null}
> +; REQUIRES: object-emission
> +
> +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t
> +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> +
> +; IR generated from clang -g with the following source:
> +; struct F {
> +;   static const int i = 2;
> +;   virtual ~F();
> +; };
> +;
> +; void f1() {
> +;   int i = F::i;
> +; }
> +
> +; Make sure we correctly handle context of a global variable being a type identifier.
> +; CHECK:  [[STRUCT:.*]]: DW_TAG_structure_type
> +; CHECK: DW_AT_name [DW_FORM_strp] {{.*}}= "F")
> +; CHECK: DW_TAG_variable
> +; CHECK-NEXT: DW_AT_specification {{.*}} "i"
> +; CHECK-NEXT: DW_AT_const_value [DW_FORM_sdata] (2)
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-darwin14.0.0"
> +
> +; Function Attrs: nounwind
> +define void @_Z2f1v() #0 {
> +entry:
> +  %i = alloca i32, align 4
> +  call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !29, metadata !30), !dbg !31
> +  store i32 2, i32* %i, align 4, !dbg !31
> +  ret void, !dbg !32
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
> +
> +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone }
> +
> +!llvm.dbg.cu <http://llvm.dbg.cu/> = !{!0}
> +!llvm.module.flags = !{!26, !27}
> +!llvm.ident = !{!28}
> +
> +!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 (trunk 222175)\000\00\000\00\001", metadata !1, metadata !2, metadata !3, metadata !20, metadata !24, metadata !2} ; [ DW_TAG_compile_unit ] [<stdin>] [DW_LANG_C_plus_plus]
> +!1 = metadata !{metadata !"<stdin>", metadata !"."}
> +!2 = metadata !{}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{metadata !"0x13\00F\001\0064\0064\000\000\000", metadata !5, null, null, metadata !6, metadata !"_ZTS1F", null, metadata !"_ZTS1F"} ; [ DW_TAG_structure_type ] [F] [line 1, size 64, align 64, offset 0] [def] [from ]
> +!5 = metadata !{metadata !"test.cpp", metadata !"."}
> +!6 = metadata !{metadata !7, metadata !14, metadata !16}
> +!7 = metadata !{metadata !"0xd\00_vptr$F\000\0064\000\000\0064", metadata !5, metadata !8, metadata !9} ; [ DW_TAG_member ] [_vptr$F] [line 0, size 64, align 0, offset 0] [artificial] [from ]
> +!8 = metadata !{metadata !"0x29", metadata !5}    ; [ DW_TAG_file_type ]
> +!9 = metadata !{metadata !"0xf\00\000\0064\000\000\000", null, null, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __vtbl_ptr_type]
> +!10 = metadata !{metadata !"0xf\00__vtbl_ptr_type\000\0064\000\000\000", null, null, metadata !11} ; [ DW_TAG_pointer_type ] [__vtbl_ptr_type] [line 0, size 64, align 0, offset 0] [from ]
> +!11 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !12, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!12 = metadata !{metadata !13}
> +!13 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
> +!14 = metadata !{metadata !"0xd\00i\002\000\000\000\004096", metadata !5, metadata !"_ZTS1F", metadata !15, i32 2} ; [ DW_TAG_member ] [i] [line 2, size 0, align 0, offset 0] [static] [from ]
> +!15 = metadata !{metadata !"0x26\00\000\000\000\000\000", null, null, metadata !13} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from int]
> +!16 = metadata !{metadata !"0x2e\00~F\00~F\00\003\000\000\001\000\00256\000\003", metadata !5, metadata !"_ZTS1F", metadata !17, metadata !"_ZTS1F", null, null, null, null} ; [ DW_TAG_subprogram ] [line 3] [~F]
> +!17 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !18, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!18 = metadata !{null, metadata !19}
> +!19 = metadata !{metadata !"0xf\00\000\0064\0064\000\001088\00", null, null, metadata !"_ZTS1F"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1F]
> +!20 = metadata !{metadata !21}
> +!21 = metadata !{metadata !"0x2e\00f1\00f1\00_Z2f1v\006\000\001\000\000\00256\000\006", metadata !5, metadata !8, metadata !22, null, void ()* @_Z2f1v, null, null, metadata !2} ; [ DW_TAG_subprogram ] [line 6] [def] [f1]
> +!22 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !23, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!23 = metadata !{null}
> +!24 = metadata !{metadata !25}
> +!25 = metadata !{metadata !"0x34\00i\00i\00\002\001\001", metadata !"_ZTS1F", metadata !8, metadata !15, i32 2, metadata !14} ; [ DW_TAG_variable ] [i] [line 2] [local] [def]
> +!26 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> +!27 = metadata !{i32 2, metadata !"Debug Info Version", i32 2}
> +!28 = metadata !{metadata !"clang version 3.6.0 (trunk 222175)"}
> +!29 = metadata !{metadata !"0x100\00i\007\000", metadata !21, metadata !8, metadata !13} ; [ DW_TAG_auto_variable ] [i] [line 7]
> +!30 = metadata !{metadata !"0x102"}               ; [ DW_TAG_expression ]
> +!31 = metadata !{i32 7, i32 0, metadata !21, null}
> +!32 = metadata !{i32 8, i32 0, metadata !21, null}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141118/9c4cdec0/attachment.html>


More information about the llvm-commits mailing list