|
@@ -96,7 +96,7 @@ public:
|
|
|
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
|
|
|
|
|
|
const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
|
|
|
- for (const VPtrInfo *VBT : *VBGlobals.VBTables) {
|
|
|
+ for (const std::unique_ptr<VPtrInfo> &VBT : *VBGlobals.VBTables) {
|
|
|
const ASTRecordLayout &SubobjectLayout =
|
|
|
Context.getASTRecordLayout(VBT->IntroducingObject);
|
|
|
CharUnits Offs = VBT->NonVirtualOffset;
|
|
@@ -122,7 +122,7 @@ public:
|
|
|
void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
|
|
|
|
|
|
llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
|
|
|
- const VPtrInfo *Info);
|
|
|
+ const VPtrInfo &Info);
|
|
|
|
|
|
llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
|
|
|
CatchTypeInfo
|
|
@@ -254,7 +254,7 @@ public:
|
|
|
CXXDtorType Type, bool ForVirtualBase,
|
|
|
bool Delegating, Address This) override;
|
|
|
|
|
|
- void emitVTableTypeMetadata(VPtrInfo *Info, const CXXRecordDecl *RD,
|
|
|
+ void emitVTableTypeMetadata(const VPtrInfo &Info, const CXXRecordDecl *RD,
|
|
|
llvm::GlobalVariable *VTable);
|
|
|
|
|
|
void emitVTableDefinitions(CodeGenVTables &CGVT,
|
|
@@ -1214,7 +1214,7 @@ void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
|
|
|
|
|
|
const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
|
|
|
for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
|
|
|
- const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
|
|
|
+ const std::unique_ptr<VPtrInfo> &VBT = (*VBGlobals.VBTables)[I];
|
|
|
llvm::GlobalVariable *GV = VBGlobals.Globals[I];
|
|
|
const ASTRecordLayout &SubobjectLayout =
|
|
|
Context.getASTRecordLayout(VBT->IntroducingObject);
|
|
@@ -1509,7 +1509,7 @@ void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
|
|
|
getFromDtorType(Type));
|
|
|
}
|
|
|
|
|
|
-void MicrosoftCXXABI::emitVTableTypeMetadata(VPtrInfo *Info,
|
|
|
+void MicrosoftCXXABI::emitVTableTypeMetadata(const VPtrInfo &Info,
|
|
|
const CXXRecordDecl *RD,
|
|
|
llvm::GlobalVariable *VTable) {
|
|
|
if (!CGM.getCodeGenOpts().PrepareForLTO)
|
|
@@ -1524,20 +1524,20 @@ void MicrosoftCXXABI::emitVTableTypeMetadata(VPtrInfo *Info,
|
|
|
getContext().getTargetInfo().getPointerWidth(0))
|
|
|
: CharUnits::Zero();
|
|
|
|
|
|
- if (Info->PathToIntroducingObject.empty()) {
|
|
|
+ if (Info.PathToIntroducingObject.empty()) {
|
|
|
CGM.AddVTableTypeMetadata(VTable, AddressPoint, RD);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Add a bitset entry for the least derived base belonging to this vftable.
|
|
|
CGM.AddVTableTypeMetadata(VTable, AddressPoint,
|
|
|
- Info->PathToIntroducingObject.back());
|
|
|
+ Info.PathToIntroducingObject.back());
|
|
|
|
|
|
// Add a bitset entry for each derived class that is laid out at the same
|
|
|
// offset as the least derived base.
|
|
|
- for (unsigned I = Info->PathToIntroducingObject.size() - 1; I != 0; --I) {
|
|
|
- const CXXRecordDecl *DerivedRD = Info->PathToIntroducingObject[I - 1];
|
|
|
- const CXXRecordDecl *BaseRD = Info->PathToIntroducingObject[I];
|
|
|
+ for (unsigned I = Info.PathToIntroducingObject.size() - 1; I != 0; --I) {
|
|
|
+ const CXXRecordDecl *DerivedRD = Info.PathToIntroducingObject[I - 1];
|
|
|
+ const CXXRecordDecl *BaseRD = Info.PathToIntroducingObject[I];
|
|
|
|
|
|
const ASTRecordLayout &Layout =
|
|
|
getContext().getASTRecordLayout(DerivedRD);
|
|
@@ -1553,7 +1553,7 @@ void MicrosoftCXXABI::emitVTableTypeMetadata(VPtrInfo *Info,
|
|
|
}
|
|
|
|
|
|
// Finally do the same for the most derived class.
|
|
|
- if (Info->FullOffsetInMDC.isZero())
|
|
|
+ if (Info.FullOffsetInMDC.isZero())
|
|
|
CGM.AddVTableTypeMetadata(VTable, AddressPoint, RD);
|
|
|
}
|
|
|
|
|
@@ -1562,7 +1562,7 @@ void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
|
|
|
MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext();
|
|
|
const VPtrInfoVector &VFPtrs = VFTContext.getVFPtrOffsets(RD);
|
|
|
|
|
|
- for (VPtrInfo *Info : VFPtrs) {
|
|
|
+ for (const std::unique_ptr<VPtrInfo>& Info : VFPtrs) {
|
|
|
llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC);
|
|
|
if (VTable->hasInitializer())
|
|
|
continue;
|
|
@@ -1573,13 +1573,13 @@ void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
|
|
|
llvm::Constant *RTTI = nullptr;
|
|
|
if (any_of(VTLayout.vtable_components(),
|
|
|
[](const VTableComponent &VTC) { return VTC.isRTTIKind(); }))
|
|
|
- RTTI = getMSCompleteObjectLocator(RD, Info);
|
|
|
+ RTTI = getMSCompleteObjectLocator(RD, *Info);
|
|
|
|
|
|
llvm::Constant *Init = CGVT.CreateVTableInitializer(VTLayout, RTTI);
|
|
|
|
|
|
VTable->setInitializer(Init);
|
|
|
|
|
|
- emitVTableTypeMetadata(Info, RD, VTable);
|
|
|
+ emitVTableTypeMetadata(*Info, RD, VTable);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1600,10 +1600,10 @@ llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor(
|
|
|
}
|
|
|
|
|
|
static void mangleVFTableName(MicrosoftMangleContext &MangleContext,
|
|
|
- const CXXRecordDecl *RD, const VPtrInfo *VFPtr,
|
|
|
+ const CXXRecordDecl *RD, const VPtrInfo &VFPtr,
|
|
|
SmallString<256> &Name) {
|
|
|
llvm::raw_svector_ostream Out(Name);
|
|
|
- MangleContext.mangleCXXVFTable(RD, VFPtr->MangledPath, Out);
|
|
|
+ MangleContext.mangleCXXVFTable(RD, VFPtr.MangledPath, Out);
|
|
|
}
|
|
|
|
|
|
llvm::Constant *
|
|
@@ -1650,25 +1650,25 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
|
|
|
llvm::StringSet<> ObservedMangledNames;
|
|
|
for (size_t J = 0, F = VFPtrs.size(); J != F; ++J) {
|
|
|
SmallString<256> Name;
|
|
|
- mangleVFTableName(getMangleContext(), RD, VFPtrs[J], Name);
|
|
|
+ mangleVFTableName(getMangleContext(), RD, *VFPtrs[J], Name);
|
|
|
if (!ObservedMangledNames.insert(Name.str()).second)
|
|
|
llvm_unreachable("Already saw this mangling before?");
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
- VPtrInfo *const *VFPtrI =
|
|
|
- std::find_if(VFPtrs.begin(), VFPtrs.end(), [&](VPtrInfo *VPI) {
|
|
|
+ const std::unique_ptr<VPtrInfo> *VFPtrI = std::find_if(
|
|
|
+ VFPtrs.begin(), VFPtrs.end(), [&](const std::unique_ptr<VPtrInfo>& VPI) {
|
|
|
return VPI->FullOffsetInMDC == VPtrOffset;
|
|
|
});
|
|
|
if (VFPtrI == VFPtrs.end()) {
|
|
|
VFTablesMap[ID] = nullptr;
|
|
|
return nullptr;
|
|
|
}
|
|
|
- VPtrInfo *VFPtr = *VFPtrI;
|
|
|
+ const std::unique_ptr<VPtrInfo> &VFPtr = *VFPtrI;
|
|
|
|
|
|
SmallString<256> VFTableName;
|
|
|
- mangleVFTableName(getMangleContext(), RD, VFPtr, VFTableName);
|
|
|
+ mangleVFTableName(getMangleContext(), RD, *VFPtr, VFTableName);
|
|
|
|
|
|
// Classes marked __declspec(dllimport) need vftables generated on the
|
|
|
// import-side in order to support features like constexpr. No other
|
|
@@ -1964,7 +1964,7 @@ llvm::Function *MicrosoftCXXABI::EmitVirtualMemPtrThunk(
|
|
|
void MicrosoftCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
|
|
|
const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
|
|
|
for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
|
|
|
- const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
|
|
|
+ const std::unique_ptr<VPtrInfo>& VBT = (*VBGlobals.VBTables)[I];
|
|
|
llvm::GlobalVariable *GV = VBGlobals.Globals[I];
|
|
|
if (GV->isDeclaration())
|
|
|
emitVBTableDefinition(*VBT, RD, GV);
|
|
@@ -3426,7 +3426,7 @@ struct MSRTTIBuilder {
|
|
|
llvm::GlobalVariable *
|
|
|
getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes);
|
|
|
llvm::GlobalVariable *getClassHierarchyDescriptor();
|
|
|
- llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo *Info);
|
|
|
+ llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo &Info);
|
|
|
|
|
|
CodeGenModule &CGM;
|
|
|
ASTContext &Context;
|
|
@@ -3608,11 +3608,11 @@ MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) {
|
|
|
}
|
|
|
|
|
|
llvm::GlobalVariable *
|
|
|
-MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo *Info) {
|
|
|
+MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo &Info) {
|
|
|
SmallString<256> MangledName;
|
|
|
{
|
|
|
llvm::raw_svector_ostream Out(MangledName);
|
|
|
- ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info->MangledPath, Out);
|
|
|
+ ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info.MangledPath, Out);
|
|
|
}
|
|
|
|
|
|
// Check to see if we've already computed this complete object locator.
|
|
@@ -3620,15 +3620,15 @@ MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo *Info) {
|
|
|
return COL;
|
|
|
|
|
|
// Compute the fields of the complete object locator.
|
|
|
- int OffsetToTop = Info->FullOffsetInMDC.getQuantity();
|
|
|
+ int OffsetToTop = Info.FullOffsetInMDC.getQuantity();
|
|
|
int VFPtrOffset = 0;
|
|
|
// The offset includes the vtordisp if one exists.
|
|
|
- if (const CXXRecordDecl *VBase = Info->getVBaseWithVPtr())
|
|
|
+ if (const CXXRecordDecl *VBase = Info.getVBaseWithVPtr())
|
|
|
if (Context.getASTRecordLayout(RD)
|
|
|
.getVBaseOffsetsMap()
|
|
|
.find(VBase)
|
|
|
->second.hasVtorDisp())
|
|
|
- VFPtrOffset = Info->NonVirtualOffset.getQuantity() + 4;
|
|
|
+ VFPtrOffset = Info.NonVirtualOffset.getQuantity() + 4;
|
|
|
|
|
|
// Forward-declare the complete object locator.
|
|
|
llvm::StructType *Type = ABI.getCompleteObjectLocatorType();
|
|
@@ -3756,7 +3756,7 @@ llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) {
|
|
|
/// \brief Gets or a creates a Microsoft CompleteObjectLocator.
|
|
|
llvm::GlobalVariable *
|
|
|
MicrosoftCXXABI::getMSCompleteObjectLocator(const CXXRecordDecl *RD,
|
|
|
- const VPtrInfo *Info) {
|
|
|
+ const VPtrInfo &Info) {
|
|
|
return MSRTTIBuilder(*this, RD).getCompleteObjectLocator(Info);
|
|
|
}
|
|
|
|