Skip to content

Commit 734abe5

Browse files
committed
Teach trans to emit undefined references to 'use'd symbols. Can compile and run a simple 'use std;' example now.
1 parent 6936093 commit 734abe5

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

src/comp/front/ast.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,28 @@ tag def {
4343
def_native_fn(def_id);
4444
}
4545

46+
fn def_id_of_def(def d) -> def_id {
47+
alt (d) {
48+
case (def_fn(?id)) { ret id; }
49+
case (def_obj(?id)) { ret id; }
50+
case (def_obj_field(?id)) { ret id; }
51+
case (def_mod(?id)) { ret id; }
52+
case (def_native_mod(?id)) { ret id; }
53+
case (def_const(?id)) { ret id; }
54+
case (def_arg(?id)) { ret id; }
55+
case (def_local(?id)) { ret id; }
56+
case (def_upvar(?id)) { ret id; }
57+
case (def_variant(_, ?id)) { ret id; }
58+
case (def_ty(?id)) { ret id; }
59+
case (def_ty_arg(?id)) { ret id; }
60+
case (def_binding(?id)) { ret id; }
61+
case (def_use(?id)) { ret id; }
62+
case (def_native_ty(?id)) { ret id; }
63+
case (def_native_fn(?id)) { ret id; }
64+
}
65+
fail;
66+
}
67+
4668
type crate = spanned[crate_];
4769
type crate_ = rec(vec[@crate_directive] directives,
4870
_mod module);

src/comp/front/creader.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,16 @@ impure fn get_item_kind(&ebml.reader ebml_r) -> u8 {
403403
ret get_item_generic[u8](ebml_r, metadata.tag_items_kind, f);
404404
}
405405

406+
impure fn get_item_symbol(&ebml.reader ebml_r) -> str {
407+
impure fn converter(vec[u8] data) -> str {
408+
auto x = @mutable 3;
409+
*x = 5;
410+
ret _str.unsafe_from_bytes(data);
411+
}
412+
auto f = converter;
413+
ret get_item_generic[str](ebml_r, metadata.tag_items_symbol, f);
414+
}
415+
406416
// FIXME: This is a *terrible* botch.
407417
impure fn impure_parse_def_id(vec[u8] data) -> ast.def_id {
408418
auto x = @mutable 3;
@@ -573,6 +583,13 @@ fn get_type(session.session sess, ast.def_id def) -> ty.ty_params_and_ty {
573583
ret tup(tps, t);
574584
}
575585

586+
fn get_symbol(session.session sess, ast.def_id def) -> str {
587+
auto external_crate_id = def._0;
588+
auto data = sess.get_external_crate(external_crate_id);
589+
auto ebml_r = lookup_item(def._1, data);
590+
ret get_item_symbol(ebml_r);
591+
}
592+
576593
// Local Variables:
577594
// mode: rust
578595
// fill-column: 78;

src/comp/middle/trans.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import std.option.some;
1111
import std.option.none;
1212

1313
import front.ast;
14+
import front.creader;
1415
import driver.session;
1516
import middle.ty;
1617
import back.x86;
@@ -3606,10 +3607,30 @@ fn lval_generic_fn(@block_ctxt cx,
36063607
ret lv;
36073608
}
36083609

3610+
fn trans_external_path(@block_ctxt cx, &ast.path p,
3611+
ast.def def, ast.ann a) -> lval_result {
3612+
auto ccx = cx.fcx.ccx;
3613+
auto ty = node_ann_type(ccx, a);
3614+
auto name = creader.get_symbol(ccx.sess, ast.def_id_of_def(def));
3615+
auto v = get_extern_const(ccx.externs, ccx.llmod,
3616+
name, type_of(ccx, ty));
3617+
ret lval_mem(cx, v);
3618+
}
3619+
3620+
fn def_is_external(@crate_ctxt cx, ast.def d) -> bool {
3621+
auto id = ast.def_id_of_def(d);
3622+
ret id._0 != cx.sess.get_targ_crate_num();
3623+
}
3624+
36093625
fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
36103626
&ast.ann ann) -> lval_result {
36113627
alt (dopt) {
36123628
case (some[ast.def](?def)) {
3629+
3630+
if (def_is_external(cx.fcx.ccx, def)) {
3631+
ret trans_external_path(cx, p, def, ann);
3632+
}
3633+
36133634
alt (def) {
36143635
case (ast.def_arg(?did)) {
36153636
alt (cx.fcx.llargs.find(did)) {

src/comp/rustc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ auth driver.rustc.main = impure;
4545
auth front.creader.load_crate = unsafe;
4646
auth front.creader.lookup_def = impure;
4747
auth front.creader.get_type = impure;
48+
auth front.creader.get_symbol = impure;
4849
auth front.creader.impure_no_op = impure;
4950
auth middle.metadata = unsafe;
5051
auth middle.trans = unsafe;

0 commit comments

Comments
 (0)