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