diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index bb14a4522944d..2b607371c8d4a 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -944,7 +944,7 @@ supported_targets! { ("armv6k-nintendo-3ds", armv6k_nintendo_3ds), - ("x86_64-unknown-none-elf", x86_64_unknown_none_elf), + ("x86_64-unknown-none", x86_64_unknown_none), } /// Warnings encountered when parsing the target `json`. diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_none_elf.rs b/compiler/rustc_target/src/spec/x86_64_unknown_none.rs similarity index 58% rename from compiler/rustc_target/src/spec/x86_64_unknown_none_elf.rs rename to compiler/rustc_target/src/spec/x86_64_unknown_none.rs index 58a83e75e4130..b460ea1c29b55 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_none_elf.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_none.rs @@ -1,19 +1,26 @@ -// Generic AArch64 target for bare-metal code - Floating point disabled +// Generic x86-64 target for bare-metal code - Floating point disabled // // Can be used in conjunction with the `target-feature` and // `target-cpu` compiler flags to opt-in more hardware-specific // features. -// -// For example, `-C target-cpu=cortex-a53`. use super::{CodeModel, LinkerFlavor, LldFlavor, PanicStrategy, Target, TargetOptions}; pub fn target() -> Target { let opts = TargetOptions { - abi: "softfloat".to_string(), + cpu: "x86-64".to_string(), + max_atomic_width: Some(64), + // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved + stack_probes: StackProbeType::Call, + position_independent_executables: true, + static_position_independent_executables: true, + relro_level: RelroLevel::Full, + relocation_model: RelocModel::Static, linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld), linker: Some("rust-lld".to_owned()), - features: "-mmx,-sse,+soft-float".to_string(), + features: + "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float" + .to_string(), executables: true, disable_redzone: true, panic_strategy: PanicStrategy::Abort, diff --git a/src/doc/rustc/src/platform-support.md b/src/doc/rustc/src/platform-support.md index fd87f60a86cdb..1263b3ad497b0 100644 --- a/src/doc/rustc/src/platform-support.md +++ b/src/doc/rustc/src/platform-support.md @@ -280,7 +280,7 @@ target | std | host | notes `x86_64-unknown-haiku` | ✓ | ✓ | 64-bit Haiku `x86_64-unknown-hermit` | ? | | `x86_64-unknown-l4re-uclibc` | ? | | -`x86_64-unknown-none-elf` | * | | Bare x86_64, softfloat +[`x86_64-unknown-none`](platform-support/x86_64-unknown-none.md) | * | | Freestanding/bare-metal x86_64, softfloat `x86_64-unknown-none-hermitkernel` | ? | | HermitCore kernel `x86_64-unknown-none-linuxkernel` | * | | Linux kernel modules `x86_64-unknown-openbsd` | ✓ | ✓ | 64-bit OpenBSD diff --git a/src/doc/rustc/src/platform-support/x86_64-unknown-none.md b/src/doc/rustc/src/platform-support/x86_64-unknown-none.md new file mode 100644 index 0000000000000..967956b3c3174 --- /dev/null +++ b/src/doc/rustc/src/platform-support/x86_64-unknown-none.md @@ -0,0 +1,76 @@ +# `x86_64-unknown-none` + +**Tier: 3** + +Freestanding/bare-metal x86-64 binaries in ELF format: firmware, kernels, etc. + +## Target maintainers + +Harald Hoyer , https://github.com/haraldh +Mike Leany, https://github.com/mikeleany + +## Requirements + +This target is cross-compiled. There is no support for `std`. There is no +default allocator, but it's possible to use `alloc` by supplying an allocator. + +By default, Rust code generated for this target does not use any vector or +floating-point registers (e.g. SSE, AVX). This allows the generated code to run +in environments, such as kernels, which may need to avoid the use of such +registers or which may have special considerations about the use of such +registers (e.g. saving and restoring them to avoid breaking userspace code +using the same registers). You can change code generation to use additional CPU +features via the `-C target-feature=` codegen options to rustc, or via the +`#[target_feature]` mechanism within Rust code. + +By default, code generated with this target should run on any `x86_64` +hardware; enabling additional target features may raise this baseline. + +Code generated with this target will use the `kernel` code model by default. +You can change this using the `-C code-model=` option to rustc. + +On `x86_64-unknown-none`, `extern "C"` uses the [standard System V calling +convention](https://gitlab.com/x86-psABIs/x86-64-ABI), without red zones. + +This target generated binaries in the ELF format. Any alternate formats or +special considerations for binary layout will require linker options or linker +scripts. + +## Building the target + +You can build Rust with support for the target by adding it to the `target` +list in `config.toml`: + +```toml +[build] +build-stage = 1 +target = ["x86_64-unknown-none"] +``` + +## Building Rust programs + +Rust does not yet ship pre-compiled artifacts for this target. To compile for +this target, you will either need to build Rust with the target enabled (see +"Building the target" above), or build your own copy of `core` by using +`build-std` or similar. + +## Testing + +As `x86_64-unknown-none` supports a variety of different environments and does +not support `std`, this target does not support running the Rust testsuite. + +## Cross-compilation toolchains and C code + +If you want to compile C code along with Rust (such as for Rust crates with C +dependencies), you will need an appropriate `x86_64` toolchain. + +Rust *may* be able to use an `x86_64-linux-gnu-` toolchain with appropriate +standalone flags to build for this toolchain (depending on the assumptions of +that toolchain, see below), or you may wish to use a separate +`x86_64-unknown-none` (or `x86_64-elf-`) toolchain. + +On some `x86_64` hosts that use ELF binaries, you *may* be able to use the host +C toolchain, if it does not introduce assumptions about the host environment +that don't match the expectations of a standalone environment. Otherwise, you +may need a separate toolchain for standalone/freestanding development, just as +when cross-compiling from a non-`x86_64` platform.