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