[clang] 1493462 - Revert "[NFC][Clang][CodeGen] Improve performance for vtable metadata generation (#67066)"

Kirill Stoimenov via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 2 17:11:47 PDT 2023


Author: Kirill Stoimenov
Date: 2023-10-03T00:09:46Z
New Revision: 149346286801a5f32d254676760a7f4211801667

URL: https://github.com/llvm/llvm-project/commit/149346286801a5f32d254676760a7f4211801667
DIFF: https://github.com/llvm/llvm-project/commit/149346286801a5f32d254676760a7f4211801667.diff

LOG: Revert "[NFC][Clang][CodeGen] Improve performance for vtable metadata generation (#67066)"

This reverts commit 22d8f1dd533e3e56512237811b8d8db83d85edce.

Broke sanitizer bots: https://lab.llvm.org/buildbot/#/builders/269/builds/59

Added: 
    

Modified: 
    clang/lib/CodeGen/CGVTables.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp
index 5ec38e0397bf4f7..d782da2103b4c79 100644
--- a/clang/lib/CodeGen/CGVTables.cpp
+++ b/clang/lib/CodeGen/CGVTables.cpp
@@ -24,7 +24,6 @@
 #include "llvm/Transforms/Utils/Cloning.h"
 #include <algorithm>
 #include <cstdio>
-#include <utility>
 
 using namespace clang;
 using namespace CodeGen;
@@ -1309,33 +1308,44 @@ void CodeGenModule::EmitVTableTypeMetadata(const CXXRecordDecl *RD,
 
   CharUnits ComponentWidth = GetTargetTypeStoreSize(getVTableComponentType());
 
-  struct AddressPoint {
-    const CXXRecordDecl *Base;
-    size_t Offset;
-    std::string TypeName;
-    bool operator<(const AddressPoint &RHS) const {
-      int D = TypeName.compare(RHS.TypeName);
-      return D < 0 || (D == 0 && Offset < RHS.Offset);
-    }
-  };
+  typedef std::pair<const CXXRecordDecl *, unsigned> AddressPoint;
   std::vector<AddressPoint> AddressPoints;
-  for (auto &&AP : VTLayout.getAddressPoints()) {
-    AddressPoint N{AP.first.getBase(),
-                   VTLayout.getVTableOffset(AP.second.VTableIndex) +
-                       AP.second.AddressPointIndex};
-    llvm::raw_string_ostream Stream(N.TypeName);
-    getCXXABI().getMangleContext().mangleCanonicalTypeName(
-        QualType(N.Base->getTypeForDecl(), 0), Stream);
-    AddressPoints.push_back(std::move(N));
-  }
+  for (auto &&AP : VTLayout.getAddressPoints())
+    AddressPoints.push_back(std::make_pair(
+        AP.first.getBase(), VTLayout.getVTableOffset(AP.second.VTableIndex) +
+                                AP.second.AddressPointIndex));
 
   // Sort the address points for determinism.
-  llvm::sort(AddressPoints);
+  // FIXME: It's more efficient to mangle the types before sorting.
+  llvm::sort(AddressPoints, [this](const AddressPoint &AP1,
+                                   const AddressPoint &AP2) {
+    if (&AP1 == &AP2)
+      return false;
+
+    std::string S1;
+    llvm::raw_string_ostream O1(S1);
+    getCXXABI().getMangleContext().mangleCanonicalTypeName(
+        QualType(AP1.first->getTypeForDecl(), 0), O1);
+    O1.flush();
+
+    std::string S2;
+    llvm::raw_string_ostream O2(S2);
+    getCXXABI().getMangleContext().mangleCanonicalTypeName(
+        QualType(AP2.first->getTypeForDecl(), 0), O2);
+    O2.flush();
+
+    if (S1 < S2)
+      return true;
+    if (S1 != S2)
+      return false;
+
+    return AP1.second < AP2.second;
+  });
 
   ArrayRef<VTableComponent> Comps = VTLayout.vtable_components();
   for (auto AP : AddressPoints) {
     // Create type metadata for the address point.
-    AddVTableTypeMetadata(VTable, ComponentWidth * AP.Offset, AP.Base);
+    AddVTableTypeMetadata(VTable, ComponentWidth * AP.second, AP.first);
 
     // The class associated with each address point could also potentially be
     // used for indirect calls via a member function pointer, so we need to
@@ -1347,7 +1357,7 @@ void CodeGenModule::EmitVTableTypeMetadata(const CXXRecordDecl *RD,
       llvm::Metadata *MD = CreateMetadataIdentifierForVirtualMemPtrType(
           Context.getMemberPointerType(
               Comps[I].getFunctionDecl()->getType(),
-              Context.getRecordType(AP.Base).getTypePtr()));
+              Context.getRecordType(AP.first).getTypePtr()));
       VTable->addTypeMetadata((ComponentWidth * I).getQuantity(), MD);
     }
   }


        


More information about the cfe-commits mailing list