@@ -898,21 +898,34 @@ void CodeGenModule::EmitDeferredVTables() {
898898 DeferredVTables.clear ();
899899}
900900
901- bool CodeGenModule::IsCFIBlacklistedRecord (const CXXRecordDecl *RD) {
902- if (RD->hasAttr <UuidAttr>() &&
903- getContext ().getSanitizerBlacklist ().isBlacklistedType (" attr:uuid" ))
904- return true ;
901+ bool CodeGenModule::NeedVTableBitSets () {
902+ return getCodeGenOpts ().WholeProgramVTables ||
903+ getLangOpts ().Sanitize .has (SanitizerKind::CFIVCall) ||
904+ getLangOpts ().Sanitize .has (SanitizerKind::CFINVCall) ||
905+ getLangOpts ().Sanitize .has (SanitizerKind::CFIDerivedCast) ||
906+ getLangOpts ().Sanitize .has (SanitizerKind::CFIUnrelatedCast);
907+ }
908+
909+ bool CodeGenModule::IsBitSetBlacklistedRecord (const CXXRecordDecl *RD) {
910+ std::string TypeName = RD->getQualifiedNameAsString ();
911+ auto isInBlacklist = [&](const SanitizerBlacklist &BL) {
912+ if (RD->hasAttr <UuidAttr>() && BL.isBlacklistedType (" attr:uuid" ))
913+ return true ;
914+
915+ return BL.isBlacklistedType (TypeName);
916+ };
905917
906- return getContext ().getSanitizerBlacklist ().isBlacklistedType (
907- RD->getQualifiedNameAsString ());
918+ return isInBlacklist (WholeProgramVTablesBlacklist) ||
919+ ((LangOpts.Sanitize .has (SanitizerKind::CFIVCall) ||
920+ LangOpts.Sanitize .has (SanitizerKind::CFINVCall) ||
921+ LangOpts.Sanitize .has (SanitizerKind::CFIDerivedCast) ||
922+ LangOpts.Sanitize .has (SanitizerKind::CFIUnrelatedCast)) &&
923+ isInBlacklist (getContext ().getSanitizerBlacklist ()));
908924}
909925
910926void CodeGenModule::EmitVTableBitSetEntries (llvm::GlobalVariable *VTable,
911927 const VTableLayout &VTLayout) {
912- if (!LangOpts.Sanitize .has (SanitizerKind::CFIVCall) &&
913- !LangOpts.Sanitize .has (SanitizerKind::CFINVCall) &&
914- !LangOpts.Sanitize .has (SanitizerKind::CFIDerivedCast) &&
915- !LangOpts.Sanitize .has (SanitizerKind::CFIUnrelatedCast))
928+ if (!NeedVTableBitSets ())
916929 return ;
917930
918931 CharUnits PointerWidth =
@@ -922,7 +935,7 @@ void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,
922935 std::vector<BSEntry> BitsetEntries;
923936 // Create a bit set entry for each address point.
924937 for (auto &&AP : VTLayout.getAddressPoints ()) {
925- if (IsCFIBlacklistedRecord (AP.first .getBase ()))
938+ if (IsBitSetBlacklistedRecord (AP.first .getBase ()))
926939 continue ;
927940
928941 BitsetEntries.push_back (std::make_pair (AP.first .getBase (), AP.second ));
0 commit comments