1*e7cd42f8SMatt Arsenault //===- LowerIFunc.cpp -----------------------------------------------------===// 2*e7cd42f8SMatt Arsenault // 3*e7cd42f8SMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e7cd42f8SMatt Arsenault // See https://llvm.org/LICENSE.txt for license information. 5*e7cd42f8SMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e7cd42f8SMatt Arsenault // 7*e7cd42f8SMatt Arsenault //===----------------------------------------------------------------------===// 8*e7cd42f8SMatt Arsenault // 9*e7cd42f8SMatt Arsenault // This file implements replacing calls to ifuncs by introducing indirect calls. 10*e7cd42f8SMatt Arsenault // 11*e7cd42f8SMatt Arsenault //===----------------------------------------------------------------------===// 12*e7cd42f8SMatt Arsenault 13*e7cd42f8SMatt Arsenault #include "llvm/Transforms/Utils/LowerIFunc.h" 14*e7cd42f8SMatt Arsenault #include "llvm/IR/Module.h" 15*e7cd42f8SMatt Arsenault #include "llvm/Pass.h" 16*e7cd42f8SMatt Arsenault #include "llvm/Transforms/Utils/ModuleUtils.h" 17*e7cd42f8SMatt Arsenault 18*e7cd42f8SMatt Arsenault using namespace llvm; 19*e7cd42f8SMatt Arsenault 20*e7cd42f8SMatt Arsenault /// Replace all call users of ifuncs in the module. run(Module & M,ModuleAnalysisManager & AM)21*e7cd42f8SMatt ArsenaultPreservedAnalyses LowerIFuncPass::run(Module &M, ModuleAnalysisManager &AM) { 22*e7cd42f8SMatt Arsenault if (M.ifunc_empty()) 23*e7cd42f8SMatt Arsenault return PreservedAnalyses::all(); 24*e7cd42f8SMatt Arsenault 25*e7cd42f8SMatt Arsenault lowerGlobalIFuncUsersAsGlobalCtor(M, {}); 26*e7cd42f8SMatt Arsenault return PreservedAnalyses::none(); 27*e7cd42f8SMatt Arsenault } 28