Auto merge of #117919 - daxpedda:wasm-c-abi, r=wesleywiser · rust-lang/rust@13e63f7 (original) (raw)

`@@ -37,7 +37,7 @@

`

37

37

`use crate::abi:🤙:Conv;

`

38

38

`use crate::abi::{Endian, Integer, Size, TargetDataLayout, TargetDataLayoutErrors};

`

39

39

`use crate::json::{Json, ToJson};

`

40

``

`-

use crate::spec::abi::{lookup as lookup_abi, Abi};

`

``

40

`+

use crate::spec::abi::Abi;

`

41

41

`use crate::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

`+

pub enum WasmCAbi {

`

``

1921

`+

/// Spec-compliant C ABI.

`

``

1922

`+

Spec,

`

``

1923

`+

/// Legacy ABI. Which is non-spec-compliant.

`

``

1924

`+

Legacy,

`

``

1925

`+

}

`

``

1926

+

``

1927

`+

pub trait HasWasmCAbiOpt {

`

``

1928

`+

fn wasm_c_abi_opt(&self) -> WasmCAbi;

`

``

1929

`+

}

`

``

1930

+

1918

1931

`type StaticCow = 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

`pub supported_sanitizers: SanitizerSet,

`

2275

2288

``

2276

``

`-

/// If present it's a default value to use for adjusting the C ABI.

`

2277

``

`-

pub default_adjusted_cabi: Option,

`

2278

``

-

2279

2289

`/// Minimum number of bits in #[repr(C)] enum. Defaults to the size of c_int

`

2280

2290

`pub c_enum_min_bits: Option,

`

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

`impl Target {

`

2540

2549

`/// Given a function ABI, turn it into the correct ABI for this target.

`

2541

``

`-

pub fn adjust_abi(&self, abi: Abi, c_variadic: bool) -> Abi {

`

``

2550

`+

pub fn adjust_abi(&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

`+

if self.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) => ( {

`

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

``

`-

_ => return Some(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

`if let Some(value) = obj.remove("target-family") {

`

3094

3105

`if let Some(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)?;

`

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

``

`-

if let Some(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());

`