@@ -4610,12 +4610,6 @@ void CodeGenModule::emitMultiVersionFunctions() {
46104610 }
46114611 llvm::Function *ResolverFunc = cast<llvm::Function>(ResolverConstant);
46124612
4613- ResolverFunc->setLinkage (getMultiversionLinkage (*this , GD));
4614-
4615- if (!ResolverFunc->hasLocalLinkage () && supportsCOMDAT ())
4616- ResolverFunc->setComdat (
4617- getModule ().getOrInsertComdat (ResolverFunc->getName ()));
4618-
46194613 const TargetInfo &TI = getTarget ();
46204614 llvm::stable_sort (
46214615 Options, [&TI](const CodeGenFunction::FMVResolverOption &LHS,
@@ -4624,6 +4618,11 @@ void CodeGenModule::emitMultiVersionFunctions() {
46244618 });
46254619 CodeGenFunction CGF (*this );
46264620 CGF.EmitMultiVersionResolver (ResolverFunc, Options);
4621+
4622+ setMultiVersionResolverAttributes (ResolverFunc, GD);
4623+ if (!ResolverFunc->hasLocalLinkage () && supportsCOMDAT ())
4624+ ResolverFunc->setComdat (
4625+ getModule ().getOrInsertComdat (ResolverFunc->getName ()));
46274626 }
46284627
46294628 // Ensure that any additions to the deferred decls list caused by emitting a
@@ -4674,7 +4673,7 @@ void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
46744673
46754674 auto *ResolverFunc = cast<llvm::Function>(GetOrCreateLLVMFunction (
46764675 ResolverName, ResolverType, ResolverGD, /* ForVTable=*/ false ));
4677- ResolverFunc-> setLinkage ( getMultiversionLinkage (* this , GD));
4676+
46784677 if (supportsCOMDAT ())
46794678 ResolverFunc->setComdat (
46804679 getModule ().getOrInsertComdat (ResolverFunc->getName ()));
@@ -4740,6 +4739,7 @@ void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
47404739
47414740 CodeGenFunction CGF (*this );
47424741 CGF.EmitMultiVersionResolver (ResolverFunc, Options);
4742+ setMultiVersionResolverAttributes (ResolverFunc, GD);
47434743
47444744 if (getTarget ().supportsIFunc ()) {
47454745 llvm::GlobalValue::LinkageTypes Linkage = getMultiversionLinkage (*this , GD);
@@ -4858,6 +4858,26 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
48584858 return Resolver;
48594859}
48604860
4861+ void CodeGenModule::setMultiVersionResolverAttributes (llvm::Function *Resolver,
4862+ GlobalDecl GD) {
4863+ const NamedDecl *D = dyn_cast_or_null<NamedDecl>(GD.getDecl ());
4864+ Resolver->setLinkage (getMultiversionLinkage (*this , GD));
4865+
4866+ // Function body has to be emitted before calling setGlobalVisibility
4867+ // for Resolver to be considered as definition.
4868+ setGlobalVisibility (Resolver, D);
4869+
4870+ setDSOLocal (Resolver);
4871+
4872+ // Set the default target-specific attributes, such as PAC and BTI ones on
4873+ // AArch64. Not passing Decl to prevent setting unrelated attributes,
4874+ // as Resolver can be shared by multiple declarations.
4875+ // FIXME Some targets may require a non-null D to set some attributes
4876+ // (such as "stackrealign" on X86, even when it is requested via
4877+ // "-mstackrealign" command line option).
4878+ getTargetCodeGenInfo ().setTargetAttributes (/* D=*/ nullptr , Resolver, *this );
4879+ }
4880+
48614881bool CodeGenModule::shouldDropDLLAttribute (const Decl *D,
48624882 const llvm::GlobalValue *GV) const {
48634883 auto SC = GV->getDLLStorageClass ();
0 commit comments