rustc_target/spec/targets/
mipsel_sony_psp.rs

1use crate::spec::{Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions, cvs};
2
3// The PSP has custom linker requirements.
4const LINKER_SCRIPT: &str = include_str!("./mipsel_sony_psp_linker_script.ld");
5
6pub(crate) fn target() -> Target {
7    let pre_link_args = TargetOptions::link_args(
8        LinkerFlavor::Gnu(Cc::No, Lld::No),
9        &["--emit-relocs", "--nmagic"],
10    );
11
12    Target {
13        llvm_target: "mipsel-sony-psp".into(),
14        metadata: crate::spec::TargetMetadata {
15            description: Some("MIPS (LE) Sony PlatStation Portable (PSP)".into()),
16            tier: Some(3),
17            host_tools: Some(false),
18            std: Some(false),
19        },
20        pointer_width: 32,
21        data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
22        arch: "mips".into(),
23
24        options: TargetOptions {
25            os: "psp".into(),
26            vendor: "sony".into(),
27            linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
28            cpu: "mips2".into(),
29            linker: Some("rust-lld".into()),
30            relocation_model: RelocModel::Static,
31
32            // PSP FPU only supports single precision floats.
33            features: "+single-float".into(),
34
35            // PSP does not support trap-on-condition instructions.
36            llvm_args: cvs!["-mno-check-zero-division"],
37            pre_link_args,
38            link_script: Some(LINKER_SCRIPT.into()),
39            ..Default::default()
40        },
41    }
42}