mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
145 lines
4.9 KiB
C++
145 lines
4.9 KiB
C++
|
//===-------------- 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);
|
||
|
}
|