@@ -44,6 +44,7 @@ type glue_fns = rec(ValueRef activate_glue,
44
44
state type crate_ctxt = rec ( session. session sess,
45
45
ModuleRef llmod,
46
46
hashmap[ str, ValueRef ] upcalls,
47
+ hashmap[ str, ValueRef ] intrinsics,
47
48
hashmap[ str, ValueRef ] fn_names,
48
49
hashmap[ ast. def_id , ValueRef ] fn_ids,
49
50
hashmap[ ast. def_id , @ast. item ] items,
@@ -632,7 +633,8 @@ fn build_memcpy(@block_ctxt cx,
632
633
ValueRef dst,
633
634
ValueRef src,
634
635
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" ) ;
636
638
auto src_ptr = cx. build . PointerCast ( src, T_ptr ( T_i8 ( ) ) ) ;
637
639
auto dst_ptr = cx. build . PointerCast ( dst, T_ptr ( T_i8 ( ) ) ) ;
638
640
auto size = lib. llvm . llvm . LLVMSizeOf ( llty) ;
@@ -1059,14 +1061,17 @@ fn trans_lval(@block_ctxt cx, &ast.expr e)
1059
1061
case ( some[ ast. def ] ( ?def) ) {
1060
1062
alt ( def) {
1061
1063
case ( ast. def_arg ( ?did) ) {
1064
+ check ( cx. fcx . llargs . contains_key ( did) ) ;
1062
1065
ret tup( res ( cx, cx. fcx . llargs . get ( did) ) ,
1063
1066
false , did) ;
1064
1067
}
1065
1068
case ( ast. def_local ( ?did) ) {
1069
+ check ( cx. fcx . lllocals . contains_key ( did) ) ;
1066
1070
ret tup( res ( cx, cx. fcx . lllocals . get ( did) ) ,
1067
1071
true , did) ;
1068
1072
}
1069
1073
case ( ast. def_fn ( ?did) ) {
1074
+ check ( cx. fcx . ccx . fn_ids . contains_key ( did) ) ;
1070
1075
ret tup( res ( cx, cx. fcx . ccx . fn_ids . get ( did) ) ,
1071
1076
false , did) ;
1072
1077
}
@@ -1359,6 +1364,7 @@ impure fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
1359
1364
case ( ast. decl_local( ?local) ) {
1360
1365
alt ( local. init) {
1361
1366
case ( some[ @ast. expr] ( ?e) ) {
1367
+ check ( cx. fcx. lllocals. contains_key( local. id) ) ;
1362
1368
auto llptr = cx. fcx. lllocals. get( local. id) ;
1363
1369
sub = trans_expr( cx, * e) ;
1364
1370
sub. val = sub. bcx. build. Store ( sub. val, llptr) ;
@@ -1468,6 +1474,7 @@ fn new_fn_ctxt(@crate_ctxt cx,
1468
1474
& ast . _fn f,
1469
1475
ast. def_id fid ) -> @fn_ctxt {
1470
1476
1477
+ check ( cx. fn_ids . contains_key ( fid) ) ;
1471
1478
let ValueRef llfn = cx. fn_ids . get ( fid) ;
1472
1479
cx. fn_names . insert ( cx. path , llfn) ;
1473
1480
@@ -1636,6 +1643,7 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
1636
1643
1637
1644
auto llargc = llvm. LLVMGetParam ( llmain, 0 u) ;
1638
1645
auto llargv = llvm. LLVMGetParam ( llmain, 1 u) ;
1646
+ check ( cx. fn_names . contains_key ( "_rust.main" ) ) ;
1639
1647
auto llrust_main = cx. fn_names . get ( "_rust.main" ) ;
1640
1648
1641
1649
//
@@ -1656,14 +1664,22 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
1656
1664
1657
1665
}
1658
1666
1659
- fn declare_intrinsics ( ModuleRef llmod) {
1667
+ fn declare_intrinsics ( ModuleRef llmod) -> hashmap [ str, ValueRef ] {
1668
+
1660
1669
let vec[ TypeRef ] T_trap_args = vec ( ) ;
1661
1670
// FIXME: switch this to 64-bit memcpy when targeting a 64-bit system.
1662
1671
let vec[ TypeRef ] T_memcpy_args = vec ( T_ptr ( T_i8 ( ) ) ,
1663
1672
T_ptr ( T_i8 ( ) ) ,
1664
1673
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;
1667
1683
}
1668
1684
1669
1685
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) {
1673
1689
1674
1690
llvm. LLVMSetModuleInlineAsm ( llmod, _str. buf ( x86. get_module_asm ( ) ) ) ;
1675
1691
1676
- declare_intrinsics ( llmod) ;
1692
+ auto intrinsics = declare_intrinsics ( llmod) ;
1677
1693
1678
1694
auto glues = @rec ( activate_glue = decl_glue ( llmod,
1679
1695
abi. activate_glue_name ( ) ) ,
@@ -1701,6 +1717,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
1701
1717
auto cx = @rec ( sess = sess,
1702
1718
llmod = llmod,
1703
1719
upcalls = new_str_hash[ ValueRef ] ( ) ,
1720
+ intrinsics = intrinsics,
1704
1721
fn_names = new_str_hash[ ValueRef ] ( ) ,
1705
1722
fn_ids = new_def_hash[ ValueRef ] ( ) ,
1706
1723
items = new_def_hash[ @ast. item ] ( ) ,
0 commit comments