Skip to content

Commit 55fc2c8

Browse files
committed
Address review comments
1 parent 969a877 commit 55fc2c8

File tree

1 file changed

+13
-22
lines changed

1 file changed

+13
-22
lines changed

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4098,7 +4098,8 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
40984098
llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
40994099
// Add the vtable pointer.
41004100
BuildVTablePointer(cast<Type>(Ty));
4101-
size_t VTablePointerIdx = Fields.size() - 1;
4101+
assert(Fields.size() == 1);
4102+
size_t VTablePointerIdx = 0;
41024103

41034104
// And the name.
41044105
llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
@@ -4213,41 +4214,31 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
42134214
break;
42144215
}
42154216

4216-
llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
42174217
SmallString<256> Name;
42184218
llvm::raw_svector_ostream Out(Name);
42194219
CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
42204220
llvm::Module &M = CGM.getModule();
42214221
llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name);
4222-
llvm::GlobalVariable *GV =
4223-
new llvm::GlobalVariable(M, Init->getType(),
4224-
/*isConstant=*/true, Linkage, Init, Name);
4222+
llvm::GlobalVariable *GV = new llvm::GlobalVariable(
4223+
M, llvm::ConstantStruct::getTypeForElements(Fields),
4224+
/*isConstant=*/true, Linkage, /*Initializer=*/nullptr, Name);
42254225
if (const auto &Schema =
42264226
CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) {
42274227
if (Schema.isAddressDiscriminated()) {
42284228
// If type info vtable pointer is signed with address discrimination
42294229
// enabled, we need to place actual storage address (which was unknown
42304230
// during construction in ItaniumRTTIBuilder::BuildVTablePointer) in the
42314231
// corresponding field.
4232-
ConstantInitBuilder Builder(CGM);
4233-
auto InitBuilder = Builder.beginStruct();
4234-
for (size_t I = 0; I < Fields.size(); ++I) {
4235-
if (I != VTablePointerIdx) {
4236-
InitBuilder.add(Fields[I]);
4237-
continue;
4238-
}
4239-
auto *SignedVTablePointer = cast<llvm::ConstantPtrAuth>(Fields[I]);
4240-
llvm::Constant *UnsignedVtablePointer =
4241-
SignedVTablePointer->getPointer();
4242-
llvm::Constant *StorageAddress =
4243-
InitBuilder.getAddrOfCurrentPosition(CGM.UnqualPtrTy);
4244-
InitBuilder.add(CGM.getConstantSignedPointer(
4245-
UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl(),
4246-
QualType(cast<Type>(Ty), 0)));
4247-
}
4248-
InitBuilder.finishAndSetAsInitializer(GV);
4232+
llvm::Constant *UnsignedVtablePointer =
4233+
cast<llvm::ConstantPtrAuth>(Fields[VTablePointerIdx])->getPointer();
4234+
assert(VTablePointerIdx == 0 && "Expected 0 offset for StorageAddress");
4235+
llvm::Constant *StorageAddress = GV;
4236+
Fields[VTablePointerIdx] = CGM.getConstantSignedPointer(
4237+
UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl(),
4238+
QualType(cast<Type>(Ty), 0));
42494239
}
42504240
}
4241+
GV->replaceInitializer(llvm::ConstantStruct::getAnon(Fields));
42514242

42524243
// Export the typeinfo in the same circumstances as the vtable is exported.
42534244
auto GVDLLStorageClass = DLLStorageClass;

0 commit comments

Comments
 (0)