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