2016-05-13 06:46:41 +08:00
|
|
|
; The following two object files were generated using the following command:
|
|
|
|
; $ cl /Z7 /c t.cpp
|
|
|
|
; The contents of t.cpp follow:
|
|
|
|
; struct A {
|
|
|
|
; virtual void f();
|
|
|
|
; };
|
|
|
|
; struct B {
|
|
|
|
; virtual void f();
|
|
|
|
; virtual void g();
|
|
|
|
; };
|
|
|
|
; struct C {
|
|
|
|
; virtual void f();
|
|
|
|
; virtual void g();
|
|
|
|
; virtual void h();
|
|
|
|
; };
|
|
|
|
; A a;
|
|
|
|
; B b;
|
|
|
|
; C c;
|
|
|
|
|
|
|
|
RUN: llvm-readobj -codeview %p/Inputs/codeview-vftable.obj.coff | FileCheck %s
|
|
|
|
|
2016-05-14 03:37:07 +08:00
|
|
|
CHECK: VFTable (0x10F0) {
|
2016-05-13 06:46:41 +08:00
|
|
|
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
|
|
|
CHECK-NEXT: CompleteClass: A
|
|
|
|
CHECK-NEXT: OverriddenVFTable: 0x0
|
|
|
|
CHECK-NEXT: VFPtrOffset: 0x0
|
|
|
|
CHECK-NEXT: VFTableName: ??_7A@@6B@
|
|
|
|
CHECK-NEXT: MethodName: ?f@A@@UEAAXXZ
|
|
|
|
CHECK-NEXT: }
|
2016-05-14 03:37:07 +08:00
|
|
|
CHECK-NEXT: VFTable (0x10F1) {
|
2016-05-13 06:46:41 +08:00
|
|
|
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
|
|
|
CHECK-NEXT: CompleteClass: B
|
|
|
|
CHECK-NEXT: OverriddenVFTable: ??_7A@@6B@ (0x10F0)
|
|
|
|
CHECK-NEXT: VFPtrOffset: 0x0
|
|
|
|
CHECK-NEXT: VFTableName: ??_7B@@6B@
|
|
|
|
CHECK-NEXT: MethodName: ?f@B@@UEAAXXZ
|
|
|
|
CHECK-NEXT: MethodName: ?g@B@@UEAAXXZ
|
|
|
|
CHECK-NEXT: }
|
2016-05-14 03:37:07 +08:00
|
|
|
CHECK-NEXT: VFTable (0x10F2) {
|
2016-05-13 06:46:41 +08:00
|
|
|
CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
|
|
|
|
CHECK-NEXT: CompleteClass: C
|
|
|
|
CHECK-NEXT: OverriddenVFTable: ??_7B@@6B@ (0x10F1)
|
|
|
|
CHECK-NEXT: VFPtrOffset: 0x0
|
|
|
|
CHECK-NEXT: VFTableName: ??_7C@@6B@
|
|
|
|
CHECK-NEXT: MethodName: ?f@C@@UEAAXXZ
|
|
|
|
CHECK-NEXT: MethodName: ?g@C@@UEAAXXZ
|
|
|
|
CHECK-NEXT: MethodName: ?h@C@@UEAAXXZ
|
|
|
|
CHECK-NEXT: }
|