]> granicus.if.org Git - clang/commitdiff
Split out overriding. WIP.
authorMike Stump <mrs@apple.com>
Tue, 1 Sep 2009 22:20:28 +0000 (22:20 +0000)
committerMike Stump <mrs@apple.com>
Tue, 1 Sep 2009 22:20:28 +0000 (22:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80732 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp

index 8f9147306ca2c16199412652185e3227aee42f55..97837b364af54cfc11f04c9334302c0651de1ef8 100644 (file)
@@ -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;