@@ -13291,6 +13291,18 @@ QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
13291
13291
}
13292
13292
}
13293
13293
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
+
13294
13306
ParsedTargetAttr
13295
13307
ASTContext::filterFunctionTargetAttrs (const TargetAttr *TD) const {
13296
13308
assert (TD != nullptr );
@@ -13349,12 +13361,32 @@ void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
13349
13361
} else if (const auto *TC = FD->getAttr <TargetClonesAttr>()) {
13350
13362
std::vector<std::string> Features;
13351
13363
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
+ }
13357
13383
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);
13358
13390
} else {
13359
13391
FeatureMap = Target->getTargetOpts ().FeatureMap ;
13360
13392
}
0 commit comments