[llvm] r332296 - [CodeView] Improve debugging of virtual base class member variables

Brock Wyma via llvm-commits llvm-commits at lists.llvm.org
Mon May 14 14:21:22 PDT 2018


Author: bwyma
Date: Mon May 14 14:21:22 2018
New Revision: 332296

URL: http://llvm.org/viewvc/llvm-project?rev=332296&view=rev
Log:
[CodeView] Improve debugging of virtual base class member variables

Initial support for passing the virtual base pointer offset to CodeViewDebug.

https://reviews.llvm.org/D46271


Modified:
    llvm/trunk/include/llvm/IR/DIBuilder.h
    llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
    llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
    llvm/trunk/lib/IR/DIBuilder.cpp
    llvm/trunk/test/DebugInfo/COFF/inheritance.ll

Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=332296&r1=332295&r2=332296&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
+++ llvm/trunk/include/llvm/IR/DIBuilder.h Mon May 14 14:21:22 2018
@@ -245,10 +245,11 @@ namespace llvm {
     /// \param Ty           Original type.
     /// \param BaseTy       Base type. Ty is inherits from base.
     /// \param BaseOffset   Base offset.
+    /// \param VBPtrOffset  Virtual base pointer offset.
     /// \param Flags        Flags to describe inheritance attribute,
     ///                     e.g. private
     DIDerivedType *createInheritance(DIType *Ty, DIType *BaseTy,
-                                     uint64_t BaseOffset,
+                                     uint64_t BaseOffset, uint32_t VBPtrOffset,
                                      DINode::DIFlags Flags);
 
     /// Create debugging information entry for a member.

Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=332296&r1=332295&r2=332296&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
+++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Mon May 14 14:21:22 2018
@@ -866,7 +866,8 @@ public:
   /// Get extra data associated with this derived type.
   ///
   /// Class type for pointer-to-members, objective-c property node for ivars,
-  /// or global constant wrapper for static members.
+  /// global constant wrapper for static members, or virtual base pointer offset
+  /// for inheritance.
   ///
   /// TODO: Separate out types that need this extra operand: pointer-to-member
   /// types and member fields (static members and ivars).
@@ -884,6 +885,14 @@ public:
     return dyn_cast_or_null<DIObjCProperty>(getExtraData());
   }
 
+  uint32_t getVBPtrOffset() const {
+    assert(getTag() == dwarf::DW_TAG_inheritance);
+    if (auto *CM = cast_or_null<ConstantAsMetadata>(getExtraData()))
+      if (auto *CI = dyn_cast_or_null<ConstantInt>(CM->getValue()))
+        return static_cast<uint32_t>(CI->getZExtValue());
+    return 0;
+  }
+
   Constant *getStorageOffsetInBits() const {
     assert(getTag() == dwarf::DW_TAG_member && isBitField());
     if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=332296&r1=332295&r2=332296&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Mon May 14 14:21:22 2018
@@ -2099,8 +2099,7 @@ CodeViewDebug::lowerRecordFieldList(cons
   for (const DIDerivedType *I : Info.Inheritance) {
     if (I->getFlags() & DINode::FlagVirtual) {
       // Virtual base.
-      // FIXME: Emit VBPtrOffset when the frontend provides it.
-      unsigned VBPtrOffset = 0;
+      unsigned VBPtrOffset = I->getVBPtrOffset();
       // FIXME: Despite the accessor name, the offset is really in bytes.
       unsigned VBTableIndex = I->getOffsetInBits() / 4;
       auto RecordKind = (I->getFlags() & DINode::FlagIndirectVirtualBase) == DINode::FlagIndirectVirtualBase

Modified: llvm/trunk/lib/IR/DIBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=332296&r1=332295&r2=332296&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DIBuilder.cpp (original)
+++ llvm/trunk/lib/IR/DIBuilder.cpp Mon May 14 14:21:22 2018
@@ -318,10 +318,14 @@ DIDerivedType *DIBuilder::createFriend(D
 
 DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy,
                                             uint64_t BaseOffset,
+                                            uint32_t VBPtrOffset,
                                             DINode::DIFlags Flags) {
   assert(Ty && "Unable to create inheritance");
+  Metadata *ExtraData = ConstantAsMetadata::get(
+      ConstantInt::get(IntegerType::get(VMContext, 32), VBPtrOffset));
   return DIDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
-                            0, Ty, BaseTy, 0, 0, BaseOffset, None, Flags);
+                            0, Ty, BaseTy, 0, 0, BaseOffset, None,
+                            Flags, ExtraData);
 }
 
 DIDerivedType *DIBuilder::createMemberType(DIScope *Scope, StringRef Name,

Modified: llvm/trunk/test/DebugInfo/COFF/inheritance.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/inheritance.ll?rev=332296&r1=332295&r2=332296&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/inheritance.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/inheritance.ll Mon May 14 14:21:22 2018
@@ -3,8 +3,8 @@
 ; C++ source to regenerate:
 ; $ cat t.cpp
 ; struct A { int a; };
-; struct B : virtual A { int b; };
-; struct C : virtual A { int c; };
+; struct B : virtual A { int b; virtual int get() { return b; } };
+; struct C : virtual A { int c; virtual int get() { return c; } };
 ; struct D : B, C {
 ;   virtual void f(); // make vbptr not offset zero
 ;   int d;
@@ -12,32 +12,7 @@
 ; D d;
 ; $ clang -fno-rtti -g -gcodeview t.cpp -emit-llvm -S -o t.ll -O1
 
-; D's field list comes first.
-; CHECK:        FieldList ({{.*}}) {
-; CHECK-NEXT:     TypeLeafKind: LF_FIELDLIST (0x1203)
-; CHECK-NEXT:     BaseClass {
-; CHECK-NEXT:       TypeLeafKind: LF_BCLASS (0x1400)
-; CHECK-NEXT:       AccessSpecifier: Public (0x3)
-; CHECK-NEXT:       BaseType: B ({{.*}})
-; CHECK-NEXT:       BaseOffset: 0x8
-; CHECK-NEXT:     }
-; CHECK-NEXT:     BaseClass {
-; CHECK-NEXT:       TypeLeafKind: LF_BCLASS (0x1400)
-; CHECK-NEXT:       AccessSpecifier: Public (0x3)
-; CHECK-NEXT:       BaseType: C ({{.*}})
-; CHECK-NEXT:       BaseOffset: 0x18
-; CHECK-NEXT:     }
-; CHECK-NEXT:     IndirectVirtualBaseClass {
-; CHECK-NEXT:       TypeLeafKind: LF_IVBCLASS (0x1402)
-; CHECK-NEXT:       AccessSpecifier: Public (0x3)
-; CHECK-NEXT:       BaseType: A ({{.*}})
-; CHECK-NEXT:       VBPtrType: const int* ({{.*}})
-; CHECK-NEXT:       VBPtrOffset: 0x0
-; CHECK-NEXT:       VBTableIndex: 0x1
-; CHECK-NEXT:     }
-; CHECK:        }
-
-; Then B's field list.
+; struct B's field list comes first.
 ; CHECK:        FieldList ({{.*}}) {
 ; CHECK-NEXT:     TypeLeafKind: LF_FIELDLIST (0x1203)
 ; CHECK-NEXT:     VirtualBaseClass {
@@ -45,88 +20,178 @@
 ; CHECK-NEXT:       AccessSpecifier: Public (0x3)
 ; CHECK-NEXT:       BaseType: A ({{.*}})
 ; CHECK-NEXT:       VBPtrType: const int* ({{.*}})
-; CHECK-NEXT:       VBPtrOffset: 0x0
+; CHECK-NEXT:       VBPtrOffset: 0x8
 ; CHECK-NEXT:       VBTableIndex: 0x1
 ; CHECK-NEXT:     }
 ; CHECK:        }
 
-; Then C's field list.
-; CHECK:        FieldList ({{.*}}) {
-; CHECK-NEXT:     TypeLeafKind: LF_FIELDLIST (0x1203)
-; CHECK-NEXT:     VirtualBaseClass {
-; CHECK-NEXT:       TypeLeafKind: LF_VBCLASS (0x1401)
-; CHECK-NEXT:       AccessSpecifier: Public (0x3)
-; CHECK-NEXT:       BaseType: A ({{.*}})
-; CHECK-NEXT:       VBPtrType: const int* ({{.*}})
-; CHECK-NEXT:       VBPtrOffset: 0x0
-; CHECK-NEXT:       VBTableIndex: 0x1
-; CHECK-NEXT:     }
-; CHECK:        }
+; struct A's field list comes next.
+; CHECK:       FieldList ({{.*}})
+; CHECK-NEXT:    TypeLeafKind: LF_FIELDLIST (0x1203)
+; CHECK:       }
+
+; struct C's field list comes next.
+; CHECK:       FieldList ({{.*}})
+; CHECK-NEXT:    TypeLeafKind: LF_FIELDLIST (0x1203)
+; CHECK-NEXT:    VirtualBaseClass {
+; CHECK-NEXT:      TypeLeafKind: LF_VBCLASS (0x1401)
+; CHECK-NEXT:      AccessSpecifier: Public (0x3)
+; CHECK-NEXT:      BaseType: A ({{.*}})
+; CHECK-NEXT:      VBPtrType: const int* ({{.*}})
+; CHECK-NEXT:      VBPtrOffset: 0x8
+; CHECK-NEXT:      VBTableIndex: 0x1
+; CHECK-NEXT:    }
+; CHECK:       }
+
+; struct D's field list is last.
+; CHECK:       FieldList ({{.*}}) {
+; CHECK-NEXT:    TypeLeafKind: LF_FIELDLIST (0x1203)
+; CHECK-NEXT:    BaseClass {
+; CHECK-NEXT:      TypeLeafKind: LF_BCLASS (0x1400)
+; CHECK-NEXT:      AccessSpecifier: Public (0x3)
+; CHECK-NEXT:      BaseType: B ({{.*}})
+; CHECK-NEXT:      BaseOffset: 0x0
+; CHECK-NEXT:    }
+; CHECK-NEXT:    BaseClass {
+; CHECK-NEXT:      TypeLeafKind: LF_BCLASS (0x1400)
+; CHECK-NEXT:      AccessSpecifier: Public (0x3)
+; CHECK-NEXT:      BaseType: C ({{.*}})
+; CHECK-NEXT:      BaseOffset: 0x18
+; CHECK-NEXT:    }
+; CHECK-NEXT:    IndirectVirtualBaseClass {
+; CHECK-NEXT:      TypeLeafKind: LF_IVBCLASS (0x1402)
+; CHECK-NEXT:      AccessSpecifier: Public (0x3)
+; CHECK-NEXT:      BaseType: A ({{.*}})
+; CHECK-NEXT:      VBPtrType: const int* ({{.*}})
+; CHECK-NEXT:      VBPtrOffset: 0x8
+; CHECK-NEXT:      VBTableIndex: 0x1
+; CHECK-NEXT:    }
+; CHECK:       }
 
 ; ModuleID = 't.cpp'
 source_filename = "t.cpp"
 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-pc-windows-msvc19.0.23918"
+target triple = "x86_64-pc-windows-msvc19.12.25835"
 
-%struct.D = type { i32 (...)**, %struct.B.base, %struct.C.base, i32, [4 x i8], %struct.A }
-%struct.B.base = type { i32*, i32 }
-%struct.C.base = type { i32*, i32 }
+%struct.D = type { %struct.B.base, %struct.C.base, i32, [4 x i8], %struct.A }
+%struct.B.base = type { i32 (...)**, i32*, i32 }
+%struct.C.base = type { i32 (...)**, i32*, i32 }
 %struct.A = type { i32 }
+%struct.B = type { i32 (...)**, i32*, i32, [4 x i8], %struct.A }
+%struct.C = type { i32 (...)**, i32*, i32, [4 x i8], %struct.A }
 
-$"\01??_8D@@7BB@@@" = comdat any
+$"?get at B@@UEAAHXZ" = comdat any
 
-$"\01??_8D@@7BC@@@" = comdat any
+$"?get at C@@UEAAHXZ" = comdat any
 
-$"\01??_7D@@6B@" = comdat any
+$"??_8D@@7BB@@@" = comdat any
 
-@"\01?d@@3UD@@A" = local_unnamed_addr global %struct.D { i32 (...)** bitcast ([1 x i8*]* @"\01??_7D@@6B@" to i32 (...)**), %struct.B.base { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"\01??_8D@@7BB@@@", i32 0, i32 0), i32 0 }, %struct.C.base { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"\01??_8D@@7BC@@@", i32 0, i32 0), i32 0 }, i32 0, [4 x i8] zeroinitializer, %struct.A zeroinitializer }, align 8, !dbg !0
-@"\01??_8D@@7BB@@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 40], comdat
-@"\01??_8D@@7BC@@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 24], comdat
-@"\01??_7D@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.D*)* @"\01?f at D@@UEAAXXZ" to i8*)], comdat
- at llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
+$"??_8D@@7BC@@@" = comdat any
 
-declare void @"\01?f at D@@UEAAXXZ"(%struct.D*) unnamed_addr #0
+$"??_7D@@6BB@@@" = comdat any
 
-attributes #0 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+$"??_7D@@6BC@@@" = comdat any
+
+@"?d@@3UD@@A" = dso_local local_unnamed_addr global %struct.D { %struct.B.base { i32 (...)** bitcast ({ [2 x i8*] }* @"??_7D@@6BB@@@" to i32 (...)**), i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"??_8D@@7BB@@@", i32 0, i32 0), i32 0 }, %struct.C.base { i32 (...)** bitcast ({ [1 x i8*] }* @"??_7D@@6BC@@@" to i32 (...)**), i32* getelementptr inbounds ([2 x i32], [2 x i32]* @"??_8D@@7BC@@@", i32 0, i32 0), i32 0 }, i32 0, [4 x i8] zeroinitializer, %struct.A zeroinitializer }, align 8, !dbg !0
+@"??_8D@@7BB@@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 -8, i32 48], comdat
+@"??_8D@@7BC@@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 -8, i32 24], comdat
+@"??_7D@@6BB@@@" = linkonce_odr unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (i32 (%struct.B*)* @"?get at B@@UEAAHXZ" to i8*), i8* bitcast (void (%struct.D*)* @"?f at D@@UEAAXXZ" to i8*)] }, comdat
+@"??_7D@@6BC@@@" = linkonce_odr unnamed_addr constant { [1 x i8*] } { [1 x i8*] [i8* bitcast (i32 (%struct.C*)* @"?get at C@@UEAAHXZ" to i8*)] }, comdat
+ at llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
+
+; Function Attrs: nounwind uwtable
+define linkonce_odr dso_local i32 @"?get at B@@UEAAHXZ"(%struct.B* %this) unnamed_addr #0 comdat align 2 !dbg !46 {
+entry:
+  call void @llvm.dbg.value(metadata %struct.B* %this, metadata !48, metadata !DIExpression()), !dbg !50
+  %b = getelementptr inbounds %struct.B, %struct.B* %this, i64 0, i32 2, !dbg !51
+  %0 = load i32, i32* %b, align 8, !dbg !51, !tbaa !52
+  ret i32 %0, !dbg !51
+}
+
+declare dso_local void @"?f at D@@UEAAXXZ"(%struct.D*) unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define linkonce_odr dso_local i32 @"?get at C@@UEAAHXZ"(%struct.C* %this) unnamed_addr #0 comdat align 2 !dbg !57 {
+entry:
+  call void @llvm.dbg.value(metadata %struct.C* %this, metadata !59, metadata !DIExpression()), !dbg !61
+  %c = getelementptr inbounds %struct.C, %struct.C* %this, i64 0, i32 2, !dbg !62
+  %0 = load i32, i32* %c, align 8, !dbg !62, !tbaa !63
+  ret i32 %0, !dbg !62
+}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #2
+
+attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { nounwind readnone speculatable }
 
 !llvm.dbg.cu = !{!2}
-!llvm.module.flags = !{!32, !33, !34}
-!llvm.ident = !{!35}
+!llvm.module.flags = !{!41, !42, !43, !44}
+!llvm.ident = !{!45}
 
-!0 = distinct !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
-!1 = !DIGlobalVariable(name: "d", linkageName: "\01?d@@3UD@@A", scope: !2, file: !6, line: 8, type: !7, isLocal: false, isDefinition: true)
-!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 4.0.0 (http://llvm.org/git/clang.git 95626d54d6db7e13087089396a80ebaccc4ffe7c) (http://llvm.org/git/llvm.git 374b6e2fa0b230d13c0fb9ee7af69b2146bfad8a)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
-!3 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild")
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "d", linkageName: "?d@@3UD@@A", scope: !2, file: !3, line: 8, type: !6, isLocal: false, isDefinition: true)
+!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (trunk)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
+!3 = !DIFile(filename: "t.cpp", directory: "C:\5CPath\5CTo\5CDirectory", checksumkind: CSK_MD5, checksum: "7477d4db6bf8a461a719bcaab9c6d65e")
 !4 = !{}
 !5 = !{!0}
-!6 = !DIFile(filename: "t.cpp", directory: "C:\5Cbuild\5Cllvm\5Cbuild")
-!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "D", file: !6, line: 4, size: 448, elements: !8, vtableHolder: !7, identifier: ".?AUD@@")
-!8 = !{!9, !18, !23, !24, !25, !27, !28}
-!9 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !7, baseType: !10, offset: 64)
-!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B", file: !6, line: 2, size: 192, elements: !11, vtableHolder: !10, identifier: ".?AUB@@")
-!11 = !{!12, !17}
-!12 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !10, baseType: !13, offset: 4, flags: DIFlagVirtual)
-!13 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A", file: !6, line: 1, size: 32, elements: !14, identifier: ".?AUA@@")
-!14 = !{!15}
-!15 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !13, file: !6, line: 1, baseType: !16, size: 32)
-!16 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-!17 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !10, file: !6, line: 2, baseType: !16, size: 32, offset: 64)
-!18 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !7, baseType: !19, offset: 192)
-!19 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C", file: !6, line: 3, size: 192, elements: !20, vtableHolder: !19, identifier: ".?AUC@@")
-!20 = !{!21, !22}
-!21 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !19, baseType: !13, offset: 4, flags: DIFlagVirtual)
-!22 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !19, file: !6, line: 3, baseType: !16, size: 32, offset: 64)
-!23 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !7, baseType: !13, offset: 4, flags: DIFlagIndirectVirtualBase)
-!24 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: null, size: 64)
-!25 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$D", scope: !6, file: !6, baseType: !26, size: 64, flags: DIFlagArtificial)
-!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !24, size: 64)
-!27 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !7, file: !6, line: 6, baseType: !16, size: 32, offset: 320)
-!28 = !DISubprogram(name: "f", linkageName: "\01?f at D@@UEAAXXZ", scope: !7, file: !6, line: 5, type: !29, isLocal: false, isDefinition: false, scopeLine: 5, containingType: !7, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: true)
-!29 = !DISubroutineType(types: !30)
-!30 = !{null, !31}
-!31 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
-!32 = !{i32 2, !"CodeView", i32 1}
-!33 = !{i32 2, !"Debug Info Version", i32 3}
-!34 = !{i32 1, !"PIC Level", i32 2}
-!35 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git 95626d54d6db7e13087089396a80ebaccc4ffe7c) (http://llvm.org/git/llvm.git 374b6e2fa0b230d13c0fb9ee7af69b2146bfad8a)"}
-
+!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "D", file: !3, line: 4, size: 512, flags: DIFlagTypePassByReference, elements: !7, vtableHolder: !9, identifier: ".?AUD@@")
+!7 = !{!8, !24, !34, !35, !36, !37}
+!8 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !6, baseType: !9, extraData: i32 0)
+!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B", file: !3, line: 2, size: 256, flags: DIFlagTypePassByReference, elements: !10, vtableHolder: !9, identifier: ".?AUB@@")
+!10 = !{!11, !16, !17, !19, !20}
+!11 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !9, baseType: !12, offset: 4, flags: DIFlagVirtual, extraData: i32 8)
+!12 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A", file: !3, line: 1, size: 32, flags: DIFlagTypePassByValue, elements: !13, identifier: ".?AUA@@")
+!13 = !{!14}
+!14 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !12, file: !3, line: 1, baseType: !15, size: 32)
+!15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!16 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: null, size: 64)
+!17 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$B", scope: !3, file: !3, baseType: !18, size: 64, flags: DIFlagArtificial)
+!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !16, size: 64)
+!19 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !9, file: !3, line: 2, baseType: !15, size: 32, offset: 128)
+!20 = !DISubprogram(name: "get", linkageName: "?get at B@@UEAAHXZ", scope: !9, file: !3, line: 2, type: !21, isLocal: false, isDefinition: false, scopeLine: 2, containingType: !9, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: true)
+!21 = !DISubroutineType(types: !22)
+!22 = !{!15, !23}
+!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
+!24 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !6, baseType: !25, offset: 192, extraData: i32 0)
+!25 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C", file: !3, line: 3, size: 256, flags: DIFlagTypePassByReference, elements: !26, vtableHolder: !25, identifier: ".?AUC@@")
+!26 = !{!27, !16, !28, !29, !30}
+!27 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !25, baseType: !12, offset: 4, flags: DIFlagVirtual, extraData: i32 8)
+!28 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$C", scope: !3, file: !3, baseType: !18, size: 64, flags: DIFlagArtificial)
+!29 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !25, file: !3, line: 3, baseType: !15, size: 32, offset: 128)
+!30 = !DISubprogram(name: "get", linkageName: "?get at C@@UEAAHXZ", scope: !25, file: !3, line: 3, type: !31, isLocal: false, isDefinition: false, scopeLine: 3, containingType: !25, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: true)
+!31 = !DISubroutineType(types: !32)
+!32 = !{!15, !33}
+!33 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !25, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
+!34 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !6, baseType: !12, offset: 4, flags: DIFlagIndirectVirtualBase, extraData: i32 8)
+!35 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: null, size: 128)
+!36 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !6, file: !3, line: 6, baseType: !15, size: 32, offset: 384)
+!37 = !DISubprogram(name: "f", linkageName: "?f at D@@UEAAXXZ", scope: !6, file: !3, line: 5, type: !38, isLocal: false, isDefinition: false, scopeLine: 5, containingType: !6, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 1, flags: DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: true)
+!38 = !DISubroutineType(types: !39)
+!39 = !{null, !40}
+!40 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
+!41 = !{i32 2, !"CodeView", i32 1}
+!42 = !{i32 2, !"Debug Info Version", i32 3}
+!43 = !{i32 1, !"wchar_size", i32 2}
+!44 = !{i32 7, !"PIC Level", i32 2}
+!45 = !{!"clang version 7.0.0 (trunk)"}
+!46 = distinct !DISubprogram(name: "get", linkageName: "?get at B@@UEAAHXZ", scope: !9, file: !3, line: 2, type: !21, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !2, declaration: !20, retainedNodes: !47)
+!47 = !{!48}
+!48 = !DILocalVariable(name: "this", arg: 1, scope: !46, type: !49, flags: DIFlagArtificial | DIFlagObjectPointer)
+!49 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64)
+!50 = !DILocation(line: 0, scope: !46)
+!51 = !DILocation(line: 2, scope: !46)
+!52 = !{!53, !54, i64 16}
+!53 = !{!"?AUB@@", !54, i64 16}
+!54 = !{!"int", !55, i64 0}
+!55 = !{!"omnipotent char", !56, i64 0}
+!56 = !{!"Simple C++ TBAA"}
+!57 = distinct !DISubprogram(name: "get", linkageName: "?get at C@@UEAAHXZ", scope: !25, file: !3, line: 3, type: !31, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !2, declaration: !30, retainedNodes: !58)
+!58 = !{!59}
+!59 = !DILocalVariable(name: "this", arg: 1, scope: !57, type: !60, flags: DIFlagArtificial | DIFlagObjectPointer)
+!60 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !25, size: 64)
+!61 = !DILocation(line: 0, scope: !57)
+!62 = !DILocation(line: 3, scope: !57)
+!63 = !{!64, !54, i64 16}
+!64 = !{!"?AUC@@", !54, i64 16}




More information about the llvm-commits mailing list