-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add armv5te-none-eabi and thumbv5te-none-eabi targets #101329
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
//! Targets the ARMv5TE, with code as `a32` code by default. | ||
|
||
use crate::spec::{cvs, LinkerFlavor, LldFlavor, PanicStrategy, RelocModel, Target, TargetOptions}; | ||
|
||
pub fn target() -> Target { | ||
Target { | ||
llvm_target: "armv5te-none-eabi".into(), | ||
pointer_width: 32, | ||
arch: "arm".into(), | ||
/* Data layout args are '-' separated: | ||
* little endian | ||
* stack is 64-bit aligned (EABI) | ||
* pointers are 32-bit | ||
* i64 must be 64-bit aligned (EABI) | ||
* mangle names with ELF style | ||
* native integers are 32-bit | ||
* All other elements are default | ||
*/ | ||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(), | ||
|
||
options: TargetOptions { | ||
abi: "eabi".into(), | ||
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld), | ||
linker: Some("rust-lld".into()), | ||
// extra args passed to the external assembler (assuming `arm-none-eabi-as`): | ||
// * activate t32/a32 interworking | ||
// * use arch ARMv5TE | ||
// * use little-endian | ||
asm_args: cvs!["-mthumb-interwork", "-march=armv5te", "-mlittle-endian",], | ||
// minimum extra features, these cannot be disabled via -C | ||
// Also force-enable 32-bit atomics, which allows the use of atomic load/store only. | ||
// The resulting atomics are ABI incompatible with atomics backed by libatomic. | ||
features: "+soft-float,+strict-align,+atomics-32".into(), | ||
main_needs_argc_argv: false, | ||
// don't have atomic compare-and-swap | ||
atomic_cas: false, | ||
has_thumb_interworking: true, | ||
relocation_model: RelocModel::Static, | ||
panic_strategy: PanicStrategy::Abort, | ||
// from thumb_base, rust-lang/rust#44993. | ||
emit_debug_gdb_scripts: false, | ||
// from thumb_base, apparently gcc/clang give enums a minimum of 8 bits on no-os targets | ||
c_enum_min_bits: 8, | ||
|
||
..Default::default() | ||
}, | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
//! Targets the ARMv5TE, with code as `t32` code by default. | ||
|
||
use crate::spec::{cvs, FramePointer, Target, TargetOptions}; | ||
|
||
pub fn target() -> Target { | ||
Target { | ||
llvm_target: "thumbv5te-none-eabi".into(), | ||
pointer_width: 32, | ||
arch: "arm".into(), | ||
/* Data layout args are '-' separated: | ||
* little endian | ||
* stack is 64-bit aligned (EABI) | ||
* pointers are 32-bit | ||
* i64 must be 64-bit aligned (EABI) | ||
* mangle names with ELF style | ||
* native integers are 32-bit | ||
* All other elements are default | ||
*/ | ||
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(), | ||
|
||
options: TargetOptions { | ||
abi: "eabi".into(), | ||
// extra args passed to the external assembler (assuming `arm-none-eabi-as`): | ||
// * activate t32/a32 interworking | ||
// * use arch ARMv5TE | ||
// * use little-endian | ||
asm_args: cvs!["-mthumb-interwork", "-march=armv5te", "-mlittle-endian",], | ||
// minimum extra features, these cannot be disabled via -C | ||
// Also force-enable 32-bit atomics, which allows the use of atomic load/store only. | ||
// The resulting atomics are ABI incompatible with atomics backed by libatomic. | ||
features: "+soft-float,+strict-align,+atomics-32".into(), | ||
frame_pointer: FramePointer::MayOmit, | ||
main_needs_argc_argv: false, | ||
// don't have atomic compare-and-swap | ||
atomic_cas: false, | ||
has_thumb_interworking: true, | ||
|
||
..super::thumb_base::opts() | ||
}, | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,75 @@ | ||||||
# `armv5te-none-eabi` | ||||||
|
||||||
**Tier: 3** | ||||||
|
||||||
Bare-metal target for any cpu in the ARMv5TE architecture family, supporting | ||||||
ARM/Thumb code interworking (aka `a32`/`t32`), with ARM code as the default code | ||||||
generation. | ||||||
|
||||||
The `thumbv5te-none-eabi` target is the same as this one, but with THUMB code as the default. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Rust supports switching the “mode” via the (currently unstable)
Suggested change
|
||||||
|
||||||
In particular this supports the main CPU of the Nintendo DS, but there's nothing DS | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This sentence is probably superfluous/excessive for the documentation of the very generic baremetal target that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's fair, the DS specific parts can be removed. I was mostly basing this off of |
||||||
specific with this target, so any ARMv5TE device should work fine. | ||||||
|
||||||
## Target Maintainers | ||||||
|
||||||
* [@QuinnPainter](https://github.com/QuinnPainter) | ||||||
|
||||||
## Requirements | ||||||
|
||||||
The target is cross-compiled, and uses static linking. | ||||||
|
||||||
By default, the `lld` linker included with Rust will be used. | ||||||
|
||||||
However, you may want to use the `arm-none-eabi-ld` linker instead. This can be obtained for Windows/Mac/Linux from the [ARM | ||||||
Developer Website][arm-dev], or possibly from your OS's package manager. To use it, add the following to your `.cargo/config.toml`: | ||||||
|
||||||
```toml | ||||||
[target.armv5te-none-eabi] | ||||||
linker = "arm-none-eabi-ld" | ||||||
``` | ||||||
|
||||||
[arm-dev]: https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain | ||||||
|
||||||
This target doesn't provide a linker script, you'll need to bring your own | ||||||
according to the specific device you want to target. Pass | ||||||
`-Clink-arg=-Tyour_script.ld` as a rustc argument to make the linker use | ||||||
`your_script.ld` during linking. | ||||||
|
||||||
## Building Rust Programs | ||||||
|
||||||
Because it is Tier 3, rust does not yet ship pre-compiled artifacts for this target. | ||||||
|
||||||
Just use the `build-std` nightly cargo feature to build the `core` library. You | ||||||
can pass this as a command line argument to cargo, or your `.cargo/config.toml` | ||||||
file might include the following lines: | ||||||
|
||||||
```toml | ||||||
[unstable] | ||||||
build-std = ["core"] | ||||||
``` | ||||||
|
||||||
Most of `core` should work as expected, with the following notes: | ||||||
* the target is "soft float", so `f32` and `f64` operations are emulated in | ||||||
software. | ||||||
* integer division is also emulated in software. | ||||||
* the target is old enough that it doesn't have atomic instructions. | ||||||
|
||||||
`alloc` is also supported, as long as you provide your own global allocator. | ||||||
|
||||||
Rust programs are output as ELF files. | ||||||
|
||||||
For running on DS hardware, you'll need to use an external tool to bundle this ELF file into an NDS binary. The `ndstool` utility included with devkitARM is one such tool that can do this for you: | ||||||
|
||||||
```shell | ||||||
ndstool -c [out_nds] -9 [in_elf] | ||||||
``` | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similarly this DS-specific note is probably overly specific for the generic target that |
||||||
|
||||||
## Testing | ||||||
|
||||||
This is a cross-compiled target that you will need to emulate during testing. | ||||||
|
||||||
Because this is a device-agnostic target, and the exact emulator that you'll | ||||||
need depends on the specific device you want to run your code on. | ||||||
|
||||||
For example, when programming for the DS, you can use one of the several available DS emulators, such as [melonDS](https://melonds.kuribo64.net/). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would argue that the
thumb_base::opts
ought to be changed so that it is also applicable to the bare-metala32
targets, since the baremetal a32 and t32 targets will be way more similar for the same architecture than the thumb* targets between different arm architecture revisions. That said, ultimately I’d be happy with any solution here that does not produce ~the same options for the two targets added here in very different ways. In particular the two different methods to obtain largely the sameTargetOptions
is both difficult to review and will be more difficult to maintain in the future.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I was thinking the same. How about for now, I just modify
armv5te-none-eabi
to usethumb_base
so the two new targets are consistent, and a new issue can be opened to makethumb_base
more generic?