/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 | | } |