Skip to main content

pliron_llvm/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) The pliron contributors
3
4//! LLVM Dialect for [pliron]
5
6// Without llvm-sys, we should be able to build without std.
7#![cfg_attr(not(feature = "llvm-sys"), no_std)]
8
9extern crate alloc;
10
11// A static check to ensure that `std` on pliron-llvm pulls in pliron with `std`.
12#[cfg(feature = "std")]
13const _: () = assert!(
14    pliron::std_deps::STD_ENABLED,
15    "pliron-llvm's `std` feature must forward to `pliron/std`"
16);
17
18use pliron::{
19    builtin::ops::ModuleOp,
20    context::Context,
21    derive::{op_interface, type_interface},
22    irbuild::dialect_conversion::{DialectConversionRewriter, OperandsInfo},
23    op::Op,
24    opts::{
25        constants::sccp::SCCPPass, dce::DCEPass, mem2reg::Mem2RegPass,
26        simplify_cfg::SimplifyCFGPass,
27    },
28    pass::{NestedOpsPass, OpPass, Passes},
29    result::Result,
30    r#type::{Type, TypeHandle},
31};
32
33use crate::{builtin_to_llvm::builtin_to_llvm_pass, ops::FuncOp};
34
35pub mod attributes;
36pub mod builtin_to_llvm;
37pub mod function_call_utils;
38pub mod interface_impls;
39pub mod metadata;
40pub mod op_interfaces;
41pub mod ops;
42pub mod types;
43
44#[cfg(feature = "llvm-sys")]
45pub mod data_layout;
46#[cfg(feature = "llvm-sys")]
47pub mod from_llvm_ir;
48#[cfg(feature = "llvm-sys")]
49pub mod llvm_sys;
50#[cfg(feature = "llvm-sys")]
51pub mod metadata_conversions;
52#[cfg(feature = "llvm-sys")]
53pub mod to_llvm_ir;
54
55/// Interface for rewriting to LLVM dialect.
56#[op_interface]
57pub trait ToLLVMDialect {
58    /// Rewrite [self] to LLVM dialect.
59    fn rewrite(
60        &self,
61        ctx: &mut Context,
62        rewriter: &mut DialectConversionRewriter,
63        operands_info: &OperandsInfo,
64    ) -> Result<()>;
65
66    fn verify(_op: &dyn Op, _ctx: &Context) -> Result<()>
67    where
68        Self: Sized,
69    {
70        Ok(())
71    }
72}
73
74/// Interface for converting to an LLVM type.
75#[type_interface]
76pub trait ToLLVMType {
77    /// Convert [self] to an LLVM type.
78    fn convert(&self, ctx: &Context) -> Result<TypeHandle>;
79
80    fn verify(_ty: &dyn Type, _ctx: &Context) -> Result<()>
81    where
82        Self: Sized,
83    {
84        Ok(())
85    }
86}
87
88/// Append -O1 passes to the given list of passes.
89pub fn append_o1_passes(module_passes: &mut OpPass<ModuleOp, Passes>) {
90    let mut passes = Passes::default();
91    passes.add_pass(OpPass::<FuncOp, Mem2RegPass>::default());
92    passes.add_pass(OpPass::<FuncOp, SCCPPass>::default());
93    passes.add_pass(OpPass::<FuncOp, SimplifyCFGPass>::default());
94    passes.add_pass(OpPass::<FuncOp, DCEPass>::default());
95
96    module_passes.add_pass(NestedOpsPass::new(passes));
97    // Optimizations may introduce builtin ops that need to be converted to LLVM ops
98    module_passes.add_pass(builtin_to_llvm_pass());
99}