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_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( 13 not(feature = "all-arch"), 14 allow(dead_code, reason = "see comment above") 15 )] 16 17 #[cfg_attr(not(feature = "std"), macro_use)] 18 extern crate alloc; 19 20 #[cfg(feature = "std")] 21 #[macro_use] 22 extern crate std; 23 24 #[cfg(not(feature = "std"))] 25 use hashbrown::{HashMap, HashSet, hash_map}; 26 #[cfg(feature = "std")] 27 use std::collections::{HashMap, HashSet, hash_map}; 28 29 /// Type alias for a hash map that uses the Fx hashing algorithm. 30 pub type FxHashMap<K, V> = HashMap<K, V, rustc_hash::FxBuildHasher>; 31 /// Type alias for a hash set that uses the Fx hashing algorithm. 32 pub type FxHashSet<V> = HashSet<V, rustc_hash::FxBuildHasher>; 33 34 pub use crate::context::Context; 35 pub use crate::value_label::{LabelValueLoc, ValueLabelsRanges, ValueLocRange}; 36 pub use crate::verifier::verify_function; 37 pub use crate::write::write_function; 38 39 pub use cranelift_bforest as bforest; 40 pub use cranelift_bitset as bitset; 41 pub use cranelift_control as control; 42 pub use cranelift_entity as entity; 43 #[cfg(feature = "unwind")] 44 pub use gimli; 45 46 // Pull in generated the `isle_numerics_methods` macro. 47 include!(concat!(env!("ISLE_DIR"), "/isle_numerics.rs")); 48 49 #[macro_use] 50 mod machinst; 51 52 pub mod binemit; 53 pub mod cfg_printer; 54 pub mod cursor; 55 pub mod data_value; 56 pub mod dbg; 57 pub mod dominator_tree; 58 pub mod flowgraph; 59 pub mod inline; 60 pub mod ir; 61 pub mod isa; 62 pub mod loop_analysis; 63 pub mod print_errors; 64 pub mod settings; 65 pub mod timing; 66 pub mod traversals; 67 pub mod verifier; 68 pub mod write; 69 70 pub use crate::entity::packed_option; 71 pub use crate::machinst::buffer::{ 72 ExceptionContextLoc, FinalizedMachCallSite, FinalizedMachExceptionHandler, FinalizedMachReloc, 73 FinalizedRelocTarget, MachCallSite, MachSrcLoc, MachTextSectionBuilder, MachTrap, 74 OpenPatchRegion, PatchRegion, 75 }; 76 pub use crate::machinst::{ 77 CallInfo, CompiledCode, Final, MachBuffer, MachBufferDebugTagList, MachBufferFinalized, 78 MachBufferFrameLayout, MachDebugTagPos, MachInst, MachInstEmit, MachInstEmitState, MachLabel, 79 RealReg, Reg, RelocDistance, TextSectionBuilder, VCodeConstant, VCodeConstantData, 80 VCodeConstants, VCodeInst, Writable, 81 }; 82 83 mod alias_analysis; 84 mod constant_hash; 85 mod context; 86 mod ctxhash; 87 mod egraph; 88 mod inst_predicates; 89 mod isle_prelude; 90 mod legalizer; 91 mod nan_canonicalization; 92 mod opts; 93 mod ranges; 94 mod remove_constant_phis; 95 mod result; 96 mod scoped_hash_map; 97 mod take_and_replace; 98 mod unreachable_code; 99 mod value_label; 100 101 #[cfg(feature = "souper-harvest")] 102 mod souper_harvest; 103 104 pub use crate::result::{CodegenError, CodegenResult, CompileError}; 105 pub use crate::take_and_replace::TakeAndReplace; 106 107 #[cfg(feature = "incremental-cache")] 108 pub mod incremental_cache; 109 110 /// Even when trace logging is disabled, the trace macro has a significant performance cost so we 111 /// disable it by default. 112 #[macro_export] 113 macro_rules! trace { 114 ($($tt:tt)*) => { 115 if cfg!(any(feature = "trace-log", debug_assertions)) { 116 ::log::trace!($($tt)*); 117 } 118 }; 119 } 120 121 /// Dynamic check for whether trace logging is enabled. 122 #[macro_export] 123 macro_rules! trace_log_enabled { 124 () => { 125 cfg!(any(feature = "trace-log", debug_assertions)) 126 && ::log::log_enabled!(::log::Level::Trace) 127 }; 128 } 129 130 include!(concat!(env!("OUT_DIR"), "/version.rs")); 131