tahonermann created this revision. tahonermann added reviewers: erichkeane, aaron.ballman. Herald added a project: All. tahonermann added inline comments. tahonermann published this revision for review. Herald added a project: clang. Herald added a subscriber: cfe-commits.
================ Comment at: clang/lib/CodeGen/CodeGenModule.cpp:3539-3540 - if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(FD)) { - const CGFunctionInfo &FInfo = getTypes().arrangeCXXMethodDeclaration(CXXFD); - DeclTy = getTypes().GetFunctionType(FInfo); - } + const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD); + llvm::FunctionType *DeclTy = getTypes().GetFunctionType(FI); ---------------- This is a drive by cleanup. `arrangeGlobalDeclaration()` handles the `CXXMethodDecl` special case (as well as other special cases). We rely on such calls elsewhere; see `CodeGenModule::emitMultiVersionFunctions()` for example. Previously, GetOrCreateMultiVersionResolver() required the caller to provide a GlobalDecl along with an llvm::type and FunctionDecl. The latter two can be cheaply obtained from the first, and the llvm::type parameter is not always used, so requiring the caller to provide them was unnecessary and created the possibility that callers would pass an inconsistent set. This change simplifies the interface to only require the GlobalDecl value. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D122956 Files: clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/CodeGenModule.h
Index: clang/lib/CodeGen/CodeGenModule.h =================================================================== --- clang/lib/CodeGen/CodeGenModule.h +++ 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 Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -3414,22 +3414,12 @@ const auto *TC = FD->getAttr<TargetClonesAttr>(); 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<CXXMethodDecl>(FD)) { - const CGFunctionInfo &FInfo = getTypes().arrangeCXXMethodDeclaration(CXXFD); - DeclTy = getTypes().GetFunctionType(FInfo); - } - llvm::Function *ResolverFunc; if (getTarget().supportsIFunc()) { - auto *IFunc = cast<llvm::GlobalIFunc>( - GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + auto *IFunc = cast<llvm::GlobalIFunc>(GetOrCreateMultiVersionResolver(GD)); ResolverFunc = cast<llvm::Function>(IFunc->getResolver()); } else - ResolverFunc = - cast<llvm::Function>(GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + ResolverFunc = cast<llvm::Function>(GetOrCreateMultiVersionResolver(GD)); SmallVector<CodeGenFunction::MultiVersionResolverOption, 10> 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<CPUDispatchAttr>(); assert(DD && "Not a cpu_dispatch Function?"); - llvm::Type *DeclTy = getTypes().ConvertType(FD->getType()); - if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(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<llvm::GlobalValue>( - GetOrCreateMultiVersionResolver(GD, DeclTy, FD)); + auto *IFunc = cast<llvm::GlobalValue>(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<FunctionDecl>(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); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits