Skip to content

Commit 2e2501b

Browse files
committed
Make rustc compile without LLVM
Doesn't yet compile when `llvm-enabled = false` due to crate metadata loading needing LLVM
1 parent ed78ac1 commit 2e2501b

File tree

11 files changed

+255
-162
lines changed

11 files changed

+255
-162
lines changed

src/librustc_driver/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ rustc_plugin = { path = "../librustc_plugin" }
2929
rustc_privacy = { path = "../librustc_privacy" }
3030
rustc_resolve = { path = "../librustc_resolve" }
3131
rustc_save_analysis = { path = "../librustc_save_analysis" }
32-
rustc_trans = { path = "../librustc_trans" }
32+
rustc_trans = { path = "../librustc_trans", optional=true }
3333
rustc_typeck = { path = "../librustc_typeck" }
3434
serialize = { path = "../libserialize" }
3535
syntax = { path = "../libsyntax" }
3636
syntax_ext = { path = "../libsyntax_ext" }
3737
syntax_pos = { path = "../libsyntax_pos" }
38+
39+
[features]
40+
llvm = ["rustc_trans"]

src/librustc_driver/driver.rs

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ use rustc_incremental::{self, IncrementalHashesMap};
3131
use rustc_resolve::{MakeGlobMap, Resolver};
3232
use rustc_metadata::creader::CrateLoader;
3333
use rustc_metadata::cstore::{self, CStore};
34+
#[cfg(feature="llvm")]
3435
use rustc_trans::back::{link, write};
36+
#[cfg(not(feature="llvm"))]
37+
use ::link;
38+
#[cfg(feature="llvm")]
3539
use rustc_trans as trans;
3640
use rustc_typeck as typeck;
3741
use rustc_privacy;
@@ -111,7 +115,7 @@ pub fn compile_input(sess: &Session,
111115
};
112116

113117
let outputs = build_output_filenames(input, outdir, output, &krate.attrs, sess);
114-
let crate_name = link::find_crate_name(Some(sess), &krate.attrs, input);
118+
let crate_name: String = link::find_crate_name(Some(sess), &krate.attrs, input);
115119
let ExpansionResult { expanded_crate, defs, analysis, resolutions, mut hir_forest } = {
116120
phase_2_configure_and_expand(
117121
sess, &cstore, krate, registry, &crate_name, addl_plugins, control.make_glob_map,
@@ -204,55 +208,71 @@ pub fn compile_input(sess: &Session,
204208
println!("Pre-trans");
205209
tcx.print_debug_stats();
206210
}
207-
let trans = phase_4_translate_to_llvm(tcx, analysis, &incremental_hashes_map,
208-
&outputs);
209211

210-
if log_enabled!(::log::LogLevel::Info) {
211-
println!("Post-trans");
212-
tcx.print_debug_stats();
213-
}
212+
#[cfg(feature="llvm")]
213+
{
214+
let trans = phase_4_translate_to_llvm(tcx, analysis, &incremental_hashes_map,
215+
&outputs);
216+
217+
if log_enabled!(::log::LogLevel::Info) {
218+
println!("Post-trans");
219+
tcx.print_debug_stats();
220+
}
214221

215-
if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
216-
if let Err(e) = mir::transform::dump_mir::emit_mir(tcx, &outputs) {
217-
sess.err(&format!("could not emit MIR: {}", e));
218-
sess.abort_if_errors();
222+
if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
223+
if let Err(e) = mir::transform::dump_mir::emit_mir(tcx, &outputs) {
224+
sess.err(&format!("could not emit MIR: {}", e));
225+
sess.abort_if_errors();
226+
}
219227
}
228+
229+
return Ok((outputs, trans))
220230
}
221231

222-
Ok((outputs, trans))
232+
#[cfg(not(feature="llvm"))]
233+
panic!("Unreachable")
223234
})??
224235
};
225236

226237
if sess.opts.debugging_opts.print_type_sizes {
227238
sess.code_stats.borrow().print_type_sizes();
228239
}
229240

230-
let phase5_result = phase_5_run_llvm_passes(sess, &trans, &outputs);
241+
#[cfg(feature="llvm")]
242+
{
243+
let phase5_result = phase_5_run_llvm_passes(sess, &trans, &outputs);
231244

232-
controller_entry_point!(after_llvm,
233-
sess,
234-
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
235-
phase5_result);
236-
phase5_result?;
245+
controller_entry_point!(after_llvm,
246+
sess,
247+
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
248+
phase5_result);
249+
phase5_result?;
237250

238-
write::cleanup_llvm(&trans);
251+
write::cleanup_llvm(&trans);
239252

240-
phase_6_link_output(sess, &trans, &outputs);
253+
phase_6_link_output(sess, &trans, &outputs);
241254

242-
// Now that we won't touch anything in the incremental compilation directory
243-
// any more, we can finalize it (which involves renaming it)
244-
rustc_incremental::finalize_session_directory(sess, trans.link.crate_hash);
255+
// Now that we won't touch anything in the incremental compilation directory
256+
// any more, we can finalize it (which involves renaming it)
257+
rustc_incremental::finalize_session_directory(sess, trans.link.crate_hash);
245258

246-
if sess.opts.debugging_opts.perf_stats {
247-
sess.print_perf_stats();
248-
}
259+
if sess.opts.debugging_opts.perf_stats {
260+
sess.print_perf_stats();
261+
}
262+
263+
controller_entry_point!(compilation_done,
264+
sess,
265+
CompileState::state_when_compilation_done(input,
266+
sess,
267+
outdir,
268+
output),
269+
Ok(()));
249270

250-
controller_entry_point!(compilation_done,
251-
sess,
252-
CompileState::state_when_compilation_done(input, sess, outdir, output),
253-
Ok(()));
271+
return Ok(())
272+
}
254273

255-
Ok(())
274+
#[cfg(not(feature="llvm"))]
275+
panic!("Unreachable")
256276
}
257277

258278
fn keep_hygiene_data(sess: &Session) -> bool {
@@ -355,6 +375,7 @@ pub struct CompileState<'a, 'tcx: 'a> {
355375
pub resolutions: Option<&'a Resolutions>,
356376
pub analysis: Option<&'a ty::CrateAnalysis>,
357377
pub tcx: Option<TyCtxt<'a, 'tcx, 'tcx>>,
378+
#[cfg(feature="llvm")]
358379
pub trans: Option<&'a trans::CrateTranslation>,
359380
}
360381

@@ -381,6 +402,7 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
381402
resolutions: None,
382403
analysis: None,
383404
tcx: None,
405+
#[cfg(feature="llvm")]
384406
trans: None,
385407
}
386408
}
@@ -470,6 +492,7 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
470492
}
471493

472494

495+
#[cfg(feature="llvm")]
473496
fn state_after_llvm(input: &'a Input,
474497
session: &'tcx Session,
475498
out_dir: &'a Option<PathBuf>,
@@ -893,6 +916,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
893916
mir::provide(&mut local_providers);
894917
reachable::provide(&mut local_providers);
895918
rustc_privacy::provide(&mut local_providers);
919+
#[cfg(feature="llvm")]
896920
trans::provide(&mut local_providers);
897921
typeck::provide(&mut local_providers);
898922
ty::provide(&mut local_providers);
@@ -904,6 +928,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
904928

905929
let mut extern_providers = ty::maps::Providers::default();
906930
cstore::provide(&mut extern_providers);
931+
#[cfg(feature="llvm")]
907932
trans::provide(&mut extern_providers);
908933
ty::provide_extern(&mut extern_providers);
909934
traits::provide_extern(&mut extern_providers);
@@ -1045,6 +1070,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
10451070

10461071
/// Run the translation phase to LLVM, after which the AST and analysis can
10471072
/// be discarded.
1073+
#[cfg(feature="llvm")]
10481074
pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
10491075
analysis: ty::CrateAnalysis,
10501076
incremental_hashes_map: &IncrementalHashesMap,
@@ -1076,6 +1102,7 @@ pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
10761102

10771103
/// Run LLVM itself, producing a bitcode file, assembly file or object file
10781104
/// as a side effect.
1105+
#[cfg(feature="llvm")]
10791106
pub fn phase_5_run_llvm_passes(sess: &Session,
10801107
trans: &trans::CrateTranslation,
10811108
outputs: &OutputFilenames) -> CompileResult {
@@ -1124,6 +1151,7 @@ pub fn phase_5_run_llvm_passes(sess: &Session,
11241151

11251152
/// Run the linker on any artifacts that resulted from the LLVM run.
11261153
/// This should produce either a finished executable or library.
1154+
#[cfg(feature="llvm")]
11271155
pub fn phase_6_link_output(sess: &Session,
11281156
trans: &trans::CrateTranslation,
11291157
outputs: &OutputFilenames) {

src/librustc_driver/lib.rs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ extern crate rustc_metadata;
4848
extern crate rustc_mir;
4949
extern crate rustc_resolve;
5050
extern crate rustc_save_analysis;
51+
#[cfg(feature="llvm")]
5152
extern crate rustc_trans;
5253
extern crate rustc_typeck;
5354
extern crate serialize;
@@ -63,7 +64,9 @@ use pretty::{PpMode, UserIdentifiedItem};
6364
use rustc_resolve as resolve;
6465
use rustc_save_analysis as save;
6566
use rustc_save_analysis::DumpHandler;
67+
#[cfg(feature="llvm")]
6668
use rustc_trans::back::link;
69+
#[cfg(feature="llvm")]
6770
use rustc_trans::back::write::{RELOC_MODEL_ARGS, CODE_GEN_MODEL_ARGS};
6871
use rustc::dep_graph::DepGraph;
6972
use rustc::session::{self, config, Session, build_session, CompileResult};
@@ -175,6 +178,7 @@ pub fn run_compiler<'a>(args: &[String],
175178
let (sopts, cfg) = config::build_session_options_and_crate_config(&matches);
176179

177180
if sopts.debugging_opts.debug_llvm {
181+
#[cfg(feature="llvm")]
178182
rustc_trans::enable_llvm_debug();
179183
}
180184

@@ -204,6 +208,7 @@ pub fn run_compiler<'a>(args: &[String],
204208
let mut sess = session::build_session_with_codemap(
205209
sopts, &dep_graph, input_file_path, descriptions, cstore.clone(), codemap, emitter_dest,
206210
);
211+
#[cfg(feature="llvm")]
207212
rustc_trans::init(&sess);
208213
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
209214

@@ -409,6 +414,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
409414
None,
410415
descriptions.clone(),
411416
cstore.clone());
417+
#[cfg(feature="llvm")]
412418
rustc_trans::init(&sess);
413419
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
414420
let mut cfg = config::build_configuration(&sess, cfg.clone());
@@ -607,7 +613,7 @@ impl RustcDefaultCalls {
607613
};
608614
let attrs = attrs.as_ref().unwrap();
609615
let t_outputs = driver::build_output_filenames(input, odir, ofile, attrs, sess);
610-
let id = link::find_crate_name(Some(sess), attrs, input);
616+
let id: String = link::find_crate_name(Some(sess), attrs, input);
611617
if *req == PrintRequest::CrateName {
612618
println!("{}", id);
613619
continue;
@@ -662,20 +668,36 @@ impl RustcDefaultCalls {
662668
}
663669
}
664670
PrintRequest::RelocationModels => {
665-
println!("Available relocation models:");
666-
for &(name, _) in RELOC_MODEL_ARGS.iter() {
667-
println!(" {}", name);
671+
#[cfg(not(feature="llvm"))]
672+
panic!("LLVM is not enabled for this rustc version");
673+
674+
#[cfg(feature="llvm")]
675+
{
676+
println!("Available relocation models:");
677+
for &(name, _) in RELOC_MODEL_ARGS.iter() {
678+
println!(" {}", name);
679+
}
680+
println!("");
668681
}
669-
println!("");
670682
}
671683
PrintRequest::CodeModels => {
672-
println!("Available code models:");
673-
for &(name, _) in CODE_GEN_MODEL_ARGS.iter(){
674-
println!(" {}", name);
684+
#[cfg(not(feature="llvm"))]
685+
panic!("LLVM is not enabled for this rustc version");
686+
687+
#[cfg(feature="llvm")]
688+
{
689+
println!("Available code models:");
690+
for &(name, _) in CODE_GEN_MODEL_ARGS.iter(){
691+
println!(" {}", name);
692+
}
693+
println!("");
675694
}
676-
println!("");
677695
}
678696
PrintRequest::TargetCPUs | PrintRequest::TargetFeatures => {
697+
#[cfg(not(feature="llvm"))]
698+
panic!("LLVM is not enabled for this rustc version");
699+
700+
#[cfg(feature="llvm")]
679701
rustc_trans::print(*req, sess);
680702
}
681703
}
@@ -715,6 +737,7 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
715737
println!("commit-date: {}", unw(commit_date_str()));
716738
println!("host: {}", config::host_triple());
717739
println!("release: {}", unw(release_str()));
740+
#[cfg(feature="llvm")]
718741
rustc_trans::print_version();
719742
}
720743
}
@@ -1008,6 +1031,10 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
10081031
}
10091032

10101033
if cg_flags.contains(&"passes=list".to_string()) {
1034+
#[cfg(not(feature="llvm"))]
1035+
panic!("LLVM is not enabled for this rustc version");
1036+
1037+
#[cfg(feature="llvm")]
10111038
rustc_trans::print_passes();
10121039
return None;
10131040
}
@@ -1135,6 +1162,7 @@ pub fn diagnostics_registry() -> errors::registry::Registry {
11351162
all_errors.extend_from_slice(&rustc_borrowck::DIAGNOSTICS);
11361163
all_errors.extend_from_slice(&rustc_resolve::DIAGNOSTICS);
11371164
all_errors.extend_from_slice(&rustc_privacy::DIAGNOSTICS);
1165+
#[cfg(feature="llvm")]
11381166
all_errors.extend_from_slice(&rustc_trans::DIAGNOSTICS);
11391167
all_errors.extend_from_slice(&rustc_const_eval::DIAGNOSTICS);
11401168
all_errors.extend_from_slice(&rustc_metadata::DIAGNOSTICS);
@@ -1159,3 +1187,9 @@ pub fn main() {
11591187
None));
11601188
process::exit(result as i32);
11611189
}
1190+
1191+
1192+
#[cfg(not(feature="llvm"))]
1193+
mod link {
1194+
include!("../librustc_trans/back/no_llvm_link.rs");
1195+
}

src/librustc_driver/target_features.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use syntax::ast;
1212
use rustc::session::Session;
1313
use syntax::symbol::Symbol;
14+
#[cfg(feature="llvm")]
1415
use rustc_trans;
1516

1617
/// Add `target_feature = "..."` cfgs for a variety of platform
@@ -21,6 +22,7 @@ use rustc_trans;
2122
pub fn add_configuration(cfg: &mut ast::CrateConfig, sess: &Session) {
2223
let tf = Symbol::intern("target_feature");
2324

25+
#[cfg(feature="llvm")]
2426
for feat in rustc_trans::target_features(sess) {
2527
cfg.insert((tf, Some(feat)));
2628
}

src/librustc_driver/test.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use driver;
1414
use rustc::dep_graph::DepGraph;
1515
use rustc_lint;
1616
use rustc_resolve::MakeGlobMap;
17+
#[cfg(feature="llvm")]
1718
use rustc_trans;
1819
use rustc::middle::lang_items;
1920
use rustc::middle::free_region::FreeRegionMap;
@@ -113,6 +114,7 @@ fn test_env<F>(source_string: &str,
113114
diagnostic_handler,
114115
Rc::new(CodeMap::new(FilePathMapping::empty())),
115116
cstore.clone());
117+
#[cfg(feature="llvm")]
116118
rustc_trans::init(&sess);
117119
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
118120
let input = config::Input::Str {

0 commit comments

Comments
 (0)