about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJonathan Creekmore <jonathan@thecreekmores.org>2016-07-26 17:44:27 -0700
committerDoug Goldstein <cardoe@cardoe.com>2016-07-27 10:29:43 -0700
commit54c61ff959de5f79afe59ba5051b087aed220408 (patch)
tree1cdf4f1ad14e158da0f5324701ac92a3a7def000 /src
parentbd194a77d57c5487baf1f9bb169e44dd844235e6 (diff)
librustc_back: filter targets for only valid ones
Since we can know which targets are instantiable on a particular host,
it does not make sense to list invalid targets in the target print code.
Filter the list of targets to only include the targets that can be
instantiated.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_back/target/mod.rs10
-rw-r--r--src/librustc_driver/lib.rs2
2 files changed, 10 insertions, 2 deletions
diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs
index 84cb6c9ba7d..f5314809228 100644
--- a/src/librustc_back/target/mod.rs
+++ b/src/librustc_back/target/mod.rs
@@ -71,7 +71,7 @@ macro_rules! supported_targets {
         $(mod $module;)*
 
         /// List of supported targets
-        pub const TARGETS: &'static [&'static str] = &[$($triple),*];
+        const TARGETS: &'static [&'static str] = &[$($triple),*];
 
         fn load_specific(target: &str) -> TargetResult {
             match target {
@@ -91,6 +91,14 @@ macro_rules! supported_targets {
             }
         }
 
+        pub fn get_targets() -> Box<Iterator<Item=String>> {
+            Box::new(TARGETS.iter().filter_map(|t| -> Option<String> {
+                load_specific(t)
+                    .map(|t| t.llvm_target)
+                    .ok()
+            }))
+        }
+
         #[cfg(test)]
         mod test_json_encode_decode {
             use serialize::json::ToJson;
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 0a8df923b84..eff920608dc 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -609,7 +609,7 @@ impl RustcDefaultCalls {
         for req in &sess.opts.prints {
             match *req {
                 PrintRequest::TargetList => {
-                    let mut targets = rustc_back::target::TARGETS.to_vec();
+                    let mut targets = rustc_back::target::get_targets().collect::<Vec<String>>();
                     targets.sort();
                     println!("{}", targets.join("\n"));
                 },