xref: /llvm-project/llvm/lib/Transforms/Utils/LowerIFunc.cpp (revision e7cd42f8e4da1beed52f401dcf87d22d36a2c81c)
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 Arsenault PreservedAnalyses 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