[PATCH] D11859: Generating vptr assume loads

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 10 12:13:53 PDT 2015


majnemer added a comment.

Some first round review comments.


================
Comment at: lib/CodeGen/CGClass.cpp:1831-1832
@@ +1830,4 @@
+
+  // generate vtable assumptions if we are not in another ctor and
+  // if we calling dynamic class ctor
+  if (CGM.getCodeGenOpts().OptimizationLevel > 0 &&
----------------
Sentences should start with a capital letter and end with a period.

================
Comment at: lib/CodeGen/CGClass.cpp:1838
@@ +1837,3 @@
+
+void CodeGenFunction::EmitVTableAssumptionLoad(const VPtr &vptr,
+                                               llvm::Value *This) {
----------------
Variables should be capitalized.

================
Comment at: lib/CodeGen/CGClass.cpp:1842
@@ +1841,3 @@
+      CGM.getCXXABI().getVTableAddressPoint(vptr.Base, vptr.VTableClass);
+  if (!VTableGlobal) return;
+
----------------
The return should be on it's own line, please clang-format this.
Also, under which conditions is this case possible?

================
Comment at: lib/CodeGen/CGClass.cpp:2098
@@ -2063,3 +2097,3 @@
     // Initialize the vtable pointer for this base.
-    InitializeVTablePointer(Base, NearestVBase, OffsetFromNearestVBase,
-                            VTableClass);
+    VPtr vptr{Base, NearestVBase, OffsetFromNearestVBase, VTableClass};
+    vptrs.push_back(vptr);
----------------
This kind of initialization is not very common in LLVM.

================
Comment at: lib/CodeGen/CodeGenFunction.h:1312
@@ -1311,1 +1311,3 @@
 
+  // struct containg all informations needed to initilize vptrs
+  struct VPtr {
----------------
Capital letter and period missing here.

================
Comment at: lib/CodeGen/CodeGenFunction.h:1328-1334
@@ -1320,8 +1327,9 @@
   typedef llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBasesSetTy;
-  void InitializeVTablePointers(BaseSubobject Base,
-                                const CXXRecordDecl *NearestVBase,
-                                CharUnits OffsetFromNearestVBase,
-                                bool BaseIsNonVirtualPrimaryBase,
-                                const CXXRecordDecl *VTableClass,
-                                VisitedVirtualBasesSetTy& VBases);
+  VPtrsVector getVTablePointers(const CXXRecordDecl *VTableClass);
+
+  void getVTablePointers(BaseSubobject Base, const CXXRecordDecl *NearestVBase,
+                         CharUnits OffsetFromNearestVBase,
+                         bool BaseIsNonVirtualPrimaryBase,
+                         const CXXRecordDecl *VTableClass,
+                         VisitedVirtualBasesSetTy &VBases, VPtrsVector &vptrs);
 
----------------
Would it make more sense for these to live in `CGClass` ?

================
Comment at: lib/CodeGen/ItaniumCXXABI.cpp:193-194
@@ -192,1 +192,4 @@
 
+  bool isVirtualOffsetNeeded(CodeGenFunction &CGF,
+                             const CXXRecordDecl *NearestVBase) override;
+
----------------
I'm not sure what this function is supposed to compute.  Needed for what?

================
Comment at: lib/CodeGen/ItaniumCXXABI.cpp:1404
@@ +1403,3 @@
+    const CXXRecordDecl *NearestVBase) {
+  // TODO check it
+  if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
----------------
Check what?

================
Comment at: lib/CodeGen/MicrosoftCXXABI.cpp:223-228
@@ +222,8 @@
+  // with the 'novtable' attribute.
+  bool canInitilizeVPtr(const CXXRecordDecl *VTableClass,
+                        const CXXRecordDecl *Base,
+                        const CXXRecordDecl *NearestVBase) override {
+    return !VTableClass->hasAttr<MSNoVTableAttr>() ||
+           (Base != VTableClass && Base != NearestVBase);
+  }
+
----------------
In the MS ABI, derived classes never share vtables with bases.  Why do you need to do anything other than check that the most derived class doesn't have the `__declspec(novtable)` ?


http://reviews.llvm.org/D11859





More information about the cfe-commits mailing list