From b0302806680da26e686ce6f0432044fcbdb4b373 Mon Sep 17 00:00:00 2001 From: Ana-Maria Date: Tue, 18 Feb 2020 15:36:05 +0000 Subject: [PATCH 1/2] Blacklist powerpc-unknown-linux-gnu as having non-ignored GNU C ZSTs. --- src/librustc/ty/layout.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index e8bf2eb9a12c9..753808bc25492 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -2547,6 +2547,8 @@ where target.target_os == "linux" && target.arch == "s390x" && target.target_env == "gnu"; let linux_sparc64 = target.target_os == "linux" && target.arch == "sparc64" && target.target_env == "gnu"; + let linux_powerpc = + target.target_os == "linux" && target.arch == "powerpc" && target.target_env == "gnu"; let rust_abi = match sig.abi { RustIntrinsic | PlatformIntrinsic | Rust | RustCall => true, _ => false, @@ -2617,9 +2619,12 @@ where if arg.layout.is_zst() { // For some forsaken reason, x86_64-pc-windows-gnu // doesn't ignore zero-sized struct arguments. - // The same is true for s390x-unknown-linux-gnu - // and sparc64-unknown-linux-gnu. - if is_return || rust_abi || (!win_x64_gnu && !linux_s390x && !linux_sparc64) { + // The same is true for s390x-unknown-linux-gnu, + // sparc64-unknown-linux-gnu and powerpc-unknown-linux-gnu. + if is_return + || rust_abi + || (!win_x64_gnu && !linux_s390x && !linux_sparc64 && !linux_powerpc) + { arg.mode = PassMode::Ignore; } } From 162d72727ecfad4d75c2564f84abc73212aa7f27 Mon Sep 17 00:00:00 2001 From: Ana-Maria Date: Mon, 24 Feb 2020 15:51:08 +0000 Subject: [PATCH 2/2] Also blacklist powerpc-unknown-linux-musl. --- src/librustc/ty/layout.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index 753808bc25492..950234cc19b54 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -2541,14 +2541,15 @@ where }; let target = &cx.tcx().sess.target.target; + let target_env_gnu_like = matches!(&target.target_env[..], "gnu" | "musl"); let win_x64_gnu = target.target_os == "windows" && target.arch == "x86_64" && target.target_env == "gnu"; - let linux_s390x = - target.target_os == "linux" && target.arch == "s390x" && target.target_env == "gnu"; - let linux_sparc64 = - target.target_os == "linux" && target.arch == "sparc64" && target.target_env == "gnu"; - let linux_powerpc = - target.target_os == "linux" && target.arch == "powerpc" && target.target_env == "gnu"; + let linux_s390x_gnu_like = + target.target_os == "linux" && target.arch == "s390x" && target_env_gnu_like; + let linux_sparc64_gnu_like = + target.target_os == "linux" && target.arch == "sparc64" && target_env_gnu_like; + let linux_powerpc_gnu_like = + target.target_os == "linux" && target.arch == "powerpc" && target_env_gnu_like; let rust_abi = match sig.abi { RustIntrinsic | PlatformIntrinsic | Rust | RustCall => true, _ => false, @@ -2619,11 +2620,13 @@ where if arg.layout.is_zst() { // For some forsaken reason, x86_64-pc-windows-gnu // doesn't ignore zero-sized struct arguments. - // The same is true for s390x-unknown-linux-gnu, - // sparc64-unknown-linux-gnu and powerpc-unknown-linux-gnu. + // The same is true for {s390x,sparc64,powerpc}-unknown-linux-{gnu,musl}. if is_return || rust_abi - || (!win_x64_gnu && !linux_s390x && !linux_sparc64 && !linux_powerpc) + || (!win_x64_gnu + && !linux_s390x_gnu_like + && !linux_sparc64_gnu_like + && !linux_powerpc_gnu_like) { arg.mode = PassMode::Ignore; }