diff --git a/src/lib.rs b/src/lib.rs index 371989a7f..e230a3801 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2444,63 +2444,93 @@ impl Build { cmd.args.push("-Wl,-melf_i386".into()); } + // + // Arm Target Details + // + + // Set Float ABI for all Arm bare-metal targets using EABIHF if target.arch == "arm" && target.os == "none" && target.abi == "eabihf" { cmd.args.push("-mfloat-abi=hard".into()) } + // Set -mthumb for all Thumb targets if target.full_arch.starts_with("thumb") { cmd.args.push("-mthumb".into()); } + // Armv6-M targets (no FPU available) if target.full_arch.starts_with("thumbv6m") { + // ARMv6S-M is an old name for "ARMv6-M with SVC support" + // before SVC support became mandatory. Some versions of GAS care + // about the difference. cmd.args.push("-march=armv6s-m".into()); } + // Armv7-M targets (no FPU available) + if target.full_arch.starts_with("thumbv7m") { + cmd.args.push("-march=armv7-m".into()); + } + // Armv7E-M targets if target.full_arch.starts_with("thumbv7em") { cmd.args.push("-march=armv7e-m".into()); - if target.abi == "eabihf" { cmd.args.push("-mfpu=fpv4-sp-d16".into()) } } - if target.full_arch.starts_with("thumbv7m") { - cmd.args.push("-march=armv7-m".into()); - } + // Armv8-M Baseline (no FPU available) if target.full_arch.starts_with("thumbv8m.base") { cmd.args.push("-march=armv8-m.base".into()); } + // Armv8-M Mainline targets if target.full_arch.starts_with("thumbv8m.main") { cmd.args.push("-march=armv8-m.main".into()); - if target.abi == "eabihf" { cmd.args.push("-mfpu=fpv5-sp-d16".into()) } } - if target.full_arch.starts_with("armebv7r") | target.full_arch.starts_with("armv7r") + // ARMv6 targets + if target.full_arch.starts_with("armv6") + || (target.full_arch.starts_with("thumbv6") + && !target.full_arch.starts_with("thumbv6m")) + { + cmd.args.push("-march=armv6".into()); + if target.abi == "eabihf" { + // lowest common denominator FPU + cmd.args.push("-mfpu=vfpv2".into()); + } + } + // ARMv7-R targets + if target.full_arch.starts_with("armebv7r") + || target.full_arch.starts_with("armv7r") + || target.full_arch.starts_with("thumbv7r") { if target.full_arch.starts_with("armeb") { cmd.args.push("-mbig-endian".into()); - } else { - cmd.args.push("-mlittle-endian".into()); } - - // ARM mode - cmd.args.push("-marm".into()); - - // R Profile cmd.args.push("-march=armv7-r".into()); - if target.abi == "eabihf" { // lowest common denominator FPU // (see Cortex-R4 technical reference manual) cmd.args.push("-mfpu=vfpv3-d16".into()) } } - if target.full_arch.starts_with("armv7a") { + // Armv7-A targets + if target.full_arch.starts_with("armv7a") + || target.full_arch.starts_with("thumbv7a") + { cmd.args.push("-march=armv7-a".into()); - if target.abi == "eabihf" { // lowest common denominator FPU cmd.args.push("-mfpu=vfpv3-d16".into()); } } + // Armv8-R targets + if target.full_arch.starts_with("armv8r") + || target.full_arch.starts_with("thumbv8r") + { + cmd.args.push("-march=armv8-r".into()); + if target.abi == "eabihf" { + cmd.args.push("-mfpu=fp-armv8".into()) + } + } + if target.arch == "riscv32" || target.arch == "riscv64" { // get the 32i/32imac/32imc/64gc/64imac/... part let arch = &target.full_arch[5..]; @@ -3708,6 +3738,10 @@ impl Build { "sparc64-unknown-linux-gnu" => Some("sparc64-linux-gnu"), "sparc64-unknown-netbsd" => Some("sparc64--netbsd"), "sparcv9-sun-solaris" => Some("sparcv9-sun-solaris"), + "armv4t-none-eabi" => Some("arm-none-eabi"), + "armv5te-none-eabi" => Some("arm-none-eabi"), + "armv6-none-eabi" => Some("arm-none-eabi"), + "armv6-none-eabihf" => Some("arm-none-eabi"), "armv7a-none-eabi" => Some("arm-none-eabi"), "armv7a-none-eabihf" => Some("arm-none-eabi"), "armebv7r-none-eabi" => Some("arm-none-eabi"), @@ -3715,6 +3749,9 @@ impl Build { "armv7r-none-eabi" => Some("arm-none-eabi"), "armv7r-none-eabihf" => Some("arm-none-eabi"), "armv8r-none-eabihf" => Some("arm-none-eabi"), + "thumbv4t-none-eabi" => Some("arm-none-eabi"), + "thumbv5te-none-eabi" => Some("arm-none-eabi"), + "thumbv6-none-eabi" => Some("arm-none-eabi"), "thumbv7a-none-eabi" => Some("arm-none-eabi"), "thumbv7a-none-eabihf" => Some("arm-none-eabi"), "thumbv7r-none-eabi" => Some("arm-none-eabi"),