| //===- LibcallLoweringInfo.cpp - Runtime libcall lowering info ------------===// | |
| // | |
| // 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/Analysis/LibcallLoweringInfo.h" | |
| #include "llvm/Analysis/RuntimeLibcallInfo.h" | |
| using namespace llvm; | |
| LibcallLoweringInfo::LibcallLoweringInfo( | |
| const RTLIB::RuntimeLibcallsInfo &RTLCI, | |
| ApplyContextRulesFn ApplyContextRules) | |
| : 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; | |
| } | |
| } | |
| // Apply the caller's context-specific (e.g. subtarget) libcall rules. | |
| if (ApplyContextRules) | |
| ApplyContextRules(*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; | |
| } |