1f78a61b9SBenjamin Bouvier use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder};
2f78a61b9SBenjamin Bouvier 
35889dd2cSBenjamin Bouvier pub(crate) fn define() -> SettingGroup {
4f78a61b9SBenjamin Bouvier     let mut settings = SettingGroupBuilder::new("shared");
5f78a61b9SBenjamin Bouvier 
6f78a61b9SBenjamin Bouvier     settings.add_enum(
7f78a61b9SBenjamin Bouvier         "opt_level",
8f78a61b9SBenjamin Bouvier         r#"
9f78a61b9SBenjamin Bouvier         Optimization level:
10f78a61b9SBenjamin Bouvier 
119e088e41Sjulian-seward1         - none: Minimise compile time by disabling most optimizations.
129e088e41Sjulian-seward1         - speed: Generate the fastest possible code
139e088e41Sjulian-seward1         - speed_and_size: like "speed", but also perform transformations
149e088e41Sjulian-seward1           aimed at reducing code size.
15f78a61b9SBenjamin Bouvier         "#,
169e088e41Sjulian-seward1         vec!["none", "speed", "speed_and_size"],
17f78a61b9SBenjamin Bouvier     );
18f78a61b9SBenjamin Bouvier 
19f78a61b9SBenjamin Bouvier     settings.add_bool(
20f78a61b9SBenjamin Bouvier         "enable_verifier",
21f78a61b9SBenjamin Bouvier         r#"
22f78a61b9SBenjamin Bouvier         Run the Cranelift IR verifier at strategic times during compilation.
23f78a61b9SBenjamin Bouvier 
24de7c0dddSBenjamin Bouvier         This makes compilation slower but catches many bugs. The verifier is always enabled by
25de7c0dddSBenjamin Bouvier         default, which is useful during development.
26f78a61b9SBenjamin Bouvier         "#,
27f78a61b9SBenjamin Bouvier         true,
28f78a61b9SBenjamin Bouvier     );
29f78a61b9SBenjamin Bouvier 
30f78a61b9SBenjamin Bouvier     // Note that Cranelift doesn't currently need an is_pie flag, because PIE is
31f78a61b9SBenjamin Bouvier     // just PIC where symbols can't be pre-empted, which can be expressed with the
32f78a61b9SBenjamin Bouvier     // `colocated` flag on external functions and global values.
33f78a61b9SBenjamin Bouvier     settings.add_bool(
34f78a61b9SBenjamin Bouvier         "is_pic",
35f78a61b9SBenjamin Bouvier         "Enable Position-Independent Code generation",
36f78a61b9SBenjamin Bouvier         false,
37f78a61b9SBenjamin Bouvier     );
38f78a61b9SBenjamin Bouvier 
39f78a61b9SBenjamin Bouvier     settings.add_bool(
40*dd497c19SBenjamin Bouvier         "use_colocated_libcalls",
41f78a61b9SBenjamin Bouvier         r#"
42f78a61b9SBenjamin Bouvier             Use colocated libcalls.
43f78a61b9SBenjamin Bouvier 
44f78a61b9SBenjamin Bouvier             Generate code that assumes that libcalls can be declared "colocated",
45f78a61b9SBenjamin Bouvier             meaning they will be defined along with the current function, such that
46f78a61b9SBenjamin Bouvier             they can use more efficient addressing.
47f78a61b9SBenjamin Bouvier             "#,
48f78a61b9SBenjamin Bouvier         false,
49f78a61b9SBenjamin Bouvier     );
50f78a61b9SBenjamin Bouvier 
51f78a61b9SBenjamin Bouvier     settings.add_bool(
52f78a61b9SBenjamin Bouvier         "avoid_div_traps",
53f78a61b9SBenjamin Bouvier         r#"
54f78a61b9SBenjamin Bouvier             Generate explicit checks around native division instructions to avoid
55f78a61b9SBenjamin Bouvier             their trapping.
56f78a61b9SBenjamin Bouvier 
57f78a61b9SBenjamin Bouvier             This is primarily used by SpiderMonkey which doesn't install a signal
58f78a61b9SBenjamin Bouvier             handler for SIGFPE, but expects a SIGILL trap for division by zero.
59f78a61b9SBenjamin Bouvier 
60f78a61b9SBenjamin Bouvier             On ISAs like ARM where the native division instructions don't trap,
61f78a61b9SBenjamin Bouvier             this setting has no effect - explicit checks are always inserted.
62f78a61b9SBenjamin Bouvier             "#,
63f78a61b9SBenjamin Bouvier         false,
64f78a61b9SBenjamin Bouvier     );
65f78a61b9SBenjamin Bouvier 
66f78a61b9SBenjamin Bouvier     settings.add_bool(
67f78a61b9SBenjamin Bouvier         "enable_float",
68f78a61b9SBenjamin Bouvier         r#"
69f78a61b9SBenjamin Bouvier             Enable the use of floating-point instructions
70f78a61b9SBenjamin Bouvier 
71f78a61b9SBenjamin Bouvier             Disabling use of floating-point instructions is not yet implemented.
72f78a61b9SBenjamin Bouvier             "#,
73f78a61b9SBenjamin Bouvier         true,
74f78a61b9SBenjamin Bouvier     );
75f78a61b9SBenjamin Bouvier 
76f78a61b9SBenjamin Bouvier     settings.add_bool(
77f78a61b9SBenjamin Bouvier         "enable_nan_canonicalization",
78f78a61b9SBenjamin Bouvier         r#"
79f78a61b9SBenjamin Bouvier             Enable NaN canonicalization
80f78a61b9SBenjamin Bouvier 
81f78a61b9SBenjamin Bouvier             This replaces NaNs with a single canonical value, for users requiring
82f78a61b9SBenjamin Bouvier             entirely deterministic WebAssembly computation. This is not required
83f78a61b9SBenjamin Bouvier             by the WebAssembly spec, so it is not enabled by default.
84f78a61b9SBenjamin Bouvier             "#,
85f78a61b9SBenjamin Bouvier         false,
86f78a61b9SBenjamin Bouvier     );
87f78a61b9SBenjamin Bouvier 
88660b8b28SBenjamin Bouvier     settings.add_bool(
89660b8b28SBenjamin Bouvier         "enable_pinned_reg",
90660b8b28SBenjamin Bouvier         r#"Enable the use of the pinned register.
91660b8b28SBenjamin Bouvier 
92660b8b28SBenjamin Bouvier         This register is excluded from register allocation, and is completely under the control of
93660b8b28SBenjamin Bouvier         the end-user. It is possible to read it via the get_pinned_reg instruction, and to set it
94660b8b28SBenjamin Bouvier         with the set_pinned_reg instruction.
95660b8b28SBenjamin Bouvier         "#,
96660b8b28SBenjamin Bouvier         false,
97660b8b28SBenjamin Bouvier     );
98660b8b28SBenjamin Bouvier 
99c1609b70SBenjamin Bouvier     settings.add_bool(
100c1609b70SBenjamin Bouvier         "use_pinned_reg_as_heap_base",
101c1609b70SBenjamin Bouvier         r#"Use the pinned register as the heap base.
102c1609b70SBenjamin Bouvier 
103c1609b70SBenjamin Bouvier         Enabling this requires the enable_pinned_reg setting to be set to true. It enables a custom
104c1609b70SBenjamin Bouvier         legalization of the `heap_addr` instruction so it will use the pinned register as the heap
105c1609b70SBenjamin Bouvier         base, instead of fetching it from a global value.
106c1609b70SBenjamin Bouvier 
107c1609b70SBenjamin Bouvier         Warning! Enabling this means that the pinned register *must* be maintained to contain the
108c1609b70SBenjamin Bouvier         heap base address at all times, during the lifetime of a function. Using the pinned
109c1609b70SBenjamin Bouvier         register for other purposes when this is set is very likely to cause crashes.
110c1609b70SBenjamin Bouvier         "#,
111c1609b70SBenjamin Bouvier         false,
112c1609b70SBenjamin Bouvier     );
113c1609b70SBenjamin Bouvier 
114f2c48009SAndrew Brown     settings.add_bool("enable_simd", "Enable the use of SIMD instructions.", false);
115f78a61b9SBenjamin Bouvier 
116f78a61b9SBenjamin Bouvier     settings.add_bool(
117f78a61b9SBenjamin Bouvier         "enable_atomics",
118f78a61b9SBenjamin Bouvier         "Enable the use of atomic instructions",
119f78a61b9SBenjamin Bouvier         true,
120f78a61b9SBenjamin Bouvier     );
121f78a61b9SBenjamin Bouvier 
12219257f80SCarmen Kwan     settings.add_bool(
12319257f80SCarmen Kwan         "enable_safepoints",
12419257f80SCarmen Kwan         r#"
12519257f80SCarmen Kwan             Enable safepoint instruction insertions.
12619257f80SCarmen Kwan 
12719257f80SCarmen Kwan             This will allow the emit_stackmaps() function to insert the safepoint
12819257f80SCarmen Kwan             instruction on top of calls and interrupt traps in order to display the
12919257f80SCarmen Kwan             live reference values at that point in the program.
13019257f80SCarmen Kwan             "#,
13119257f80SCarmen Kwan         false,
13219257f80SCarmen Kwan     );
13319257f80SCarmen Kwan 
134f78a61b9SBenjamin Bouvier     // Settings specific to the `baldrdash` calling convention.
135f78a61b9SBenjamin Bouvier 
136d8d36022SBenjamin Bouvier     settings.add_enum(
137d8d36022SBenjamin Bouvier         "libcall_call_conv",
138d8d36022SBenjamin Bouvier         r#"
139d8d36022SBenjamin Bouvier             Defines the calling convention to use for LibCalls call expansion,
140d8d36022SBenjamin Bouvier             since it may be different from the ISA default calling convention.
141d8d36022SBenjamin Bouvier 
142d8d36022SBenjamin Bouvier             The default value is to use the same calling convention as the ISA
143d8d36022SBenjamin Bouvier             default calling convention.
144d8d36022SBenjamin Bouvier 
145d8d36022SBenjamin Bouvier             This list should be kept in sync with the list of calling
146d8d36022SBenjamin Bouvier             conventions available in isa/call_conv.rs.
147d8d36022SBenjamin Bouvier         "#,
148d8d36022SBenjamin Bouvier         vec![
149d8d36022SBenjamin Bouvier             "isa_default",
150d8d36022SBenjamin Bouvier             "fast",
151d8d36022SBenjamin Bouvier             "cold",
152d8d36022SBenjamin Bouvier             "system_v",
153d8d36022SBenjamin Bouvier             "windows_fastcall",
1542ee35b7eSBenjamin Bouvier             "baldrdash_system_v",
1552ee35b7eSBenjamin Bouvier             "baldrdash_windows",
156d8d36022SBenjamin Bouvier             "probestack",
157d8d36022SBenjamin Bouvier         ],
158d8d36022SBenjamin Bouvier     );
159d8d36022SBenjamin Bouvier 
160f78a61b9SBenjamin Bouvier     settings.add_num(
161f78a61b9SBenjamin Bouvier         "baldrdash_prologue_words",
162f78a61b9SBenjamin Bouvier         r#"
163f78a61b9SBenjamin Bouvier             Number of pointer-sized words pushed by the baldrdash prologue.
164f78a61b9SBenjamin Bouvier 
165f78a61b9SBenjamin Bouvier             Functions with the `baldrdash` calling convention don't generate their
166f78a61b9SBenjamin Bouvier             own prologue and epilogue. They depend on externally generated code
167f78a61b9SBenjamin Bouvier             that pushes a fixed number of words in the prologue and restores them
168f78a61b9SBenjamin Bouvier             in the epilogue.
169f78a61b9SBenjamin Bouvier 
170f78a61b9SBenjamin Bouvier             This setting configures the number of pointer-sized words pushed on the
171f78a61b9SBenjamin Bouvier             stack when the Cranelift-generated code is entered. This includes the
172f78a61b9SBenjamin Bouvier             pushed return address on x86.
173f78a61b9SBenjamin Bouvier             "#,
174f78a61b9SBenjamin Bouvier         0,
175f78a61b9SBenjamin Bouvier     );
176f78a61b9SBenjamin Bouvier 
177f78a61b9SBenjamin Bouvier     // BaldrMonkey requires that not-yet-relocated function addresses be encoded
178f78a61b9SBenjamin Bouvier     // as all-ones bitpatterns.
179f78a61b9SBenjamin Bouvier     settings.add_bool(
180*dd497c19SBenjamin Bouvier         "emit_all_ones_funcaddrs",
181f78a61b9SBenjamin Bouvier         "Emit not-yet-relocated function addresses as all-ones bit patterns.",
182f78a61b9SBenjamin Bouvier         false,
183f78a61b9SBenjamin Bouvier     );
184f78a61b9SBenjamin Bouvier 
185f78a61b9SBenjamin Bouvier     // Stack probing options.
186f78a61b9SBenjamin Bouvier 
187f78a61b9SBenjamin Bouvier     settings.add_bool(
188*dd497c19SBenjamin Bouvier         "enable_probestack",
189f78a61b9SBenjamin Bouvier         r#"
190f78a61b9SBenjamin Bouvier             Enable the use of stack probes, for calling conventions which support this
191f78a61b9SBenjamin Bouvier             functionality.
192f78a61b9SBenjamin Bouvier             "#,
193f78a61b9SBenjamin Bouvier         true,
194f78a61b9SBenjamin Bouvier     );
195f78a61b9SBenjamin Bouvier 
196f78a61b9SBenjamin Bouvier     settings.add_bool(
197f78a61b9SBenjamin Bouvier         "probestack_func_adjusts_sp",
198f78a61b9SBenjamin Bouvier         r#"
199f78a61b9SBenjamin Bouvier             Set this to true of the stack probe function modifies the stack pointer
200f78a61b9SBenjamin Bouvier             itself.
201f78a61b9SBenjamin Bouvier             "#,
202f78a61b9SBenjamin Bouvier         false,
203f78a61b9SBenjamin Bouvier     );
204f78a61b9SBenjamin Bouvier 
205f78a61b9SBenjamin Bouvier     settings.add_num(
206f78a61b9SBenjamin Bouvier         "probestack_size_log2",
207f78a61b9SBenjamin Bouvier         r#"
208f78a61b9SBenjamin Bouvier             The log2 of the size of the stack guard region.
209f78a61b9SBenjamin Bouvier 
210f78a61b9SBenjamin Bouvier             Stack frames larger than this size will have stack overflow checked
211f78a61b9SBenjamin Bouvier             by calling the probestack function.
212f78a61b9SBenjamin Bouvier 
213f78a61b9SBenjamin Bouvier             The default is 12, which translates to a size of 4096.
214f78a61b9SBenjamin Bouvier             "#,
215f78a61b9SBenjamin Bouvier         12,
216f78a61b9SBenjamin Bouvier     );
217f78a61b9SBenjamin Bouvier 
218f78a61b9SBenjamin Bouvier     // Jump table options.
219f78a61b9SBenjamin Bouvier 
220f78a61b9SBenjamin Bouvier     settings.add_bool(
221*dd497c19SBenjamin Bouvier         "enable_jump_tables",
222f78a61b9SBenjamin Bouvier         "Enable the use of jump tables in generated machine code.",
223f78a61b9SBenjamin Bouvier         true,
224f78a61b9SBenjamin Bouvier     );
225f78a61b9SBenjamin Bouvier 
22670f79d23SBenjamin Bouvier     settings.build()
227f78a61b9SBenjamin Bouvier }
228