rustc_target/spec/targets/
mipsel_sony_psp.rs

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