[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