llvm-plugin 0.6.0

A wrapper for easily implementing out-of-source-tree LLVM plugins in Rust.
Documentation
use std::ffi::c_void;

use inkwell_internals::llvm_versions;

pub type AnalysisKey = *const u8;

#[link(name = "llvm-plugin-cpp")]
extern "C" {
    #[llvm_versions(15..)]
    pub(crate) fn passBuilderAddFullLinkTimeOptimizationLastEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    #[llvm_versions(15..)]
    pub(crate) fn passBuilderAddFullLinkTimeOptimizationEarlyEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    #[llvm_versions(15..)]
    pub(crate) fn passBuilderAddOptimizerEarlyEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    #[llvm_versions(11..)]
    pub(crate) fn passBuilderAddOptimizerLastEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    #[llvm_versions(12..)]
    pub(crate) fn passBuilderAddPipelineEarlySimplificationEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    #[llvm_versions(12..)]
    pub(crate) fn passBuilderAddPipelineStartEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    pub(crate) fn passBuilderAddVectorizerStartEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    pub(crate) fn passBuilderAddScalarOptimizerLateEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    pub(crate) fn passBuilderAddPeepholeEPCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void, crate::OptimizationLevel),
    );

    pub(crate) fn passBuilderAddModuleAnalysisRegistrationCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void),
    );

    pub(crate) fn passBuilderAddFunctionAnalysisRegistrationCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *mut c_void),
    );

    pub(crate) fn passBuilderAddModulePipelineParsingCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *const u8, usize, *mut c_void) -> bool,
    );

    pub(crate) fn passBuilderAddFunctionPipelineParsingCallback(
        builder: *mut c_void,
        cb: *const c_void,
        cb_deleter: extern "C" fn(*const c_void),
        cb_sys: extern "C" fn(*const c_void, *const u8, usize, *mut c_void) -> bool,
    );

    pub(crate) fn modulePassManagerAddPass(
        manager: *mut c_void,
        pass: *mut c_void,
        pass_deleter: extern "C" fn(*mut c_void),
        pass_sys: extern "C" fn(*mut c_void, *mut c_void, *mut c_void) -> crate::PreservedAnalyses,
    );

    #[llvm_versions(12..)]
    pub(crate) fn modulePassManagerIsEmpty(manager: *mut c_void) -> bool;

    pub(crate) fn functionPassManagerAddPass(
        manager: *mut c_void,
        pass: *mut c_void,
        pass_deleter: extern "C" fn(*mut c_void),
        pass_sys: extern "C" fn(*mut c_void, *mut c_void, *mut c_void) -> crate::PreservedAnalyses,
    );

    #[llvm_versions(12..)]
    pub(crate) fn functionPassManagerIsEmpty(manager: *mut c_void) -> bool;

    pub(crate) fn moduleAnalysisManagerRegisterPass(
        manager: *mut c_void,
        pass: *mut c_void,
        pass_deleter: extern "C" fn(*mut c_void),
        pass_sys: extern "C" fn(
            pass: *mut c_void,
            module: *mut c_void,
            manager: *mut c_void,
            res: *mut *mut c_void,
            res_deleter: *mut extern "C" fn(*mut c_void),
        ),
        id: AnalysisKey,
    ) -> bool;

    pub(crate) fn functionAnalysisManagerRegisterPass(
        manager: *mut c_void,
        pass: *mut c_void,
        pass_deleter: extern "C" fn(*mut c_void),
        pass_sys: extern "C" fn(
            pass: *mut c_void,
            module: *mut c_void,
            manager: *mut c_void,
            res: *mut *mut c_void,
            res_deleter: *mut extern "C" fn(*mut c_void),
        ),
        id: AnalysisKey,
    ) -> bool;

    fn getFunctionAnalysisManagerModuleProxy(
        manager: *mut c_void,
        function: *mut c_void,
    ) -> *mut c_void;

    fn getFunctionAnalysisManager(manager_proxy: *mut c_void) -> *mut c_void;

    fn getFunctionAnalysisResult(
        manager: *mut c_void,
        id: AnalysisKey,
        function: *mut c_void,
    ) -> *mut c_void;

    fn getModuleAnalysisResult(
        manager: *mut c_void,
        id: AnalysisKey,
        module: *mut c_void,
    ) -> *mut c_void;

    fn getFunctionAnalysisCachedResult(
        manager: *mut c_void,
        id: AnalysisKey,
        function: *mut c_void,
    ) -> *mut c_void;

    fn getModuleAnalysisCachedResult(
        manager: *mut c_void,
        id: AnalysisKey,
        module: *mut c_void,
    ) -> *mut c_void;

    fn llvmPluginApiVersion() -> u32;
}

pub(super) fn get_function_analysis_manager_module_proxy(
    manager: *mut c_void,
    function: *mut c_void,
) -> *mut c_void {
    unsafe { getFunctionAnalysisManagerModuleProxy(manager, function) }
}

pub(super) fn get_function_analysis_manager(manager_proxy: *mut c_void) -> *mut c_void {
    unsafe { getFunctionAnalysisManager(manager_proxy) }
}

pub(super) fn get_module_analysis_result(
    manager: *mut c_void,
    id: AnalysisKey,
    module: *mut c_void,
) -> *mut c_void {
    unsafe { getModuleAnalysisResult(manager, id, module) }
}

pub(super) fn get_function_analysis_result(
    manager: *mut c_void,
    id: AnalysisKey,
    function: *mut c_void,
) -> *mut c_void {
    unsafe { getFunctionAnalysisResult(manager, id, function) }
}

pub(super) fn get_module_analysis_cached_result(
    manager: *mut c_void,
    id: AnalysisKey,
    module: *mut c_void,
) -> *mut c_void {
    unsafe { getModuleAnalysisCachedResult(manager, id, module) }
}

pub(super) fn get_function_analysis_cached_result(
    manager: *mut c_void,
    id: AnalysisKey,
    function: *mut c_void,
) -> *mut c_void {
    unsafe { getFunctionAnalysisCachedResult(manager, id, function) }
}

#[doc(hidden)]
pub fn get_llvm_plugin_api_version__() -> u32 {
    unsafe { llvmPluginApiVersion() }
}