]> git.lizzy.rs Git - rust.git/commitdiff
fully implement lld-flavor
authorJorge Aparicio <jorge@japaric.io>
Sat, 18 Aug 2018 18:16:04 +0000 (20:16 +0200)
committerJorge Aparicio <jorge@japaric.io>
Sat, 18 Aug 2018 18:16:04 +0000 (20:16 +0200)
src/librustc_target/spec/mod.rs

index 98b20f00265e8ef28e1f1dba0bac11371e646e07..a6c0fdccd332756ac2e173a2c1dbf797aa918ac2 100644 (file)
@@ -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 @@ macro_rules! key {
                         .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 @@ macro_rules! key {
 
         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 @@ macro_rules! target_option_val {
 
         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);