Coverage Report

Created: 2026-10-31 07:49

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wasmtime/crates/cranelift/src/isa_builder.rs
Line
Count
Source
1
use cranelift_codegen::isa::IsaBuilder as Builder;
2
use cranelift_codegen::settings::{self, Configurable, Flags, SetError};
3
use target_lexicon::Triple;
4
use wasmtime_environ::error::Result;
5
use wasmtime_environ::{Setting, SettingKind};
6
7
/// A helper to build an Isa for a compiler implementation.
8
/// Compiler builders can wrap this to provide better flexibility when setting flags.
9
///
10
/// Most methods are mirrored from the `wasmtime_environ::CompilerBuilder` trait, so look there for more
11
/// information.
12
pub struct IsaBuilder<T> {
13
    /// The shared flags that all targets share.
14
    shared_flags: settings::Builder,
15
    /// The internal ISA builder for the current target.
16
    inner: Builder<T>,
17
    /// A callback to lookup a new ISA builder for a target.
18
    pub lookup: fn(Triple) -> Result<Builder<T>>,
19
}
20
21
impl<T> IsaBuilder<T> {
22
    /// Create a new ISA builder with the given lookup function.
23
127k
    pub fn new(triple: Option<Triple>, lookup: fn(Triple) -> Result<Builder<T>>) -> Result<Self> {
24
127k
        let mut flags = settings::builder();
25
26
        // We don't use probestack as a stack limit mechanism
27
127k
        flags
28
127k
            .set("enable_probestack", "false")
29
127k
            .expect("should be valid flag");
30
31
127k
        let triple_specified = triple.is_some();
32
127k
        let triple = triple.unwrap_or_else(Triple::host);
33
127k
        let mut isa_flags = lookup(triple)?;
34
127k
        if !triple_specified {
35
99.7k
            cranelift_native::infer_native_flags(&mut isa_flags).unwrap();
36
99.7k
        }
37
38
127k
        Ok(Self {
39
127k
            shared_flags: flags,
40
127k
            inner: isa_flags,
41
127k
            lookup,
42
127k
        })
43
127k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::new
Line
Count
Source
23
6.70k
    pub fn new(triple: Option<Triple>, lookup: fn(Triple) -> Result<Builder<T>>) -> Result<Self> {
24
6.70k
        let mut flags = settings::builder();
25
26
        // We don't use probestack as a stack limit mechanism
27
6.70k
        flags
28
6.70k
            .set("enable_probestack", "false")
29
6.70k
            .expect("should be valid flag");
30
31
6.70k
        let triple_specified = triple.is_some();
32
6.70k
        let triple = triple.unwrap_or_else(Triple::host);
33
6.70k
        let mut isa_flags = lookup(triple)?;
34
6.70k
        if !triple_specified {
35
5.71k
            cranelift_native::infer_native_flags(&mut isa_flags).unwrap();
36
5.71k
        }
37
38
6.70k
        Ok(Self {
39
6.70k
            shared_flags: flags,
40
6.70k
            inner: isa_flags,
41
6.70k
            lookup,
42
6.70k
        })
43
6.70k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::new
Line
Count
Source
23
120k
    pub fn new(triple: Option<Triple>, lookup: fn(Triple) -> Result<Builder<T>>) -> Result<Self> {
24
120k
        let mut flags = settings::builder();
25
26
        // We don't use probestack as a stack limit mechanism
27
120k
        flags
28
120k
            .set("enable_probestack", "false")
29
120k
            .expect("should be valid flag");
30
31
120k
        let triple_specified = triple.is_some();
32
120k
        let triple = triple.unwrap_or_else(Triple::host);
33
120k
        let mut isa_flags = lookup(triple)?;
34
120k
        if !triple_specified {
35
94.0k
            cranelift_native::infer_native_flags(&mut isa_flags).unwrap();
36
94.0k
        }
37
38
120k
        Ok(Self {
39
120k
            shared_flags: flags,
40
120k
            inner: isa_flags,
41
120k
            lookup,
42
120k
        })
43
120k
    }
44
45
0
    pub fn triple(&self) -> &target_lexicon::Triple {
46
0
        self.inner.triple()
47
0
    }
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::triple
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::triple
48
49
0
    pub fn target(&mut self, target: target_lexicon::Triple) -> Result<()> {
50
0
        self.inner = (self.lookup)(target)?;
51
0
        Ok(())
52
0
    }
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::target
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::target
53
54
0
    pub fn settings(&self) -> Vec<Setting> {
55
0
        self.inner
56
0
            .iter()
57
0
            .map(|s| Setting {
58
0
                description: s.description,
59
0
                name: s.name,
60
0
                values: s.values,
61
0
                kind: match s.kind {
62
0
                    settings::SettingKind::Preset => SettingKind::Preset,
63
0
                    settings::SettingKind::Enum => SettingKind::Enum,
64
0
                    settings::SettingKind::Num => SettingKind::Num,
65
0
                    settings::SettingKind::Bool => SettingKind::Bool,
66
                },
67
0
            })
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::settings::{closure#0}
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::settings::{closure#0}
68
0
            .collect()
69
0
    }
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::settings
Unexecuted instantiation: <wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::settings
70
71
1.25M
    pub fn set(&mut self, name: &str, value: &str) -> Result<()> {
72
1.25M
        if let Err(err) = self.shared_flags.set(name, value) {
73
213k
            match err {
74
                SetError::BadName(_) => {
75
213k
                    self.inner.set(name, value)?;
76
                }
77
0
                _ => return Err(err.into()),
78
            }
79
1.03M
        }
80
1.25M
        Ok(())
81
1.25M
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::set
Line
Count
Source
71
60.0k
    pub fn set(&mut self, name: &str, value: &str) -> Result<()> {
72
60.0k
        if let Err(err) = self.shared_flags.set(name, value) {
73
16.9k
            match err {
74
                SetError::BadName(_) => {
75
16.9k
                    self.inner.set(name, value)?;
76
                }
77
0
                _ => return Err(err.into()),
78
            }
79
43.1k
        }
80
60.0k
        Ok(())
81
60.0k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::set
Line
Count
Source
71
1.19M
    pub fn set(&mut self, name: &str, value: &str) -> Result<()> {
72
1.19M
        if let Err(err) = self.shared_flags.set(name, value) {
73
196k
            match err {
74
                SetError::BadName(_) => {
75
196k
                    self.inner.set(name, value)?;
76
                }
77
0
                _ => return Err(err.into()),
78
            }
79
994k
        }
80
1.19M
        Ok(())
81
1.19M
    }
82
83
288k
    pub fn enable(&mut self, name: &str) -> Result<()> {
84
288k
        if let Err(err) = self.shared_flags.enable(name) {
85
0
            match err {
86
                SetError::BadName(_) => {
87
                    // Try the target-specific flags.
88
0
                    self.inner.enable(name)?;
89
                }
90
0
                _ => return Err(err.into()),
91
            }
92
288k
        }
93
288k
        Ok(())
94
288k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::enable
Line
Count
Source
83
13.4k
    pub fn enable(&mut self, name: &str) -> Result<()> {
84
13.4k
        if let Err(err) = self.shared_flags.enable(name) {
85
0
            match err {
86
                SetError::BadName(_) => {
87
                    // Try the target-specific flags.
88
0
                    self.inner.enable(name)?;
89
                }
90
0
                _ => return Err(err.into()),
91
            }
92
13.4k
        }
93
13.4k
        Ok(())
94
13.4k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::enable
Line
Count
Source
83
275k
    pub fn enable(&mut self, name: &str) -> Result<()> {
84
275k
        if let Err(err) = self.shared_flags.enable(name) {
85
0
            match err {
86
                SetError::BadName(_) => {
87
                    // Try the target-specific flags.
88
0
                    self.inner.enable(name)?;
89
                }
90
0
                _ => return Err(err.into()),
91
            }
92
275k
        }
93
275k
        Ok(())
94
275k
    }
95
96
127k
    pub fn build(&self) -> T {
97
127k
        self.inner
98
127k
            .finish(settings::Flags::new(self.shared_flags.clone()))
99
127k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::boxed::Box<dyn winch_codegen::isa::TargetIsa>, wasmtime_internal_core::error::error::Error>>>::build
Line
Count
Source
96
6.70k
    pub fn build(&self) -> T {
97
6.70k
        self.inner
98
6.70k
            .finish(settings::Flags::new(self.shared_flags.clone()))
99
6.70k
    }
<wasmtime_internal_cranelift::isa_builder::IsaBuilder<core::result::Result<alloc::sync::Arc<dyn cranelift_codegen::isa::TargetIsa>, cranelift_codegen::result::CodegenError>>>::build
Line
Count
Source
96
120k
    pub fn build(&self) -> T {
97
120k
        self.inner
98
120k
            .finish(settings::Flags::new(self.shared_flags.clone()))
99
120k
    }
100
101
0
    pub fn shared_flags(&self) -> Flags {
102
0
        settings::Flags::new(self.shared_flags.clone())
103
0
    }
104
}