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

David Blaikie dblaikie at gmail.com
Tue Nov 18 10:53:44 PST 2014


[+llvm-commits]

Having a great time dropping mailing lists of late... sorry about that.

On Tue, Nov 18, 2014 at 10:53 AM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Tue, Nov 18, 2014 at 10:44 AM, Manman Ren <mren at apple.com> wrote:
>
>>
>> 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> 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
>>> 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
>>>
>>> ==============================================================================
>>> --- 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
>>>
>>> ==============================================================================
>>> --- 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
>>>
>>> ==============================================================================
>>> --- 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
>>>
>>> ==============================================================================
>>> --- 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
>>>
>>> ==============================================================================
>>> --- 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 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).
>>
>
> The context of a DIGlobalVariable should never be a type, but there will
> be DIDerivedTypes in the CU's global variable list, unfortunately - I'm not
> sure if this is a problem for you/us/LTO - I haven't fully wrapped my head
> around the uniquing you had to do here.
>
>
>> If that is the case, we need to add an assertion to make sure it is never
>> going to happen.
>>
>
> Yes, there should be an assertion that this isn't the case.
>
>
>> Otherwise, we still need this patch to link to the uniqued type context.
>>
>
> & we should just revert this patch & the Clang one.
>
>
>> 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.
>>
>
> There will be no other test case because this situation shouldn't arise,
> right? This patch (& the corresponding Clang one) will be reverted and the
> assertion added.
>
>
>>
>> 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 = !{!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 = !{!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
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> 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/0edd8054/attachment.html>


More information about the llvm-commits mailing list