@@ -4562,15 +4562,17 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4562
4562
ResolverName += " .resolver" ;
4563
4563
}
4564
4564
4565
+ bool ShouldReturnIFunc =
4566
+ getTarget ().supportsIFunc () && !FD->isCPUSpecificMultiVersion ();
4567
+
4565
4568
// If the resolver has already been created, just return it. This lookup may
4566
4569
// yield a function declaration instead of a resolver on AArch64. That is
4567
4570
// because we didn't know whether a resolver will be generated when we first
4568
4571
// encountered a use of the symbol named after this resolver. Therefore,
4569
4572
// targets which support ifuncs should not return here unless we actually
4570
4573
// found an ifunc.
4571
4574
llvm::GlobalValue *ResolverGV = GetGlobalValue (ResolverName);
4572
- if (ResolverGV &&
4573
- (isa<llvm::GlobalIFunc>(ResolverGV) || !getTarget ().supportsIFunc ()))
4575
+ if (ResolverGV && (isa<llvm::GlobalIFunc>(ResolverGV) || !ShouldReturnIFunc))
4574
4576
return ResolverGV;
4575
4577
4576
4578
const CGFunctionInfo &FI = getTypes ().arrangeGlobalDeclaration (GD);
@@ -4583,7 +4585,7 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4583
4585
4584
4586
// For cpu_specific, don't create an ifunc yet because we don't know if the
4585
4587
// cpu_dispatch will be emitted in this translation unit.
4586
- if (getTarget (). supportsIFunc () && !FD-> isCPUSpecificMultiVersion () ) {
4588
+ if (ShouldReturnIFunc ) {
4587
4589
unsigned AS = getTypes ().getTargetAddressSpace (FD->getType ());
4588
4590
llvm::Type *ResolverType =
4589
4591
llvm::FunctionType::get (llvm::PointerType::get (DeclTy, AS), false );
@@ -4602,11 +4604,9 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
4602
4604
4603
4605
llvm::Constant *Resolver = GetOrCreateLLVMFunction (
4604
4606
ResolverName, DeclTy, GlobalDecl{}, /* ForVTable=*/ false );
4605
- assert (isa<llvm::GlobalValue>(Resolver) &&
4607
+ assert (isa<llvm::GlobalValue>(Resolver) && !ResolverGV &&
4606
4608
" Resolver should be created for the first time" );
4607
4609
SetCommonAttributes (FD, cast<llvm::GlobalValue>(Resolver));
4608
- if (ResolverGV)
4609
- replaceDeclarationWith (ResolverGV, Resolver);
4610
4610
return Resolver;
4611
4611
}
4612
4612
0 commit comments