rustc: Add min_align_of, pref_align_of intrinsic, deprecate align_of

This commit is contained in:
Brian Anderson 2012-04-26 22:21:28 -07:00
parent 1c46ee34be
commit f4f909b8b5
4 changed files with 32 additions and 2 deletions

View file

@ -764,10 +764,19 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::native_item,
Store(bcx, C_uint(ccx, shape::llsize_of_real(ccx, lltp_ty)),
fcx.llretptr);
}
// FIXME: Transitional. Please remove me.
"align_of" {
Store(bcx, C_uint(ccx, shape::llalign_of_pref(ccx, lltp_ty)),
fcx.llretptr);
}
"min_align_of" {
Store(bcx, C_uint(ccx, shape::llalign_of_min(ccx, lltp_ty)),
fcx.llretptr);
}
"pref_align_of" {
Store(bcx, C_uint(ccx, shape::llalign_of_pref(ccx, lltp_ty)),
fcx.llretptr);
}
"get_tydesc" {
let td = get_tydesc_simple(ccx, tp_ty);
Store(bcx, PointerCast(bcx, td, T_ptr(T_nil())), fcx.llretptr);

View file

@ -76,7 +76,8 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint)
ast_map::node_native_item(i@@{node: native_item_fn(_, _), _}, abi, _) {
if abi == native_abi_rust_intrinsic {
let flags = alt check i.ident {
"size_of" | "align_of" | "init" |
"size_of" | "align_of" |
"pref_align_of" | "min_align_of" | "init" |
"reinterpret_cast" { use_repr }
"get_tydesc" | "needs_drop" { use_tydesc }
"forget" | "addr_of" { 0u }

View file

@ -2007,7 +2007,8 @@ fn check_intrinsic_type(ccx: @crate_ctxt, it: @ast::native_item) {
}
let tcx = ccx.tcx;
let (n_tps, inputs, output) = alt it.ident {
"size_of" | "align_of" { (1u, [], ty::mk_uint(ccx.tcx)) }
"size_of" | "align_of" |
"pref_align_of" | "min_align_of" { (1u, [], ty::mk_uint(ccx.tcx)) }
"get_tydesc" { (1u, [], ty::mk_nil_ptr(tcx)) }
"init" { (1u, [], param(ccx, 0u)) }
"forget" { (1u, [arg(ast::by_move, param(ccx, 0u))],

View file

@ -0,0 +1,19 @@
// xfail-win32 need to investigate alignment on windows
#[abi = "rust-intrinsic"]
native mod rusti {
fn pref_align_of<T>() -> uint;
fn min_align_of<T>() -> uint;
}
#[cfg(target_arch = "x86")]
fn main() {
assert rusti::pref_align_of::<u64>() == 8u;
assert rusti::min_align_of::<u64>() == 4u;
}
#[cfg(target_arch = "x86_64")]
fn main() {
assert rusti::pref_align_of::<u64>() == 8u;
assert rusti::min_align_of::<u64>() == 8u;
}