Skip to content

Commit b08172f

Browse files
committed
Construct GV before BuildVTablePointer call
1 parent 90d6355 commit b08172f

File tree

3 files changed

+26
-41
lines changed

3 files changed

+26
-41
lines changed

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3437,7 +3437,7 @@ class ItaniumRTTIBuilder {
34373437
llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
34383438

34393439
/// BuildVTablePointer - Build the vtable pointer for the given type.
3440-
void BuildVTablePointer(const Type *Ty);
3440+
void BuildVTablePointer(const Type *Ty, llvm::Constant *StorageAddress);
34413441

34423442
/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
34433443
/// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
@@ -3834,7 +3834,8 @@ static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
38343834
return true;
38353835
}
38363836

3837-
void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
3837+
void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty,
3838+
llvm::Constant *StorageAddress) {
38383839
// abi::__class_type_info.
38393840
static const char * const ClassTypeInfo =
38403841
"_ZTVN10__cxxabiv117__class_type_infoE";
@@ -3982,13 +3983,11 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
39823983
}
39833984

39843985
if (const auto &Schema =
3985-
CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) {
3986-
// If address discrimination is enabled, we'll re-write that to actual
3987-
// storage address later in ItaniumRTTIBuilder::BuildTypeInfo.
3988-
llvm::Constant *StorageAddress = nullptr;
3989-
VTable = CGM.getConstantSignedPointer(VTable, Schema, StorageAddress,
3990-
GlobalDecl(), QualType(Ty, 0));
3991-
}
3986+
CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer)
3987+
VTable = CGM.getConstantSignedPointer(
3988+
VTable, Schema,
3989+
Schema.isAddressDiscriminated() ? StorageAddress : nullptr,
3990+
GlobalDecl(), QualType(Ty, 0));
39923991

39933992
Fields.push_back(VTable);
39943993
}
@@ -4104,10 +4103,18 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
41044103
llvm::GlobalVariable::LinkageTypes Linkage,
41054104
llvm::GlobalValue::VisibilityTypes Visibility,
41064105
llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
4106+
SmallString<256> Name;
4107+
llvm::raw_svector_ostream Out(Name);
4108+
CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4109+
llvm::Module &M = CGM.getModule();
4110+
llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name);
4111+
// int8 is an arbitrary type to be replaced later with replaceInitializer.
4112+
llvm::GlobalVariable *GV =
4113+
new llvm::GlobalVariable(M, CGM.Int8Ty, /*isConstant=*/true, Linkage,
4114+
/*Initializer=*/nullptr, Name);
4115+
41074116
// Add the vtable pointer.
4108-
BuildVTablePointer(cast<Type>(Ty));
4109-
assert(Fields.size() == 1);
4110-
size_t VTablePointerIdx = 0;
4117+
BuildVTablePointer(cast<Type>(Ty), GV);
41114118

41124119
// And the name.
41134120
llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
@@ -4225,30 +4232,6 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
42254232
llvm_unreachable("HLSL doesn't support RTTI");
42264233
}
42274234

4228-
SmallString<256> Name;
4229-
llvm::raw_svector_ostream Out(Name);
4230-
CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4231-
llvm::Module &M = CGM.getModule();
4232-
llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name);
4233-
llvm::GlobalVariable *GV = new llvm::GlobalVariable(
4234-
M, llvm::ConstantStruct::getTypeForElements(Fields),
4235-
/*isConstant=*/true, Linkage, /*Initializer=*/nullptr, Name);
4236-
if (const auto &Schema =
4237-
CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) {
4238-
if (Schema.isAddressDiscriminated()) {
4239-
// If type info vtable pointer is signed with address discrimination
4240-
// enabled, we need to place actual storage address (which was unknown
4241-
// during construction in ItaniumRTTIBuilder::BuildVTablePointer) in the
4242-
// corresponding field.
4243-
llvm::Constant *UnsignedVtablePointer =
4244-
cast<llvm::ConstantPtrAuth>(Fields[VTablePointerIdx])->getPointer();
4245-
assert(VTablePointerIdx == 0 && "Expected 0 offset for StorageAddress");
4246-
llvm::Constant *StorageAddress = GV;
4247-
Fields[VTablePointerIdx] = CGM.getConstantSignedPointer(
4248-
UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl(),
4249-
QualType(cast<Type>(Ty), 0));
4250-
}
4251-
}
42524235
GV->replaceInitializer(llvm::ConstantStruct::getAnon(Fields));
42534236

42544237
// Export the typeinfo in the same circumstances as the vtable is exported.

clang/test/CodeGenCXX/ptrauth-type-info-vtable.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,14 @@ static_assert(__has_feature(ptrauth_type_info_vtable_pointer_discrimination) ==
6060
extern "C" int disc_std_type_info = __builtin_ptrauth_string_discriminator("_ZTVSt9type_info");
6161

6262
// CHECK: @_ZTV10TestStruct = unnamed_addr constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI10TestStruct, ptr ptrauth (ptr @_ZN10TestStructD1Ev, i32 0, i64 52216, ptr getelementptr inbounds ({ [4 x ptr] }, ptr @_ZTV10TestStruct, i32 0, i32 0, i32 2)), ptr ptrauth (ptr @_ZN10TestStructD0Ev, i32 0, i64 39671, ptr getelementptr inbounds ({ [4 x ptr] }, ptr @_ZTV10TestStruct, i32 0, i32 0, i32 3))] }, align 8
63-
// CHECK: @_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr]
64-
// CHECK: @_ZTS10TestStruct = constant [13 x i8] c"10TestStruct\00", align 1
6563

6664
// NODISC: @_ZTI10TestStruct = constant { ptr, ptr } { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), i32 2), ptr @_ZTS10TestStruct }, align 8
6765

6866
// DISC: @_ZTI10TestStruct = constant { ptr, ptr } { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), i32 2, i64 [[STDTYPEINFO_DISC]], ptr @_ZTI10TestStruct), ptr @_ZTS10TestStruct }, align 8
6967

68+
// CHECK: @_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr]
69+
// CHECK: @_ZTS10TestStruct = constant [13 x i8] c"10TestStruct\00", align 1
70+
7071
struct TestStruct {
7172
virtual ~TestStruct();
7273
int a;

llvm/test/CodeGen/AArch64/ptrauth-type-info-vptr-discr.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
; MACHO-LABEL: __ZTI10NoDisc:
1212
; MACHO-NEXT: .quad (__ZTVN10__cxxabiv117__class_type_infoE+16)@AUTH(da,45546)
1313

14-
@_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr]
1514

16-
@_ZTS10Disc = constant [4 x i8] c"Disc", align 1
1715
@_ZTI10Disc = constant { ptr, ptr } { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), i32 2, i64 45546, ptr @_ZTI10Disc), ptr @_ZTS10Disc }, align 8
16+
@_ZTS10Disc = constant [4 x i8] c"Disc", align 1
1817

19-
@_ZTS10NoDisc = constant [6 x i8] c"NoDisc", align 1
2018
@_ZTI10NoDisc = constant { ptr, ptr } { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), i32 2, i64 45546), ptr @_ZTS10NoDisc }, align 8
19+
@_ZTS10NoDisc = constant [6 x i8] c"NoDisc", align 1
20+
21+
@_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr]

0 commit comments

Comments
 (0)