1 //! Cranelift code generation library. 2 #![deny(missing_docs)] 3 // Display feature requirements in the documentation when building on docs.rs 4 #![cfg_attr(docsrs, feature(doc_auto_cfg))] 5 #![no_std] 6 // Various bits and pieces of this crate might only be used for one platform or 7 // another, but it's not really too useful to learn about that all the time. On 8 // CI we build at least one version of this crate with `--features all-arch` 9 // which means we'll always detect truly dead code, otherwise if this is only 10 // built for one platform we don't have to worry too much about trimming 11 // everything down. 12 #![cfg_attr(not(feature = "all-arch"), allow(dead_code))] 13 #![expect(clippy::allow_attributes_without_reason, reason = "crate not migrated")] 14 15 #[allow(unused_imports)] // #[macro_use] is required for no_std 16 #[macro_use] 17 extern crate alloc; 18 19 #[cfg(feature = "std")] 20 #[macro_use] 21 extern crate std; 22 23 #[cfg(not(feature = "std"))] 24 use hashbrown::{HashMap, hash_map}; 25 #[cfg(feature = "std")] 26 use std::collections::{HashMap, hash_map}; 27 28 pub use crate::context::Context; 29 pub use crate::value_label::{LabelValueLoc, ValueLabelsRanges, ValueLocRange}; 30 pub use crate::verifier::verify_function; 31 pub use crate::write::write_function; 32 33 pub use cranelift_bforest as bforest; 34 pub use cranelift_bitset as bitset; 35 pub use cranelift_control as control; 36 pub use cranelift_entity as entity; 37 #[cfg(feature = "unwind")] 38 pub use gimli; 39 40 // Pull in generated the `isle_numerics_methods` macro. 41 include!(concat!(env!("ISLE_DIR"), "/isle_numerics.rs")); 42 43 #[macro_use] 44 mod machinst; 45 46 pub mod binemit; 47 pub mod cfg_printer; 48 pub mod cursor; 49 pub mod data_value; 50 pub mod dbg; 51 pub mod dominator_tree; 52 pub mod flowgraph; 53 pub mod ir; 54 pub mod isa; 55 pub mod loop_analysis; 56 pub mod print_errors; 57 pub mod settings; 58 pub mod timing; 59 pub mod traversals; 60 pub mod verifier; 61 pub mod write; 62 63 pub use crate::entity::packed_option; 64 pub use crate::machinst::buffer::{ 65 FinalizedMachCallSite, FinalizedMachReloc, FinalizedRelocTarget, MachCallSite, MachSrcLoc, 66 MachTextSectionBuilder, MachTrap, OpenPatchRegion, PatchRegion, 67 }; 68 pub use crate::machinst::{ 69 CallInfo, CompiledCode, Final, MachBuffer, MachBufferFinalized, MachInst, MachInstEmit, 70 MachInstEmitState, MachLabel, RealReg, Reg, RelocDistance, TextSectionBuilder, VCodeConstant, 71 VCodeConstantData, VCodeConstants, VCodeInst, Writable, 72 }; 73 74 mod alias_analysis; 75 mod constant_hash; 76 mod context; 77 mod ctxhash; 78 mod egraph; 79 mod inst_predicates; 80 mod isle_prelude; 81 mod legalizer; 82 mod nan_canonicalization; 83 mod opts; 84 mod ranges; 85 mod remove_constant_phis; 86 mod result; 87 mod scoped_hash_map; 88 mod take_and_replace; 89 mod unreachable_code; 90 mod value_label; 91 92 #[cfg(feature = "souper-harvest")] 93 mod souper_harvest; 94 95 pub use crate::result::{CodegenError, CodegenResult, CompileError}; 96 pub use crate::take_and_replace::TakeAndReplace; 97 98 #[cfg(feature = "incremental-cache")] 99 pub mod incremental_cache; 100 101 /// Even when trace logging is disabled, the trace macro has a significant performance cost so we 102 /// disable it by default. 103 #[macro_export] 104 macro_rules! trace { 105 ($($tt:tt)*) => { 106 if cfg!(any(feature = "trace-log", debug_assertions)) { 107 ::log::trace!($($tt)*); 108 } 109 }; 110 } 111 112 /// Dynamic check for whether trace logging is enabled. 113 #[macro_export] 114 macro_rules! trace_log_enabled { 115 () => { 116 cfg!(any(feature = "trace-log", debug_assertions)) 117 && ::log::log_enabled!(::log::Level::Trace) 118 }; 119 } 120 121 include!(concat!(env!("OUT_DIR"), "/version.rs")); 122