Chaos mode MVP: Skip branch optimization in MachBuffer (#6039)
* fuzz: Add chaos mode control plane Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: Skip branch optimization with chaos mode Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: Rename chaos engine -> control plane Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * chaos mode: refactoring ControlPlane to be passed through the call stack by reference Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Remo Senekowitsch <contact@remsle.dev> * fuzz: annotate chaos todos Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: cleanup control plane Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: remove control plane from compiler context Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: move control plane into emit state Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fuzz: fix remaining compiler errors Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * fix tests * refactor emission state ctrl plane accessors Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * centralize conditional compilation of chaos mode Also cleanup a few straggling dependencies on cranelift-control that aren't needed anymore. Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * add cranelift-control to published crates prtest:full Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> * add cranelift-control to public crates Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> --------- Co-authored-by: Falk Zwimpfer <24669719+FalkZ@users.noreply.github.com> Co-authored-by: Moritz Waser <mzrw.dev@pm.me> Co-authored-by: Remo Senekowitsch <contact@remsle.dev>
This commit is contained in:
committed by
GitHub
parent
064968b01d
commit
7eb8914090
28
cranelift/control/src/chaos.rs
Normal file
28
cranelift/control/src/chaos.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
use arbitrary::Arbitrary;
|
||||
|
||||
/// The control plane of chaos mode.
|
||||
/// Please see the [crate-level documentation](crate).
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct ControlPlane {
|
||||
data: Vec<bool>,
|
||||
}
|
||||
|
||||
impl Arbitrary<'_> for ControlPlane {
|
||||
fn arbitrary<'a>(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
|
||||
Ok(Self {
|
||||
data: u.arbitrary()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ControlPlane {
|
||||
/// Returns a pseudo-random boolean if the control plane was constructed
|
||||
/// with `arbitrary`.
|
||||
///
|
||||
/// The default value `false` will always be returned if the
|
||||
/// pseudo-random data is exhausted or the control plane was constructed
|
||||
/// with `default`.
|
||||
pub fn get_decision(&mut self) -> bool {
|
||||
self.data.pop().unwrap_or_default()
|
||||
}
|
||||
}
|
||||
30
cranelift/control/src/lib.rs
Normal file
30
cranelift/control/src/lib.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
//! # Cranelift Control
|
||||
//!
|
||||
//! This is the home of the control plane of chaos mode, a compilation feature
|
||||
//! intended to be turned on for certain fuzz targets. When the feature is
|
||||
//! turned off, as is normally the case, [ControlPlane] will be a zero-sized
|
||||
//! type and optimized away.
|
||||
//!
|
||||
//! While the feature is turned on, the struct [ControlPlane]
|
||||
//! provides functionality to tap into pseudo-randomness at specific locations
|
||||
//! in the code. It may be used for targeted fuzzing of compiler internals,
|
||||
//! e.g. manipulate heuristic optimizations, clobber undefined register bits
|
||||
//! etc.
|
||||
//!
|
||||
//! There are two ways to acquire a [ControlPlane]:
|
||||
//! - [arbitrary] for the real deal
|
||||
//! - [default] for an "empty" control plane which always returns default
|
||||
//! values
|
||||
//!
|
||||
//! [arbitrary]: ControlPlane#method.arbitrary
|
||||
//! [default]: ControlPlane#method.default
|
||||
|
||||
#[cfg(not(feature = "chaos"))]
|
||||
mod zero_sized;
|
||||
#[cfg(not(feature = "chaos"))]
|
||||
pub use zero_sized::*;
|
||||
|
||||
#[cfg(feature = "chaos")]
|
||||
mod chaos;
|
||||
#[cfg(feature = "chaos")]
|
||||
pub use chaos::*;
|
||||
28
cranelift/control/src/zero_sized.rs
Normal file
28
cranelift/control/src/zero_sized.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
//! Shims for ControlPlane when chaos mode is disabled. Enables
|
||||
//! unconditional use of the type and its methods throughout cranelift.
|
||||
|
||||
/// A shim for ControlPlane when chaos mode is disabled.
|
||||
/// Please see the [crate-level documentation](crate).
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct ControlPlane {
|
||||
/// prevent direct instantiation (use `default` instead)
|
||||
_private: (),
|
||||
}
|
||||
|
||||
/// A shim for ControlPlane's `Arbitrary` implementation when chaos mode is
|
||||
/// disabled. It doesn't consume any bytes and always returns a default
|
||||
/// control plane.
|
||||
impl arbitrary::Arbitrary<'_> for ControlPlane {
|
||||
fn arbitrary<'a>(_u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
|
||||
Ok(Self::default())
|
||||
}
|
||||
}
|
||||
|
||||
impl ControlPlane {
|
||||
/// Returns a pseudo-random boolean. This variant is used when chaos
|
||||
/// mode is disabled. It always returns `false`.
|
||||
#[inline]
|
||||
pub fn get_decision(&mut self) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user