rsmith accepted this revision.
This revision is now accepted and ready to land.

================
Comment at: include/clang/AST/VTableBuilder.h:222-225
@@ -221,6 +221,6 @@
 
   typedef const VTableComponent *vtable_component_iterator;
   typedef const VTableThunkTy *vtable_thunk_iterator;
   typedef llvm::iterator_range<vtable_component_iterator>
       vtable_component_range;
 
----------------
Can you remove these? It looks like they should be unused now.

================
Comment at: lib/CodeGen/CGVTables.cpp:527-528
@@ +526,4 @@
+  auto OffsetConstant = [&](CharUnits Offset) {
+    llvm::Type *PtrDiffTy =
+        CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
+    return llvm::ConstantExpr::getIntToPtr(
----------------
This is just `CGM.PtrDiffTy`.

================
Comment at: lib/CodeGen/CGVTables.cpp:588
@@ +587,3 @@
+        if (auto *F = dyn_cast<llvm::Function>(Cache))
+          F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
+        Cache = llvm::ConstantExpr::getBitCast(Cache, CGM.Int8PtrTy);
----------------
Do you have any idea why we're doing this? It looks wrong to me. These ABI 
entry points are exposed and could certainly have their addresses taken and 
used in this translation unit.

================
Comment at: lib/CodeGen/CGVTables.cpp:598-615
@@ -638,5 +597,20 @@
+                              CGM.getCXXABI().GetPureVirtualCallName());
+    } else if (cast<CXXMethodDecl>(GD.getDecl())->isDeleted()) {
+      return SpecialVirtualFn(DeletedVirtualFn,
+                              CGM.getCXXABI().GetDeletedVirtualCallName());
+    } else {
+      // Check if we should use a thunk.
+      if (NextVTableThunkIndex < VTLayout.vtable_thunks().size() &&
+          VTLayout.vtable_thunks()[NextVTableThunkIndex].first == Idx) {
+        const ThunkInfo &Thunk =
+            VTLayout.vtable_thunks()[NextVTableThunkIndex].second;
+
+        maybeEmitThunkForVTable(GD, Thunk);
+        NextVTableThunkIndex++;
+        return CGM.GetAddrOfThunk(GD, Thunk);
+      } else {
+        llvm::Type *Ty = CGM.getTypes().GetFunctionTypeForVTable(GD);
 
-        Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy);
+        return CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
       }
     }
----------------
Please remove the `else`-after-`return` throughout here. That'll make it much 
more obvious to a reader of the code that fallthrough to the next `case` is not 
possible.

================
Comment at: lib/CodeGen/CGVTables.h:52
@@ -51,1 +51,3 @@
 
+  llvm::Constant *PureVirtualFn = nullptr, *DeletedVirtualFn = nullptr;
+
----------------
I'd prefer these to be two separate declarations, with doc comments.


https://reviews.llvm.org/D22642



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to