123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- //===-------------- PassBuilder bindings for LLVM-C -----------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- /// \file
- ///
- /// This file defines the C bindings to the new pass manager
- ///
- //===----------------------------------------------------------------------===//
- #include "llvm-c/Transforms/PassBuilder.h"
- #include "llvm/IR/Verifier.h"
- #include "llvm/Passes/PassBuilder.h"
- #include "llvm/Passes/StandardInstrumentations.h"
- #include "llvm/Support/CBindingWrapping.h"
- using namespace llvm;
- namespace llvm {
- /// Helper struct for holding a set of builder options for LLVMRunPasses. This
- /// structure is used to keep LLVMRunPasses backwards compatible with future
- /// versions in case we modify the options the new Pass Manager utilizes.
- class LLVMPassBuilderOptions {
- public:
- explicit LLVMPassBuilderOptions(
- bool DebugLogging = false, bool VerifyEach = false,
- PipelineTuningOptions PTO = PipelineTuningOptions())
- : DebugLogging(DebugLogging), VerifyEach(VerifyEach), PTO(PTO) {}
- bool DebugLogging;
- bool VerifyEach;
- PipelineTuningOptions PTO;
- };
- } // namespace llvm
- static TargetMachine *unwrap(LLVMTargetMachineRef P) {
- return reinterpret_cast<TargetMachine *>(P);
- }
- DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions,
- LLVMPassBuilderOptionsRef)
- LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes,
- LLVMTargetMachineRef TM,
- LLVMPassBuilderOptionsRef Options) {
- TargetMachine *Machine = unwrap(TM);
- LLVMPassBuilderOptions *PassOpts = unwrap(Options);
- bool Debug = PassOpts->DebugLogging;
- bool VerifyEach = PassOpts->VerifyEach;
- Module *Mod = unwrap(M);
- PassInstrumentationCallbacks PIC;
- PassBuilder PB(Machine, PassOpts->PTO, None, &PIC);
- LoopAnalysisManager LAM;
- FunctionAnalysisManager FAM;
- CGSCCAnalysisManager CGAM;
- ModuleAnalysisManager MAM;
- PB.registerLoopAnalyses(LAM);
- PB.registerFunctionAnalyses(FAM);
- PB.registerCGSCCAnalyses(CGAM);
- PB.registerModuleAnalyses(MAM);
- PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
- StandardInstrumentations SI(Debug, VerifyEach);
- SI.registerCallbacks(PIC, &FAM);
- ModulePassManager MPM;
- if (VerifyEach) {
- MPM.addPass(VerifierPass());
- }
- if (auto Err = PB.parsePassPipeline(MPM, Passes)) {
- return wrap(std::move(Err));
- }
- MPM.run(*Mod, MAM);
- return LLVMErrorSuccess;
- }
- LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions() {
- return wrap(new LLVMPassBuilderOptions());
- }
- void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options,
- LLVMBool VerifyEach) {
- unwrap(Options)->VerifyEach = VerifyEach;
- }
- void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options,
- LLVMBool DebugLogging) {
- unwrap(Options)->DebugLogging = DebugLogging;
- }
- void LLVMPassBuilderOptionsSetLoopInterleaving(
- LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) {
- unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving;
- }
- void LLVMPassBuilderOptionsSetLoopVectorization(
- LLVMPassBuilderOptionsRef Options, LLVMBool LoopVectorization) {
- unwrap(Options)->PTO.LoopVectorization = LoopVectorization;
- }
- void LLVMPassBuilderOptionsSetSLPVectorization(
- LLVMPassBuilderOptionsRef Options, LLVMBool SLPVectorization) {
- unwrap(Options)->PTO.SLPVectorization = SLPVectorization;
- }
- void LLVMPassBuilderOptionsSetLoopUnrolling(LLVMPassBuilderOptionsRef Options,
- LLVMBool LoopUnrolling) {
- unwrap(Options)->PTO.LoopUnrolling = LoopUnrolling;
- }
- void LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll(
- LLVMPassBuilderOptionsRef Options, LLVMBool ForgetAllSCEVInLoopUnroll) {
- unwrap(Options)->PTO.ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll;
- }
- void LLVMPassBuilderOptionsSetLicmMssaOptCap(LLVMPassBuilderOptionsRef Options,
- unsigned LicmMssaOptCap) {
- unwrap(Options)->PTO.LicmMssaOptCap = LicmMssaOptCap;
- }
- void LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap(
- LLVMPassBuilderOptionsRef Options, unsigned LicmMssaNoAccForPromotionCap) {
- unwrap(Options)->PTO.LicmMssaNoAccForPromotionCap =
- LicmMssaNoAccForPromotionCap;
- }
- void LLVMPassBuilderOptionsSetCallGraphProfile(
- LLVMPassBuilderOptionsRef Options, LLVMBool CallGraphProfile) {
- unwrap(Options)->PTO.CallGraphProfile = CallGraphProfile;
- }
- void LLVMPassBuilderOptionsSetMergeFunctions(LLVMPassBuilderOptionsRef Options,
- LLVMBool MergeFunctions) {
- unwrap(Options)->PTO.MergeFunctions = MergeFunctions;
- }
- void LLVMDisposePassBuilderOptions(LLVMPassBuilderOptionsRef Options) {
- delete unwrap(Options);
- }
|