[PATCH] D11859: Generating vptr assume loads

John McCall via cfe-commits cfe-commits at lists.llvm.org
Sat Aug 15 00:11:36 PDT 2015


rjmccall added a comment.

Mostly LGTM.  Are you going to emit assumptions for vbptrs in a separate patch?


================
Comment at: lib/CodeGen/CGCXXABI.h:349-357
@@ -348,1 +348,11 @@
 
+  /// Checks if ABI requires extra virtual offset for vtable field.
+  virtual bool
+  isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
+                                      const CXXRecordDecl *NearestVBase) = 0;
+
+  /// Checks if ABI allows to initilize vptr for given class.
+  virtual bool canInitializeVPtr(const CXXRecordDecl *VTableClass,
+                                 const CXXRecordDecl *Base,
+                                 const CXXRecordDecl *NearestVBase) = 0;
+
----------------
In contrast, this does not need to be as general as it is, and making it this general is actively harmful; just pass the vtable class.

Also, I suggest calling it "doStructorsInitializeVTables".

================
Comment at: lib/CodeGen/CGCXXABI.h:352
@@ +351,3 @@
+  isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
+                                      const CXXRecordDecl *NearestVBase) = 0;
+
----------------
This method does not need to be passed a CodeGenFunction&, but it should take a complete CodeGenFunction::VPtr, not just this one random field from it.

================
Comment at: lib/CodeGen/CGClass.cpp:1862
@@ +1861,3 @@
+  for (const VPtr &vptr : getVTablePointers(ClassDecl))
+    if (CGM.getCXXABI().canInitializeVPtr(vptr.VTableClass, vptr.Base.getBase(),
+                                          vptr.NearestVBase))
----------------
As mentioned elsewhere, you can skip this entire loop if doStructorsInitializeVTables returns false.

================
Comment at: lib/CodeGen/CGClass.cpp:2157
@@ +2156,3 @@
+    if (CGM.getCXXABI().canInitializeVPtr(Vptr.VTableClass, Vptr.Base.getBase(),
+                                          Vptr.NearestVBase))
+      InitializeVTablePointer(Vptr);
----------------
Please call doStructorsInitializeVTables for RD above the call to getVTablePointers and then just skip the rest of the function if it returns false.


http://reviews.llvm.org/D11859





More information about the cfe-commits mailing list