From 23f3f224245c6163447678d588c43b44c5c6e710 Mon Sep 17 00:00:00 2001 From: Jens Reidel Date: Sun, 20 Jul 2025 11:23:27 +0200 Subject: [PATCH 1/2] Add powerpc64-unknown-linux-gnuelfv2 target This is virtually the same target as the existing -gnu target, but using the ELFv2 ABI instead of the ELFv1 ABI and made possible now that we expose target_abi = "elfv1" or "elfv2" on the 64-bit PowerPC targets. Signed-off-by: Jens Reidel --- compiler/rustc_target/src/spec/mod.rs | 1 + .../powerpc64_unknown_linux_gnuelfv2.rs | 29 +++++++++++ src/bootstrap/src/core/sanity.rs | 1 + src/doc/rustc/src/SUMMARY.md | 1 + src/doc/rustc/src/platform-support.md | 1 + .../powerpc64-unknown-linux-gnuelfv2.md | 50 +++++++++++++++++++ tests/assembly/targets/targets-elf.rs | 3 ++ 7 files changed, 86 insertions(+) create mode 100644 compiler/rustc_target/src/spec/targets/powerpc64_unknown_linux_gnuelfv2.rs create mode 100644 src/doc/rustc/src/platform-support/powerpc64-unknown-linux-gnuelfv2.md diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 4bc0d88a910cb..ee603a274912b 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -1781,6 +1781,7 @@ supported_targets! { ("powerpc-unknown-linux-muslspe", powerpc_unknown_linux_muslspe), ("powerpc64-ibm-aix", powerpc64_ibm_aix), ("powerpc64-unknown-linux-gnu", powerpc64_unknown_linux_gnu), + ("powerpc64-unknown-linux-gnuelfv2", powerpc64_unknown_linux_gnuelfv2), ("powerpc64-unknown-linux-musl", powerpc64_unknown_linux_musl), ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu), ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl), diff --git a/compiler/rustc_target/src/spec/targets/powerpc64_unknown_linux_gnuelfv2.rs b/compiler/rustc_target/src/spec/targets/powerpc64_unknown_linux_gnuelfv2.rs new file mode 100644 index 0000000000000..daaa8eb87bd96 --- /dev/null +++ b/compiler/rustc_target/src/spec/targets/powerpc64_unknown_linux_gnuelfv2.rs @@ -0,0 +1,29 @@ +use rustc_abi::Endian; + +use crate::spec::{ + Cc, LinkerFlavor, Lld, StackProbeType, Target, TargetMetadata, TargetOptions, base, +}; + +pub(crate) fn target() -> Target { + let mut base = base::linux_gnu::opts(); + base.cpu = "ppc64".into(); + base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); + base.max_atomic_width = Some(64); + base.stack_probes = StackProbeType::Inline; + base.abi = "elfv2".into(); + base.llvm_abiname = "elfv2".into(); + + Target { + llvm_target: "powerpc64-unknown-linux-gnu".into(), + metadata: TargetMetadata { + description: Some("PPC64 Linux (ELFv2 ABI, kernel 3.2, glibc 2.17)".into()), + tier: Some(3), + host_tools: Some(false), + std: Some(true), + }, + pointer_width: 64, + data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(), + arch: "powerpc64".into(), + options: TargetOptions { endian: Endian::Big, mcount: "_mcount".into(), ..base }, + } +} diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index b39d464493e56..2359dbd51493e 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -34,6 +34,7 @@ pub struct Finder { // Targets can be removed from this list once they are present in the stage0 compiler (usually by updating the beta compiler of the bootstrap). const STAGE0_MISSING_TARGETS: &[&str] = &[ // just a dummy comment so the list doesn't get onelined + "powerpc64-unknown-linux-gnuelfv2", ]; /// Minimum version threshold for libstdc++ required when using prebuilt LLVM diff --git a/src/doc/rustc/src/SUMMARY.md b/src/doc/rustc/src/SUMMARY.md index 7c688e32bc0dd..484d8db49ef01 100644 --- a/src/doc/rustc/src/SUMMARY.md +++ b/src/doc/rustc/src/SUMMARY.md @@ -94,6 +94,7 @@ - [powerpc-unknown-linux-gnuspe](platform-support/powerpc-unknown-linux-gnuspe.md) - [powerpc-unknown-linux-muslspe](platform-support/powerpc-unknown-linux-muslspe.md) - [powerpc64-ibm-aix](platform-support/aix.md) + - [powerpc64-unknown-linux-gnuelfv2](platform-support/powerpc64-unknown-linux-gnuelfv2.md) - [powerpc64-unknown-linux-musl](platform-support/powerpc64-unknown-linux-musl.md) - [powerpc64le-unknown-linux-gnu](platform-support/powerpc64le-unknown-linux-gnu.md) - [powerpc64le-unknown-linux-musl](platform-support/powerpc64le-unknown-linux-musl.md) diff --git a/src/doc/rustc/src/platform-support.md b/src/doc/rustc/src/platform-support.md index 65b7063015388..8cee2f67d09b9 100644 --- a/src/doc/rustc/src/platform-support.md +++ b/src/doc/rustc/src/platform-support.md @@ -360,6 +360,7 @@ target | std | host | notes [`powerpc-wrs-vxworks-spe`](platform-support/vxworks.md) | ✓ | | [`powerpc64-ibm-aix`](platform-support/aix.md) | ? | | 64-bit AIX (7.2 and newer) [`powerpc64-unknown-freebsd`](platform-support/freebsd.md) | ✓ | ✓ | PPC64 FreeBSD (ELFv2) +[`powerpc64-unknown-linux-gnuelfv2`](platform-support/powerpc64-unknown-linux-gnuelfv2.md) | ✓ | ✓ | PPC64 Linux (ELFv2 ABI, kernel 3.2, glibc 2.17) [`powerpc64-unknown-linux-musl`](platform-support/powerpc64-unknown-linux-musl.md) | ✓ | ✓ | PPC64 Linux (kernel 4.19, musl 1.2.3) [`powerpc64-unknown-openbsd`](platform-support/openbsd.md) | ✓ | ✓ | OpenBSD/powerpc64 [`powerpc64-wrs-vxworks`](platform-support/vxworks.md) | ✓ | | diff --git a/src/doc/rustc/src/platform-support/powerpc64-unknown-linux-gnuelfv2.md b/src/doc/rustc/src/platform-support/powerpc64-unknown-linux-gnuelfv2.md new file mode 100644 index 0000000000000..59ae4507de302 --- /dev/null +++ b/src/doc/rustc/src/platform-support/powerpc64-unknown-linux-gnuelfv2.md @@ -0,0 +1,50 @@ +# powerpc64-unknown-linux-gnuelfv2 + +**Tier: 3** + +Target for 64-bit big endian PowerPC Linux programs using the ELFv2 ABI and +the GNU C library. + +## Target maintainers + +[@Gelbpunkt](https://github.com/Gelbpunkt) + +## Requirements + +Building the target itself requires a 64-bit big endian PowerPC compiler that +uses the ELFv2 ABI and is supported by `cc-rs`. + +## Building the target + +The target can be built by enabling it for a `rustc` build. + +```toml +[build] +target = ["powerpc64-unknown-linux-gnuelfv2"] +``` + +Make sure your C compiler is included in `$PATH`, then add it to the +`bootstrap.toml`: + +```toml +[target.powerpc64-unknown-linux-gnuelfv2] +cc = "powerpc64-linux-gnu-gcc" +cxx = "powerpc64-linux-gnu-g++" +ar = "powerpc64-linux-gnu-ar" +linker = "powerpc64-linux-gnu-gcc" +``` + +## Building Rust programs + +Rust does not yet ship pre-compiled artifacts for this target. To compile for +this target, you will first need to build Rust with the target enabled (see +"Building the target" above). + +## Cross-compilation + +This target can be cross-compiled from any host. + +## Testing + +This target can be tested as normal with `x.py` on a 64-bit big endian PowerPC +host or via QEMU emulation. diff --git a/tests/assembly/targets/targets-elf.rs b/tests/assembly/targets/targets-elf.rs index edf16548e7de0..b75fd838b61ed 100644 --- a/tests/assembly/targets/targets-elf.rs +++ b/tests/assembly/targets/targets-elf.rs @@ -358,6 +358,9 @@ //@ revisions: powerpc64_unknown_linux_gnu //@ [powerpc64_unknown_linux_gnu] compile-flags: --target powerpc64-unknown-linux-gnu //@ [powerpc64_unknown_linux_gnu] needs-llvm-components: powerpc +//@ revisions: powerpc64_unknown_linux_gnuelfv2 +//@ [powerpc64_unknown_linux_gnuelfv2] compile-flags: --target powerpc64-unknown-linux-gnuelfv2 +//@ [powerpc64_unknown_linux_gnuelfv2] needs-llvm-components: powerpc //@ revisions: powerpc64_unknown_linux_musl //@ [powerpc64_unknown_linux_musl] compile-flags: --target powerpc64-unknown-linux-musl //@ [powerpc64_unknown_linux_musl] needs-llvm-components: powerpc From d7200f076c503bec83c3592c232c9ac2eec53bdc Mon Sep 17 00:00:00 2001 From: Jens Reidel Date: Sun, 20 Jul 2025 20:23:12 +0200 Subject: [PATCH 2/2] Temporarily use LLVM that accounts for ABI in data layout Signed-off-by: Jens Reidel --- .gitmodules | 4 ++-- src/llvm-project | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 439fde6d76601..8947be9023a54 100644 --- a/.gitmodules +++ b/.gitmodules @@ -24,8 +24,8 @@ shallow = true [submodule "src/llvm-project"] path = src/llvm-project - url = https://github.com/rust-lang/llvm-project.git - branch = rustc/20.1-2025-07-13 + url = https://github.com/Gelbpunkt/llvm-project.git + branch = rust-ppc64-gnu-elfv2 shallow = true [submodule "src/doc/embedded-book"] path = src/doc/embedded-book diff --git a/src/llvm-project b/src/llvm-project index e8a2ffcf322f4..a4772909edc08 160000 --- a/src/llvm-project +++ b/src/llvm-project @@ -1 +1 @@ -Subproject commit e8a2ffcf322f45b8dce82c65ab27a3e2430a6b51 +Subproject commit a4772909edc0865b0c976c2f6c4a745f2cf1b344