Only make symbols external when they are actually externally accessible

Closes #2030
This commit is contained in:
Marijn Haverbeke 2012-03-20 13:19:33 +01:00
parent ade1207ba3
commit 928364b98b
2 changed files with 33 additions and 25 deletions

View file

@ -1898,7 +1898,7 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, real_substs: [ty::t],
let pt = *pt + [path_name(ccx.names(name))];
let s = mangle_exported_name(ccx, pt, mono_ty);
let lldecl = decl_cdecl_fn(ccx.llmod, s, llfty);
let lldecl = decl_internal_cdecl_fn(ccx.llmod, s, llfty);
ccx.monomorphized.insert(hash_id, lldecl);
ccx.item_symbols.insert(fn_id.node, s);
@ -1982,12 +1982,14 @@ fn maybe_instantiate_inline(ccx: @crate_ctxt, fn_id: ast::def_id)
}
csearch::found(ast::ii_method(impl_did, mth)) {
ccx.external.insert(fn_id, some(mth.id));
compute_ii_method_info(ccx, impl_did, mth) {|ty, bounds, path|
if bounds.len() == 0u {
let llfn = get_item_val(ccx, mth.id);
trans_fn(ccx, path, mth.decl, mth.body,
llfn, impl_self(ty), none, mth.id, none);
}
let {bounds: impl_bnds, ty: impl_ty} =
ty::lookup_item_type(ccx.tcx, impl_did);
if (*impl_bnds).len() + mth.tps.len() == 0u {
let llfn = get_item_val(ccx, mth.id);
let path = ty::item_path(ccx.tcx, impl_did) +
[path_name(mth.ident)];
trans_fn(ccx, path, mth.decl, mth.body,
llfn, impl_self(impl_ty), none, mth.id, none);
}
local_def(mth.id)
}
@ -4173,18 +4175,6 @@ fn trans_mod(ccx: @crate_ctxt, m: ast::_mod) {
for item in m.items { trans_item(ccx, *item); }
}
fn compute_ii_method_info(ccx: @crate_ctxt,
impl_did: ast::def_id,
m: @ast::method,
f: fn(ty::t, [ty::param_bounds], ast_map::path)) {
let {bounds: impl_bnds, ty: impl_ty} =
ty::lookup_item_type(ccx.tcx, impl_did);
let m_bounds = *impl_bnds + param_bounds(ccx, m.tps);
let impl_path = ty::item_path(ccx.tcx, impl_did);
let m_path = impl_path + [path_name(m.ident)];
f(impl_ty, m_bounds, m_path);
}
fn get_pair_fn_ty(llpairty: TypeRef) -> TypeRef {
// Bit of a kludge: pick the fn typeref out of the pair.
ret struct_elt(llpairty, 0u);
@ -4196,11 +4186,6 @@ fn register_fn(ccx: @crate_ctxt, sp: span, path: path, flav: str,
register_fn_full(ccx, sp, path, flav, node_id, t)
}
fn param_bounds(ccx: @crate_ctxt, tps: [ast::ty_param])
-> [ty::param_bounds] {
vec::map(tps) {|tp| ccx.tcx.ty_param_bounds.get(tp.id) }
}
fn register_fn_full(ccx: @crate_ctxt, sp: span, path: path, flav: str,
node_id: ast::node_id, node_type: ty::t) -> ValueRef {
let llfty = type_of_fn_from_ty(ccx, node_type);
@ -4333,6 +4318,7 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef {
alt ccx.item_vals.find(id) {
some(v) { v }
none {
let exprt = false;
let val = alt check ccx.tcx.items.get(id) {
ast_map::node_item(i, pth) {
let my_path = *pth + [path_name(i.ident)];
@ -4368,6 +4354,7 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef {
}
}
ast_map::node_method(m, impl_id, pth) {
exprt = true;
let mty = ty::node_id_to_type(ccx.tcx, id);
let pth = *pth + [path_name(int::str(impl_id.node)),
path_name(m.ident)];
@ -4377,6 +4364,7 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef {
llfn
}
ast_map::node_native_item(ni, _, pth) {
exprt = true;
native::decl_native_fn(ccx, ni, *pth + [path_name(ni.ident)])
}
ast_map::node_ctor(i, _) {
@ -4405,6 +4393,9 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef {
llfn
}
};
if !(exprt || ccx.reachable.contains_key(id)) {
lib::llvm::SetLinkage(val, lib::llvm::InternalLinkage);
}
ccx.item_vals.insert(id, val);
val
}

View file

@ -98,7 +98,24 @@ fn traverse_public_item(cx: ctx, item: @item) {
}
}
}
item_class(_tps, _items, _) {} // FIXME handle these when stable
item_class(tps, items, ctor) {
cx.rmap.insert(ctor.node.id, ());
for item in items {
alt item.node.decl {
class_method(i) {
cx.rmap.insert(i.id, ());
if tps.len() > 0u ||
attr::find_inline_attr(i.attrs) != attr::ia_none {
alt i.node {
item_fn(_, _, blk) { traverse_inline_body(cx, blk); }
_ {}
}
}
}
_ {}
}
}
}
item_const(_, _) | item_ty(_, _) | item_enum(_, _) | item_iface(_, _) {}
}
}