rustc: Reduce shape.rs to the bare minimum needed to not trigger bugs
This commit is contained in:
parent
954eee5310
commit
e500659eb5
@ -23,92 +23,13 @@ use option::is_some;
|
||||
|
||||
use ty_ctxt = middle::ty::ctxt;
|
||||
|
||||
type nominal_id_ = {did: ast::def_id, parent_id: Option<ast::def_id>,
|
||||
tps: ~[ty::t]};
|
||||
type nominal_id = @nominal_id_;
|
||||
|
||||
impl nominal_id_ : core::cmp::Eq {
|
||||
pure fn eq(other: &nominal_id_) -> bool {
|
||||
if self.did != other.did ||
|
||||
self.parent_id != other.parent_id {
|
||||
false
|
||||
} else {
|
||||
do vec::all2(self.tps, other.tps) |m_tp, n_tp| {
|
||||
ty::type_id(m_tp) == ty::type_id(n_tp)
|
||||
}
|
||||
}
|
||||
}
|
||||
pure fn ne(other: &nominal_id_) -> bool {
|
||||
! (self == *other)
|
||||
}
|
||||
}
|
||||
|
||||
impl nominal_id_ : to_bytes::IterBytes {
|
||||
pure fn iter_bytes(lsb0: bool, f: to_bytes::Cb) {
|
||||
to_bytes::iter_bytes_2(&self.did, &self.parent_id, lsb0, f);
|
||||
for self.tps.each |t| {
|
||||
ty::type_id(*t).iter_bytes(lsb0, f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn mk_nominal_id(tcx: ty::ctxt, did: ast::def_id,
|
||||
parent_id: Option<ast::def_id>,
|
||||
tps: ~[ty::t]) -> nominal_id {
|
||||
let tps_norm = tps.map(|t| ty::normalize_ty(tcx, *t));
|
||||
@{did: did, parent_id: parent_id, tps: tps_norm}
|
||||
}
|
||||
|
||||
fn new_nominal_id_hash<T: Copy>() -> HashMap<nominal_id, T> {
|
||||
return HashMap();
|
||||
}
|
||||
|
||||
type enum_data = {did: ast::def_id, substs: ty::substs};
|
||||
|
||||
type ctxt =
|
||||
{mut next_tag_id: u16,
|
||||
pad: u16,
|
||||
tag_id_to_index: HashMap<nominal_id, u16>,
|
||||
tag_order: DVec<enum_data>,
|
||||
resources: interner::interner<nominal_id>,
|
||||
llshapetablesty: TypeRef,
|
||||
llshapetables: ValueRef};
|
||||
|
||||
const shape_u8: u8 = 0u8;
|
||||
const shape_u16: u8 = 1u8;
|
||||
const shape_u32: u8 = 2u8;
|
||||
const shape_u64: u8 = 3u8;
|
||||
const shape_i8: u8 = 4u8;
|
||||
const shape_i16: u8 = 5u8;
|
||||
const shape_i32: u8 = 6u8;
|
||||
const shape_i64: u8 = 7u8;
|
||||
const shape_f32: u8 = 8u8;
|
||||
const shape_f64: u8 = 9u8;
|
||||
const shape_box: u8 = 10u8;
|
||||
const shape_enum: u8 = 12u8;
|
||||
const shape_struct: u8 = 17u8;
|
||||
const shape_box_fn: u8 = 18u8;
|
||||
const shape_res: u8 = 20u8;
|
||||
const shape_uniq: u8 = 22u8;
|
||||
const shape_opaque_closure_ptr: u8 = 23u8; // the closure itself.
|
||||
const shape_uniq_fn: u8 = 25u8;
|
||||
const shape_stack_fn: u8 = 26u8;
|
||||
const shape_bare_fn: u8 = 27u8;
|
||||
const shape_tydesc: u8 = 28u8;
|
||||
const shape_send_tydesc: u8 = 29u8;
|
||||
const shape_rptr: u8 = 31u8;
|
||||
const shape_fixedvec: u8 = 32u8;
|
||||
const shape_slice: u8 = 33u8;
|
||||
const shape_unboxed_vec: u8 = 34u8;
|
||||
type ctxt = {mut next_tag_id: u16, pad: u16, pad2: u32};
|
||||
|
||||
fn mk_global(ccx: @crate_ctxt, name: ~str, llval: ValueRef, internal: bool) ->
|
||||
ValueRef {
|
||||
let llglobal =
|
||||
str::as_c_str(name,
|
||||
|buf| {
|
||||
lib::llvm::llvm::LLVMAddGlobal(ccx.llmod,
|
||||
val_ty(llval), buf)
|
||||
});
|
||||
let llglobal = do str::as_c_str(name) |buf| {
|
||||
lib::llvm::llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval), buf)
|
||||
};
|
||||
lib::llvm::llvm::LLVMSetInitializer(llglobal, llval);
|
||||
lib::llvm::llvm::LLVMSetGlobalConstant(llglobal, True);
|
||||
|
||||
@ -119,91 +40,13 @@ fn mk_global(ccx: @crate_ctxt, name: ~str, llval: ValueRef, internal: bool) ->
|
||||
return llglobal;
|
||||
}
|
||||
|
||||
|
||||
// Computes a set of variants of a enum that are guaranteed to have size and
|
||||
// alignment at least as large as any other variant of the enum. This is an
|
||||
// important performance optimization.
|
||||
|
||||
fn round_up(size: u16, align: u8) -> u16 {
|
||||
assert (align >= 1u8);
|
||||
let alignment = align as u16;
|
||||
return size - 1u16 + alignment & !(alignment - 1u16);
|
||||
}
|
||||
|
||||
type size_align = {size: u16, align: u8};
|
||||
|
||||
enum enum_kind {
|
||||
tk_unit, // 1 variant, no data
|
||||
tk_enum, // N variants, no data
|
||||
tk_newtype, // 1 variant, data
|
||||
tk_complex // N variants, no data
|
||||
}
|
||||
|
||||
fn enum_kind(ccx: @crate_ctxt, did: ast::def_id) -> enum_kind {
|
||||
let variants = ty::enum_variants(ccx.tcx, did);
|
||||
if vec::any(*variants, |v| vec::len(v.args) > 0u) {
|
||||
if vec::len(*variants) == 1u { tk_newtype }
|
||||
else { tk_complex }
|
||||
} else {
|
||||
if vec::len(*variants) <= 1u { tk_unit }
|
||||
else { tk_enum }
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the code corresponding to the pointer size on this architecture.
|
||||
fn s_int(tcx: ty_ctxt) -> u8 {
|
||||
return match tcx.sess.targ_cfg.arch {
|
||||
session::arch_x86 => shape_i32,
|
||||
session::arch_x86_64 => shape_i64,
|
||||
session::arch_arm => shape_i32
|
||||
};
|
||||
}
|
||||
|
||||
fn s_uint(tcx: ty_ctxt) -> u8 {
|
||||
return match tcx.sess.targ_cfg.arch {
|
||||
session::arch_x86 => shape_u32,
|
||||
session::arch_x86_64 => shape_u64,
|
||||
session::arch_arm => shape_u32
|
||||
};
|
||||
}
|
||||
|
||||
fn s_float(tcx: ty_ctxt) -> u8 {
|
||||
return match tcx.sess.targ_cfg.arch {
|
||||
session::arch_x86 => shape_f64,
|
||||
session::arch_x86_64 => shape_f64,
|
||||
session::arch_arm => shape_f64
|
||||
};
|
||||
}
|
||||
|
||||
fn s_variant_enum_t(tcx: ty_ctxt) -> u8 {
|
||||
return s_int(tcx);
|
||||
}
|
||||
|
||||
fn s_tydesc(_tcx: ty_ctxt) -> u8 {
|
||||
return shape_tydesc;
|
||||
}
|
||||
|
||||
fn s_send_tydesc(_tcx: ty_ctxt) -> u8 {
|
||||
return shape_send_tydesc;
|
||||
}
|
||||
|
||||
fn mk_ctxt(llmod: ModuleRef) -> ctxt {
|
||||
let llshapetablesty = trans::common::T_named_struct(~"shapes");
|
||||
let llshapetables = str::as_c_str(~"shapes", |buf| {
|
||||
let _llshapetables = str::as_c_str(~"shapes", |buf| {
|
||||
lib::llvm::llvm::LLVMAddGlobal(llmod, llshapetablesty, buf)
|
||||
});
|
||||
|
||||
return {mut next_tag_id: 0u16,
|
||||
pad: 0u16,
|
||||
tag_id_to_index: new_nominal_id_hash(),
|
||||
tag_order: DVec(),
|
||||
resources: interner::mk(),
|
||||
llshapetablesty: llshapetablesty,
|
||||
llshapetables: llshapetables};
|
||||
}
|
||||
|
||||
fn add_bool(&dest: ~[u8], val: bool) {
|
||||
dest += ~[if val { 1u8 } else { 0u8 }];
|
||||
return {mut next_tag_id: 0u16, pad: 0u16, pad2: 0u32};
|
||||
}
|
||||
|
||||
fn add_u16(&dest: ~[u8], val: u16) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user