From: Anders Carlsson Date: Fri, 12 Feb 2010 02:38:13 +0000 (+0000) Subject: When dumping vtables, dump whether a virtual member function is pure or not. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=982414266cbfbb3f2784c6b42f008532336ea64c;p=clang When dumping vtables, dump whether a virtual member function is pure or not. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95963 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index eeee22c275..09d6067f46 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -500,7 +500,6 @@ public: /// dumpLayout - Dump the vtable layout. void dumpLayout(llvm::raw_ostream&); - }; void VtableBuilder::layoutSimpleVtable(const CXXRecordDecl *RD) { @@ -593,6 +592,9 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, MD); Out << Str; + if (MD->isPure()) + Out << " [pure]"; + break; } @@ -600,6 +602,9 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { const CXXDestructorDecl *DD = Component.getDestructorDecl(); Out << DD->getQualifiedNameAsString() << "() [complete]"; + if (DD->isPure()) + Out << " [pure]"; + break; } @@ -607,6 +612,9 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) { const CXXDestructorDecl *DD = Component.getDestructorDecl(); Out << DD->getQualifiedNameAsString() << "() [deleting]"; + if (DD->isPure()) + Out << " [pure]"; + break; } diff --git a/test/CodeGenCXX/vtable-layout.cpp b/test/CodeGenCXX/vtable-layout.cpp index c59eff0abf..3f7e18a095 100644 --- a/test/CodeGenCXX/vtable-layout.cpp +++ b/test/CodeGenCXX/vtable-layout.cpp @@ -39,4 +39,22 @@ struct A { void A::f() { } +// Another simple vtable dumper test. +// CHECK: Vtable for 'Test2::B' (6 entries). +// CHECK-NEXT: 0 | offset_to_top (0) +// CHECK-NEXT: 1 | Test2::B RTTI +// CHECK-NEXT: -- (Test2::B, 0) vtable address -- +// CHECK-NEXT: 2 | void Test2::B::f() +// CHECK-NEXT: 3 | void Test2::B::g() [pure] +// CHECK-NEXT: 4 | Test2::B::~B() [complete] [pure] +// CHECK-NEXT: 5 | Test2::B::~B() [deleting] [pure] + +struct B { + virtual void f(); + virtual void g() = 0; + virtual ~B() = 0; +}; + +void B::f() { } + }