Skip to content

Commit 9b3182a

Browse files
committed
Add lookup checks and intrinsics table to trans.
1 parent 7e2f205 commit 9b3182a

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

src/comp/middle/trans.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type glue_fns = rec(ValueRef activate_glue,
4444
state type crate_ctxt = rec(session.session sess,
4545
ModuleRef llmod,
4646
hashmap[str, ValueRef] upcalls,
47+
hashmap[str, ValueRef] intrinsics,
4748
hashmap[str, ValueRef] fn_names,
4849
hashmap[ast.def_id, ValueRef] fn_ids,
4950
hashmap[ast.def_id, @ast.item] items,
@@ -632,7 +633,8 @@ fn build_memcpy(@block_ctxt cx,
632633
ValueRef dst,
633634
ValueRef src,
634635
TypeRef llty) -> result {
635-
auto memcpy = cx.fcx.ccx.fn_names.get("llvm.memcpy");
636+
check (cx.fcx.ccx.intrinsics.contains_key("llvm.memcpy"));
637+
auto memcpy = cx.fcx.ccx.intrinsics.get("llvm.memcpy");
636638
auto src_ptr = cx.build.PointerCast(src, T_ptr(T_i8()));
637639
auto dst_ptr = cx.build.PointerCast(dst, T_ptr(T_i8()));
638640
auto size = lib.llvm.llvm.LLVMSizeOf(llty);
@@ -1059,14 +1061,17 @@ fn trans_lval(@block_ctxt cx, &ast.expr e)
10591061
case (some[ast.def](?def)) {
10601062
alt (def) {
10611063
case (ast.def_arg(?did)) {
1064+
check (cx.fcx.llargs.contains_key(did));
10621065
ret tup(res(cx, cx.fcx.llargs.get(did)),
10631066
false, did);
10641067
}
10651068
case (ast.def_local(?did)) {
1069+
check (cx.fcx.lllocals.contains_key(did));
10661070
ret tup(res(cx, cx.fcx.lllocals.get(did)),
10671071
true, did);
10681072
}
10691073
case (ast.def_fn(?did)) {
1074+
check (cx.fcx.ccx.fn_ids.contains_key(did));
10701075
ret tup(res(cx, cx.fcx.ccx.fn_ids.get(did)),
10711076
false, did);
10721077
}
@@ -1359,6 +1364,7 @@ impure fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
13591364
case (ast.decl_local(?local)) {
13601365
alt (local.init) {
13611366
case (some[@ast.expr](?e)) {
1367+
check (cx.fcx.lllocals.contains_key(local.id));
13621368
auto llptr = cx.fcx.lllocals.get(local.id);
13631369
sub = trans_expr(cx, *e);
13641370
sub.val = sub.bcx.build.Store(sub.val, llptr);
@@ -1468,6 +1474,7 @@ fn new_fn_ctxt(@crate_ctxt cx,
14681474
&ast._fn f,
14691475
ast.def_id fid) -> @fn_ctxt {
14701476

1477+
check (cx.fn_ids.contains_key(fid));
14711478
let ValueRef llfn = cx.fn_ids.get(fid);
14721479
cx.fn_names.insert(cx.path, llfn);
14731480

@@ -1636,6 +1643,7 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
16361643

16371644
auto llargc = llvm.LLVMGetParam(llmain, 0u);
16381645
auto llargv = llvm.LLVMGetParam(llmain, 1u);
1646+
check (cx.fn_names.contains_key("_rust.main"));
16391647
auto llrust_main = cx.fn_names.get("_rust.main");
16401648

16411649
//
@@ -1656,14 +1664,22 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
16561664

16571665
}
16581666

1659-
fn declare_intrinsics(ModuleRef llmod) {
1667+
fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] {
1668+
16601669
let vec[TypeRef] T_trap_args = vec();
16611670
// FIXME: switch this to 64-bit memcpy when targeting a 64-bit system.
16621671
let vec[TypeRef] T_memcpy_args = vec(T_ptr(T_i8()),
16631672
T_ptr(T_i8()),
16641673
T_i32(), T_i32(), T_i1());
1665-
decl_cdecl_fn(llmod, "llvm.trap", T_fn(T_trap_args, T_void()));
1666-
decl_cdecl_fn(llmod, "llvm.memcpy", T_fn(T_memcpy_args, T_void()));
1674+
auto trap = decl_cdecl_fn(llmod, "llvm.trap",
1675+
T_fn(T_trap_args, T_void()));
1676+
auto memcpy = decl_cdecl_fn(llmod, "llvm.memcpy",
1677+
T_fn(T_memcpy_args, T_void()));
1678+
1679+
auto intrinsics = new_str_hash[ValueRef]();
1680+
intrinsics.insert("llvm.trap", trap);
1681+
intrinsics.insert("llvm.memcpy", memcpy);
1682+
ret intrinsics;
16671683
}
16681684

16691685
fn trans_crate(session.session sess, @ast.crate crate, str output) {
@@ -1673,7 +1689,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
16731689

16741690
llvm.LLVMSetModuleInlineAsm(llmod, _str.buf(x86.get_module_asm()));
16751691

1676-
declare_intrinsics(llmod);
1692+
auto intrinsics = declare_intrinsics(llmod);
16771693

16781694
auto glues = @rec(activate_glue = decl_glue(llmod,
16791695
abi.activate_glue_name()),
@@ -1701,6 +1717,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
17011717
auto cx = @rec(sess = sess,
17021718
llmod = llmod,
17031719
upcalls = new_str_hash[ValueRef](),
1720+
intrinsics = intrinsics,
17041721
fn_names = new_str_hash[ValueRef](),
17051722
fn_ids = new_def_hash[ValueRef](),
17061723
items = new_def_hash[@ast.item](),

src/comp/middle/typeck.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,7 @@ fn unify(&fn_ctxt fcx, @ty expected, @ty actual) -> unify_result {
619619
}
620620
}
621621
case (ty_local(?actual_id)) {
622+
check (fcx.locals.contains_key(actual_id));
622623
auto actual_ty = fcx.locals.get(actual_id);
623624
auto result = unify_step(fcx, bindings, expected, actual_ty);
624625
alt (result) {
@@ -828,6 +829,7 @@ fn unify(&fn_ctxt fcx, @ty expected, @ty actual) -> unify_result {
828829
}
829830

830831
case (ty_local(?expected_id)) {
832+
check (fcx.locals.contains_key(expected_id));
831833
auto expected_ty = fcx.locals.get(expected_id);
832834
auto result = unify_step(fcx, bindings, expected_ty, actual);
833835
alt (result) {

0 commit comments

Comments
 (0)