Skip to content

Commit 025c199

Browse files
committed
Add new Tier-3 targets: loongarch32-unknown-none*
MCP: rust-lang/compiler-team#865
1 parent 27f8efb commit 025c199

File tree

33 files changed

+146
-28
lines changed

33 files changed

+146
-28
lines changed

compiler/rustc_ast_lowering/src/asm.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
4848
| asm::InlineAsmArch::Arm64EC
4949
| asm::InlineAsmArch::RiscV32
5050
| asm::InlineAsmArch::RiscV64
51+
| asm::InlineAsmArch::LoongArch32
5152
| asm::InlineAsmArch::LoongArch64
5253
| asm::InlineAsmArch::S390x
5354
);

compiler/rustc_codegen_gcc/example/alloc_system.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// add fast paths for low alignment values.
99
#[cfg(any(target_arch = "x86",
1010
target_arch = "arm",
11+
target_arch = "loongarch32",
1112
target_arch = "m68k",
1213
target_arch = "mips",
1314
target_arch = "mips32r6",

compiler/rustc_codegen_llvm/src/asm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ impl<'ll, 'tcx> AsmBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
251251
InlineAsmArch::Nvptx64 => {}
252252
InlineAsmArch::PowerPC | InlineAsmArch::PowerPC64 => {}
253253
InlineAsmArch::Hexagon => {}
254-
InlineAsmArch::LoongArch64 => {
254+
InlineAsmArch::LoongArch32 | InlineAsmArch::LoongArch64 => {
255255
constraints.extend_from_slice(&[
256256
"~{$fcc0}".to_string(),
257257
"~{$fcc1}".to_string(),

compiler/rustc_codegen_ssa/src/back/link/raw_dylib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ fn create_elf_raw_dylib_stub(sess: &Session, soname: &str, symbols: &[DllImport]
287287
(Architecture::X86_64, None) => elf::EM_X86_64,
288288
(Architecture::X86_64_X32, None) => elf::EM_X86_64,
289289
(Architecture::Hexagon, None) => elf::EM_HEXAGON,
290+
(Architecture::LoongArch32, None) => elf::EM_LOONGARCH,
290291
(Architecture::LoongArch64, None) => elf::EM_LOONGARCH,
291292
(Architecture::M68k, None) => elf::EM_68K,
292293
(Architecture::Mips, None) => elf::EM_MIPS,

compiler/rustc_codegen_ssa/src/back/metadata.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ pub(super) fn elf_e_flags(architecture: Architecture, sess: &Session) -> u32 {
348348

349349
e_flags
350350
}
351-
Architecture::LoongArch64 => {
351+
Architecture::LoongArch32 | Architecture::LoongArch64 => {
352352
// Source: https://github.com/loongson/la-abi-specs/blob/release/laelf.adoc#e_flags-identifies-abi-type-and-version
353353
let mut e_flags: u32 = elf::EF_LARCH_OBJABI_V1;
354354

compiler/rustc_target/src/asm/mod.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ pub enum InlineAsmArch {
226226
RiscV64,
227227
Nvptx64,
228228
Hexagon,
229+
LoongArch32,
229230
LoongArch64,
230231
Mips,
231232
Mips64,
@@ -260,6 +261,7 @@ impl FromStr for InlineAsmArch {
260261
"powerpc" => Ok(Self::PowerPC),
261262
"powerpc64" => Ok(Self::PowerPC64),
262263
"hexagon" => Ok(Self::Hexagon),
264+
"loongarch32" => Ok(Self::LoongArch32),
263265
"loongarch64" => Ok(Self::LoongArch64),
264266
"mips" | "mips32r6" => Ok(Self::Mips),
265267
"mips64" | "mips64r6" => Ok(Self::Mips64),
@@ -365,7 +367,9 @@ impl InlineAsmReg {
365367
Self::PowerPC(PowerPCInlineAsmReg::parse(name)?)
366368
}
367369
InlineAsmArch::Hexagon => Self::Hexagon(HexagonInlineAsmReg::parse(name)?),
368-
InlineAsmArch::LoongArch64 => Self::LoongArch(LoongArchInlineAsmReg::parse(name)?),
370+
InlineAsmArch::LoongArch32 | InlineAsmArch::LoongArch64 => {
371+
Self::LoongArch(LoongArchInlineAsmReg::parse(name)?)
372+
}
369373
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
370374
Self::Mips(MipsInlineAsmReg::parse(name)?)
371375
}
@@ -652,7 +656,9 @@ impl InlineAsmRegClass {
652656
Self::PowerPC(PowerPCInlineAsmRegClass::parse(name)?)
653657
}
654658
InlineAsmArch::Hexagon => Self::Hexagon(HexagonInlineAsmRegClass::parse(name)?),
655-
InlineAsmArch::LoongArch64 => Self::LoongArch(LoongArchInlineAsmRegClass::parse(name)?),
659+
InlineAsmArch::LoongArch32 | InlineAsmArch::LoongArch64 => {
660+
Self::LoongArch(LoongArchInlineAsmRegClass::parse(name)?)
661+
}
656662
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
657663
Self::Mips(MipsInlineAsmRegClass::parse(name)?)
658664
}
@@ -860,7 +866,7 @@ pub fn allocatable_registers(
860866
hexagon::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
861867
map
862868
}
863-
InlineAsmArch::LoongArch64 => {
869+
InlineAsmArch::LoongArch32 | InlineAsmArch::LoongArch64 => {
864870
let mut map = loongarch::regclass_map();
865871
loongarch::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
866872
map
@@ -992,7 +998,7 @@ impl InlineAsmClobberAbi {
992998
"C" | "system" => Ok(InlineAsmClobberAbi::Avr),
993999
_ => Err(&["C", "system"]),
9941000
},
995-
InlineAsmArch::LoongArch64 => match name {
1001+
InlineAsmArch::LoongArch32 | InlineAsmArch::LoongArch64 => match name {
9961002
"C" | "system" => Ok(InlineAsmClobberAbi::LoongArch),
9971003
_ => Err(&["C", "system"]),
9981004
},

compiler/rustc_target/src/callconv/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ impl<'a, Ty> FnAbi<'a, Ty> {
648648
"amdgpu" => amdgpu::compute_abi_info(cx, self),
649649
"arm" => arm::compute_abi_info(cx, self),
650650
"avr" => avr::compute_abi_info(self),
651-
"loongarch64" => loongarch::compute_abi_info(cx, self),
651+
"loongarch32" | "loongarch64" => loongarch::compute_abi_info(cx, self),
652652
"m68k" => m68k::compute_abi_info(self),
653653
"csky" => csky::compute_abi_info(self),
654654
"mips" | "mips32r6" => mips::compute_abi_info(cx, self),
@@ -691,7 +691,7 @@ impl<'a, Ty> FnAbi<'a, Ty> {
691691
match &*spec.arch {
692692
"x86" => x86::compute_rust_abi_info(cx, self),
693693
"riscv32" | "riscv64" => riscv::compute_rust_abi_info(cx, self),
694-
"loongarch64" => loongarch::compute_rust_abi_info(cx, self),
694+
"loongarch32" | "loongarch64" => loongarch::compute_rust_abi_info(cx, self),
695695
"aarch64" => aarch64::compute_rust_abi_info(cx, self),
696696
_ => {}
697697
};

compiler/rustc_target/src/spec/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,6 +1981,8 @@ supported_targets! {
19811981

19821982
("sparc-unknown-none-elf", sparc_unknown_none_elf),
19831983

1984+
("loongarch32-unknown-none", loongarch32_unknown_none),
1985+
("loongarch32-unknown-none-softfloat", loongarch32_unknown_none_softfloat),
19841986
("loongarch64-unknown-none", loongarch64_unknown_none),
19851987
("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
19861988

@@ -3502,6 +3504,7 @@ impl Target {
35023504
"msp430" => (Architecture::Msp430, None),
35033505
"hexagon" => (Architecture::Hexagon, None),
35043506
"bpf" => (Architecture::Bpf, None),
3507+
"loongarch32" => (Architecture::LoongArch32, None),
35053508
"loongarch64" => (Architecture::LoongArch64, None),
35063509
"csky" => (Architecture::Csky, None),
35073510
"arm64ec" => (Architecture::Aarch64, Some(object::SubArchitecture::Arm64EC)),
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use crate::spec::{
2+
Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
3+
};
4+
5+
pub(crate) fn target() -> Target {
6+
Target {
7+
llvm_target: "loongarch32-unknown-none".into(),
8+
metadata: TargetMetadata {
9+
description: Some("Freestanding/bare-metal LoongArch32".into()),
10+
tier: Some(3),
11+
host_tools: Some(false),
12+
std: Some(false),
13+
},
14+
pointer_width: 32,
15+
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
16+
arch: "loongarch32".into(),
17+
options: TargetOptions {
18+
cpu: "generic".into(),
19+
features: "+f,+d".into(),
20+
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
21+
linker: Some("rust-lld".into()),
22+
llvm_abiname: "ilp32d".into(),
23+
max_atomic_width: Some(32),
24+
relocation_model: RelocModel::Static,
25+
panic_strategy: PanicStrategy::Abort,
26+
..Default::default()
27+
},
28+
}
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use crate::spec::{
2+
Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
3+
};
4+
5+
pub(crate) fn target() -> Target {
6+
Target {
7+
llvm_target: "loongarch32-unknown-none".into(),
8+
metadata: TargetMetadata {
9+
description: Some("Freestanding/bare-metal LoongArch32 softfloat".into()),
10+
tier: Some(3),
11+
host_tools: Some(false),
12+
std: Some(false),
13+
},
14+
pointer_width: 32,
15+
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
16+
arch: "loongarch32".into(),
17+
options: TargetOptions {
18+
cpu: "generic".into(),
19+
features: "-f,-d".into(),
20+
abi: "softfloat".into(),
21+
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
22+
linker: Some("rust-lld".into()),
23+
llvm_abiname: "ilp32s".into(),
24+
max_atomic_width: Some(32),
25+
relocation_model: RelocModel::Static,
26+
panic_strategy: PanicStrategy::Abort,
27+
..Default::default()
28+
},
29+
}
30+
}

0 commit comments

Comments
 (0)