[llvm] r190334 - Debug Info: Use DIScopeRef for DIType::getContext.

David Blaikie dblaikie at gmail.com
Mon Sep 9 13:43:24 PDT 2013


On Mon, Sep 9, 2013 at 1:36 PM, Manman Ren <manman.ren at gmail.com> wrote:

>
>
>
> On Mon, Sep 9, 2013 at 1:21 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>>
>>
>>
>> On Mon, Sep 9, 2013 at 12:47 PM, Manman Ren <manman.ren at gmail.com> wrote:
>>
>>> Author: mren
>>> Date: Mon Sep  9 14:47:11 2013
>>> New Revision: 190334
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=190334&view=rev
>>> Log:
>>> Debug Info: Use DIScopeRef for DIType::getContext.
>>>
>>> In DIBuilder, the context field of a TAG_member is updated to use the
>>> scope reference. Verifier is updated accordingly.
>>>
>>> DebugInfoFinder now needs to generate a type identifier map to have
>>> access to the actual scope. Same applies for BreakpointPrinter.
>>>
>>> processModule of DebugInfoFinder is called during initialization phase
>>> of the verifier to make sure the type identifier map is constructed early
>>> enough.
>>>
>>> We are now able to unique a simple class as demonstrated by the added
>>> testing case.
>>>
>>> Added:
>>>     llvm/trunk/test/Linker/type-unique-simple-a.ll
>>>     llvm/trunk/test/Linker/type-unique-simple-b.ll
>>> Modified:
>>>     llvm/trunk/include/llvm/DebugInfo.h
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>     llvm/trunk/lib/IR/DIBuilder.cpp
>>>     llvm/trunk/lib/IR/DebugInfo.cpp
>>>     llvm/trunk/lib/IR/Verifier.cpp
>>>     llvm/trunk/tools/opt/opt.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/DebugInfo.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo.h?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/DebugInfo.h (original)
>>> +++ llvm/trunk/include/llvm/DebugInfo.h Mon Sep  9 14:47:11 2013
>>> @@ -237,7 +237,7 @@ namespace llvm {
>>>      /// Verify - Verify that a type descriptor is well formed.
>>>      bool Verify() const;
>>>
>>> -    DIScope getContext() const          { return
>>> getFieldAs<DIScope>(2); }
>>> +    DIScopeRef getContext() const       { return
>>> getFieldAs<DIScopeRef>(2); }
>>>      StringRef getName() const           { return getStringField(3);
>>> }
>>>      unsigned getLineNumber() const      { return getUnsignedField(4); }
>>>      uint64_t getSizeInBits() const      { return getUInt64Field(5); }
>>> @@ -820,6 +820,7 @@ namespace llvm {
>>>      SmallVector<MDNode *, 8> TYs;  // Types
>>>      SmallVector<MDNode *, 8> Scopes; // Scopes
>>>      SmallPtrSet<MDNode *, 64> NodesSeen;
>>> +    DITypeIdentifierMap TypeIdentifierMap;
>>>    };
>>>  } // end namespace llvm
>>>
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Sep  9
>>> 14:47:11 2013
>>> @@ -800,7 +800,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(con
>>>      addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
>>>    }
>>>
>>> -  addToContextOwner(TyDIE, Ty.getContext());
>>> +  addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
>>>    return TyDIE;
>>>  }
>>>
>>> @@ -832,7 +832,7 @@ void CompileUnit::addType(DIE *Entity, D
>>>  /// addGlobalType - Add a new global type to the compile unit.
>>>  ///
>>>  void CompileUnit::addGlobalType(DIType Ty) {
>>> -  DIDescriptor Context = Ty.getContext();
>>> +  DIDescriptor Context = DD->resolve(Ty.getContext());
>>>    if (Ty.isCompositeType() && !Ty.getName().empty() &&
>>> !Ty.isForwardDecl()
>>>        && (!Context || Context.isCompileUnit() || Context.isFile()
>>>            || Context.isNameSpace()))
>>> @@ -914,7 +914,7 @@ void CompileUnit::constructTypeDIE(DIE &
>>>  /// Return true if the type is appropriately scoped to be contained
>>> inside
>>>  /// its own type unit.
>>>  static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
>>> -  DIScope Parent = Ty.getContext();
>>> +  DIScope Parent = DD->resolve(Ty.getContext());
>>>    while (Parent) {
>>>      // Don't generate a hash for anything scoped inside a function.
>>>      if (Parent.isSubprogram())
>>> @@ -1088,7 +1088,7 @@ void CompileUnit::constructTypeDIE(DIE &
>>>        addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
>>> dwarf::DW_FORM_ref4,
>>>                    getOrCreateTypeDIE(DIType(ContainingType)));
>>>      else
>>> -      addToContextOwner(&Buffer, CTy.getContext());
>>> +      addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
>>>
>>>      if (CTy.isObjcClassComplete())
>>>        addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
>>> @@ -1373,7 +1373,7 @@ void CompileUnit::createGlobalVariableDI
>>>      // We need the declaration DIE that is in the static member's class.
>>>      // But that class might not exist in the DWARF yet.
>>>      // Creating the class will create the static member decl DIE.
>>> -    getOrCreateContextDIE(SDMDecl.getContext());
>>> +    getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
>>>      VariableDIE = getDIE(SDMDecl);
>>>      assert(VariableDIE && "Static member decl has no context?");
>>>      IsStaticMember = true;
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Sep  9 14:47:11
>>> 2013
>>> @@ -341,7 +341,7 @@ bool DwarfDebug::isSubprogramContext(con
>>>    if (D.isSubprogram())
>>>      return true;
>>>    if (D.isType())
>>> -    return isSubprogramContext(DIType(Context).getContext());
>>> +    return isSubprogramContext(resolve(DIType(Context).getContext()));
>>>    return false;
>>>  }
>>>
>>> @@ -2656,7 +2656,7 @@ DIScope DwarfDebug::resolve(DIScopeRef S
>>>  DIScope DwarfDebug::getScopeContext(DIScope S) const {
>>>
>>>    if (S.isType())
>>> -    return DIType(S).getContext();
>>> +    return resolve(DIType(S).getContext());
>>>
>>>    if (S.isSubprogram())
>>>      return DISubprogram(S).getContext();
>>>
>>> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
>>> +++ llvm/trunk/lib/IR/DIBuilder.cpp Mon Sep  9 14:47:11 2013
>>> @@ -417,7 +417,7 @@ DIDerivedType DIBuilder::createMemberTyp
>>>    Value *Elts[] = {
>>>      GetTagConstant(VMContext, dwarf::DW_TAG_member),
>>>      File.getFileNode(),
>>> -    getNonCompileUnitScope(Scope),
>>> +    DIScope(getNonCompileUnitScope(Scope)).generateRef(),
>>>      MDString::get(VMContext, Name),
>>>      ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
>>>      ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
>>>
>>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Sep  9 14:47:11 2013
>>> @@ -446,12 +446,18 @@ static bool isScopeRef(const Value *Val)
>>>           (isa<MDNode>(Val) && DIScope(cast<MDNode>(Val)).isScope());
>>>  }
>>>
>>> +/// Check if a field at position Elt of a MDNode can be a ScopeRef.
>>> +static bool fieldIsScopeRef(const MDNode *DbgNode, unsigned Elt) {
>>> +  Value *Fld = getField(DbgNode, Elt);
>>> +  return isScopeRef(Fld);
>>> +}
>>> +
>>>  /// Verify - Verify that a type descriptor is well formed.
>>>  bool DIType::Verify() const {
>>>    if (!isType())
>>>      return false;
>>>    // Make sure Context @ field 2 is MDNode.
>>> -  if (!fieldIsMDNode(DbgNode, 2))
>>> +  if (!fieldIsScopeRef(DbgNode, 2))
>>>      return false;
>>>
>>>    // FIXME: Sink this into the various subclass verifies.
>>> @@ -956,11 +962,13 @@ void DebugInfoFinder::reset() {
>>>    TYs.clear();
>>>    Scopes.clear();
>>>    NodesSeen.clear();
>>> +  TypeIdentifierMap.clear();
>>>  }
>>>
>>>  /// processModule - Process entire module and collect debug info.
>>>  void DebugInfoFinder::processModule(const Module &M) {
>>>    if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
>>> +    TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
>>>      for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
>>>        DICompileUnit CU(CU_Nodes->getOperand(i));
>>>        addCompileUnit(CU);
>>> @@ -1010,7 +1018,7 @@ void DebugInfoFinder::processLocation(DI
>>>  void DebugInfoFinder::processType(DIType DT) {
>>>    if (!addType(DT))
>>>      return;
>>> -  processScope(DT.getContext());
>>> +  processScope(DT.getContext().resolve(TypeIdentifierMap));
>>>    if (DT.isCompositeType()) {
>>>      DICompositeType DCT(DT);
>>>      processType(DCT.getTypeDerivedFrom());
>>>
>>> Modified: llvm/trunk/lib/IR/Verifier.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/Verifier.cpp (original)
>>> +++ llvm/trunk/lib/IR/Verifier.cpp Mon Sep  9 14:47:11 2013
>>> @@ -170,6 +170,8 @@ namespace {
>>>        Finder.reset();
>>>
>>>        DL = getAnalysisIfAvailable<DataLayout>();
>>> +      if (!DisableDebugInfoVerifier)
>>> +        Finder.processModule(M);
>>>
>>>        // We must abort before returning back to the pass manager, or
>>> else the
>>>        // pass manager may try to run other passes on the broken module.
>>> @@ -2305,8 +2307,6 @@ void Verifier::visitIntrinsicFunctionCal
>>>  void Verifier::verifyDebugInfo(Module &M) {
>>>    // Verify Debug Info.
>>>    if (!DisableDebugInfoVerifier) {
>>> -    Finder.processModule(M);
>>> -
>>>      for (DebugInfoFinder::iterator I = Finder.compile_unit_begin(),
>>>           E = Finder.compile_unit_end(); I != E; ++I)
>>>        Assert1(DICompileUnit(*I).Verify(), "DICompileUnit does not
>>> Verify!", *I);
>>>
>>> Added: llvm/trunk/test/Linker/type-unique-simple-a.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple-a.ll?rev=190334&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Linker/type-unique-simple-a.ll (added)
>>> +++ llvm/trunk/test/Linker/type-unique-simple-a.ll Mon Sep  9 14:47:11
>>> 2013
>>> @@ -0,0 +1,73 @@
>>> +; RUN: llvm-link %s %p/type-unique-simple-b.ll -S -o - | FileCheck %s
>>> +
>>> +; CHECK: DW_TAG_structure_type
>>> +; CHECK-NOT: DW_TAG_structure_type
>>> +; Content of header files:
>>> +; struct Base {
>>> +;   int a;
>>> +;   //Base *b;
>>>
>>
>> What's this commented out line for?
>>
> Oops, I used a script to generate this testing case and didn't notice this
> commented out line.
> I will update this testing case.
>

Thanks.


>
>>
>>> +; };
>>> +; Content of foo.cpp:
>>> +;
>>> +; #include "a.hpp"
>>> +; void f(int a) {
>>> +;   Base t;
>>> +; }
>>> +; Content of bar.cpp:
>>> +;
>>> +; #include "a.hpp"
>>> +; void f(int);
>>> +; void g(int a) {
>>> +;   Base t;
>>> +; }
>>> +; int main() {
>>> +;   f(0);
>>> +;   g(1);
>>> +;   return 0;
>>> +; }
>>> +; ModuleID = 'foo.cpp'
>>> +target datalayout =
>>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
>>> +target triple = "x86_64-apple-macosx10.8.0"
>>> +
>>> +%struct.Base = type { i32 }
>>> +
>>> +; Function Attrs: nounwind ssp uwtable
>>> +define void @_Z1fi(i32 %a) #0 {
>>> +entry:
>>> +  %a.addr = alloca i32, align 4
>>> +  %t = alloca %struct.Base, align 4
>>> +  store i32 %a, i32* %a.addr, align 4
>>> +  call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !15),
>>> !dbg !16
>>> +  call void @llvm.dbg.declare(metadata !{%struct.Base* %t}, metadata
>>> !17), !dbg !18
>>> +  ret void, !dbg !19
>>> +}
>>> +
>>> +; Function Attrs: nounwind readnone
>>> +declare void @llvm.dbg.declare(metadata, metadata) #1
>>> +
>>> +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false"
>>> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>>> "use-soft-float"="false" }
>>> +attributes #1 = { nounwind readnone }
>>> +
>>> +!llvm.dbg.cu = !{!0}
>>> +!llvm.module.flags = !{!14}
>>> +
>>> +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang
>>> version 3.4 (http://llvm.org/git/clang.gitc23b1db6268c8e7ce64026d57d1510c1aac200a0) (
>>> http://llvm.org/git/llvm.git09b98fe3978eddefc2145adc1056cf21580ce945)", i1 false, metadata !"", i32 0,
>>> metadata !2, metadata !3, metadata !9, metadata !2, metadata !2, metadata
>>> !""} ; [ DW_TAG_compile_unit ]
>>> [/Users/mren/c_testing/type_unique_air/simple/foo.cpp] [DW_LANG_C_plus_plus]
>>> +!1 = metadata !{metadata !"foo.cpp", metadata
>>> !"/Users/mren/c_testing/type_unique_air/simple"}
>>> +!2 = metadata !{i32 0}
>>> +!3 = metadata !{metadata !4}
>>> +!4 = metadata !{i32 786451, metadata !5, null, metadata !"Base", i32 1,
>>> i64 32, i64 32, i32 0, i32 0, null, metadata !6, i32 0, null, null,
>>> metadata !"_ZTS4Base"} ; [ DW_TAG_structure_type ] [Base] [line 1, size 32,
>>> align 32, offset 0] [def] [from ]
>>> +!5 = metadata !{metadata !"./a.hpp", metadata
>>> !"/Users/mren/c_testing/type_unique_air/simple"}
>>> +!6 = metadata !{metadata !7}
>>> +!7 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base",
>>> metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [
>>> DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from int]
>>> +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
>>> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
>>> align 32, offset 0, enc DW_ATE_signed]
>>> +!9 = metadata !{metadata !10}
>>> +!10 = metadata !{i32 786478, metadata !1, metadata !11, metadata !"f",
>>> metadata !"f", metadata !"_Z1fi", i32 3, metadata !12, i1 false, i1 true,
>>> i32 0, i32 0, null, i32 256, i1 false, void (i32)* @_Z1fi, null, null,
>>> metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f]
>>> +!11 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type
>>> ] [/Users/mren/c_testing/type_unique_air/simple/foo.cpp]
>>> +!12 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
>>> i64 0, i64 0, i32 0, null, metadata !13, i32 0, null, null, null} ; [
>>> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
>>> +!13 = metadata !{null, metadata !8}
>>> +!14 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
>>> +!15 = metadata !{i32 786689, metadata !10, metadata !"a", metadata !11,
>>> i32 16777219, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a]
>>> [line 3]
>>> +!16 = metadata !{i32 3, i32 0, metadata !10, null}
>>> +!17 = metadata !{i32 786688, metadata !10, metadata !"t", metadata !11,
>>> i32 4, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [t] [line 4]
>>> +!18 = metadata !{i32 4, i32 0, metadata !10, null}
>>> +!19 = metadata !{i32 5, i32 0, metadata !10, null}
>>>
>>> Added: llvm/trunk/test/Linker/type-unique-simple-b.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple-b.ll?rev=190334&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Linker/type-unique-simple-b.ll (added)
>>> +++ llvm/trunk/test/Linker/type-unique-simple-b.ll Mon Sep  9 14:47:11
>>> 2013
>>> @@ -0,0 +1,68 @@
>>> +; RUN: true
>>>
>>
>> I don't believe this is the right way to include a dependent file for a
>> test case. I believe (please check for existing examples, etc) is to put
>> the dependent file in an "Inputs" subdirectory, which won't try to be
>> executed as tests themselves.
>>
> I was following most of the testing cases under test/Linker,
>

Curious.


> and I just noticed that there are a few examples of using Inputs under
> test/Linker as well.
> Is there a standard way of doing this?
>

Looks like there are more supporting files in "Inputs" directories than are
using "RUN: true" - and the latter just produces more test execution
overhead, etc, so I would prefer the former.


>
> Manman
>
>>
>>
>>> +
>>> +; ModuleID = 'bar.cpp'
>>> +target datalayout =
>>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
>>> +target triple = "x86_64-apple-macosx10.8.0"
>>> +
>>> +%struct.Base = type { i32 }
>>> +
>>> +; Function Attrs: nounwind ssp uwtable
>>> +define void @_Z1gi(i32 %a) #0 {
>>> +entry:
>>> +  %a.addr = alloca i32, align 4
>>> +  %t = alloca %struct.Base, align 4
>>> +  store i32 %a, i32* %a.addr, align 4
>>> +  call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !18),
>>> !dbg !19
>>> +  call void @llvm.dbg.declare(metadata !{%struct.Base* %t}, metadata
>>> !20), !dbg !21
>>> +  ret void, !dbg !22
>>> +}
>>> +
>>> +; Function Attrs: nounwind readnone
>>> +declare void @llvm.dbg.declare(metadata, metadata) #1
>>> +
>>> +; Function Attrs: ssp uwtable
>>> +define i32 @main() #2 {
>>> +entry:
>>> +  %retval = alloca i32, align 4
>>> +  store i32 0, i32* %retval
>>> +  call void @_Z1fi(i32 0), !dbg !23
>>> +  call void @_Z1gi(i32 1), !dbg !24
>>> +  ret i32 0, !dbg !25
>>> +}
>>> +
>>> +declare void @_Z1fi(i32) #3
>>> +
>>> +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false"
>>> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>>> "use-soft-float"="false" }
>>> +attributes #1 = { nounwind readnone }
>>> +attributes #2 = { ssp uwtable "less-precise-fpmad"="false"
>>> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>>> "use-soft-float"="false" }
>>> +attributes #3 = { "less-precise-fpmad"="false"
>>> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
>>> "use-soft-float"="false" }
>>> +
>>> +!llvm.dbg.cu = !{!0}
>>> +!llvm.module.flags = !{!17}
>>> +
>>> +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang
>>> version 3.4 (http://llvm.org/git/clang.gitc23b1db6268c8e7ce64026d57d1510c1aac200a0) (
>>> http://llvm.org/git/llvm.git09b98fe3978eddefc2145adc1056cf21580ce945)", i1 false, metadata !"", i32 0,
>>> metadata !2, metadata !3, metadata !9, metadata !2, metadata !2, metadata
>>> !""} ; [ DW_TAG_compile_unit ]
>>> [/Users/mren/c_testing/type_unique_air/simple/bar.cpp] [DW_LANG_C_plus_plus]
>>> +!1 = metadata !{metadata !"bar.cpp", metadata
>>> !"/Users/mren/c_testing/type_unique_air/simple"}
>>> +!2 = metadata !{i32 0}
>>> +!3 = metadata !{metadata !4}
>>> +!4 = metadata !{i32 786451, metadata !5, null, metadata !"Base", i32 1,
>>> i64 32, i64 32, i32 0, i32 0, null, metadata !6, i32 0, null, null,
>>> metadata !"_ZTS4Base"} ; [ DW_TAG_structure_type ] [Base] [line 1, size 32,
>>> align 32, offset 0] [def] [from ]
>>> +!5 = metadata !{metadata !"./a.hpp", metadata
>>> !"/Users/mren/c_testing/type_unique_air/simple"}
>>> +!6 = metadata !{metadata !7}
>>> +!7 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base",
>>> metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [
>>> DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from int]
>>> +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
>>> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
>>> align 32, offset 0, enc DW_ATE_signed]
>>> +!9 = metadata !{metadata !10, metadata !14}
>>> +!10 = metadata !{i32 786478, metadata !1, metadata !11, metadata !"g",
>>> metadata !"g", metadata !"_Z1gi", i32 4, metadata !12, i1 false, i1 true,
>>> i32 0, i32 0, null, i32 256, i1 false, void (i32)* @_Z1gi, null, null,
>>> metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [g]
>>> +!11 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type
>>> ] [/Users/mren/c_testing/type_unique_air/simple/bar.cpp]
>>> +!12 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
>>> i64 0, i64 0, i32 0, null, metadata !13, i32 0, null, null, null} ; [
>>> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
>>> +!13 = metadata !{null, metadata !8}
>>> +!14 = metadata !{i32 786478, metadata !1, metadata !11, metadata
>>> !"main", metadata !"main", metadata !"", i32 7, metadata !15, i1 false, i1
>>> true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null,
>>> metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [main]
>>> +!15 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
>>> i64 0, i64 0, i32 0, null, metadata !16, i32 0, null, null, null} ; [
>>> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
>>> +!16 = metadata !{metadata !8}
>>> +!17 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
>>> +!18 = metadata !{i32 786689, metadata !10, metadata !"a", metadata !11,
>>> i32 16777220, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a]
>>> [line 4]
>>> +!19 = metadata !{i32 4, i32 0, metadata !10, null}
>>> +!20 = metadata !{i32 786688, metadata !10, metadata !"t", metadata !11,
>>> i32 5, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [t] [line 5]
>>> +!21 = metadata !{i32 5, i32 0, metadata !10, null}
>>> +!22 = metadata !{i32 6, i32 0, metadata !10, null}
>>> +!23 = metadata !{i32 8, i32 0, metadata !14, null} ; [
>>> DW_TAG_imported_declaration ]
>>> +!24 = metadata !{i32 9, i32 0, metadata !14, null}
>>> +!25 = metadata !{i32 10, i32 0, metadata !14, null}
>>>
>>> Modified: llvm/trunk/tools/opt/opt.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/opt.cpp?rev=190334&r1=190333&r2=190334&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/opt/opt.cpp (original)
>>> +++ llvm/trunk/tools/opt/opt.cpp Mon Sep  9 14:47:11 2013
>>> @@ -367,6 +367,7 @@ char BasicBlockPassPrinter::ID = 0;
>>>  struct BreakpointPrinter : public ModulePass {
>>>    raw_ostream &Out;
>>>    static char ID;
>>> +  DITypeIdentifierMap TypeIdentifierMap;
>>>
>>>    BreakpointPrinter(raw_ostream &out)
>>>      : ModulePass(ID), Out(out) {
>>> @@ -382,13 +383,18 @@ struct BreakpointPrinter : public Module
>>>      } else if (Context.isType()) {
>>>        DIType TY(Context);
>>>        if (!TY.getName().empty()) {
>>> -        getContextName(TY.getContext(), N);
>>> +        getContextName(TY.getContext().resolve(TypeIdentifierMap), N);
>>>          N = N + TY.getName().str() + "::";
>>>        }
>>>      }
>>>    }
>>>
>>>    virtual bool runOnModule(Module &M) {
>>> +    TypeIdentifierMap.clear();
>>> +    NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu");
>>> +    if (CU_Nodes)
>>> +      TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
>>> +
>>>      StringSet<> Processed;
>>>      if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
>>>        for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
>>>
>>>
>>> _______________________________________________
>>> 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/20130909/02bfa65e/attachment.html>


More information about the llvm-commits mailing list