diff options
| author | Graydon Hoare <[email protected]> | 2011-03-29 13:21:16 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-29 13:23:51 -0700 |
| commit | 734abe593dc09edaea0f24978acf4f4270337361 (patch) | |
| tree | eaac6bb58a955617ec1ac47e031002a97931ac40 /src/comp/middle | |
| parent | XFAIL nbody on darwin, quiet tinderbox for now. (diff) | |
| download | rust-734abe593dc09edaea0f24978acf4f4270337361.tar.xz rust-734abe593dc09edaea0f24978acf4f4270337361.zip | |
Teach trans to emit undefined references to 'use'd symbols. Can compile and run a simple 'use std;' example now.
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/trans.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 3995e1de..551a6348 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -11,6 +11,7 @@ import std.option.some; import std.option.none; import front.ast; +import front.creader; import driver.session; import middle.ty; import back.x86; @@ -3606,10 +3607,30 @@ fn lval_generic_fn(@block_ctxt cx, ret lv; } +fn trans_external_path(@block_ctxt cx, &ast.path p, + ast.def def, ast.ann a) -> lval_result { + auto ccx = cx.fcx.ccx; + auto ty = node_ann_type(ccx, a); + auto name = creader.get_symbol(ccx.sess, ast.def_id_of_def(def)); + auto v = get_extern_const(ccx.externs, ccx.llmod, + name, type_of(ccx, ty)); + ret lval_mem(cx, v); +} + +fn def_is_external(@crate_ctxt cx, ast.def d) -> bool { + auto id = ast.def_id_of_def(d); + ret id._0 != cx.sess.get_targ_crate_num(); +} + fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt, &ast.ann ann) -> lval_result { alt (dopt) { case (some[ast.def](?def)) { + + if (def_is_external(cx.fcx.ccx, def)) { + ret trans_external_path(cx, p, def, ann); + } + alt (def) { case (ast.def_arg(?did)) { alt (cx.fcx.llargs.find(did)) { |