1f78a61b9SBenjamin Bouvier use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder};
2f78a61b9SBenjamin Bouvier
define() -> SettingGroup35889dd2cSBenjamin Bouvier pub(crate) fn define() -> SettingGroup {
4f78a61b9SBenjamin Bouvier let mut settings = SettingGroupBuilder::new("shared");
5f78a61b9SBenjamin Bouvier
60af8737eSChris Fallin settings.add_bool(
70af8737eSChris Fallin "regalloc_checker",
80af8737eSChris Fallin "Enable the symbolic checker for register allocation.",
90af8737eSChris Fallin r#"
100af8737eSChris Fallin This performs a verification that the register allocator preserves
110af8737eSChris Fallin equivalent dataflow with respect to the original (pre-regalloc)
120af8737eSChris Fallin program. This analysis is somewhat expensive. However, if it succeeds,
130af8737eSChris Fallin it provides independent evidence (by a carefully-reviewed, from-first-principles
140af8737eSChris Fallin analysis) that no regalloc bugs were triggered for the particular compilations
150af8737eSChris Fallin performed. This is a valuable assurance to have as regalloc bugs can be
160af8737eSChris Fallin very dangerous and difficult to debug.
170af8737eSChris Fallin "#,
180af8737eSChris Fallin false,
190af8737eSChris Fallin );
200af8737eSChris Fallin
214ce329d1SBenjamin Bouvier settings.add_bool(
224ce329d1SBenjamin Bouvier "regalloc_verbose_logs",
234ce329d1SBenjamin Bouvier "Enable verbose debug logs for regalloc2.",
244ce329d1SBenjamin Bouvier r#"
254ce329d1SBenjamin Bouvier This adds extra logging for regalloc2 output, that is quite valuable to understand
264ce329d1SBenjamin Bouvier decisions taken by the register allocator as well as debugging it. It is disabled by
274ce329d1SBenjamin Bouvier default, as it can cause many log calls which can slow down compilation by a large
284ce329d1SBenjamin Bouvier amount.
294ce329d1SBenjamin Bouvier "#,
304ce329d1SBenjamin Bouvier false,
314ce329d1SBenjamin Bouvier );
324ce329d1SBenjamin Bouvier
33f78a61b9SBenjamin Bouvier settings.add_enum(
341e3e5fc1SChris Fallin "regalloc_algorithm",
351e3e5fc1SChris Fallin "Algorithm to use in register allocator.",
361e3e5fc1SChris Fallin r#"
371e3e5fc1SChris Fallin Supported options:
381e3e5fc1SChris Fallin
391e3e5fc1SChris Fallin - `backtracking`: A backtracking allocator with range splitting; more expensive
401e3e5fc1SChris Fallin but generates better code.
4173de2ee9SChris Fallin - `single_pass`: A single-pass algorithm that yields quick compilation but
4273de2ee9SChris Fallin results in code with more register spills and moves.
431e3e5fc1SChris Fallin "#,
4473de2ee9SChris Fallin vec!["backtracking", "single_pass"],
451e3e5fc1SChris Fallin );
461e3e5fc1SChris Fallin
471e3e5fc1SChris Fallin settings.add_enum(
48f78a61b9SBenjamin Bouvier "opt_level",
49abf3bf29SPeter Huene "Optimization level for generated code.",
50f78a61b9SBenjamin Bouvier r#"
51abf3bf29SPeter Huene Supported levels:
52f78a61b9SBenjamin Bouvier
53abf3bf29SPeter Huene - `none`: Minimise compile time by disabling most optimizations.
54abf3bf29SPeter Huene - `speed`: Generate the fastest possible code
55abf3bf29SPeter Huene - `speed_and_size`: like "speed", but also perform transformations aimed at reducing code size.
56f78a61b9SBenjamin Bouvier "#,
579e088e41Sjulian-seward1 vec!["none", "speed", "speed_and_size"],
58f78a61b9SBenjamin Bouvier );
59f78a61b9SBenjamin Bouvier
60f78a61b9SBenjamin Bouvier settings.add_bool(
612034c8aaSChris Fallin "enable_alias_analysis",
622034c8aaSChris Fallin "Do redundant-load optimizations with alias analysis.",
632034c8aaSChris Fallin r#"
642034c8aaSChris Fallin This enables the use of a simple alias analysis to optimize away redundant loads.
652034c8aaSChris Fallin Only effective when `opt_level` is `speed` or `speed_and_size`.
662034c8aaSChris Fallin "#,
672034c8aaSChris Fallin true,
682034c8aaSChris Fallin );
692034c8aaSChris Fallin
702034c8aaSChris Fallin settings.add_bool(
71f78a61b9SBenjamin Bouvier "enable_verifier",
72abf3bf29SPeter Huene "Run the Cranelift IR verifier at strategic times during compilation.",
73f78a61b9SBenjamin Bouvier r#"
74de7c0dddSBenjamin Bouvier This makes compilation slower but catches many bugs. The verifier is always enabled by
75de7c0dddSBenjamin Bouvier default, which is useful during development.
76f78a61b9SBenjamin Bouvier "#,
77f78a61b9SBenjamin Bouvier true,
78f78a61b9SBenjamin Bouvier );
79f78a61b9SBenjamin Bouvier
80f78a61b9SBenjamin Bouvier // Note that Cranelift doesn't currently need an is_pie flag, because PIE is
81*2811ee83SMikhail Katychev // just PIC where symbols can't be preempted, which can be expressed with the
82f78a61b9SBenjamin Bouvier // `colocated` flag on external functions and global values.
83f78a61b9SBenjamin Bouvier settings.add_bool(
84f78a61b9SBenjamin Bouvier "is_pic",
85abf3bf29SPeter Huene "Enable Position-Independent Code generation.",
86abf3bf29SPeter Huene "",
87f78a61b9SBenjamin Bouvier false,
88f78a61b9SBenjamin Bouvier );
89f78a61b9SBenjamin Bouvier
90f78a61b9SBenjamin Bouvier settings.add_bool(
91dd497c19SBenjamin Bouvier "use_colocated_libcalls",
92abf3bf29SPeter Huene "Use colocated libcalls.",
93f78a61b9SBenjamin Bouvier r#"
94f78a61b9SBenjamin Bouvier Generate code that assumes that libcalls can be declared "colocated",
95f78a61b9SBenjamin Bouvier meaning they will be defined along with the current function, such that
96f78a61b9SBenjamin Bouvier they can use more efficient addressing.
97f78a61b9SBenjamin Bouvier "#,
98f78a61b9SBenjamin Bouvier false,
99f78a61b9SBenjamin Bouvier );
100f78a61b9SBenjamin Bouvier
101f78a61b9SBenjamin Bouvier settings.add_bool(
102f78a61b9SBenjamin Bouvier "enable_nan_canonicalization",
103abf3bf29SPeter Huene "Enable NaN canonicalization.",
104f78a61b9SBenjamin Bouvier r#"
105f78a61b9SBenjamin Bouvier This replaces NaNs with a single canonical value, for users requiring
106f78a61b9SBenjamin Bouvier entirely deterministic WebAssembly computation. This is not required
107f78a61b9SBenjamin Bouvier by the WebAssembly spec, so it is not enabled by default.
108f78a61b9SBenjamin Bouvier "#,
109f78a61b9SBenjamin Bouvier false,
110f78a61b9SBenjamin Bouvier );
111f78a61b9SBenjamin Bouvier
112660b8b28SBenjamin Bouvier settings.add_bool(
113660b8b28SBenjamin Bouvier "enable_pinned_reg",
114abf3bf29SPeter Huene "Enable the use of the pinned register.",
115abf3bf29SPeter Huene r#"
116660b8b28SBenjamin Bouvier This register is excluded from register allocation, and is completely under the control of
117660b8b28SBenjamin Bouvier the end-user. It is possible to read it via the get_pinned_reg instruction, and to set it
118660b8b28SBenjamin Bouvier with the set_pinned_reg instruction.
119660b8b28SBenjamin Bouvier "#,
120660b8b28SBenjamin Bouvier false,
121660b8b28SBenjamin Bouvier );
122660b8b28SBenjamin Bouvier
1230a1bb3baSbjorn3 settings.add_enum(
1240a1bb3baSbjorn3 "tls_model",
125abf3bf29SPeter Huene "Defines the model used to perform TLS accesses.",
126abf3bf29SPeter Huene "",
1270a1bb3baSbjorn3 vec!["none", "elf_gd", "macho", "coff"],
1280a1bb3baSbjorn3 );
1290a1bb3baSbjorn3
130d8d36022SBenjamin Bouvier settings.add_enum(
131dbc11c30SFrank Emrich "stack_switch_model",
132dbc11c30SFrank Emrich "Defines the model used to performing stack switching.",
133dbc11c30SFrank Emrich r#"
134dbc11c30SFrank Emrich This determines the compilation of `stack_switch` instructions. If
135dbc11c30SFrank Emrich set to `basic`, we simply save all registers, update stack pointer
136dbc11c30SFrank Emrich and frame pointer (if needed), and jump to the target IP.
137dbc11c30SFrank Emrich If set to `update_windows_tib`, we *additionally* update information
138dbc11c30SFrank Emrich about the active stack in Windows' Thread Information Block.
139dbc11c30SFrank Emrich "#,
140dbc11c30SFrank Emrich vec!["none", "basic", "update_windows_tib"],
141dbc11c30SFrank Emrich );
142dbc11c30SFrank Emrich
143dbc11c30SFrank Emrich settings.add_enum(
144d8d36022SBenjamin Bouvier "libcall_call_conv",
145abf3bf29SPeter Huene "Defines the calling convention to use for LibCalls call expansion.",
146d8d36022SBenjamin Bouvier r#"
147abf3bf29SPeter Huene This may be different from the ISA default calling convention.
148d8d36022SBenjamin Bouvier
149d8d36022SBenjamin Bouvier The default value is to use the same calling convention as the ISA
150d8d36022SBenjamin Bouvier default calling convention.
151d8d36022SBenjamin Bouvier
152d8d36022SBenjamin Bouvier This list should be kept in sync with the list of calling
153d8d36022SBenjamin Bouvier conventions available in isa/call_conv.rs.
154d8d36022SBenjamin Bouvier "#,
155d8d36022SBenjamin Bouvier vec![
156d8d36022SBenjamin Bouvier "isa_default",
157d8d36022SBenjamin Bouvier "fast",
158d8d36022SBenjamin Bouvier "system_v",
159d8d36022SBenjamin Bouvier "windows_fastcall",
1606e6713aeSBenjamin Bouvier "apple_aarch64",
161d8d36022SBenjamin Bouvier "probestack",
16287ed3b60SChris Fallin "preserve_all",
163d8d36022SBenjamin Bouvier ],
164d8d36022SBenjamin Bouvier );
165d8d36022SBenjamin Bouvier
1666c94eb82SChris Fallin settings.add_bool(
1676c94eb82SChris Fallin "enable_llvm_abi_extensions",
168abf3bf29SPeter Huene "Enable various ABI extensions defined by LLVM's behavior.",
1696c94eb82SChris Fallin r#"
1706c94eb82SChris Fallin In some cases, LLVM's implementation of an ABI (calling convention)
1716c94eb82SChris Fallin goes beyond a standard and supports additional argument types or
1726c94eb82SChris Fallin behavior. This option instructs Cranelift codegen to follow LLVM's
1736c94eb82SChris Fallin behavior where applicable.
1746c94eb82SChris Fallin
1756c94eb82SChris Fallin Currently, this applies only to Windows Fastcall on x86-64, and
1766c94eb82SChris Fallin allows an `i128` argument to be spread across two 64-bit integer
1776c94eb82SChris Fallin registers. The Fastcall implementation otherwise does not support
1786c94eb82SChris Fallin `i128` arguments, and will panic if they are present and this
1796c94eb82SChris Fallin option is not set.
1806c94eb82SChris Fallin "#,
1816c94eb82SChris Fallin false,
1826c94eb82SChris Fallin );
1836c94eb82SChris Fallin
1842d5db92aSChris Fallin settings.add_bool(
185af968461Sbjorn3 "enable_multi_ret_implicit_sret",
186af968461Sbjorn3 "Enable support for sret arg introduction when there are too many ret vals.",
187af968461Sbjorn3 r#"
188af968461Sbjorn3 When there are more returns than available return registers, the
189af968461Sbjorn3 return value has to be returned through the introduction of a
190af968461Sbjorn3 return area pointer. Normally this return area pointer has to be
191af968461Sbjorn3 introduced as `ArgumentPurpose::StructReturn` parameter, but for
192af968461Sbjorn3 backward compatibility reasons Cranelift also supports implicitly
193af968461Sbjorn3 introducing this parameter and writing the return values through it.
194af968461Sbjorn3
195af968461Sbjorn3 **This option currently does not conform to platform ABIs and the
196af968461Sbjorn3 used ABI should not be assumed to remain the same between Cranelift
197af968461Sbjorn3 versions.**
198af968461Sbjorn3
199af968461Sbjorn3 This option is **deprecated** and will be removed in the future.
200af968461Sbjorn3
201af968461Sbjorn3 Because of the above issues, and complexities of native ABI support
202af968461Sbjorn3 for the concept in general, Cranelift's support for multiple return
203af968461Sbjorn3 values may also be removed in the future (#9510). For the most
204af968461Sbjorn3 robust solution, it is recommended to build a convention on top of
205af968461Sbjorn3 Cranelift's primitives for passing multiple return values, for
206af968461Sbjorn3 example by allocating a stackslot in the caller, passing it as an
207af968461Sbjorn3 explicit StructReturn argument, storing return values in the callee,
208af968461Sbjorn3 and loading results in the caller.
209af968461Sbjorn3 "#,
210af968461Sbjorn3 false,
211af968461Sbjorn3 );
212af968461Sbjorn3
213af968461Sbjorn3 settings.add_bool(
2142d5db92aSChris Fallin "unwind_info",
215abf3bf29SPeter Huene "Generate unwind information.",
2162d5db92aSChris Fallin r#"
217abf3bf29SPeter Huene This increases metadata size and compile time, but allows for the
218abf3bf29SPeter Huene debugger to trace frames, is needed for GC tracing that relies on
219abf3bf29SPeter Huene libunwind (such as in Wasmtime), and is unconditionally needed on
220abf3bf29SPeter Huene certain platforms (such as Windows) that must always be able to unwind.
2212d5db92aSChris Fallin "#,
2222d5db92aSChris Fallin true,
2232d5db92aSChris Fallin );
2242d5db92aSChris Fallin
225800cf25bSChris Fallin settings.add_bool(
22622d91a7cSNick Fitzgerald "preserve_frame_pointers",
22722d91a7cSNick Fitzgerald "Preserve frame pointers",
22822d91a7cSNick Fitzgerald r#"
22922d91a7cSNick Fitzgerald Preserving frame pointers -- even inside leaf functions -- makes it
23022d91a7cSNick Fitzgerald easy to capture the stack of a running program, without requiring any
23122d91a7cSNick Fitzgerald side tables or metadata (like `.eh_frame` sections). Many sampling
23222d91a7cSNick Fitzgerald profilers and similar tools walk frame pointers to capture stacks.
23322d91a7cSNick Fitzgerald Enabling this option will play nice with those tools.
23422d91a7cSNick Fitzgerald "#,
23522d91a7cSNick Fitzgerald false,
23622d91a7cSNick Fitzgerald );
23722d91a7cSNick Fitzgerald
23822d91a7cSNick Fitzgerald settings.add_bool(
239800cf25bSChris Fallin "machine_code_cfg_info",
240800cf25bSChris Fallin "Generate CFG metadata for machine code.",
241800cf25bSChris Fallin r#"
242800cf25bSChris Fallin This increases metadata size and compile time, but allows for the
243800cf25bSChris Fallin embedder to more easily post-process or analyze the generated
244800cf25bSChris Fallin machine code. It provides code offsets for the start of each
245800cf25bSChris Fallin basic block in the generated machine code, and a list of CFG
246800cf25bSChris Fallin edges (with blocks identified by start offsets) between them.
247800cf25bSChris Fallin This is useful for, e.g., machine-code analyses that verify certain
248800cf25bSChris Fallin properties of the generated code.
249800cf25bSChris Fallin "#,
250800cf25bSChris Fallin false,
251800cf25bSChris Fallin );
252800cf25bSChris Fallin
253f78a61b9SBenjamin Bouvier // Stack probing options.
254f78a61b9SBenjamin Bouvier
255f78a61b9SBenjamin Bouvier settings.add_bool(
256dd497c19SBenjamin Bouvier "enable_probestack",
257abf3bf29SPeter Huene "Enable the use of stack probes for supported calling conventions.",
258abf3bf29SPeter Huene "",
25983088538SAlex Crichton false,
260f78a61b9SBenjamin Bouvier );
261f78a61b9SBenjamin Bouvier
262f78a61b9SBenjamin Bouvier settings.add_num(
263f78a61b9SBenjamin Bouvier "probestack_size_log2",
264abf3bf29SPeter Huene "The log2 of the size of the stack guard region.",
265f78a61b9SBenjamin Bouvier r#"
266f78a61b9SBenjamin Bouvier Stack frames larger than this size will have stack overflow checked
267f78a61b9SBenjamin Bouvier by calling the probestack function.
268f78a61b9SBenjamin Bouvier
269f78a61b9SBenjamin Bouvier The default is 12, which translates to a size of 4096.
270f78a61b9SBenjamin Bouvier "#,
271f78a61b9SBenjamin Bouvier 12,
272f78a61b9SBenjamin Bouvier );
273f78a61b9SBenjamin Bouvier
27408e7a7f1SAfonso Bordado settings.add_enum(
27508e7a7f1SAfonso Bordado "probestack_strategy",
27608e7a7f1SAfonso Bordado "Controls what kinds of stack probes are emitted.",
27708e7a7f1SAfonso Bordado r#"
27808e7a7f1SAfonso Bordado Supported strategies:
27908e7a7f1SAfonso Bordado
28008e7a7f1SAfonso Bordado - `outline`: Always emits stack probes as calls to a probe stack function.
28108e7a7f1SAfonso Bordado - `inline`: Always emits inline stack probes.
28208e7a7f1SAfonso Bordado "#,
28308e7a7f1SAfonso Bordado vec!["outline", "inline"],
28408e7a7f1SAfonso Bordado );
28508e7a7f1SAfonso Bordado
2862a2e8f62Sbjorn3 // Spectre options. (Only read by wasmtime-cranelift)
2872a2e8f62Sbjorn3 // FIXME move configuration out of Cranelift into Wasmtime
288e694fb13SChris Fallin
289e694fb13SChris Fallin settings.add_bool(
290e694fb13SChris Fallin "enable_heap_access_spectre_mitigation",
291abf3bf29SPeter Huene "Enable Spectre mitigation on heap bounds checks.",
292e694fb13SChris Fallin r#"
293e694fb13SChris Fallin This is a no-op for any heap that needs no bounds checks; e.g.,
294e694fb13SChris Fallin if the limit is static and the guard region is large enough that
295e694fb13SChris Fallin the index cannot reach past it.
296e694fb13SChris Fallin
297e694fb13SChris Fallin This option is enabled by default because it is highly
298e694fb13SChris Fallin recommended for secure sandboxing. The embedder should consider
299e694fb13SChris Fallin the security implications carefully before disabling this option.
300e694fb13SChris Fallin "#,
301e694fb13SChris Fallin true,
302e694fb13SChris Fallin );
303e694fb13SChris Fallin
30461dc38c0SChris Fallin settings.add_bool(
30561dc38c0SChris Fallin "enable_table_access_spectre_mitigation",
30661dc38c0SChris Fallin "Enable Spectre mitigation on table bounds checks.",
30761dc38c0SChris Fallin r#"
30861dc38c0SChris Fallin This option uses a conditional move to ensure that when a table
30961dc38c0SChris Fallin access index is bounds-checked and a conditional branch is used
31061dc38c0SChris Fallin for the out-of-bounds case, a misspeculation of that conditional
31161dc38c0SChris Fallin branch (falsely predicted in-bounds) will select an in-bounds
31261dc38c0SChris Fallin index to load on the speculative path.
31361dc38c0SChris Fallin
31461dc38c0SChris Fallin This option is enabled by default because it is highly
31561dc38c0SChris Fallin recommended for secure sandboxing. The embedder should consider
31661dc38c0SChris Fallin the security implications carefully before disabling this option.
31761dc38c0SChris Fallin "#,
31861dc38c0SChris Fallin true,
31961dc38c0SChris Fallin );
32061dc38c0SChris Fallin
3218a9b1a90SBenjamin Bouvier settings.add_bool(
3228a9b1a90SBenjamin Bouvier "enable_incremental_compilation_cache_checks",
3238a9b1a90SBenjamin Bouvier "Enable additional checks for debugging the incremental compilation cache.",
3248a9b1a90SBenjamin Bouvier r#"
3258a9b1a90SBenjamin Bouvier Enables additional checks that are useful during development of the incremental
3268a9b1a90SBenjamin Bouvier compilation cache. This should be mostly useful for Cranelift hackers, as well as for
3278a9b1a90SBenjamin Bouvier helping to debug false incremental cache positives for embedders.
3288a9b1a90SBenjamin Bouvier
3298a9b1a90SBenjamin Bouvier This option is disabled by default and requires enabling the "incremental-cache" Cargo
3308a9b1a90SBenjamin Bouvier feature in cranelift-codegen.
3318a9b1a90SBenjamin Bouvier "#,
3328a9b1a90SBenjamin Bouvier false,
3338a9b1a90SBenjamin Bouvier );
3348a9b1a90SBenjamin Bouvier
33549dd8fd7SAlex Crichton settings.add_num(
33649dd8fd7SAlex Crichton "bb_padding_log2_minus_one",
33749dd8fd7SAlex Crichton "The log2 of the size to insert dummy padding between basic blocks",
33849dd8fd7SAlex Crichton r#"
33949dd8fd7SAlex Crichton This is a debugging option for stressing various cases during code
34049dd8fd7SAlex Crichton generation without requiring large functions. This will insert
34149dd8fd7SAlex Crichton 0-byte padding between basic blocks of the specified size.
34249dd8fd7SAlex Crichton
34349dd8fd7SAlex Crichton The amount of padding inserted two raised to the power of this value
34449dd8fd7SAlex Crichton minus one. If this value is 0 then no padding is inserted.
34549dd8fd7SAlex Crichton
34649dd8fd7SAlex Crichton The default for this option is 0 to insert no padding as it's only
34749dd8fd7SAlex Crichton intended for testing and development.
34849dd8fd7SAlex Crichton "#,
34949dd8fd7SAlex Crichton 0,
35049dd8fd7SAlex Crichton );
35149dd8fd7SAlex Crichton
3522af0a1f7Sbjorn3 settings.add_num(
3532af0a1f7Sbjorn3 "log2_min_function_alignment",
3542af0a1f7Sbjorn3 "The log2 of the minimum alignment of functions",
3552af0a1f7Sbjorn3 "The bigger of this value and the default alignment will be used as actual alignment.",
3562af0a1f7Sbjorn3 0,
3572af0a1f7Sbjorn3 );
3582af0a1f7Sbjorn3
35951d87342SAfonso Bordado // When adding new settings please check if they can also be added
36051d87342SAfonso Bordado // in cranelift/fuzzgen/src/lib.rs for fuzzing.
36170f79d23SBenjamin Bouvier settings.build()
362f78a61b9SBenjamin Bouvier }
363