aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r--lib/CodeGen/CGCXX.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 8f9147306c..97837b364a 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -892,13 +892,10 @@ public:
SeenVBase.clear();
}
- void AddMethod(const CXXMethodDecl *MD, Index_t AddressPoint,
- bool MorallyVirtual, Index_t Offset) {
+ bool OverrideMethod(const CXXMethodDecl *MD, llvm::Constant *m,
+ bool MorallyVirtual, Index_t Offset) {
typedef CXXMethodDecl::method_iterator meth_iter;
- llvm::Constant *m;
- m = wrap(CGM.GetAddrOfFunction(GlobalDecl(MD), Ptr8Ty));
-
// FIXME: Don't like the nested loops. For very large inheritance
// heirarchies we could have a table on the side with the final overridder
// and just replace each instance of an overridden method once. Would be
@@ -925,11 +922,21 @@ public:
VCalls[VCall[OMD]] = Offset/8 - VCallOffset[OMD];
}
// submethods[VCall[OMD]] = wrap(Offset/8 - VCallOffset[OMD]);
- return;
+ return true;
}
}
}
+ return false;
+ }
+
+ void AddMethod(const CXXMethodDecl *MD, Index_t AddressPoint,
+ bool MorallyVirtual, Index_t Offset) {
+ llvm::Constant *m;
+ m = wrap(CGM.GetAddrOfFunction(GlobalDecl(MD), Ptr8Ty));
+ if (OverrideMethod(MD, m, MorallyVirtual, Offset))
+ return;
+
// else allocate a new slot.
Index[MD] = submethods.size();
// VCall[MD] = Offset;