@@ -13291,6 +13291,18 @@ QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
1329113291 }
1329213292}
1329313293
13294+ std::vector<std::string> ASTContext::filterFunctionTargetVersionAttrs (
13295+ const TargetVersionAttr *TV) const {
13296+ assert (TV != nullptr );
13297+ llvm::SmallVector<StringRef, 8 > Feats;
13298+ std::vector<std::string> ResFeats;
13299+ TV->getFeatures (Feats);
13300+ for (auto &Feature : Feats)
13301+ if (Target->validateCpuSupports (Feature.str ()))
13302+ ResFeats.push_back (" ?" + Feature.str ());
13303+ return ResFeats;
13304+ }
13305+
1329413306ParsedTargetAttr
1329513307ASTContext::filterFunctionTargetAttrs (const TargetAttr *TD) const {
1329613308 assert (TD != nullptr );
@@ -13349,12 +13361,32 @@ void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
1334913361 } else if (const auto *TC = FD->getAttr <TargetClonesAttr>()) {
1335013362 std::vector<std::string> Features;
1335113363 StringRef VersionStr = TC->getFeatureStr (GD.getMultiVersionIndex ());
13352- if (VersionStr.startswith (" arch=" ))
13353- TargetCPU = VersionStr.drop_front (sizeof (" arch=" ) - 1 );
13354- else if (VersionStr != " default" )
13355- Features.push_back ((StringRef{" +" } + VersionStr).str ());
13356-
13364+ if (Target->getTriple ().isAArch64 ()) {
13365+ // TargetClones for AArch64
13366+ if (VersionStr != " default" ) {
13367+ SmallVector<StringRef, 1 > VersionFeatures;
13368+ VersionStr.split (VersionFeatures, " +" );
13369+ for (auto &VFeature : VersionFeatures) {
13370+ VFeature = VFeature.trim ();
13371+ Features.push_back ((StringRef{" ?" } + VFeature).str ());
13372+ }
13373+ }
13374+ Features.insert (Features.begin (),
13375+ Target->getTargetOpts ().FeaturesAsWritten .begin (),
13376+ Target->getTargetOpts ().FeaturesAsWritten .end ());
13377+ } else {
13378+ if (VersionStr.startswith (" arch=" ))
13379+ TargetCPU = VersionStr.drop_front (sizeof (" arch=" ) - 1 );
13380+ else if (VersionStr != " default" )
13381+ Features.push_back ((StringRef{" +" } + VersionStr).str ());
13382+ }
1335713383 Target->initFeatureMap (FeatureMap, getDiagnostics (), TargetCPU, Features);
13384+ } else if (const auto *TV = FD->getAttr <TargetVersionAttr>()) {
13385+ std::vector<std::string> Feats = filterFunctionTargetVersionAttrs (TV);
13386+ Feats.insert (Feats.begin (),
13387+ Target->getTargetOpts ().FeaturesAsWritten .begin (),
13388+ Target->getTargetOpts ().FeaturesAsWritten .end ());
13389+ Target->initFeatureMap (FeatureMap, getDiagnostics (), TargetCPU, Feats);
1335813390 } else {
1335913391 FeatureMap = Target->getTargetOpts ().FeatureMap ;
1336013392 }
0 commit comments