rustc: MIPS32 support

This commit is contained in:
Jyun-Yan You 2013-01-29 22:28:08 +08:00 committed by Brian Anderson
parent 0ecd9e03ff
commit 5150b9811b
18 changed files with 164 additions and 11 deletions

View File

@ -244,7 +244,7 @@ DRIVER_CRATE := $(S)src/driver/driver.rs
######################################################################
# FIXME: x86-ism
LLVM_COMPONENTS=x86 arm ipo bitreader bitwriter linker asmparser jit mcjit \
LLVM_COMPONENTS=x86 arm mips ipo bitreader bitwriter linker asmparser jit mcjit \
interpreter
define DEF_LLVM_VARS

View File

@ -41,8 +41,14 @@ struct Registers {
data: [u32 * 16]
}
#[cfg(target_arch="mips")]
struct Registers {
data: [u32 * 32]
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
struct Context {
regs: Registers,
next: *Context,
@ -69,6 +75,7 @@ struct BoxedRegion {
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
struct Task {
// Public fields
refcount: intptr_t, // 0

View File

@ -203,6 +203,7 @@ pub mod types {
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub mod arch {
pub mod c95 {
pub type c_char = i8;

View File

@ -28,6 +28,7 @@ pub mod inst {
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub const bits: uint = 32;
#[cfg(target_arch = "x86_64")]

View File

@ -1097,6 +1097,9 @@ pub mod consts {
#[cfg(target_arch = "arm")]
pub use os::consts::arm::*;
#[cfg(target_arch = "mips")]
use os::consts::mips::*;
pub mod x86 {
pub const ARCH: &str = "x86";
}
@ -1106,6 +1109,9 @@ pub mod consts {
pub mod arm {
pub const ARCH: &str = "arm";
}
pub mod mips {
pub const ARCH: &str = "mips";
}
}
#[cfg(test)]

View File

@ -91,6 +91,7 @@ pub pure fn Path(s: &str) -> Path {
mod stat {
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub mod arch {
use libc;

View File

@ -166,6 +166,7 @@ pub mod tests {
#[test]
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub fn size_of_32() {
assert size_of::<uint>() == 4u;
assert size_of::<*uint>() == 4u;
@ -196,6 +197,7 @@ pub mod tests {
#[test]
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub fn align_of_32() {
assert pref_align_of::<uint>() == 4u;
assert pref_align_of::<*uint>() == 4u;

85
src/librustc/back/mips.rs Normal file
View File

@ -0,0 +1,85 @@
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use back::target_strs;
use driver::session;
use session::sess_os_to_meta_os;
use metadata::loader::meta_section_name;
pub fn get_target_strs(target_os: session::os) -> target_strs::t {
return target_strs::t {
module_asm: ~"",
meta_sect_name: meta_section_name(sess_os_to_meta_os(target_os)),
data_layout: match target_os {
session::os_macos => {
~"e-p:32:32:32" +
~"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
~"-f32:32:32-f64:64:64" +
~"-v64:64:64-v128:64:128" +
~"-a0:0:64-n32"
}
session::os_win32 => {
~"e-p:32:32:32" +
~"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
~"-f32:32:32-f64:64:64" +
~"-v64:64:64-v128:64:128" +
~"-a0:0:64-n32"
}
session::os_linux => {
~"e-p:32:32:32" +
~"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
~"-f32:32:32-f64:64:64" +
~"-v64:64:64-v128:64:128" +
~"-a0:0:64-n32"
}
session::os_android => {
~"e-p:32:32:32" +
~"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
~"-f32:32:32-f64:64:64" +
~"-v64:64:64-v128:64:128" +
~"-a0:0:64-n32"
}
session::os_freebsd => {
~"e-p:32:32:32" +
~"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
~"-f32:32:32-f64:64:64" +
~"-v64:64:64-v128:64:128" +
~"-a0:0:64-n32"
}
},
target_triple: match target_os {
session::os_macos => ~"mips-apple-darwin",
session::os_win32 => ~"mips-pc-mingw32",
session::os_linux => ~"mips-unknown-linux-gnu",
session::os_android => ~"mips-unknown-android-gnu",
session::os_freebsd => ~"mips-unknown-freebsd"
},
cc_args: ~[]
};
}
//
// Local Variables:
// mode: rust
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// End:
//

View File

@ -11,7 +11,7 @@
use core::prelude::*;
use back::link;
use back::{arm, x86, x86_64};
use back::{arm, x86, x86_64, mips};
use driver::session::{Aggressive};
use driver::session::{Session, Session_, OptLevel, No, Less, Default};
use driver::session;
@ -94,7 +94,8 @@ pub fn default_configuration(sess: Session, +argv0: ~str, input: input) ->
let (end,arch,wordsz) = match sess.targ_cfg.arch {
session::arch_x86 => (~"little",~"x86",~"32"),
session::arch_x86_64 => (~"little",~"x86_64",~"64"),
session::arch_arm => (~"little",~"arm",~"32")
session::arch_arm => (~"little",~"arm",~"32"),
session::arch_mips => (~"little",~"arm",~"32")
};
return ~[ // Target bindings.
@ -472,6 +473,8 @@ pub fn get_arch(triple: ~str) -> Option<session::arch> {
} else if str::contains(triple, ~"arm") ||
str::contains(triple, ~"xscale") {
Some(session::arch_arm)
} else if str::contains(triple, ~"mips") {
Some(session::arch_mips)
} else { None }
}
@ -490,12 +493,14 @@ pub fn build_target_config(sopts: @session::options,
let (int_type, uint_type, float_type) = match arch {
session::arch_x86 => (ast::ty_i32, ast::ty_u32, ast::ty_f64),
session::arch_x86_64 => (ast::ty_i64, ast::ty_u64, ast::ty_f64),
session::arch_arm => (ast::ty_i32, ast::ty_u32, ast::ty_f64)
session::arch_arm => (ast::ty_i32, ast::ty_u32, ast::ty_f64),
session::arch_mips => (ast::ty_i32, ast::ty_u32, ast::ty_f64)
};
let target_strs = match arch {
session::arch_x86 => x86::get_target_strs(os),
session::arch_x86_64 => x86_64::get_target_strs(os),
session::arch_arm => arm::get_target_strs(os)
session::arch_arm => arm::get_target_strs(os),
session::arch_mips => mips::get_target_strs(os)
};
let target_cfg = @session::config {
os: os,

View File

@ -33,7 +33,7 @@ use syntax;
pub enum os { os_win32, os_macos, os_linux, os_android, os_freebsd, }
#[deriving_eq]
pub enum arch { arch_x86, arch_x86_64, arch_arm, }
pub enum arch { arch_x86, arch_x86_64, arch_arm, arch_mips, }
pub enum crate_type { bin_crate, lib_crate, unknown_crate, }

View File

@ -1484,7 +1484,9 @@ pub fn call_memcpy(cx: block, dst: ValueRef, src: ValueRef,
let _icx = cx.insn_ctxt("call_memcpy");
let ccx = cx.ccx();
let key = match ccx.sess.targ_cfg.arch {
session::arch_x86 | session::arch_arm => ~"llvm.memcpy.p0i8.p0i8.i32",
session::arch_x86
| session::arch_arm
| session::arch_mips => ~"llvm.memcpy.p0i8.p0i8.i32",
session::arch_x86_64 => ~"llvm.memcpy.p0i8.p0i8.i64"
};
let memcpy = ccx.intrinsics.get(&key);
@ -1526,7 +1528,9 @@ pub fn memzero(cx: block, llptr: ValueRef, llty: TypeRef) {
let intrinsic_key;
match ccx.sess.targ_cfg.arch {
session::arch_x86 | session::arch_arm => {
session::arch_x86
| session::arch_arm
| session::arch_mips => {
intrinsic_key = ~"llvm.memset.p0i8.i32";
}
session::arch_x86_64 => {

View File

@ -766,7 +766,8 @@ pub fn T_int(targ_cfg: @session::config) -> TypeRef {
return match targ_cfg.arch {
session::arch_x86 => T_i32(),
session::arch_x86_64 => T_i64(),
session::arch_arm => T_i32()
session::arch_arm => T_i32(),
session::arch_mips => T_i32()
};
}
@ -803,7 +804,8 @@ pub fn T_float(targ_cfg: @session::config) -> TypeRef {
return match targ_cfg.arch {
session::arch_x86 => T_f64(),
session::arch_x86_64 => T_f64(),
session::arch_arm => T_f64()
session::arch_arm => T_f64(),
session::arch_mips => T_f64()
};
}

View File

@ -113,6 +113,7 @@ pub mod back {
pub mod abi;
pub mod upcall;
pub mod arm;
pub mod mips;
pub mod x86;
pub mod x86_64;
pub mod rpath;

View File

@ -27,6 +27,7 @@ A BigDigit is half the size of machine word size.
*/
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub type BigDigit = u16;
/**
@ -42,6 +43,7 @@ pub mod BigDigit {
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "mips")]
pub const bits: uint = 16;
#[cfg(target_arch = "x86_64")]
@ -530,6 +532,7 @@ priv pure fn get_radix_base(radix: uint) -> (uint, uint) {
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "mips")]
priv pure fn get_radix_base(radix: uint) -> (uint, uint) {
assert 1 < radix && radix <= 16;
match radix {
@ -946,6 +949,7 @@ mod biguint_tests {
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "mips")]
fn test_shl_bits() {
check(~[0x3210, 0x7654, 0xba98, 0xfedc,
0x3210, 0x7654, 0xba98, 0xfedc], 4,
@ -962,6 +966,7 @@ mod biguint_tests {
#[test]
#[ignore(cfg(target_arch = "x86"))]
#[ignore(cfg(target_arch = "arm"))]
#[ignore(cfg(target_arch = "mips"))]
fn test_shr() {
fn check(v: ~[BigDigit], shift: uint, ans: ~[BigDigit]) {
assert BigUint::new(v) >> shift == BigUint::new(ans);
@ -989,6 +994,7 @@ mod biguint_tests {
#[cfg(target_arch = "arm")]
#[cfg(target_arch = "x86")]
#[cfg(target_arch = "mips")]
fn test_shr_bits() {
check(~[0x2100, 0x6543, 0xa987, 0xedcb,
0x210f, 0x6543, 0xa987, 0xedcb, 0xf], 4,

View File

@ -1504,6 +1504,7 @@ pub mod test {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub mod impl32 {
use net::tcp::test::*;

View File

@ -132,6 +132,7 @@ pub struct uv_tcp_t_32bit_unix_riders {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct uv_tcp_t_32bit_unix_riders {
a29: *u8, a30: *u8, a31: *u8,
}
@ -187,6 +188,7 @@ pub struct uv_write_t_32bit_unix_riders {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct uv_write_t_32bit_unix_riders {
a13: *u8, a14: *u8, a15: *u8,
a16: *u8,
@ -215,6 +217,7 @@ pub struct uv_async_t_32bit_unix_riders {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct uv_async_t_32bit_unix_riders {
a10: *u8,
}
@ -244,6 +247,7 @@ pub struct uv_timer_t_32bit_unix_riders {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct uv_timer_t_32bit_unix_riders {
a10: *u8, a11: *u8, a12: *u8
}
@ -273,6 +277,7 @@ pub struct sockaddr_in6 {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct sockaddr_in6 {
a0: *u8, a1: *u8,
a2: *u8, a3: *u8,
@ -291,7 +296,8 @@ pub mod addr_in_impl {
a2: *u8, a3: *u8,
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct addr_in {
a0: *u8, a1: *u8,
a2: *u8, a3: *u8,
@ -319,6 +325,7 @@ pub mod addrinfo_impl {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub struct addrinfo {
a00: *u8, a01: *u8, a02: *u8, a03: *u8,
a04: *u8, a05: *u8, a06: *u8, a07: *u8,
@ -402,6 +409,7 @@ pub mod uv_ll_struct_stubgen {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub fn gen_stub_arch() -> uv_tcp_t {
uv_tcp_t {
fields: uv_handle_fields {
@ -546,6 +554,7 @@ pub mod uv_ll_struct_stubgen {
}
#[cfg(target_arch = "x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub fn gen_stub_arch() -> uv_async_t {
uv_async_t {
fields: uv_handle_fields {
@ -602,6 +611,7 @@ pub mod uv_ll_struct_stubgen {
}
#[cfg(target_arch = "x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub fn gen_stub_arch() -> uv_timer_t {
uv_timer_t {
fields: uv_handle_fields {
@ -662,6 +672,7 @@ pub mod uv_ll_struct_stubgen {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub fn gen_stub_arch() -> uv_write_t {
uv_write_t {
fields: uv_handle_fields {
@ -1748,6 +1759,7 @@ pub mod test {
}
#[cfg(target_arch="x86")]
#[cfg(target_arch="arm")]
#[cfg(target_arch="mips")]
pub mod impl32 {
use uv_ll::test::*;
#[test]

View File

@ -97,6 +97,12 @@ void LLVMInitializeARMTarget();
void LLVMInitializeARMTargetMC();
void LLVMInitializeARMAsmPrinter();
void LLVMInitializeARMAsmParser();
void LLVMInitializeMipsTargetInfo();
void LLVMInitializeMipsTarget();
void LLVMInitializeMipsTargetMC();
void LLVMInitializeMipsAsmPrinter();
void LLVMInitializeMipsAsmParser();
// Only initialize the platforms supported by Rust here,
// because using --llvm-root will have multiple platforms
// that rustllvm doesn't actually link to and it's pointless to put target info
@ -114,6 +120,12 @@ void LLVMRustInitializeTargets() {
LLVMInitializeARMTargetMC();
LLVMInitializeARMAsmPrinter();
LLVMInitializeARMAsmParser();
LLVMInitializeMipsTargetInfo();
LLVMInitializeMipsTarget();
LLVMInitializeMipsTargetMC();
LLVMInitializeMipsAsmPrinter();
LLVMInitializeMipsAsmParser();
}
// Custom memory manager for MCJITting. It needs special features

View File

@ -384,18 +384,25 @@ LLVMInitializeScalarOpts
LLVMInitializeTarget
LLVMInitializeTransformUtils
LLVMInitializeARMAsmLexer
LLVMInitializeMipsAsmLexer
LLVMInitializeX86AsmLexer
LLVMInitializeARMAsmParser
LLVMInitializeMipsAsmParser
LLVMInitializeX86AsmParser
LLVMInitializeARMAsmPrinter
LLVMInitializeMipsAsmPrinter
LLVMInitializeX86AsmPrinter
LLVMInitializeARMDisassembler
LLVMInitializeMipsDisassembler
LLVMInitializeX86Disassembler
LLVMInitializeARMTarget
LLVMInitializeMipsTarget
LLVMInitializeX86Target
LLVMInitializeARMTargetMC
LLVMInitializeMipsTargetMC
LLVMInitializeX86TargetMC
LLVMInitializeARMTargetInfo
LLVMInitializeMipsTargetInfo
LLVMInitializeX86TargetInfo
LLVMInsertBasicBlock
LLVMInsertBasicBlockInContext