| //===- LibcallLoweringInfo.cpp - Interface for runtime libcalls -----------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/CodeGen/LibcallLoweringInfo.h" | |
| #include "llvm/Analysis/RuntimeLibcallInfo.h" | |
| #include "llvm/CodeGen/TargetSubtargetInfo.h" | |
| #include "llvm/InitializePasses.h" | |
| #include "llvm/Target/TargetMachine.h" | |
| using namespace llvm; | |
| LibcallLoweringInfo::LibcallLoweringInfo( | |
| const RTLIB::RuntimeLibcallsInfo &RTLCI, | |
| const TargetSubtargetInfo &Subtarget) | |
| : RTLCI(RTLCI) { | |
| // TODO: This should be generated with lowering predicates, and assert the | |
| // call is available. | |
| for (RTLIB::LibcallImpl Impl : RTLIB::libcall_impls()) { | |
| if (RTLCI.isAvailable(Impl)) { | |
| RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl); | |
| // FIXME: Hack, assume the first available libcall wins. | |
| if (LibcallImpls[LC] == RTLIB::Unsupported) | |
| LibcallImpls[LC] = Impl; | |
| } | |
| } | |
| Subtarget.initLibcallLoweringInfo(*this); | |
| } | |
| AnalysisKey LibcallLoweringModuleAnalysis::Key; | |
| bool ModuleLibcallLoweringInfo::invalidate( | |
| Module &, const PreservedAnalyses &PA, | |
| ModuleAnalysisManager::Invalidator &) { | |
| // Passes that change the runtime libcall set must explicitly invalidate this | |
| // pass. | |
| auto PAC = PA.getChecker<LibcallLoweringModuleAnalysis>(); | |
| return !PAC.preservedWhenStateless(); | |
| } | |
| ModuleLibcallLoweringInfo | |
| LibcallLoweringModuleAnalysis::run(Module &M, ModuleAnalysisManager &MAM) { | |
| LibcallLoweringMap.init(&MAM.getResult<RuntimeLibraryAnalysis>(M)); | |
| return LibcallLoweringMap; | |
| } | |
| INITIALIZE_PASS_BEGIN(LibcallLoweringInfoWrapper, "libcall-lowering-info", | |
| "Library Function Lowering Analysis", false, true) | |
| INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper) | |
| INITIALIZE_PASS_END(LibcallLoweringInfoWrapper, "libcall-lowering-info", | |
| "Library Function Lowering Analysis", false, true) | |
| char LibcallLoweringInfoWrapper::ID = 0; | |
| LibcallLoweringInfoWrapper::LibcallLoweringInfoWrapper() : ImmutablePass(ID) {} | |
| void LibcallLoweringInfoWrapper::initializePass() { | |
| RuntimeLibcallsWrapper = &getAnalysis<RuntimeLibraryInfoWrapper>(); | |
| } | |
| void LibcallLoweringInfoWrapper::getAnalysisUsage(AnalysisUsage &AU) const { | |
| AU.addRequired<RuntimeLibraryInfoWrapper>(); | |
| AU.setPreservesAll(); | |
| } | |
| void LibcallLoweringInfoWrapper::releaseMemory() { Result.clear(); } | |
| ModulePass *llvm::createLibcallLoweringInfoWrapper() { | |
| return new LibcallLoweringInfoWrapper(); | |
| } |