1#![cfg_attr(not(feature = "llvm-sys"), no_std)]
8
9extern crate alloc;
10
11#[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#[op_interface]
57pub trait ToLLVMDialect {
58 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#[type_interface]
76pub trait ToLLVMType {
77 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
88pub 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 module_passes.add_pass(builtin_to_llvm_pass());
99}