@@ -101,6 +101,43 @@ impl Display for DebuginfoLevel {
101
101
}
102
102
}
103
103
104
+ #[ derive( Default , Clone ) ]
105
+ pub struct LLVMConfig {
106
+ pub assertions : bool ,
107
+ pub tests : bool ,
108
+ pub plugins : bool ,
109
+ pub optimize : bool ,
110
+ pub thin_lto : bool ,
111
+ pub release_debuginfo : bool ,
112
+ pub static_stdcpp : bool ,
113
+ /// `None` if `llvm_from_ci` is true and we haven't yet downloaded llvm.
114
+ #[ cfg( not( test) ) ]
115
+ link_shared : Cell < Option < bool > > ,
116
+ #[ cfg( test) ]
117
+ pub link_shared : Cell < Option < bool > > ,
118
+ pub clang_cl : Option < String > ,
119
+ pub targets : Option < String > ,
120
+ pub experimental_targets : Option < String > ,
121
+ pub link_jobs : Option < u32 > ,
122
+ pub version_suffix : Option < String > ,
123
+ pub use_linker : Option < String > ,
124
+ pub allow_old_toolchain : bool ,
125
+ pub polly : bool ,
126
+ pub clang : bool ,
127
+ pub enable_warnings : bool ,
128
+ pub from_ci : bool ,
129
+ pub build_config : HashMap < String , String > ,
130
+
131
+ pub use_lld : bool ,
132
+ pub lld_enabled : bool ,
133
+ pub tools_enabled : bool ,
134
+
135
+ pub cflags : Option < String > ,
136
+ pub cxxflags : Option < String > ,
137
+ pub ldflags : Option < String > ,
138
+ pub use_libcxx : bool ,
139
+ }
140
+
104
141
/// Global configuration for the entire build and/or bootstrap.
105
142
///
106
143
/// This structure is parsed from `config.toml`, and some of the fields are inferred from `git` or build-time parameters.
@@ -167,39 +204,7 @@ pub struct Config {
167
204
pub backtrace_on_ice : bool ,
168
205
169
206
// llvm codegen options
170
- pub llvm_assertions : bool ,
171
- pub llvm_tests : bool ,
172
- pub llvm_plugins : bool ,
173
- pub llvm_optimize : bool ,
174
- pub llvm_thin_lto : bool ,
175
- pub llvm_release_debuginfo : bool ,
176
- pub llvm_static_stdcpp : bool ,
177
- /// `None` if `llvm_from_ci` is true and we haven't yet downloaded llvm.
178
- #[ cfg( not( test) ) ]
179
- llvm_link_shared : Cell < Option < bool > > ,
180
- #[ cfg( test) ]
181
- pub llvm_link_shared : Cell < Option < bool > > ,
182
- pub llvm_clang_cl : Option < String > ,
183
- pub llvm_targets : Option < String > ,
184
- pub llvm_experimental_targets : Option < String > ,
185
- pub llvm_link_jobs : Option < u32 > ,
186
- pub llvm_version_suffix : Option < String > ,
187
- pub llvm_use_linker : Option < String > ,
188
- pub llvm_allow_old_toolchain : bool ,
189
- pub llvm_polly : bool ,
190
- pub llvm_clang : bool ,
191
- pub llvm_enable_warnings : bool ,
192
- pub llvm_from_ci : bool ,
193
- pub llvm_build_config : HashMap < String , String > ,
194
-
195
- pub use_lld : bool ,
196
- pub lld_enabled : bool ,
197
- pub llvm_tools_enabled : bool ,
198
-
199
- pub llvm_cflags : Option < String > ,
200
- pub llvm_cxxflags : Option < String > ,
201
- pub llvm_ldflags : Option < String > ,
202
- pub llvm_use_libcxx : bool ,
207
+ pub llvm : LLVMConfig ,
203
208
204
209
// rust codegen options
205
210
pub rust_optimize : RustOptimize ,
@@ -1052,9 +1057,9 @@ define_config! {
1052
1057
impl Config {
1053
1058
pub fn default_opts ( ) -> Config {
1054
1059
let mut config = Config :: default ( ) ;
1055
- config. llvm_optimize = true ;
1060
+ config. llvm . optimize = true ;
1056
1061
config. ninja_in_file = true ;
1057
- config. llvm_static_stdcpp = false ;
1062
+ config. llvm . static_stdcpp = false ;
1058
1063
config. backtrace = true ;
1059
1064
config. rust_optimize = RustOptimize :: Bool ( true ) ;
1060
1065
config. rust_optimize_tests = true ;
@@ -1428,9 +1433,9 @@ impl Config {
1428
1433
if let Some ( true ) = rust. incremental {
1429
1434
config. incremental = true ;
1430
1435
}
1431
- set ( & mut config. use_lld , rust. use_lld ) ;
1432
- set ( & mut config. lld_enabled , rust. lld ) ;
1433
- set ( & mut config. llvm_tools_enabled , rust. llvm_tools ) ;
1436
+ set ( & mut config. llvm . use_lld , rust. use_lld ) ;
1437
+ set ( & mut config. llvm . lld_enabled , rust. lld ) ;
1438
+ set ( & mut config. llvm . tools_enabled , rust. llvm_tools ) ;
1434
1439
config. rustc_parallel = rust. parallel_compiler . unwrap_or ( false ) ;
1435
1440
config. rustc_default_linker = rust. default_linker ;
1436
1441
config. musl_root = rust. musl_root . map ( PathBuf :: from) ;
@@ -1489,32 +1494,32 @@ impl Config {
1489
1494
llvm_assertions = llvm. assertions ;
1490
1495
llvm_tests = llvm. tests ;
1491
1496
llvm_plugins = llvm. plugins ;
1492
- set ( & mut config. llvm_optimize , llvm. optimize ) ;
1493
- set ( & mut config. llvm_thin_lto , llvm. thin_lto ) ;
1494
- set ( & mut config. llvm_release_debuginfo , llvm. release_debuginfo ) ;
1495
- set ( & mut config. llvm_static_stdcpp , llvm. static_libstdcpp ) ;
1497
+ set ( & mut config. llvm . optimize , llvm. optimize ) ;
1498
+ set ( & mut config. llvm . thin_lto , llvm. thin_lto ) ;
1499
+ set ( & mut config. llvm . release_debuginfo , llvm. release_debuginfo ) ;
1500
+ set ( & mut config. llvm . static_stdcpp , llvm. static_libstdcpp ) ;
1496
1501
if let Some ( v) = llvm. link_shared {
1497
- config. llvm_link_shared . set ( Some ( v) ) ;
1502
+ config. llvm . link_shared . set ( Some ( v) ) ;
1498
1503
}
1499
- config. llvm_targets = llvm. targets . clone ( ) ;
1500
- config. llvm_experimental_targets = llvm. experimental_targets . clone ( ) ;
1501
- config. llvm_link_jobs = llvm. link_jobs ;
1502
- config. llvm_version_suffix = llvm. version_suffix . clone ( ) ;
1503
- config. llvm_clang_cl = llvm. clang_cl . clone ( ) ;
1504
-
1505
- config. llvm_cflags = llvm. cflags . clone ( ) ;
1506
- config. llvm_cxxflags = llvm. cxxflags . clone ( ) ;
1507
- config. llvm_ldflags = llvm. ldflags . clone ( ) ;
1508
- set ( & mut config. llvm_use_libcxx , llvm. use_libcxx ) ;
1509
- config. llvm_use_linker = llvm. use_linker . clone ( ) ;
1510
- config. llvm_allow_old_toolchain = llvm. allow_old_toolchain . unwrap_or ( false ) ;
1511
- config. llvm_polly = llvm. polly . unwrap_or ( false ) ;
1512
- config. llvm_clang = llvm. clang . unwrap_or ( false ) ;
1513
- config. llvm_enable_warnings = llvm. enable_warnings . unwrap_or ( false ) ;
1514
- config. llvm_build_config = llvm. build_config . clone ( ) . unwrap_or ( Default :: default ( ) ) ;
1504
+ config. llvm . targets = llvm. targets . clone ( ) ;
1505
+ config. llvm . experimental_targets = llvm. experimental_targets . clone ( ) ;
1506
+ config. llvm . link_jobs = llvm. link_jobs ;
1507
+ config. llvm . version_suffix = llvm. version_suffix . clone ( ) ;
1508
+ config. llvm . clang_cl = llvm. clang_cl . clone ( ) ;
1509
+
1510
+ config. llvm . cflags = llvm. cflags . clone ( ) ;
1511
+ config. llvm . cxxflags = llvm. cxxflags . clone ( ) ;
1512
+ config. llvm . ldflags = llvm. ldflags . clone ( ) ;
1513
+ set ( & mut config. llvm . use_libcxx , llvm. use_libcxx ) ;
1514
+ config. llvm . use_linker = llvm. use_linker . clone ( ) ;
1515
+ config. llvm . allow_old_toolchain = llvm. allow_old_toolchain . unwrap_or ( false ) ;
1516
+ config. llvm . polly = llvm. polly . unwrap_or ( false ) ;
1517
+ config. llvm . clang = llvm. clang . unwrap_or ( false ) ;
1518
+ config. llvm . enable_warnings = llvm. enable_warnings . unwrap_or ( false ) ;
1519
+ config. llvm . build_config = llvm. build_config . clone ( ) . unwrap_or ( Default :: default ( ) ) ;
1515
1520
1516
1521
let asserts = llvm_assertions. unwrap_or ( false ) ;
1517
- config. llvm_from_ci = match llvm. download_ci_llvm {
1522
+ config. llvm . from_ci = match llvm. download_ci_llvm {
1518
1523
Some ( StringOrBool :: String ( s) ) => {
1519
1524
assert ! ( s == "if-available" , "unknown option `{}` for download-ci-llvm" , s) ;
1520
1525
crate :: llvm:: is_ci_llvm_available ( & config, asserts)
@@ -1525,7 +1530,7 @@ impl Config {
1525
1530
}
1526
1531
} ;
1527
1532
1528
- if config. llvm_from_ci {
1533
+ if config. llvm . from_ci {
1529
1534
// None of the LLVM options, except assertions, are supported
1530
1535
// when using downloaded LLVM. We could just ignore these but
1531
1536
// that's potentially confusing, so force them to not be
@@ -1556,14 +1561,14 @@ impl Config {
1556
1561
}
1557
1562
1558
1563
// NOTE: can never be hit when downloading from CI, since we call `check_ci_llvm!(thin_lto)` above.
1559
- if config. llvm_thin_lto && llvm. link_shared . is_none ( ) {
1564
+ if config. llvm . thin_lto && llvm. link_shared . is_none ( ) {
1560
1565
// If we're building with ThinLTO on, by default we want to link
1561
1566
// to LLVM shared, to avoid re-doing ThinLTO (which happens in
1562
1567
// the link step) with each stage.
1563
- config. llvm_link_shared . set ( Some ( true ) ) ;
1568
+ config. llvm . link_shared . set ( Some ( true ) ) ;
1564
1569
}
1565
1570
} else {
1566
- config. llvm_from_ci =
1571
+ config. llvm . from_ci =
1567
1572
config. channel == "dev" && crate :: llvm:: is_ci_llvm_available ( & config, false ) ;
1568
1573
}
1569
1574
@@ -1615,7 +1620,7 @@ impl Config {
1615
1620
}
1616
1621
}
1617
1622
1618
- if config. llvm_from_ci {
1623
+ if config. llvm . from_ci {
1619
1624
let triple = & config. build . triple ;
1620
1625
let ci_llvm_bin = config. ci_llvm_root ( ) . join ( "bin" ) ;
1621
1626
let build_target = config
@@ -1650,9 +1655,9 @@ impl Config {
1650
1655
// Now that we've reached the end of our configuration, infer the
1651
1656
// default values for all options that we haven't otherwise stored yet.
1652
1657
1653
- config. llvm_assertions = llvm_assertions. unwrap_or ( false ) ;
1654
- config. llvm_tests = llvm_tests. unwrap_or ( false ) ;
1655
- config. llvm_plugins = llvm_plugins. unwrap_or ( false ) ;
1658
+ config. llvm . assertions = llvm_assertions. unwrap_or ( false ) ;
1659
+ config. llvm . tests = llvm_tests. unwrap_or ( false ) ;
1660
+ config. llvm . plugins = llvm_plugins. unwrap_or ( false ) ;
1656
1661
config. rust_optimize = optimize. unwrap_or ( RustOptimize :: Bool ( true ) ) ;
1657
1662
1658
1663
let default = debug == Some ( true ) ;
@@ -1855,7 +1860,7 @@ impl Config {
1855
1860
1856
1861
/// The absolute path to the downloaded LLVM artifacts.
1857
1862
pub ( crate ) fn ci_llvm_root ( & self ) -> PathBuf {
1858
- assert ! ( self . llvm_from_ci ) ;
1863
+ assert ! ( self . llvm . from_ci ) ;
1859
1864
self . out . join ( & * self . build . triple ) . join ( "ci-llvm" )
1860
1865
}
1861
1866
@@ -1870,14 +1875,14 @@ impl Config {
1870
1875
/// If `false`, llvm should be linked statically.
1871
1876
/// This is computed on demand since LLVM might have to first be downloaded from CI.
1872
1877
pub ( crate ) fn llvm_link_shared ( & self ) -> bool {
1873
- let mut opt = self . llvm_link_shared . get ( ) ;
1878
+ let mut opt = self . llvm . link_shared . get ( ) ;
1874
1879
if opt. is_none ( ) && self . dry_run ( ) {
1875
1880
// just assume static for now - dynamic linking isn't supported on all platforms
1876
1881
return false ;
1877
1882
}
1878
1883
1879
1884
let llvm_link_shared = * opt. get_or_insert_with ( || {
1880
- if self . llvm_from_ci {
1885
+ if self . llvm . from_ci {
1881
1886
self . maybe_download_ci_llvm ( ) ;
1882
1887
let ci_llvm = self . ci_llvm_root ( ) ;
1883
1888
let link_type = t ! (
@@ -1891,7 +1896,7 @@ impl Config {
1891
1896
false
1892
1897
}
1893
1898
} ) ;
1894
- self . llvm_link_shared . set ( opt) ;
1899
+ self . llvm . link_shared . set ( opt) ;
1895
1900
llvm_link_shared
1896
1901
}
1897
1902
0 commit comments