diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6d2c705..9383c57 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4237,19 +4237,19 @@ void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD, EmitGlobalFunctionDefinition(GD.getWithMultiVersionIndex(I), nullptr); } else if (auto *TC = FD->getAttr<TargetClonesAttr>()) { for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) - // AArch64 favors the default target version over the clone if any. - if ((!TC->isDefaultVersion(I) || !getTarget().getTriple().isAArch64()) && - TC->isFirstOfVersion(I)) + if (TC->isFirstOfVersion(I)) EmitGlobalFunctionDefinition(GD.getWithMultiVersionIndex(I), nullptr); - // Ensure that the resolver function is also emitted. - GetOrCreateMultiVersionResolver(GD); } else EmitGlobalFunctionDefinition(GD, GV); - // Defer the resolver emission until we can reason whether the TU - // contains a default target version implementation. - if (FD->isTargetVersionMultiVersion()) - AddDeferredMultiVersionResolverToEmit(GD); + // Ensure that the resolver function is also emitted. + if (FD->isTargetVersionMultiVersion() || FD->isTargetClonesMultiVersion()) { + // On AArch64 defer the resolver emission until the entire TU is processed. + if (getTarget().getTriple().isAArch64()) + AddDeferredMultiVersionResolverToEmit(GD); + else + GetOrCreateMultiVersionResolver(GD); + } } void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) { @@ -4351,7 +4351,7 @@ void CodeGenModule::emitMultiVersionFunctions() { }; // For AArch64, a resolver is only emitted if a function marked with - // target_version("default")) or target_clones() is present and defined + // target_version("default")) or target_clones("default") is defined // in this TU. For other architectures it is always emitted. bool ShouldEmitResolver = !getTarget().getTriple().isAArch64(); SmallVector<CodeGenFunction::FMVResolverOption, 10> Options; @@ -4374,12 +4374,11 @@ void CodeGenModule::emitMultiVersionFunctions() { TVA->getFeatures(Feats, Delim); Options.emplace_back(Func, Feats); } else if (const auto *TC = CurFD->getAttr<TargetClonesAttr>()) { - if (IsDefined) - ShouldEmitResolver = true; for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) { if (!TC->isFirstOfVersion(I)) continue; - + if (TC->isDefaultVersion(I) && IsDefined) + ShouldEmitResolver = true; llvm::Function *Func = createFunction(CurFD, I); Feats.clear(); if (getTarget().getTriple().isX86()) { |