@@ -30,293 +30,11 @@ use crate::core::config::toml::llvm::Llvm;
30
30
use crate :: core:: config:: toml:: merge:: Merge ;
31
31
use crate :: core:: config:: toml:: rust:: { LldMode , Rust , RustOptimize } ;
32
32
use crate :: core:: config:: toml:: target:: Target ;
33
- use crate :: core:: config:: { GccCiMode , RustcLto } ;
33
+ use crate :: core:: config:: { GccCiMode , RustcLto , set , threads_from_config } ;
34
34
use crate :: utils:: channel:: GitInfo ;
35
35
use crate :: utils:: helpers:: { self , exe, t} ;
36
36
use crate :: { Config , DryRun , TargetSelection , check_ci_llvm} ;
37
37
38
- /// Compares the current `Llvm` options against those in the CI LLVM builder and detects any incompatible options.
39
- /// It does this by destructuring the `Llvm` instance to make sure every `Llvm` field is covered and not missing.
40
- #[ cfg( not( test) ) ]
41
- pub fn check_incompatible_options_for_ci_llvm (
42
- current_config_toml : TomlConfig ,
43
- ci_config_toml : TomlConfig ,
44
- ) -> Result < ( ) , String > {
45
- macro_rules! err {
46
- ( $current: expr, $expected: expr) => {
47
- if let Some ( current) = & $current {
48
- if Some ( current) != $expected. as_ref( ) {
49
- return Err ( format!(
50
- "ERROR: Setting `llvm.{}` is incompatible with `llvm.download-ci-llvm`. \
51
- Current value: {:?}, Expected value(s): {}{:?}",
52
- stringify!( $expected) . replace( "_" , "-" ) ,
53
- $current,
54
- if $expected. is_some( ) { "None/" } else { "" } ,
55
- $expected,
56
- ) ) ;
57
- } ;
58
- } ;
59
- } ;
60
- }
61
-
62
- macro_rules! warn {
63
- ( $current: expr, $expected: expr) => {
64
- if let Some ( current) = & $current {
65
- if Some ( current) != $expected. as_ref( ) {
66
- println!(
67
- "WARNING: `llvm.{}` has no effect with `llvm.download-ci-llvm`. \
68
- Current value: {:?}, Expected value(s): {}{:?}",
69
- stringify!( $expected) . replace( "_" , "-" ) ,
70
- $current,
71
- if $expected. is_some( ) { "None/" } else { "" } ,
72
- $expected,
73
- ) ;
74
- } ;
75
- } ;
76
- } ;
77
- }
78
-
79
- let ( Some ( current_llvm_config) , Some ( ci_llvm_config) ) =
80
- ( current_config_toml. llvm , ci_config_toml. llvm )
81
- else {
82
- return Ok ( ( ) ) ;
83
- } ;
84
-
85
- let Llvm {
86
- optimize,
87
- thin_lto,
88
- release_debuginfo,
89
- assertions : _,
90
- tests : _,
91
- plugins,
92
- ccache : _,
93
- static_libstdcpp : _,
94
- libzstd,
95
- ninja : _,
96
- targets,
97
- experimental_targets,
98
- link_jobs : _,
99
- link_shared : _,
100
- version_suffix,
101
- clang_cl,
102
- cflags,
103
- cxxflags,
104
- ldflags,
105
- use_libcxx,
106
- use_linker,
107
- allow_old_toolchain,
108
- offload,
109
- polly,
110
- clang,
111
- enable_warnings,
112
- download_ci_llvm : _,
113
- build_config,
114
- enzyme,
115
- } = ci_llvm_config;
116
-
117
- err ! ( current_llvm_config. optimize, optimize) ;
118
- err ! ( current_llvm_config. thin_lto, thin_lto) ;
119
- err ! ( current_llvm_config. release_debuginfo, release_debuginfo) ;
120
- err ! ( current_llvm_config. libzstd, libzstd) ;
121
- err ! ( current_llvm_config. targets, targets) ;
122
- err ! ( current_llvm_config. experimental_targets, experimental_targets) ;
123
- err ! ( current_llvm_config. clang_cl, clang_cl) ;
124
- err ! ( current_llvm_config. version_suffix, version_suffix) ;
125
- err ! ( current_llvm_config. cflags, cflags) ;
126
- err ! ( current_llvm_config. cxxflags, cxxflags) ;
127
- err ! ( current_llvm_config. ldflags, ldflags) ;
128
- err ! ( current_llvm_config. use_libcxx, use_libcxx) ;
129
- err ! ( current_llvm_config. use_linker, use_linker) ;
130
- err ! ( current_llvm_config. allow_old_toolchain, allow_old_toolchain) ;
131
- err ! ( current_llvm_config. offload, offload) ;
132
- err ! ( current_llvm_config. polly, polly) ;
133
- err ! ( current_llvm_config. clang, clang) ;
134
- err ! ( current_llvm_config. build_config, build_config) ;
135
- err ! ( current_llvm_config. plugins, plugins) ;
136
- err ! ( current_llvm_config. enzyme, enzyme) ;
137
-
138
- warn ! ( current_llvm_config. enable_warnings, enable_warnings) ;
139
-
140
- Ok ( ( ) )
141
- }
142
-
143
- /// Compares the current Rust options against those in the CI rustc builder and detects any incompatible options.
144
- /// It does this by destructuring the `Rust` instance to make sure every `Rust` field is covered and not missing.
145
- pub fn check_incompatible_options_for_ci_rustc (
146
- host : TargetSelection ,
147
- current_config_toml : TomlConfig ,
148
- ci_config_toml : TomlConfig ,
149
- ) -> Result < ( ) , String > {
150
- macro_rules! err {
151
- ( $current: expr, $expected: expr, $config_section: expr) => {
152
- if let Some ( current) = & $current {
153
- if Some ( current) != $expected. as_ref( ) {
154
- return Err ( format!(
155
- "ERROR: Setting `{}` is incompatible with `rust.download-rustc`. \
156
- Current value: {:?}, Expected value(s): {}{:?}",
157
- format!( "{}.{}" , $config_section, stringify!( $expected) . replace( "_" , "-" ) ) ,
158
- $current,
159
- if $expected. is_some( ) { "None/" } else { "" } ,
160
- $expected,
161
- ) ) ;
162
- } ;
163
- } ;
164
- } ;
165
- }
166
-
167
- macro_rules! warn {
168
- ( $current: expr, $expected: expr, $config_section: expr) => {
169
- if let Some ( current) = & $current {
170
- if Some ( current) != $expected. as_ref( ) {
171
- println!(
172
- "WARNING: `{}` has no effect with `rust.download-rustc`. \
173
- Current value: {:?}, Expected value(s): {}{:?}",
174
- format!( "{}.{}" , $config_section, stringify!( $expected) . replace( "_" , "-" ) ) ,
175
- $current,
176
- if $expected. is_some( ) { "None/" } else { "" } ,
177
- $expected,
178
- ) ;
179
- } ;
180
- } ;
181
- } ;
182
- }
183
-
184
- let current_profiler = current_config_toml. build . as_ref ( ) . and_then ( |b| b. profiler ) ;
185
- let profiler = ci_config_toml. build . as_ref ( ) . and_then ( |b| b. profiler ) ;
186
- err ! ( current_profiler, profiler, "build" ) ;
187
-
188
- let current_optimized_compiler_builtins =
189
- current_config_toml. build . as_ref ( ) . and_then ( |b| b. optimized_compiler_builtins ) ;
190
- let optimized_compiler_builtins =
191
- ci_config_toml. build . as_ref ( ) . and_then ( |b| b. optimized_compiler_builtins ) ;
192
- err ! ( current_optimized_compiler_builtins, optimized_compiler_builtins, "build" ) ;
193
-
194
- // We always build the in-tree compiler on cross targets, so we only care
195
- // about the host target here.
196
- let host_str = host. to_string ( ) ;
197
- if let Some ( current_cfg) = current_config_toml. target . as_ref ( ) . and_then ( |c| c. get ( & host_str) ) {
198
- if current_cfg. profiler . is_some ( ) {
199
- let ci_target_toml = ci_config_toml. target . as_ref ( ) . and_then ( |c| c. get ( & host_str) ) ;
200
- let ci_cfg = ci_target_toml. ok_or ( format ! (
201
- "Target specific config for '{host_str}' is not present for CI-rustc"
202
- ) ) ?;
203
-
204
- let profiler = & ci_cfg. profiler ;
205
- err ! ( current_cfg. profiler, profiler, "build" ) ;
206
-
207
- let optimized_compiler_builtins = & ci_cfg. optimized_compiler_builtins ;
208
- err ! ( current_cfg. optimized_compiler_builtins, optimized_compiler_builtins, "build" ) ;
209
- }
210
- }
211
-
212
- let ( Some ( current_rust_config) , Some ( ci_rust_config) ) =
213
- ( current_config_toml. rust , ci_config_toml. rust )
214
- else {
215
- return Ok ( ( ) ) ;
216
- } ;
217
-
218
- let Rust {
219
- // Following options are the CI rustc incompatible ones.
220
- optimize,
221
- randomize_layout,
222
- debug_logging,
223
- debuginfo_level_rustc,
224
- llvm_tools,
225
- llvm_bitcode_linker,
226
- lto,
227
- stack_protector,
228
- strip,
229
- lld_mode,
230
- jemalloc,
231
- rpath,
232
- channel,
233
- description,
234
- incremental,
235
- default_linker,
236
- std_features,
237
-
238
- // Rest of the options can simply be ignored.
239
- debug : _,
240
- codegen_units : _,
241
- codegen_units_std : _,
242
- rustc_debug_assertions : _,
243
- std_debug_assertions : _,
244
- tools_debug_assertions : _,
245
- overflow_checks : _,
246
- overflow_checks_std : _,
247
- debuginfo_level : _,
248
- debuginfo_level_std : _,
249
- debuginfo_level_tools : _,
250
- debuginfo_level_tests : _,
251
- backtrace : _,
252
- musl_root : _,
253
- verbose_tests : _,
254
- optimize_tests : _,
255
- codegen_tests : _,
256
- omit_git_hash : _,
257
- dist_src : _,
258
- save_toolstates : _,
259
- codegen_backends : _,
260
- lld : _,
261
- deny_warnings : _,
262
- backtrace_on_ice : _,
263
- verify_llvm_ir : _,
264
- thin_lto_import_instr_limit : _,
265
- remap_debuginfo : _,
266
- test_compare_mode : _,
267
- llvm_libunwind : _,
268
- control_flow_guard : _,
269
- ehcont_guard : _,
270
- new_symbol_mangling : _,
271
- profile_generate : _,
272
- profile_use : _,
273
- download_rustc : _,
274
- validate_mir_opts : _,
275
- frame_pointers : _,
276
- } = ci_rust_config;
277
-
278
- // There are two kinds of checks for CI rustc incompatible options:
279
- // 1. Checking an option that may change the compiler behaviour/output.
280
- // 2. Checking an option that have no effect on the compiler behaviour/output.
281
- //
282
- // If the option belongs to the first category, we call `err` macro for a hard error;
283
- // otherwise, we just print a warning with `warn` macro.
284
-
285
- err ! ( current_rust_config. optimize, optimize, "rust" ) ;
286
- err ! ( current_rust_config. randomize_layout, randomize_layout, "rust" ) ;
287
- err ! ( current_rust_config. debug_logging, debug_logging, "rust" ) ;
288
- err ! ( current_rust_config. debuginfo_level_rustc, debuginfo_level_rustc, "rust" ) ;
289
- err ! ( current_rust_config. rpath, rpath, "rust" ) ;
290
- err ! ( current_rust_config. strip, strip, "rust" ) ;
291
- err ! ( current_rust_config. lld_mode, lld_mode, "rust" ) ;
292
- err ! ( current_rust_config. llvm_tools, llvm_tools, "rust" ) ;
293
- err ! ( current_rust_config. llvm_bitcode_linker, llvm_bitcode_linker, "rust" ) ;
294
- err ! ( current_rust_config. jemalloc, jemalloc, "rust" ) ;
295
- err ! ( current_rust_config. default_linker, default_linker, "rust" ) ;
296
- err ! ( current_rust_config. stack_protector, stack_protector, "rust" ) ;
297
- err ! ( current_rust_config. lto, lto, "rust" ) ;
298
- err ! ( current_rust_config. std_features, std_features, "rust" ) ;
299
-
300
- warn ! ( current_rust_config. channel, channel, "rust" ) ;
301
- warn ! ( current_rust_config. description, description, "rust" ) ;
302
- warn ! ( current_rust_config. incremental, incremental, "rust" ) ;
303
-
304
- Ok ( ( ) )
305
- }
306
-
307
- pub fn set < T > ( field : & mut T , val : Option < T > ) {
308
- if let Some ( v) = val {
309
- * field = v;
310
- }
311
- }
312
-
313
- pub fn threads_from_config ( v : u32 ) -> u32 {
314
- match v {
315
- 0 => std:: thread:: available_parallelism ( ) . map_or ( 1 , std:: num:: NonZeroUsize :: get) as u32 ,
316
- n => n,
317
- }
318
- }
319
-
320
38
impl Config {
321
39
#[ cfg_attr(
322
40
feature = "tracing" ,
0 commit comments