Auto merge of #88321 - glaubitz:m68k-linux, r=wesleywiser
Add initial support for m68k This patch series adds initial support for m68k making use of the new M68k backend introduced with LLVM-13. Additional changes will be needed to be able to actually use the backend for this target.
This commit is contained in:
@@ -76,6 +76,7 @@ fn main() {
|
||||
"aarch64",
|
||||
"amdgpu",
|
||||
"avr",
|
||||
"m68k",
|
||||
"mips",
|
||||
"powerpc",
|
||||
"systemz",
|
||||
|
||||
@@ -201,6 +201,12 @@ void LLVMRustAddLastExtensionPasses(
|
||||
#define SUBTARGET_AVR
|
||||
#endif
|
||||
|
||||
#ifdef LLVM_COMPONENT_M68k
|
||||
#define SUBTARGET_M68K SUBTARGET(M68k)
|
||||
#else
|
||||
#define SUBTARGET_M68K
|
||||
#endif
|
||||
|
||||
#ifdef LLVM_COMPONENT_MIPS
|
||||
#define SUBTARGET_MIPS SUBTARGET(Mips)
|
||||
#else
|
||||
@@ -248,6 +254,7 @@ void LLVMRustAddLastExtensionPasses(
|
||||
SUBTARGET_ARM \
|
||||
SUBTARGET_AARCH64 \
|
||||
SUBTARGET_AVR \
|
||||
SUBTARGET_M68K \
|
||||
SUBTARGET_MIPS \
|
||||
SUBTARGET_PPC \
|
||||
SUBTARGET_SYSTEMZ \
|
||||
|
||||
@@ -90,6 +90,14 @@ pub fn initialize_available_targets() {
|
||||
LLVMInitializeAVRAsmPrinter,
|
||||
LLVMInitializeAVRAsmParser
|
||||
);
|
||||
init_target!(
|
||||
llvm_component = "m68k",
|
||||
LLVMInitializeM68kTargetInfo,
|
||||
LLVMInitializeM68kTarget,
|
||||
LLVMInitializeM68kTargetMC,
|
||||
LLVMInitializeM68kAsmPrinter,
|
||||
LLVMInitializeM68kAsmParser
|
||||
);
|
||||
init_target!(
|
||||
llvm_component = "mips",
|
||||
LLVMInitializeMipsTargetInfo,
|
||||
|
||||
30
compiler/rustc_target/src/abi/call/m68k.rs
Normal file
30
compiler/rustc_target/src/abi/call/m68k.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
use crate::abi::call::{ArgAbi, FnAbi};
|
||||
|
||||
fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
|
||||
if ret.layout.is_aggregate() {
|
||||
ret.make_indirect();
|
||||
} else {
|
||||
ret.extend_integer_width_to(32);
|
||||
}
|
||||
}
|
||||
|
||||
fn classify_arg<Ty>(arg: &mut ArgAbi<'_, Ty>) {
|
||||
if arg.layout.is_aggregate() {
|
||||
arg.make_indirect_byval();
|
||||
} else {
|
||||
arg.extend_integer_width_to(32);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) {
|
||||
if !fn_abi.ret.is_ignore() {
|
||||
classify_ret(&mut fn_abi.ret);
|
||||
}
|
||||
|
||||
for arg in &mut fn_abi.args {
|
||||
if arg.is_ignore() {
|
||||
continue;
|
||||
}
|
||||
classify_arg(arg);
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ mod arm;
|
||||
mod avr;
|
||||
mod bpf;
|
||||
mod hexagon;
|
||||
mod m68k;
|
||||
mod mips;
|
||||
mod mips64;
|
||||
mod msp430;
|
||||
@@ -656,6 +657,7 @@ impl<'a, Ty> FnAbi<'a, Ty> {
|
||||
"amdgpu" => amdgpu::compute_abi_info(cx, self),
|
||||
"arm" => arm::compute_abi_info(cx, self),
|
||||
"avr" => avr::compute_abi_info(self),
|
||||
"m68k" => m68k::compute_abi_info(self),
|
||||
"mips" => mips::compute_abi_info(cx, self),
|
||||
"mips64" => mips64::compute_abi_info(cx, self),
|
||||
"powerpc" => powerpc::compute_abi_info(self),
|
||||
|
||||
15
compiler/rustc_target/src/spec/m68k_unknown_linux_gnu.rs
Normal file
15
compiler/rustc_target/src/spec/m68k_unknown_linux_gnu.rs
Normal file
@@ -0,0 +1,15 @@
|
||||
use crate::abi::Endian;
|
||||
use crate::spec::{Target, TargetOptions};
|
||||
|
||||
pub fn target() -> Target {
|
||||
let mut base = super::linux_base::opts();
|
||||
base.max_atomic_width = Some(32);
|
||||
|
||||
Target {
|
||||
llvm_target: "m68k-unknown-linux-gnu".to_string(),
|
||||
pointer_width: 32,
|
||||
data_layout: "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16".to_string(),
|
||||
arch: "m68k".to_string(),
|
||||
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
||||
}
|
||||
}
|
||||
@@ -742,6 +742,7 @@ supported_targets! {
|
||||
("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
|
||||
("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
|
||||
("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
|
||||
("m68k-unknown-linux-gnu", m68k_unknown_linux_gnu),
|
||||
("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
|
||||
("mips64-unknown-linux-gnuabi64", mips64_unknown_linux_gnuabi64),
|
||||
("mips64el-unknown-linux-gnuabi64", mips64el_unknown_linux_gnuabi64),
|
||||
|
||||
Reference in New Issue
Block a user