Skip to content

Commit 371b61a

Browse files
committed
Drop two useless sub-passes from trans
Neither collect_tag_ctors nor the second pass in collect_items needed to be separate passes. Also remove obsolete obj_methods table kludge.
1 parent a4694ce commit 371b61a

File tree

3 files changed

+59
-98
lines changed

3 files changed

+59
-98
lines changed

src/comp/middle/trans.rs

Lines changed: 55 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -5010,8 +5010,8 @@ fn trans_item(cx: @local_ctxt, item: ast::item) {
50105010
with *extend_path(cx, item.ident)};
50115011
trans_obj(sub_cx, item.span, ob, ctor_id, tps);
50125012
}
5013-
ast::item_impl(tps, _, _, ms) {
5014-
trans_impl::trans_impl(cx, item.ident, ms, item.id, tps);
5013+
ast::item_impl(tps, ifce, _, ms) {
5014+
trans_impl::trans_impl(cx, item.ident, ms, item.id, tps, ifce);
50155015
}
50165016
ast::item_res(decl, tps, body, dtor_id, ctor_id) {
50175017
trans_res_ctor(cx, item.span, decl, ctor_id, tps);
@@ -5249,56 +5249,55 @@ fn collect_native_item(ccx: @crate_ctxt,
52495249
_v: vt<[str]>) {
52505250
alt i.node {
52515251
ast::native_item_fn(_, tps) {
5252-
if !ccx.obj_methods.contains_key(i.id) {
5253-
let sp = i.span;
5254-
let id = i.id;
5255-
let node_type = node_id_type(ccx, id);
5256-
let fn_abi =
5257-
alt attr::get_meta_item_value_str_by_name(i.attrs, "abi") {
5258-
option::none. {
5252+
let sp = i.span;
5253+
let id = i.id;
5254+
let node_type = node_id_type(ccx, id);
5255+
let fn_abi =
5256+
alt attr::get_meta_item_value_str_by_name(i.attrs, "abi") {
5257+
option::none. {
52595258
// if abi isn't specified for this function, inherit from
5260-
// its enclosing native module
5261-
option::get(*abi)
5259+
// its enclosing native module
5260+
option::get(*abi)
52625261
}
5263-
_ {
5264-
alt attr::native_abi(i.attrs) {
5265-
either::right(abi_) { abi_ }
5266-
either::left(msg) { ccx.sess.span_fatal(i.span, msg) }
5262+
_ {
5263+
alt attr::native_abi(i.attrs) {
5264+
either::right(abi_) { abi_ }
5265+
either::left(msg) { ccx.sess.span_fatal(i.span, msg) }
5266+
}
52675267
}
5268-
}
52695268
};
5270-
alt fn_abi {
5271-
ast::native_abi_rust_intrinsic. {
5272-
// For intrinsics: link the function directly to the intrinsic
5273-
// function itself.
5274-
check returns_non_ty_var(ccx, node_type);
5275-
let fn_type = type_of_fn_from_ty(
5276-
ccx, sp, node_type,
5277-
vec::map(tps, {|p| param_bounds(ccx, p)}));
5278-
let ri_name = "rust_intrinsic_" + link_name(i);
5279-
let llnativefn = get_extern_fn(
5280-
ccx.externs, ccx.llmod, ri_name,
5281-
lib::llvm::LLVMCCallConv, fn_type);
5282-
ccx.item_ids.insert(id, llnativefn);
5283-
ccx.item_symbols.insert(id, ri_name);
5284-
}
5269+
alt fn_abi {
5270+
ast::native_abi_rust_intrinsic. {
5271+
// For intrinsics: link the function directly to the intrinsic
5272+
// function itself.
5273+
check returns_non_ty_var(ccx, node_type);
5274+
let fn_type = type_of_fn_from_ty(
5275+
ccx, sp, node_type,
5276+
vec::map(tps, {|p| param_bounds(ccx, p)}));
5277+
let ri_name = "rust_intrinsic_" + link_name(i);
5278+
let llnativefn = get_extern_fn(
5279+
ccx.externs, ccx.llmod, ri_name,
5280+
lib::llvm::LLVMCCallConv, fn_type);
5281+
ccx.item_ids.insert(id, llnativefn);
5282+
ccx.item_symbols.insert(id, ri_name);
5283+
}
52855284

5286-
ast::native_abi_cdecl. | ast::native_abi_stdcall. {
5287-
// For true external functions: create a rust wrapper
5288-
// and link to that. The rust wrapper will handle
5289-
// switching to the C stack.
5290-
let new_pt = pt + [i.ident];
5291-
register_fn(ccx, i.span, new_pt, "native fn", tps, i.id);
5292-
}
5293-
}
5285+
ast::native_abi_cdecl. | ast::native_abi_stdcall. {
5286+
// For true external functions: create a rust wrapper
5287+
// and link to that. The rust wrapper will handle
5288+
// switching to the C stack.
5289+
let new_pt = pt + [i.ident];
5290+
register_fn(ccx, i.span, new_pt, "native fn", tps, i.id);
5291+
}
52945292
}
52955293
}
52965294
_ { }
52975295
}
52985296
}
52995297

5300-
fn collect_item_1(ccx: @crate_ctxt, abi: @mutable option::t<ast::native_abi>,
5301-
i: @ast::item, &&pt: [str], v: vt<[str]>) {
5298+
fn collect_item(ccx: @crate_ctxt, abi: @mutable option::t<ast::native_abi>,
5299+
i: @ast::item, &&pt: [str], v: vt<[str]>) {
5300+
let new_pt = pt + [i.ident];
53025301
alt i.node {
53035302
ast::item_const(_, _) {
53045303
let typ = node_id_type(ccx, i.id);
@@ -5323,26 +5322,11 @@ fn collect_item_1(ccx: @crate_ctxt, abi: @mutable option::t<ast::native_abi>,
53235322
}
53245323
}
53255324
}
5326-
_ { }
5327-
}
5328-
visit::visit_item(i, pt + [i.ident], v);
5329-
}
5330-
5331-
fn collect_item_2(ccx: @crate_ctxt, i: @ast::item, &&pt: [str],
5332-
v: vt<[str]>) {
5333-
let new_pt = pt + [i.ident];
5334-
visit::visit_item(i, new_pt, v);
5335-
alt i.node {
53365325
ast::item_fn(_, tps, _) {
5337-
if !ccx.obj_methods.contains_key(i.id) {
5338-
register_fn(ccx, i.span, new_pt, "fn", tps, i.id);
5339-
}
5326+
register_fn(ccx, i.span, new_pt, "fn", tps, i.id);
53405327
}
53415328
ast::item_obj(ob, tps, ctor_id) {
53425329
register_fn(ccx, i.span, new_pt, "obj_ctor", tps, ctor_id);
5343-
for m: @ast::method in ob.methods {
5344-
ccx.obj_methods.insert(m.id, ());
5345-
}
53465330
}
53475331
ast::item_impl(tps, _, _, methods) {
53485332
let name = ccx.names.next(i.ident);
@@ -5362,47 +5346,28 @@ fn collect_item_2(ccx: @crate_ctxt, i: @ast::item, &&pt: [str],
53625346
check returns_non_ty_var(ccx, t);
53635347
register_fn_full(ccx, i.span, new_pt, "res_dtor", tps, i.id, t);
53645348
}
5365-
_ { }
5366-
}
5367-
}
5368-
5369-
fn collect_items(ccx: @crate_ctxt, crate: @ast::crate) {
5370-
let abi = @mutable none::<ast::native_abi>;
5371-
let visitor0 = visit::default_visitor();
5372-
let visitor1 =
5373-
@{visit_native_item: bind collect_native_item(ccx, abi, _, _, _),
5374-
visit_item: bind collect_item_1(ccx, abi, _, _, _) with *visitor0};
5375-
let visitor2 =
5376-
@{visit_item: bind collect_item_2(ccx, _, _, _) with *visitor0};
5377-
visit::visit_crate(*crate, [], visit::mk_vt(visitor1));
5378-
visit::visit_crate(*crate, [], visit::mk_vt(visitor2));
5379-
}
5380-
5381-
fn collect_tag_ctor(ccx: @crate_ctxt, i: @ast::item, &&pt: [str],
5382-
v: vt<[str]>) {
5383-
let new_pt = pt + [i.ident];
5384-
visit::visit_item(i, new_pt, v);
5385-
alt i.node {
53865349
ast::item_tag(variants, tps) {
5387-
for variant: ast::variant in variants {
5350+
for variant in variants {
53885351
if vec::len(variant.node.args) != 0u {
53895352
register_fn(ccx, i.span, new_pt + [variant.node.name],
53905353
"tag", tps, variant.node.id);
53915354
}
53925355
}
53935356
}
5394-
_ {/* fall through */ }
5357+
_ { }
53955358
}
5359+
visit::visit_item(i, new_pt, v);
53965360
}
53975361

5398-
fn collect_tag_ctors(ccx: @crate_ctxt, crate: @ast::crate) {
5399-
let visitor =
5400-
@{visit_item: bind collect_tag_ctor(ccx, _, _, _)
5401-
with *visit::default_visitor()};
5402-
visit::visit_crate(*crate, [], visit::mk_vt(visitor));
5362+
fn collect_items(ccx: @crate_ctxt, crate: @ast::crate) {
5363+
let abi = @mutable none::<ast::native_abi>;
5364+
visit::visit_crate(*crate, [], visit::mk_vt(@{
5365+
visit_native_item: bind collect_native_item(ccx, abi, _, _, _),
5366+
visit_item: bind collect_item(ccx, abi, _, _, _)
5367+
with *visit::default_visitor()
5368+
}));
54035369
}
54045370

5405-
54065371
// The constant translation pass.
54075372
fn trans_constant(ccx: @crate_ctxt, it: @ast::item, &&pt: [str],
54085373
v: vt<[str]>) {
@@ -5411,15 +5376,12 @@ fn trans_constant(ccx: @crate_ctxt, it: @ast::item, &&pt: [str],
54115376
alt it.node {
54125377
ast::item_tag(variants, _) {
54135378
let i = 0u;
5414-
let n_variants = vec::len::<ast::variant>(variants);
5415-
while i < n_variants {
5416-
let variant = variants[i];
5379+
for variant in variants {
54175380
let p = new_pt + [it.ident, variant.node.name, "discrim"];
54185381
let s = mangle_exported_name(ccx, p, ty::mk_int(ccx.tcx));
5419-
let discrim_gvar =
5420-
str::as_buf(s, {|buf|
5421-
llvm::LLVMAddGlobal(ccx.llmod, ccx.int_type, buf)
5422-
});
5382+
let discrim_gvar = str::as_buf(s, {|buf|
5383+
llvm::LLVMAddGlobal(ccx.llmod, ccx.int_type, buf)
5384+
});
54235385
llvm::LLVMSetInitializer(discrim_gvar, C_int(ccx, i as int));
54245386
llvm::LLVMSetGlobalConstant(discrim_gvar, True);
54255387
ccx.discrims.insert(
@@ -5670,7 +5632,6 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
56705632
discrims: ast_util::new_def_id_hash::<ValueRef>(),
56715633
discrim_symbols: new_int_hash::<str>(),
56725634
consts: new_int_hash::<ValueRef>(),
5673-
obj_methods: new_int_hash::<()>(),
56745635
tydescs: ty::new_ty_hash(),
56755636
module_data: new_str_hash::<ValueRef>(),
56765637
lltypes: ty::new_ty_hash(),
@@ -5706,7 +5667,6 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
57065667
dbg_cx: dbg_cx};
57075668
let cx = new_local_ctxt(ccx);
57085669
collect_items(ccx, crate);
5709-
collect_tag_ctors(ccx, crate);
57105670
trans_constants(ccx, crate);
57115671
trans_mod(cx, crate.node.module);
57125672
fill_crate_map(ccx, crate_map);
@@ -5724,7 +5684,6 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
57245684
#error("n_null_glues: %u", ccx.stats.n_null_glues);
57255685
#error("n_real_glues: %u", ccx.stats.n_real_glues);
57265686

5727-
57285687
for timing: {ident: str, time: int} in *ccx.stats.fn_times {
57295688
#error("time: %s took %d ms", timing.ident, timing.time);
57305689
}

src/comp/middle/trans_common.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ type crate_ctxt =
9292
discrims: hashmap<ast::def_id, ValueRef>,
9393
discrim_symbols: hashmap<ast::node_id, str>,
9494
consts: hashmap<ast::node_id, ValueRef>,
95-
obj_methods: hashmap<ast::node_id, ()>,
9695
tydescs: hashmap<ty::t, @tydesc_info>,
9796
module_data: hashmap<str, ValueRef>,
9897
lltypes: hashmap<ty::t, TypeRef>,

src/comp/middle/trans_impl.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import trans::*;
22
import trans_common::*;
3+
import trans_build::*;
34
import option::{some, none};
45
import syntax::ast;
6+
import lib::llvm;
57

68
fn trans_impl(cx: @local_ctxt, name: ast::ident, methods: [@ast::method],
7-
id: ast::node_id, tps: [ast::ty_param]) {
9+
id: ast::node_id, tps: [ast::ty_param],
10+
_ifce: option::t<@ast::ty>) {
811
let sub_cx = extend_path(cx, name);
912
for m in methods {
1013
alt cx.ccx.item_ids.find(m.id) {

0 commit comments

Comments
 (0)