Skip to content

Commit b7314c7

Browse files
committed
Actually make rustc_driver compile without llvm
1 parent b43c02b commit b7314c7

File tree

10 files changed

+318
-148
lines changed

10 files changed

+318
-148
lines changed

src/Cargo.lock

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/librustc_driver/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ rustc_privacy = { path = "../librustc_privacy" }
3030
rustc_resolve = { path = "../librustc_resolve" }
3131
rustc_save_analysis = { path = "../librustc_save_analysis" }
3232
rustc_trans = { path = "../librustc_trans", optional = true }
33+
rustc_trans_utils = { path = "../librustc_trans_utils" }
3334
rustc_typeck = { path = "../librustc_typeck" }
3435
serialize = { path = "../libserialize" }
3536
syntax = { path = "../libsyntax" }

src/librustc_driver/driver.rs

+48-26
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ 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(feature="llvm")]
3537
use rustc_trans as trans;
3638
use rustc_typeck as typeck;
3739
use rustc_privacy;
@@ -113,7 +115,8 @@ pub fn compile_input(sess: &Session,
113115
};
114116

115117
let outputs = build_output_filenames(input, outdir, output, &krate.attrs, sess);
116-
let crate_name = link::find_crate_name(Some(sess), &krate.attrs, input);
118+
let crate_name =
119+
::rustc_trans_utils::link::find_crate_name(Some(sess), &krate.attrs, input);
117120
let ExpansionResult { expanded_crate, defs, analysis, resolutions, mut hir_forest } = {
118121
phase_2_configure_and_expand(
119122
sess, &cstore, krate, registry, &crate_name, addl_plugins, control.make_glob_map,
@@ -206,8 +209,12 @@ pub fn compile_input(sess: &Session,
206209
println!("Pre-trans");
207210
tcx.print_debug_stats();
208211
}
212+
213+
#[cfg(feature="llvm")]
209214
let trans = phase_4_translate_to_llvm(tcx, analysis, incremental_hashes_map,
210215
&outputs);
216+
#[cfg(not(feature="llvm"))]
217+
let trans = { panic!("LLVM not supported by this rustc."); () };
211218

212219
if log_enabled!(::log::LogLevel::Info) {
213220
println!("Post-trans");
@@ -225,34 +232,42 @@ pub fn compile_input(sess: &Session,
225232
})??
226233
};
227234

228-
if sess.opts.debugging_opts.print_type_sizes {
229-
sess.code_stats.borrow().print_type_sizes();
230-
}
235+
#[cfg(not(feature="llvm"))]
236+
unreachable!();
231237

232-
let (phase5_result, trans) = phase_5_run_llvm_passes(sess, trans);
238+
#[cfg(feature="llvm")]
239+
{
240+
if sess.opts.debugging_opts.print_type_sizes {
241+
sess.code_stats.borrow().print_type_sizes();
242+
}
233243

234-
controller_entry_point!(after_llvm,
235-
sess,
236-
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
237-
phase5_result);
238-
phase5_result?;
244+
let (phase5_result, trans) = phase_5_run_llvm_passes(sess, trans);
239245

240-
phase_6_link_output(sess, &trans, &outputs);
246+
controller_entry_point!(after_llvm,
247+
sess,
248+
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
249+
phase5_result);
250+
phase5_result?;
241251

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);
252+
phase_6_link_output(sess, &trans, &outputs);
245253

246-
if sess.opts.debugging_opts.perf_stats {
247-
sess.print_perf_stats();
248-
}
254+
// Now that we won't touch anything in the incremental compilation directory
255+
// any more, we can finalize it (which involves renaming it)
256+
rustc_incremental::finalize_session_directory(sess, trans.link.crate_hash);
257+
258+
if sess.opts.debugging_opts.perf_stats {
259+
sess.print_perf_stats();
260+
}
249261

250-
controller_entry_point!(compilation_done,
251-
sess,
252-
CompileState::state_when_compilation_done(input, sess, outdir, output),
253-
Ok(()));
262+
controller_entry_point!(
263+
compilation_done,
264+
sess,
265+
CompileState::state_when_compilation_done(input, sess, outdir, output),
266+
Ok(())
267+
);
254268

255-
Ok(())
269+
Ok(())
270+
}
256271
}
257272

258273
fn keep_hygiene_data(sess: &Session) -> bool {
@@ -360,6 +375,7 @@ pub struct CompileState<'a, 'tcx: 'a> {
360375
pub resolutions: Option<&'a Resolutions>,
361376
pub analysis: Option<&'a ty::CrateAnalysis>,
362377
pub tcx: Option<TyCtxt<'a, 'tcx, 'tcx>>,
378+
#[cfg(feature="llvm")]
363379
pub trans: Option<&'a trans::CrateTranslation>,
364380
}
365381

@@ -386,6 +402,7 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
386402
resolutions: None,
387403
analysis: None,
388404
tcx: None,
405+
#[cfg(feature="llvm")]
389406
trans: None,
390407
}
391408
}
@@ -474,7 +491,7 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
474491
}
475492
}
476493

477-
494+
#[cfg(feature="llvm")]
478495
fn state_after_llvm(input: &'a Input,
479496
session: &'tcx Session,
480497
out_dir: &'a Option<PathBuf>,
@@ -906,6 +923,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
906923
mir::provide(&mut local_providers);
907924
reachable::provide(&mut local_providers);
908925
rustc_privacy::provide(&mut local_providers);
926+
#[cfg(feature="llvm")]
909927
trans::provide(&mut local_providers);
910928
typeck::provide(&mut local_providers);
911929
ty::provide(&mut local_providers);
@@ -918,6 +936,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
918936

919937
let mut extern_providers = ty::maps::Providers::default();
920938
cstore::provide(&mut extern_providers);
939+
#[cfg(feature="llvm")]
921940
trans::provide(&mut extern_providers);
922941
ty::provide_extern(&mut extern_providers);
923942
traits::provide_extern(&mut extern_providers);
@@ -1063,6 +1082,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
10631082

10641083
/// Run the translation phase to LLVM, after which the AST and analysis can
10651084
/// be discarded.
1085+
#[cfg(feature="llvm")]
10661086
pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
10671087
analysis: ty::CrateAnalysis,
10681088
incremental_hashes_map: IncrementalHashesMap,
@@ -1084,6 +1104,7 @@ pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
10841104

10851105
/// Run LLVM itself, producing a bitcode file, assembly file or object file
10861106
/// as a side effect.
1107+
#[cfg(feature="llvm")]
10871108
pub fn phase_5_run_llvm_passes(sess: &Session,
10881109
trans: write::OngoingCrateTranslation)
10891110
-> (CompileResult, trans::CrateTranslation) {
@@ -1102,6 +1123,7 @@ pub fn phase_5_run_llvm_passes(sess: &Session,
11021123

11031124
/// Run the linker on any artifacts that resulted from the LLVM run.
11041125
/// This should produce either a finished executable or library.
1126+
#[cfg(feature="llvm")]
11051127
pub fn phase_6_link_output(sess: &Session,
11061128
trans: &trans::CrateTranslation,
11071129
outputs: &OutputFilenames) {
@@ -1123,7 +1145,7 @@ fn write_out_deps(sess: &Session, outputs: &OutputFilenames, crate_name: &str) {
11231145
match *output_type {
11241146
OutputType::Exe => {
11251147
for output in sess.crate_types.borrow().iter() {
1126-
let p = link::filename_for_input(sess, *output, crate_name, outputs);
1148+
let p = ::rustc_trans_utils::link::filename_for_input(sess, *output, crate_name, outputs);
11271149
out_filenames.push(p);
11281150
}
11291151
}
@@ -1233,15 +1255,15 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<c
12331255
if base.is_empty() {
12341256
base.extend(attr_types);
12351257
if base.is_empty() {
1236-
base.push(link::default_output_for_target(session));
1258+
base.push(::rustc_trans_utils::link::default_output_for_target(session));
12371259
}
12381260
base.sort();
12391261
base.dedup();
12401262
}
12411263

12421264
base.into_iter()
12431265
.filter(|crate_type| {
1244-
let res = !link::invalid_output_for_target(session, *crate_type);
1266+
let res = !rustc_trans_utils::link::invalid_output_for_target(session, *crate_type);
12451267

12461268
if !res {
12471269
session.warn(&format!("dropping unsupported crate type `{}` for target `{}`",

src/librustc_driver/lib.rs

+23-2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern crate rustc_resolve;
5454
extern crate rustc_save_analysis;
5555
#[cfg(feature="llvm")]
5656
extern crate rustc_trans;
57+
extern crate rustc_trans_utils;
5758
extern crate rustc_typeck;
5859
extern crate serialize;
5960
#[macro_use]
@@ -68,7 +69,9 @@ use pretty::{PpMode, UserIdentifiedItem};
6869
use rustc_resolve as resolve;
6970
use rustc_save_analysis as save;
7071
use rustc_save_analysis::DumpHandler;
72+
#[cfg(feature="llvm")]
7173
use rustc_trans::back::link;
74+
#[cfg(feature="llvm")]
7275
use rustc_trans::back::write::{RELOC_MODEL_ARGS, CODE_GEN_MODEL_ARGS};
7376
use rustc::dep_graph::DepGraph;
7477
use rustc::session::{self, config, Session, build_session, CompileResult};
@@ -83,6 +86,8 @@ use rustc::middle::cstore::MetadataLoader;
8386
use rustc_metadata::locator;
8487
use rustc_metadata::cstore::CStore;
8588
use rustc::util::common::{time, ErrorReported};
89+
#[cfg(not(feature="llvm"))]
90+
use rustc_back::target::Target;
8691

8792
use serialize::json::ToJson;
8893

@@ -95,6 +100,8 @@ use std::ffi::OsString;
95100
use std::io::{self, Read, Write};
96101
use std::iter::repeat;
97102
use std::path::PathBuf;
103+
#[cfg(not(feature="llvm"))]
104+
use std::path::Path;
98105
use std::process::{self, Command, Stdio};
99106
use std::rc::Rc;
100107
use std::str;
@@ -112,6 +119,7 @@ pub mod test;
112119

113120
pub mod driver;
114121
pub mod pretty;
122+
#[cfg(feature="llvm")]
115123
pub mod target_features;
116124
mod derive_registrar;
117125

@@ -220,6 +228,7 @@ pub fn run_compiler<'a>(args: &[String],
220228
let (sopts, cfg) = config::build_session_options_and_crate_config(&matches);
221229

222230
if sopts.debugging_opts.debug_llvm {
231+
#[cfg(feature="llvm")]
223232
rustc_trans::enable_llvm_debug();
224233
}
225234

@@ -249,10 +258,12 @@ pub fn run_compiler<'a>(args: &[String],
249258
let mut sess = session::build_session_with_codemap(
250259
sopts, &dep_graph, input_file_path, descriptions, cstore.clone(), codemap, emitter_dest,
251260
);
261+
#[cfg(feature="llvm")]
252262
rustc_trans::init(&sess);
253263
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
254264

255265
let mut cfg = config::build_configuration(&sess, cfg);
266+
#[cfg(feature="llvm")]
256267
target_features::add_configuration(&mut cfg, &sess);
257268
sess.parse_sess.config = cfg;
258269

@@ -528,9 +539,11 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
528539
None,
529540
descriptions.clone(),
530541
cstore.clone());
542+
#[cfg(feature="llvm")]
531543
rustc_trans::init(&sess);
532544
rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
533545
let mut cfg = config::build_configuration(&sess, cfg.clone());
546+
#[cfg(feature="llvm")]
534547
target_features::add_configuration(&mut cfg, &sess);
535548
sess.parse_sess.config = cfg;
536549
let should_stop =
@@ -723,14 +736,14 @@ impl RustcDefaultCalls {
723736
};
724737
let attrs = attrs.as_ref().unwrap();
725738
let t_outputs = driver::build_output_filenames(input, odir, ofile, attrs, sess);
726-
let id = link::find_crate_name(Some(sess), attrs, input);
739+
let id = rustc_trans_utils::link::find_crate_name(Some(sess), attrs, input);
727740
if *req == PrintRequest::CrateName {
728741
println!("{}", id);
729742
continue;
730743
}
731744
let crate_types = driver::collect_crate_types(sess, attrs);
732745
for &style in &crate_types {
733-
let fname = link::filename_for_input(sess, style, &id, &t_outputs);
746+
let fname = rustc_trans_utils::link::filename_for_input(sess, style, &id, &t_outputs);
734747
println!("{}",
735748
fname.file_name()
736749
.unwrap()
@@ -779,20 +792,25 @@ impl RustcDefaultCalls {
779792
}
780793
PrintRequest::RelocationModels => {
781794
println!("Available relocation models:");
795+
#[cfg(features="llvm")]
782796
for &(name, _) in RELOC_MODEL_ARGS.iter() {
783797
println!(" {}", name);
784798
}
785799
println!("");
786800
}
787801
PrintRequest::CodeModels => {
788802
println!("Available code models:");
803+
#[cfg(features="llvm")]
789804
for &(name, _) in CODE_GEN_MODEL_ARGS.iter(){
790805
println!(" {}", name);
791806
}
792807
println!("");
793808
}
794809
PrintRequest::TargetCPUs | PrintRequest::TargetFeatures => {
810+
#[cfg(feature="llvm")]
795811
rustc_trans::print(*req, sess);
812+
#[cfg(not(feature="llvm"))]
813+
panic!("LLVM not supported by this rustc")
796814
}
797815
}
798816
}
@@ -831,6 +849,7 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
831849
println!("commit-date: {}", unw(commit_date_str()));
832850
println!("host: {}", config::host_triple());
833851
println!("release: {}", unw(release_str()));
852+
#[cfg(feature="llvm")]
834853
rustc_trans::print_version();
835854
}
836855
}
@@ -1128,6 +1147,7 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
11281147
}
11291148

11301149
if cg_flags.contains(&"passes=list".to_string()) {
1150+
#[cfg(feature="llvm")]
11311151
rustc_trans::print_passes();
11321152
return None;
11331153
}
@@ -1255,6 +1275,7 @@ pub fn diagnostics_registry() -> errors::registry::Registry {
12551275
all_errors.extend_from_slice(&rustc_borrowck::DIAGNOSTICS);
12561276
all_errors.extend_from_slice(&rustc_resolve::DIAGNOSTICS);
12571277
all_errors.extend_from_slice(&rustc_privacy::DIAGNOSTICS);
1278+
#[cfg(feature="llvm")]
12581279
all_errors.extend_from_slice(&rustc_trans::DIAGNOSTICS);
12591280
all_errors.extend_from_slice(&rustc_const_eval::DIAGNOSTICS);
12601281
all_errors.extend_from_slice(&rustc_metadata::DIAGNOSTICS);

src/librustc_driver/test.rs

+2
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 {

src/librustc_trans/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ rustc_errors = { path = "../librustc_errors" }
2626
rustc_incremental = { path = "../librustc_incremental" }
2727
rustc_llvm = { path = "../librustc_llvm" }
2828
rustc_platform_intrinsics = { path = "../librustc_platform_intrinsics" }
29+
rustc_trans_utils = { path = "../librustc_trans_utils" }
2930
serialize = { path = "../libserialize" }
3031
syntax = { path = "../libsyntax" }
3132
syntax_pos = { path = "../libsyntax_pos" }

0 commit comments

Comments
 (0)