about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJorge Aparicio <jorge@japaric.io>2018-08-18 20:16:04 +0200
committerJorge Aparicio <jorge@japaric.io>2018-08-18 20:16:04 +0200
commit4bbedd7dd21f3bb01ec144035918fb29942b9b7d (patch)
tree9d4b1f85be2a7f14cb8662576b9f97e3feee40f3
parentcafeb6f05b95a888267fd525597ec8a3fb737b40 (diff)
downloadrust-4bbedd7dd21f3bb01ec144035918fb29942b9b7d.tar.gz
rust-4bbedd7dd21f3bb01ec144035918fb29942b9b7d.zip
fully implement lld-flavor
-rw-r--r--src/librustc_target/spec/mod.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index 98b20f00265..a6c0fdccd33 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -94,6 +94,29 @@ pub enum LldFlavor {
     Link,
 }
 
+impl LldFlavor {
+    fn from_str(s: &str) -> Option<Self> {
+        Some(match s {
+            "darwin" => LldFlavor::Ld64,
+            "gnu" => LldFlavor::Ld,
+            "link" => LldFlavor::Link,
+            "wasm" => LldFlavor::Wasm,
+            _ => return None,
+        })
+    }
+}
+
+impl ToJson for LldFlavor {
+    fn to_json(&self) -> Json {
+        match *self {
+            LldFlavor::Ld64 => "darwin",
+            LldFlavor::Ld => "gnu",
+            LldFlavor::Link => "link",
+            LldFlavor::Wasm => "wasm",
+        }.to_json()
+    }
+}
+
 impl ToJson for LinkerFlavor {
     fn to_json(&self) -> Json {
         self.desc().to_json()
@@ -860,6 +883,20 @@ impl Target {
                         .map(|s| s.to_string() );
                 }
             } );
+            ($key_name:ident, LldFlavor) => ( {
+                let name = (stringify!($key_name)).replace("_", "-");
+                obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
+                    if let Some(flavor) = LldFlavor::from_str(&s) {
+                        base.options.$key_name = flavor;
+                    } else {
+                        return Some(Err(format!(
+                            "'{}' is not a valid value for lld-flavor. \
+                             Use 'darwin', 'gnu', 'link' or 'wasm.",
+                            s)))
+                    }
+                    Some(Ok(()))
+                })).unwrap_or(Ok(()))
+            } );
             ($key_name:ident, LinkerFlavor) => ( {
                 let name = (stringify!($key_name)).replace("_", "-");
                 obj.find(&name[..]).and_then(|o| o.as_string().map(|s| {
@@ -915,6 +952,7 @@ impl Target {
 
         key!(is_builtin, bool);
         key!(linker, optional);
+        try!(key!(lld_flavor, LldFlavor));
         key!(pre_link_args, link_args);
         key!(pre_link_args_crt, link_args);
         key!(pre_link_objects_exe, list);
@@ -1124,6 +1162,7 @@ impl ToJson for Target {
 
         target_option_val!(is_builtin);
         target_option_val!(linker);
+        target_option_val!(lld_flavor);
         target_option_val!(link_args - pre_link_args);
         target_option_val!(link_args - pre_link_args_crt);
         target_option_val!(pre_link_objects_exe);