rustc: Make tag discriminants per-tag-ID, not per-tag-ID-and-subtypes

This commit is contained in:
Patrick Walton 2011-03-03 17:57:36 -08:00
parent b4a85c7b58
commit 629eba1d06

View file

@ -60,10 +60,7 @@ type glue_fns = rec(ValueRef activate_glue,
ValueRef bzero_glue, ValueRef bzero_glue,
ValueRef vec_grow_glue); ValueRef vec_grow_glue);
type tag_info = rec( type tag_info = rec(type_handle th);
type_handle th,
mutable @hashmap[ast.def_id,ValueRef] lldiscrims
);
state type crate_ctxt = rec(session.session sess, state type crate_ctxt = rec(session.session sess,
ModuleRef llmod, ModuleRef llmod,
@ -78,6 +75,7 @@ state type crate_ctxt = rec(session.session sess,
hashmap[ast.def_id, hashmap[ast.def_id,
@ast.native_item] native_items, @ast.native_item] native_items,
hashmap[@ty.t, @tag_info] tags, hashmap[@ty.t, @tag_info] tags,
hashmap[ast.def_id, ValueRef] discrims,
hashmap[ast.def_id, ValueRef] fn_pairs, hashmap[ast.def_id, ValueRef] fn_pairs,
hashmap[ast.def_id, ValueRef] consts, hashmap[ast.def_id, ValueRef] consts,
hashmap[ast.def_id,()] obj_methods, hashmap[ast.def_id,()] obj_methods,
@ -2962,9 +2960,7 @@ fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
} else { } else {
// Nullary variant. // Nullary variant.
auto tag_ty = node_ann_type(cx.fcx.ccx, ann); auto tag_ty = node_ann_type(cx.fcx.ccx, ann);
auto info = cx.fcx.ccx.tags.get(tag_ty); auto lldiscrim_gv = cx.fcx.ccx.discrims.get(vid);
check (info.lldiscrims.contains_key(vid));
auto lldiscrim_gv = info.lldiscrims.get(vid);
auto lldiscrim = cx.build.Load(lldiscrim_gv); auto lldiscrim = cx.build.Load(lldiscrim_gv);
auto alloc_result = alloc_ty(cx, tag_ty); auto alloc_result = alloc_ty(cx, tag_ty);
@ -4866,10 +4862,7 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
auto vi = new_def_hash[uint](); auto vi = new_def_hash[uint]();
auto navi = new_def_hash[uint](); auto navi = new_def_hash[uint]();
auto info = @rec( auto info = @rec(th=mk_type_handle());
th=mk_type_handle(),
mutable lldiscrims=@new_def_hash[ValueRef]()
);
cx.tags.insert(mk_plain_tag(tag_id), info); cx.tags.insert(mk_plain_tag(tag_id), info);
cx.items.insert(tag_id, i); cx.items.insert(tag_id, i);
@ -4980,8 +4973,6 @@ fn resolve_tag_types(@crate_ctxt cx, @ast.crate crate) {
fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt { fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
alt (it.node) { alt (it.node) {
case (ast.item_tag(_, ?variants, _, ?tag_id)) { case (ast.item_tag(_, ?variants, _, ?tag_id)) {
auto info = cx.tags.get(mk_plain_tag(tag_id));
auto i = 0u; auto i = 0u;
auto n_variants = _vec.len[ast.variant](variants); auto n_variants = _vec.len[ast.variant](variants);
while (i < n_variants) { while (i < n_variants) {
@ -5000,7 +4991,7 @@ fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
llvm.LLVMSetLinkage(discrim_gvar, lib.llvm.LLVMPrivateLinkage llvm.LLVMSetLinkage(discrim_gvar, lib.llvm.LLVMPrivateLinkage
as llvm.Linkage); as llvm.Linkage);
info.lldiscrims.insert(variant.id, discrim_gvar); cx.discrims.insert(variant.id, discrim_gvar);
i += 1u; i += 1u;
} }
@ -5445,6 +5436,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output,
items = new_def_hash[@ast.item](), items = new_def_hash[@ast.item](),
native_items = new_def_hash[@ast.native_item](), native_items = new_def_hash[@ast.native_item](),
tags = tags, tags = tags,
discrims = new_def_hash[ValueRef](),
fn_pairs = new_def_hash[ValueRef](), fn_pairs = new_def_hash[ValueRef](),
consts = new_def_hash[ValueRef](), consts = new_def_hash[ValueRef](),
obj_methods = new_def_hash[()](), obj_methods = new_def_hash[()](),