aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-02-11 18:20:28 +0000
committerAnders Carlsson <andersca@mac.com>2010-02-11 18:20:28 +0000
commit848fa64143fbe5ae62a601ad61277f741e54dfab (patch)
treebc0dedaa6e2d1dba6c8d194763c36182530a83a9 /lib/CodeGen/CGVtable.cpp
parentb203c9ee39be3170a7d545db057de8ea62959259 (diff)
More vtable layout dumper improvements. Handle destructors, dump the complete function type of the member functions (using PredefinedExpr::ComputeName.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95887 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp73
1 files changed, 61 insertions, 12 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index d2b6c08712..93e2cb7fc6 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -32,7 +32,13 @@ public:
CK_VBaseOffset,
CK_OffsetToTop,
CK_RTTI,
- CK_VFunctionPointer
+ CK_FunctionPointer,
+
+ /// CK_CompleteDtorPointer - A pointer to the complete destructor.
+ CK_CompleteDtorPointer,
+
+ /// CK_DeletingDtorPointer - A pointer to the deleting destructor.
+ CK_DeletingDtorPointer
};
/// dump - Dump the contents of this component to the given stream.
@@ -48,12 +54,22 @@ public:
static VtableComponent MakeFunction(const CXXMethodDecl *MD) {
assert(!isa<CXXDestructorDecl>(MD) &&
- "Don't know how to handle dtors yet!");
+ "Don't use MakeFunction with destructors!");
- return VtableComponent(CK_VFunctionPointer,
+ return VtableComponent(CK_FunctionPointer,
reinterpret_cast<uintptr_t>(MD));
}
+ static VtableComponent MakeCompleteDtor(const CXXDestructorDecl *DD) {
+ return VtableComponent(CK_CompleteDtorPointer,
+ reinterpret_cast<uintptr_t>(DD));
+ }
+
+ static VtableComponent MakeDeletingDtor(const CXXDestructorDecl *DD) {
+ return VtableComponent(CK_DeletingDtorPointer,
+ reinterpret_cast<uintptr_t>(DD));
+ }
+
/// getKind - Get the kind of this vtable component.
Kind getKind() const {
return (Kind)(Value & 0x7);
@@ -72,11 +88,18 @@ public:
}
const CXXMethodDecl *getFunctionDecl() const {
- assert(getKind() == CK_VFunctionPointer);
+ assert(getKind() == CK_FunctionPointer);
return reinterpret_cast<CXXMethodDecl *>(getPointer());
}
-
+
+ const CXXDestructorDecl *getDestructorDecl() const {
+ assert((getKind() == CK_CompleteDtorPointer ||
+ getKind() == CK_DeletingDtorPointer) && "Invalid component kind!");
+
+ return reinterpret_cast<CXXDestructorDecl *>(getPointer());
+ }
+
private:
VtableComponent(Kind ComponentKind, int64_t Offset) {
assert((ComponentKind == CK_VCallOffset ||
@@ -89,7 +112,9 @@ private:
VtableComponent(Kind ComponentKind, uintptr_t Ptr) {
assert((ComponentKind == CK_RTTI ||
- ComponentKind == CK_VFunctionPointer) &&
+ ComponentKind == CK_FunctionPointer ||
+ ComponentKind == CK_CompleteDtorPointer ||
+ ComponentKind == CK_DeletingDtorPointer) &&
"Invalid component kind!");
assert((Ptr & 7) == 0 && "Pointer not sufficiently aligned!");
@@ -105,9 +130,11 @@ private:
}
uintptr_t getPointer() const {
- assert((getKind() == CK_RTTI || getKind() == CK_VFunctionPointer) &&
+ assert((getKind() == CK_RTTI ||
+ getKind() == CK_FunctionPointer ||
+ getKind() == CK_CompleteDtorPointer ||
+ getKind() == CK_DeletingDtorPointer) &&
"Invalid component kind!");
-
return static_cast<uintptr_t>(Value & ~7ULL);
}
@@ -173,8 +200,14 @@ void VtableBuilder::layoutSimpleVtable(const CXXRecordDecl *RD) {
if (!MD->isVirtual())
continue;
- // Add the function.
- Components.push_back(VtableComponent::MakeFunction(MD));
+ if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
+ // Add both the complete destructor and the deleting destructor.
+ Components.push_back(VtableComponent::MakeCompleteDtor(DD));
+ Components.push_back(VtableComponent::MakeDeletingDtor(DD));
+ } else {
+ // Add the function.
+ Components.push_back(VtableComponent::MakeFunction(MD));
+ }
}
}
@@ -229,11 +262,27 @@ void VtableBuilder::dumpLayout(llvm::raw_ostream& Out) {
Out << Component.getRTTIDecl()->getQualifiedNameAsString() << " RTTI";
break;
- case VtableComponent::CK_VFunctionPointer: {
+ case VtableComponent::CK_FunctionPointer: {
const CXXMethodDecl *MD = Component.getFunctionDecl();
- Out << MD->getQualifiedNameAsString();
+ std::string Str =
+ PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual,
+ MD);
+ Out << Str;
+ break;
+ }
+ case VtableComponent::CK_CompleteDtorPointer: {
+ const CXXDestructorDecl *DD = Component.getDestructorDecl();
+
+ Out << DD->getQualifiedNameAsString() << "() [complete]";
+ break;
+ }
+
+ case VtableComponent::CK_DeletingDtorPointer: {
+ const CXXDestructorDecl *DD = Component.getDestructorDecl();
+
+ Out << DD->getQualifiedNameAsString() << "() [deleting]";
break;
}