summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.cpp8
-rw-r--r--clang/test/CodeGenCXX/debug-info-access.cpp2
-rw-r--r--clang/test/CodeGenCXX/debug-info-ms-vbase.cpp8
-rw-r--r--llvm/include/llvm/IR/DIBuilder.h3
-rw-r--r--llvm/include/llvm/IR/DebugInfoMetadata.h11
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp3
-rw-r--r--llvm/lib/IR/DIBuilder.cpp6
-rw-r--r--llvm/test/DebugInfo/COFF/inheritance.ll247
8 files changed, 185 insertions, 103 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 12209723999..55f96618ea4 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1536,6 +1536,7 @@ void CGDebugInfo::CollectCXXBasesAux(
auto *BaseTy = getOrCreateType(BI.getType(), Unit);
llvm::DINode::DIFlags BFlags = StartingFlags;
uint64_t BaseOffset;
+ uint32_t VBPtrOffset = 0;
if (BI.isVirtual()) {
if (CGM.getTarget().getCXXABI().isItaniumFamily()) {
@@ -1549,6 +1550,8 @@ void CGDebugInfo::CollectCXXBasesAux(
// vbase offset offset in Itanium.
BaseOffset =
4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base);
+ VBPtrOffset = CGM.getContext().getASTRecordLayout(RD).getVBPtrOffset()
+ .getQuantity();
}
BFlags |= llvm::DINode::FlagVirtual;
} else
@@ -1558,7 +1561,8 @@ void CGDebugInfo::CollectCXXBasesAux(
BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD);
llvm::DIType *DTy =
- DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset, BFlags);
+ DBuilder.createInheritance(RecordTy, BaseTy, BaseOffset, VBPtrOffset,
+ BFlags);
EltTys.push_back(DTy);
}
}
@@ -2192,7 +2196,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
if (!SClassTy)
return nullptr;
- llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0,
+ llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0,
llvm::DINode::FlagZero);
EltTys.push_back(InhTag);
}
diff --git a/clang/test/CodeGenCXX/debug-info-access.cpp b/clang/test/CodeGenCXX/debug-info-access.cpp
index 82f29ea4d38..44d6b4da17a 100644
--- a/clang/test/CodeGenCXX/debug-info-access.cpp
+++ b/clang/test/CodeGenCXX/debug-info-access.cpp
@@ -10,7 +10,7 @@ struct A {
};
-// CHECK: !DIDerivedType(tag: DW_TAG_inheritance,{{.*}} baseType: ![[A]],{{.*}} flags: DIFlagPublic)
+// CHECK: !DIDerivedType(tag: DW_TAG_inheritance,{{.*}} baseType: ![[A]],{{.*}} flags: DIFlagPublic, extraData: i32 0)
class B : public A {
public:
// CHECK-DAG: !DISubprogram(name: "pub",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagPublic | DIFlagPrototyped,
diff --git a/clang/test/CodeGenCXX/debug-info-ms-vbase.cpp b/clang/test/CodeGenCXX/debug-info-ms-vbase.cpp
index 3de3a751cba..04c9a6d2ba7 100644
--- a/clang/test/CodeGenCXX/debug-info-ms-vbase.cpp
+++ b/clang/test/CodeGenCXX/debug-info-ms-vbase.cpp
@@ -8,7 +8,7 @@
// CHECK: ![[elements]] = !{![[NoPrimaryBase_base:[0-9]+]]}
// CHECK: ![[NoPrimaryBase_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[NoPrimaryBase]],
-// CHECK-SAME: baseType: ![[HasVirtualMethod:[0-9]+]], offset: 4, flags: DIFlagVirtual)
+// CHECK-SAME: baseType: ![[HasVirtualMethod:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 0)
// CHECK: ![[HasVirtualMethod]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "HasVirtualMethod"
@@ -18,11 +18,11 @@
// CHECK: ![[elements]] = !{![[SecondaryVTable_base:[0-9]+]], ![[HasVirtualMethod_base:[0-9]+]], ![[vshape:[0-9]+]]}
// CHECK: ![[SecondaryVTable_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasPrimaryBase]],
-// CHECK-SAME: baseType: ![[SecondaryVTable:[0-9]+]], offset: 4, flags: DIFlagVirtual)
+// CHECK-SAME: baseType: ![[SecondaryVTable:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 4)
// CHECK: ![[SecondaryVTable]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "SecondaryVTable"
-// CHECK: ![[HasVirtualMethod_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasPrimaryBase]], baseType: ![[HasVirtualMethod]])
+// CHECK: ![[HasVirtualMethod_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[HasPrimaryBase]], baseType: ![[HasVirtualMethod]], extraData: i32 0)
// CHECK: ![[HasIndirectVirtualBase:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "HasIndirectVirtualBase"
// CHECK-SAME: elements: ![[elements:[0-9]+]]
@@ -41,7 +41,7 @@
// CHECK: ![[elements]] = !{![[POD_base:[0-9]+]]}
// CHECK: ![[POD_base]] = !DIDerivedType(tag: DW_TAG_inheritance, scope: ![[DynamicNoVFPtr]],
-// CHECK-SAME: baseType: ![[POD:[0-9]+]], offset: 4, flags: DIFlagVirtual)
+// CHECK-SAME: baseType: ![[POD:[0-9]+]], offset: 4, flags: DIFlagVirtual, extraData: i32 0)
// CHECK: ![[POD]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "POD"
diff --git a/llvm/include/llvm/IR/DIBuilder.h b/llvm/include/llvm/IR/DIBuilder.h
index f422d53ca9e..32103dba9c3 100644
--- a/llvm/include/llvm/IR/DIBuilder.h
+++ b/llvm/include/llvm/IR/DIBuilder.h
@@ -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.
diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h
index 85e626bec6a..cab9f062213 100644
--- a/llvm/include/llvm/IR/DebugInfoMetadata.h
+++ b/llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -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()))
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index 0af3d1521eb..ef279417b7e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -2099,8 +2099,7 @@ CodeViewDebug::lowerRecordFieldList(const DICompositeType *Ty) {
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
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp
index 8596ebd9527..90a089bb969 100644
--- a/llvm/lib/IR/DIBuilder.cpp
+++ b/llvm/lib/IR/DIBuilder.cpp
@@ -318,10 +318,14 @@ DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) {
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,
diff --git a/llvm/test/DebugInfo/COFF/inheritance.ll b/llvm/test/DebugInfo/COFF/inheritance.ll
index 0de30d67f72..5c7916b7bb8 100644
--- a/llvm/test/DebugInfo/COFF/inheritance.ll
+++ b/llvm/test/DebugInfo/COFF/inheritance.ll
@@ -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 }
+
+$"?get@B@@UEAAHXZ" = comdat any
+
+$"?get@C@@UEAAHXZ" = comdat any
+
+$"??_8D@@7BB@@@" = comdat any
-$"\01??_8D@@7BB@@@" = comdat any
+$"??_8D@@7BC@@@" = comdat any
-$"\01??_8D@@7BC@@@" = comdat any
+$"??_7D@@6BB@@@" = comdat any
-$"\01??_7D@@6B@" = comdat any
+$"??_7D@@6BC@@@" = 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@D@@UEAAXXZ" to i8*)], comdat
+@"?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@B@@UEAAHXZ" to i8*), i8* bitcast (void (%struct.D*)* @"?f@D@@UEAAXXZ" to i8*)] }, comdat
+@"??_7D@@6BC@@@" = linkonce_odr unnamed_addr constant { [1 x i8*] } { [1 x i8*] [i8* bitcast (i32 (%struct.C*)* @"?get@C@@UEAAHXZ" to i8*)] }, comdat
@llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
-declare void @"\01?f@D@@UEAAXXZ"(%struct.D*) unnamed_addr #0
+; Function Attrs: nounwind uwtable
+define linkonce_odr dso_local i32 @"?get@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
+}
-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" }
+declare dso_local void @"?f@D@@UEAAXXZ"(%struct.D*) unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define linkonce_odr dso_local i32 @"?get@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@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@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@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@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@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@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}
OpenPOWER on IntegriCloud