|
37 | 37 | usecrate::abi::call::Conv; |
38 | 38 | usecrate::abi::{Endian,Integer,Size,TargetDataLayout,TargetDataLayoutErrors}; |
39 | 39 | usecrate::json::{Json,ToJson}; |
40 | | -usecrate::spec::abi::{lookup as lookup_abi,Abi}; |
| 40 | +usecrate::spec::abi::Abi; |
41 | 41 | usecrate::spec::crt_objects::CrtObjects; |
42 | 42 | use rustc_fs_util::try_canonicalize; |
43 | 43 | use rustc_serialize::{Decodable,Decoder,Encodable,Encoder}; |
@@ -1915,6 +1915,19 @@ impl HasTargetSpec for Target { |
1915 | 1915 | } |
1916 | 1916 | } |
1917 | 1917 |
|
| 1918 | +/// Which C ABI to use for `wasm32-unknown-unknown`. |
| 1919 | +#[derive(Debug,Copy,Clone,Hash,PartialEq,Eq)] |
| 1920 | +pubenumWasmCAbi{ |
| 1921 | +/// Spec-compliant C ABI. |
| 1922 | +Spec, |
| 1923 | +/// Legacy ABI. Which is non-spec-compliant. |
| 1924 | +Legacy, |
| 1925 | +} |
| 1926 | + |
| 1927 | +pubtraitHasWasmCAbiOpt{ |
| 1928 | +fnwasm_c_abi_opt(&self) -> WasmCAbi; |
| 1929 | +} |
| 1930 | + |
1918 | 1931 | typeStaticCow<T> = Cow<'static,T>; |
1919 | 1932 |
|
1920 | 1933 | /// Optional aspects of a target specification. |
@@ -2273,9 +2286,6 @@ pub struct TargetOptions { |
2273 | 2286 | /// distributed with the target, the sanitizer should still appear in this list for the target. |
2274 | 2287 | pubsupported_sanitizers:SanitizerSet, |
2275 | 2288 |
|
2276 | | -/// If present it's a default value to use for adjusting the C ABI. |
2277 | | -pubdefault_adjusted_cabi:Option<Abi>, |
2278 | | - |
2279 | 2289 | /// Minimum number of bits in #[repr(C)] enum. Defaults to the size of c_int |
2280 | 2290 | pubc_enum_min_bits:Option<u64>, |
2281 | 2291 |
|
@@ -2507,7 +2517,6 @@ impl Default for TargetOptions { |
2507 | 2517 | // `Off` is supported by default, but targets can remove this manually, e.g. Windows. |
2508 | 2518 | supported_split_debuginfo:Cow::Borrowed(&[SplitDebuginfo::Off]), |
2509 | 2519 | supported_sanitizers:SanitizerSet::empty(), |
2510 | | -default_adjusted_cabi:None, |
2511 | 2520 | c_enum_min_bits:None, |
2512 | 2521 | generate_arange_section:true, |
2513 | 2522 | supports_stack_protector:true, |
@@ -2538,9 +2547,21 @@ impl DerefMut for Target { |
2538 | 2547 |
|
2539 | 2548 | implTarget{ |
2540 | 2549 | /// Given a function ABI, turn it into the correct ABI for this target. |
2541 | | -pubfnadjust_abi(&self,abi:Abi,c_variadic:bool) -> Abi{ |
| 2550 | +pubfnadjust_abi<C>(&self,cx:&C,abi:Abi,c_variadic:bool) -> Abi |
| 2551 | +where |
| 2552 | +C:HasWasmCAbiOpt, |
| 2553 | +{ |
2542 | 2554 | match abi { |
2543 | | -Abi::C{ .. } => self.default_adjusted_cabi.unwrap_or(abi), |
| 2555 | +Abi::C{ .. } => { |
| 2556 | +ifself.arch == "wasm32" |
| 2557 | + && self.os == "unknown" |
| 2558 | + && cx.wasm_c_abi_opt() == WasmCAbi::Legacy |
| 2559 | +{ |
| 2560 | +Abi::Wasm |
| 2561 | +}else{ |
| 2562 | + abi |
| 2563 | +} |
| 2564 | +} |
2544 | 2565 |
|
2545 | 2566 | // On Windows, `extern "system"` behaves like msvc's `__stdcall`. |
2546 | 2567 | // `__stdcall` only applies on x86 and on non-variadic functions: |
@@ -3079,16 +3100,6 @@ impl Target { |
3079 | 3100 | } |
3080 | 3101 | } |
3081 | 3102 | }); |
3082 | | -($key_name:ident,Option<Abi>) => ({ |
3083 | | -let name = (stringify!($key_name)).replace("_","-"); |
3084 | | - obj.remove(&name).and_then(|o| o.as_str().and_then(|s| { |
3085 | | -match lookup_abi(s){ |
3086 | | -Ok(abi) => base.$key_name = Some(abi), |
3087 | | - _ => returnSome(Err(format!("'{}' is not a valid value for abi", s))), |
3088 | | -} |
3089 | | -Some(Ok(())) |
3090 | | -})).unwrap_or(Ok(())) |
3091 | | -}); |
3092 | 3103 | ($key_name:ident,TargetFamilies) => ({ |
3093 | 3104 | ifletSome(value) = obj.remove("target-family"){ |
3094 | 3105 | ifletSome(v) = value.as_array(){ |
@@ -3238,7 +3249,6 @@ impl Target { |
3238 | 3249 | key!(split_debuginfo,SplitDebuginfo)?; |
3239 | 3250 | key!(supported_split_debuginfo, fallible_list)?; |
3240 | 3251 | key!(supported_sanitizers,SanitizerSet)?; |
3241 | | -key!(default_adjusted_cabi,Option<Abi>)?; |
3242 | 3252 | key!(generate_arange_section,bool); |
3243 | 3253 | key!(supports_stack_protector,bool); |
3244 | 3254 | key!(entry_name); |
@@ -3502,10 +3512,6 @@ impl ToJson for Target { |
3502 | 3512 | target_option_val!(entry_abi); |
3503 | 3513 | target_option_val!(supports_xray); |
3504 | 3514 |
|
3505 | | -ifletSome(abi) = self.default_adjusted_cabi{ |
3506 | | - d.insert("default-adjusted-cabi".into(),Abi::name(abi).to_json()); |
3507 | | -} |
3508 | | - |
3509 | 3515 | // Serializing `-Clink-self-contained` needs a dynamic key to support the |
3510 | 3516 | // backwards-compatible variants. |
3511 | 3517 | d.insert(self.link_self_contained.json_key().into(),self.link_self_contained.to_json()); |
|
0 commit comments