@@ -3041,9 +3041,11 @@ void CodeGenModule::createFunctionTypeMetadataForIcall(const FunctionDecl *FD,
30413041 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic ())
30423042 return ;
30433043
3044- llvm::Metadata *MD = CreateMetadataIdentifierForType (FD->getType ());
3044+ QualType FnType = FD->getType ();
3045+ llvm::Metadata *MD = CreateMetadataIdentifierForType (FnType);
30453046 F->addTypeMetadata (0 , MD);
3046- F->addTypeMetadata (0 , CreateMetadataIdentifierGeneralized (FD->getType ()));
3047+ FnType = GeneralizeFunctionType (getContext (), FnType);
3048+ F->addTypeMetadata (0 , CreateMetadataIdentifierGeneralized (FnType));
30473049
30483050 // Emit a hash-based bit set entry for cross-DSO calls.
30493051 if (CodeGenOpts.SanitizeCfiCrossDso )
@@ -7934,6 +7936,15 @@ CodeGenModule::CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
79347936 return InternalId;
79357937}
79367938
7939+ llvm::Metadata *CodeGenModule::CreateMetadataIdentifierForFnType (QualType T) {
7940+ assert (isa<FunctionType>(T));
7941+ if (getCodeGenOpts ().SanitizeCfiICallGeneralizePointers ) {
7942+ T = GeneralizeFunctionType (getContext (), T);
7943+ return CreateMetadataIdentifierGeneralized (T);
7944+ }
7945+ return CreateMetadataIdentifierForType (T);
7946+ }
7947+
79377948llvm::Metadata *CodeGenModule::CreateMetadataIdentifierForType (QualType T) {
79387949 return CreateMetadataIdentifierImpl (T, MetadataIdMap, " " );
79397950}
@@ -7944,8 +7955,8 @@ CodeGenModule::CreateMetadataIdentifierForVirtualMemPtrType(QualType T) {
79447955}
79457956
79467957llvm::Metadata *CodeGenModule::CreateMetadataIdentifierGeneralized (QualType T) {
7947- return CreateMetadataIdentifierImpl (GeneralizeFunctionType ( getContext (), T) ,
7948- GeneralizedMetadataIdMap, " .generalized" );
7958+ return CreateMetadataIdentifierImpl (T, GeneralizedMetadataIdMap ,
7959+ " .generalized" );
79497960}
79507961
79517962// / Returns whether this module needs the "all-vtables" type identifier.
0 commit comments