diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1472,9 +1472,7 @@ // the resolver symbol for the provided declaration. The value returned // will be for an ifunc (llvm::GlobalIFunc) if the current target supports // that feature and for a regular function (llvm::GlobalValue) otherwise. - llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD, - llvm::Type *DeclTy, - const FunctionDecl *FD); + llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD); // In scenarios where a function is not known to be a multiversion function // until a later declaration, it is sometimes necessary to change the diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3414,22 +3414,12 @@ const auto *TC = FD->getAttr(); assert(TC && "Not a target_clones Function?"); - QualType CanonTy = Context.getCanonicalType(FD->getType()); - llvm::Type *DeclTy = getTypes().ConvertType(CanonTy); - - if (const auto *CXXFD = dyn_cast(FD)) { - const CGFunctionInfo &FInfo = getTypes().arrangeCXXMethodDeclaration(CXXFD); - DeclTy = getTypes().GetFunctionType(FInfo); - } - llvm::Function *ResolverFunc; if (getTarget().supportsIFunc()) { - auto *IFunc = cast( - GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + auto *IFunc = cast(GetOrCreateMultiVersionResolver(GD)); ResolverFunc = cast(IFunc->getResolver()); } else - ResolverFunc = - cast(GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + ResolverFunc = cast(GetOrCreateMultiVersionResolver(GD)); SmallVector Options; for (unsigned VersionIndex = 0; VersionIndex < TC->featuresStrs_size(); @@ -3545,12 +3535,9 @@ assert(FD->isCPUDispatchMultiVersion() && "Not a multiversion function?"); const auto *DD = FD->getAttr(); assert(DD && "Not a cpu_dispatch Function?"); - llvm::Type *DeclTy = getTypes().ConvertType(FD->getType()); - if (const auto *CXXFD = dyn_cast(FD)) { - const CGFunctionInfo &FInfo = getTypes().arrangeCXXMethodDeclaration(CXXFD); - DeclTy = getTypes().GetFunctionType(FInfo); - } + const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); + llvm::FunctionType *DeclTy = getTypes().GetFunctionType(FI); StringRef ResolverName = getMangledName(GD); UpdateMultiVersionNames(GD, FD, ResolverName); @@ -3640,8 +3627,7 @@ if (getTarget().supportsIFunc()) { llvm::GlobalValue::LinkageTypes Linkage = getMultiversionLinkage(*this, GD); - auto *IFunc = cast( - GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + auto *IFunc = cast(GetOrCreateMultiVersionResolver(GD)); // Fix up function declarations that were created for cpu_specific before // cpu_dispatch was known @@ -3668,8 +3654,10 @@ /// If a dispatcher for the specified mangled name is not in the module, create /// and return an llvm Function with the specified type. -llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver( - GlobalDecl GD, llvm::Type *DeclTy, const FunctionDecl *FD) { +llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) { + const auto *FD = cast(GD.getDecl()); + assert(FD && "Not a FunctionDecl?"); + std::string MangledName = getMangledNameImpl(*this, GD, FD, /*OmitMultiVersionMangling=*/true); @@ -3685,6 +3673,9 @@ if (llvm::GlobalValue *ResolverGV = GetGlobalValue(ResolverName)) return ResolverGV; + const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); + llvm::FunctionType *DeclTy = getTypes().GetFunctionType(FI); + // Since this is the first time we've created this IFunc, make sure // that we put this multiversioned function into the list to be // replaced later if necessary (target multiversioning only). @@ -3770,7 +3761,7 @@ if (FD->isMultiVersion()) { UpdateMultiVersionNames(GD, FD, MangledName); if (!IsForDefinition) - return GetOrCreateMultiVersionResolver(GD, Ty, FD); + return GetOrCreateMultiVersionResolver(GD); } }