-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add mips64-gnu and mips64el-gnu targets #36024
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# rustbuild-only target |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# rustbuild-only target |
+1 −1 | Cargo.toml | |
+2 −2 | libc-test/Cargo.lock | |
+1 −0 | libc-test/build-generated.rs | |
+17 −1 | libc-test/build.rs | |
+1 −1 | libc-test/generate-files/Cargo.lock | |
+4 −1 | src/lib.rs | |
+42 −0 | src/unix/bsd/apple/mod.rs | |
+34 −0 | src/unix/bsd/freebsdlike/mod.rs | |
+9 −0 | src/unix/bsd/mod.rs | |
+4 −2 | src/unix/bsd/openbsdlike/mod.rs | |
+17 −0 | src/unix/bsd/openbsdlike/openbsd.rs | |
+17 −0 | src/unix/mod.rs | |
+4 −0 | src/unix/notbsd/android/b32.rs | |
+4 −0 | src/unix/notbsd/android/b64.rs | |
+65 −0 | src/unix/notbsd/android/mod.rs | |
+5 −0 | src/unix/notbsd/linux/mips.rs | |
+221 −0 | src/unix/notbsd/linux/mips64.rs | |
+14 −10 | src/unix/notbsd/linux/mod.rs | |
+2 −0 | src/unix/notbsd/linux/musl/b64/aarch64.rs | |
+0 −1 | src/unix/notbsd/linux/musl/b64/mod.rs | |
+2 −0 | src/unix/notbsd/linux/musl/b64/powerpc64.rs | |
+2 −0 | src/unix/notbsd/linux/musl/b64/x86_64.rs | |
+15 −0 | src/unix/notbsd/linux/musl/mod.rs | |
+63 −0 | src/unix/notbsd/linux/other/mod.rs | |
+35 −0 | src/unix/notbsd/mod.rs | |
+17 −2 | src/unix/solaris/mod.rs |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// Copyright 2016 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 target::{Target, TargetOptions, TargetResult}; | ||
|
||
pub fn target() -> TargetResult { | ||
Ok(Target { | ||
llvm_target: "mips64-unknown-linux-gnuabi64".to_string(), | ||
target_endian: "big".to_string(), | ||
target_pointer_width: "64".to_string(), | ||
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(), | ||
arch: "mips64".to_string(), | ||
target_os: "linux".to_string(), | ||
target_env: "gnu".to_string(), | ||
target_vendor: "unknown".to_string(), | ||
options: TargetOptions { | ||
// NOTE(mips64r2) matches C toolchain | ||
cpu: "mips64r2".to_string(), | ||
features: "+mips64r2".to_string(), | ||
max_atomic_width: 64, | ||
..super::linux_base::opts() | ||
}, | ||
}) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// Copyright 2016 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 target::{Target, TargetOptions, TargetResult}; | ||
|
||
pub fn target() -> TargetResult { | ||
Ok(Target { | ||
llvm_target: "mips64el-unknown-linux-gnuabi64".to_string(), | ||
target_endian: "little".to_string(), | ||
target_pointer_width: "64".to_string(), | ||
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(), | ||
arch: "mips64".to_string(), | ||
target_os: "linux".to_string(), | ||
target_env: "gnu".to_string(), | ||
target_vendor: "unknown".to_string(), | ||
options: TargetOptions { | ||
// NOTE(mips64r2) matches C toolchain | ||
cpu: "mips64r2".to_string(), | ||
features: "+mips64r2".to_string(), | ||
max_atomic_width: 64, | ||
..super::linux_base::opts() | ||
}, | ||
}) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
// Copyright 2016 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. | ||
|
||
#![allow(non_upper_case_globals)] | ||
|
||
use libc::c_uint; | ||
use std::cmp; | ||
use llvm; | ||
use llvm::{Integer, Pointer, Float, Double, Struct, Array, Vector}; | ||
use abi::{ArgType, FnType}; | ||
use context::CrateContext; | ||
use type_::Type; | ||
|
||
fn align_up_to(off: usize, a: usize) -> usize { | ||
return (off + a - 1) / a * a; | ||
} | ||
|
||
fn align(off: usize, ty: Type) -> usize { | ||
let a = ty_align(ty); | ||
return align_up_to(off, a); | ||
} | ||
|
||
fn ty_align(ty: Type) -> usize { | ||
match ty.kind() { | ||
Integer => ((ty.int_width() as usize) + 7) / 8, | ||
Pointer => 8, | ||
Float => 4, | ||
Double => 8, | ||
Struct => { | ||
if ty.is_packed() { | ||
1 | ||
} else { | ||
let str_tys = ty.field_types(); | ||
str_tys.iter().fold(1, |a, t| cmp::max(a, ty_align(*t))) | ||
} | ||
} | ||
Array => { | ||
let elt = ty.element_type(); | ||
ty_align(elt) | ||
} | ||
Vector => { | ||
let len = ty.vector_length(); | ||
let elt = ty.element_type(); | ||
ty_align(elt) * len | ||
} | ||
_ => bug!("ty_align: unhandled type") | ||
} | ||
} | ||
|
||
fn ty_size(ty: Type) -> usize { | ||
match ty.kind() { | ||
Integer => ((ty.int_width() as usize) + 7) / 8, | ||
Pointer => 8, | ||
Float => 4, | ||
Double => 8, | ||
Struct => { | ||
if ty.is_packed() { | ||
let str_tys = ty.field_types(); | ||
str_tys.iter().fold(0, |s, t| s + ty_size(*t)) | ||
} else { | ||
let str_tys = ty.field_types(); | ||
let size = str_tys.iter().fold(0, |s, t| align(s, *t) + ty_size(*t)); | ||
align(size, ty) | ||
} | ||
} | ||
Array => { | ||
let len = ty.array_length(); | ||
let elt = ty.element_type(); | ||
let eltsz = ty_size(elt); | ||
len * eltsz | ||
} | ||
Vector => { | ||
let len = ty.vector_length(); | ||
let elt = ty.element_type(); | ||
let eltsz = ty_size(elt); | ||
len * eltsz | ||
} | ||
_ => bug!("ty_size: unhandled type") | ||
} | ||
} | ||
|
||
fn classify_ret_ty(ccx: &CrateContext, ret: &mut ArgType) { | ||
if is_reg_ty(ret.ty) { | ||
ret.extend_integer_width_to(64); | ||
} else { | ||
ret.make_indirect(ccx); | ||
} | ||
} | ||
|
||
fn classify_arg_ty(ccx: &CrateContext, arg: &mut ArgType, offset: &mut usize) { | ||
let orig_offset = *offset; | ||
let size = ty_size(arg.ty) * 8; | ||
let mut align = ty_align(arg.ty); | ||
|
||
align = cmp::min(cmp::max(align, 4), 8); | ||
*offset = align_up_to(*offset, align); | ||
*offset += align_up_to(size, align * 8) / 8; | ||
|
||
if !is_reg_ty(arg.ty) { | ||
arg.cast = Some(struct_ty(ccx, arg.ty)); | ||
arg.pad = padding_ty(ccx, align, orig_offset); | ||
} else { | ||
arg.extend_integer_width_to(64); | ||
} | ||
} | ||
|
||
fn is_reg_ty(ty: Type) -> bool { | ||
return match ty.kind() { | ||
Integer | ||
| Pointer | ||
| Float | ||
| Double | ||
| Vector => true, | ||
_ => false | ||
}; | ||
} | ||
|
||
fn padding_ty(ccx: &CrateContext, align: usize, offset: usize) -> Option<Type> { | ||
if ((align - 1 ) & offset) > 0 { | ||
Some(Type::i32(ccx)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This might be incorrect, especially if only 64-bit registers are in use. |
||
} else { | ||
None | ||
} | ||
} | ||
|
||
fn coerce_to_int(ccx: &CrateContext, size: usize) -> Vec<Type> { | ||
let int_ty = Type::i32(ccx); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here. |
||
let mut args = Vec::new(); | ||
|
||
let mut n = size / 64; | ||
while n > 0 { | ||
args.push(int_ty); | ||
n -= 1; | ||
} | ||
|
||
let r = size % 64; | ||
if r > 0 { | ||
unsafe { | ||
args.push(Type::from_ref(llvm::LLVMIntTypeInContext(ccx.llcx(), r as c_uint))); | ||
} | ||
} | ||
|
||
args | ||
} | ||
|
||
fn struct_ty(ccx: &CrateContext, ty: Type) -> Type { | ||
let size = ty_size(ty) * 8; | ||
Type::struct_(ccx, &coerce_to_int(ccx, size), false) | ||
} | ||
|
||
pub fn compute_abi_info(ccx: &CrateContext, fty: &mut FnType) { | ||
if !fty.ret.is_ignore() { | ||
classify_ret_ty(ccx, &mut fty.ret); | ||
} | ||
|
||
let mut offset = if fty.ret.is_indirect() { 8 } else { 0 }; | ||
for arg in &mut fty.args { | ||
if arg.is_ignore() { continue; } | ||
classify_arg_ty(ccx, arg, &mut offset); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,11 +28,7 @@ fn align(off: usize, ty: Type) -> usize { | |
|
||
fn ty_align(ty: Type) -> usize { | ||
match ty.kind() { | ||
Integer => { | ||
unsafe { | ||
((llvm::LLVMGetIntTypeWidth(ty.to_ref()) as usize) + 7) / 8 | ||
} | ||
} | ||
Integer => ((ty.int_width() as usize) + 7) / 8, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I forgot to mention but these two are drive by cleanups. The int_width method is equivalent to the llvm call that was deleted. |
||
Pointer => 4, | ||
Float => 4, | ||
Double => 8, | ||
|
@@ -54,11 +50,7 @@ fn ty_align(ty: Type) -> usize { | |
|
||
fn ty_size(ty: Type) -> usize { | ||
match ty.kind() { | ||
Integer => { | ||
unsafe { | ||
((llvm::LLVMGetIntTypeWidth(ty.to_ref()) as usize) + 7) / 8 | ||
} | ||
} | ||
Integer => ((ty.int_width() as usize) + 7) / 8, | ||
Pointer => 4, | ||
Float => 4, | ||
Double => 8, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -155,6 +155,11 @@ mod arch { | |
} | ||
} | ||
|
||
#[cfg(target_arch = "mips64")] | ||
mod arch { | ||
pub use libc::{off_t, ino_t, nlink_t, blksize_t, blkcnt_t, stat, time_t}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if I need to add stability attributes. This whole module is deprecated anyway. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's actually ok to just leave this out, the deprecated modules are just here for backwards compatibility. MIPS64 didn't even work back then, so there's no compatibility to be had! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should I There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh right, nah this is fine to just keep everything else compiling. |
||
} | ||
|
||
#[cfg(target_arch = "aarch64")] | ||
mod arch { | ||
use os::raw::{c_long, c_int}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not 100% sure if these MIN_ALIGN values make sense for the mips64.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It should, at least on all 64-bit GNU userlands.