@@ -42,6 +42,7 @@ import lib.llvm.llvm.BasicBlockRef;
42
42
43
43
import lib. llvm . False ;
44
44
import lib. llvm . True ;
45
+ import lib. llvm . Bool ;
45
46
46
47
state obj namegen ( mutable int i) {
47
48
fn next ( str prefix ) -> str {
@@ -887,14 +888,13 @@ fn C_null(TypeRef t) -> ValueRef {
887
888
ret llvm. LLVMConstNull ( t) ;
888
889
}
889
890
890
- fn C_integral ( int i , TypeRef t ) -> ValueRef {
891
+ fn C_integral ( TypeRef t , uint u , Bool sign_extend ) -> ValueRef {
891
892
// FIXME. We can't use LLVM.ULongLong with our existing minimal native
892
- // API, which only knows word-sized args. Lucky for us LLVM has a "take a
893
- // string encoding" version. Hilarious. Please fix to handle:
893
+ // API, which only knows word-sized args.
894
894
//
895
895
// ret llvm.LLVMConstInt(T_int(), t as LLVM.ULongLong, False);
896
896
//
897
- ret llvm. LLVMConstIntOfString ( t, Str . buf ( istr ( i ) ) , 10 ) ;
897
+ ret llvm. LLVMRustConstSmallInt ( t, u , sign_extend ) ;
898
898
}
899
899
900
900
fn C_float ( str s) -> ValueRef {
@@ -907,23 +907,23 @@ fn C_floating(str s, TypeRef t) -> ValueRef {
907
907
908
908
fn C_nil ( ) -> ValueRef {
909
909
// NB: See comment above in T_void().
910
- ret C_integral ( 0 , T_i1 ( ) ) ;
910
+ ret C_integral ( T_i1 ( ) , 0 u , False ) ;
911
911
}
912
912
913
913
fn C_bool ( bool b) -> ValueRef {
914
914
if ( b) {
915
- ret C_integral ( 1 , T_bool ( ) ) ;
915
+ ret C_integral ( T_bool ( ) , 1 u , False ) ;
916
916
} else {
917
- ret C_integral ( 0 , T_bool ( ) ) ;
917
+ ret C_integral ( T_bool ( ) , 0 u , False ) ;
918
918
}
919
919
}
920
920
921
921
fn C_int ( int i) -> ValueRef {
922
- ret C_integral ( i , T_int ( ) ) ;
922
+ ret C_integral ( T_int ( ) , i as uint , True ) ;
923
923
}
924
924
925
- fn C_i8 ( uint i) -> ValueRef {
926
- ret C_integral ( i as int , T_i8 ( ) ) ;
925
+ fn C_u8 ( uint i) -> ValueRef {
926
+ ret C_integral ( T_i8 ( ) , i , False ) ;
927
927
}
928
928
929
929
// This is a 'c-like' raw string, which differs from
@@ -961,7 +961,7 @@ fn C_zero_byte_arr(uint size) -> ValueRef {
961
961
auto i = 0 u;
962
962
let vec[ ValueRef ] elts = vec ( ) ;
963
963
while ( i < size) {
964
- elts += vec ( C_integral ( 0 , T_i8 ( ) ) ) ;
964
+ elts += vec ( C_u8 ( 0 u ) ) ;
965
965
i += 1 u;
966
966
}
967
967
ret llvm. LLVMConstArray ( T_i8 ( ) , Vec . buf [ ValueRef ] ( elts) ,
@@ -2175,7 +2175,7 @@ fn make_cmp_glue(@block_ctxt cx,
2175
2175
// == and <= default to true if they find == all the way. <
2176
2176
// defaults to false if it finds == all the way.
2177
2177
auto result_if_equal = scx. build . ICmp ( lib. llvm . LLVMIntNE , llop,
2178
- C_i8 ( abi. cmp_glue_op_lt ) ) ;
2178
+ C_u8 ( abi. cmp_glue_op_lt ) ) ;
2179
2179
scx. build . Store ( result_if_equal, flag) ;
2180
2180
r = res ( scx, C_nil ( ) ) ;
2181
2181
}
@@ -2211,7 +2211,7 @@ fn make_cmp_glue(@block_ctxt cx,
2211
2211
2212
2212
// First 'eq' comparison: if so, continue to next elts.
2213
2213
auto eq_r = call_cmp_glue ( cx, av, bv, t,
2214
- C_i8 ( abi. cmp_glue_op_eq ) ) ;
2214
+ C_u8 ( abi. cmp_glue_op_eq ) ) ;
2215
2215
eq_r. bcx . build . CondBr ( eq_r. val , cnt_cx. llbb , stop_cx. llbb ) ;
2216
2216
2217
2217
// Second 'op' comparison: find out how this elt-pair decides.
@@ -2299,9 +2299,9 @@ fn make_fp_cmp_glue(@block_ctxt cx, ValueRef lhs, ValueRef rhs, ty.t fptype,
2299
2299
unreach_cx. build . Unreachable ( ) ;
2300
2300
2301
2301
auto llswitch = cx. build . Switch ( llop, unreach_cx. llbb , 3 u) ;
2302
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_eq ) , eq_cx. llbb ) ;
2303
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_lt ) , lt_cx. llbb ) ;
2304
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_le ) , le_cx. llbb ) ;
2302
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_eq ) , eq_cx. llbb ) ;
2303
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_lt ) , lt_cx. llbb ) ;
2304
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_le ) , le_cx. llbb ) ;
2305
2305
2306
2306
auto last_result =
2307
2307
last_cx. build . Phi ( T_i1 ( ) , vec ( eq_result, lt_result, le_result) ,
@@ -2341,9 +2341,9 @@ fn compare_integral_values(@block_ctxt cx, ValueRef lhs, ValueRef rhs,
2341
2341
unreach_cx. build . Unreachable ( ) ;
2342
2342
2343
2343
auto llswitch = cx. build . Switch ( llop, unreach_cx. llbb , 3 u) ;
2344
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_eq ) , eq_cx. llbb ) ;
2345
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_lt ) , lt_cx. llbb ) ;
2346
- llvm. LLVMAddCase ( llswitch, C_i8 ( abi. cmp_glue_op_le ) , le_cx. llbb ) ;
2344
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_eq ) , eq_cx. llbb ) ;
2345
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_lt ) , lt_cx. llbb ) ;
2346
+ llvm. LLVMAddCase ( llswitch, C_u8 ( abi. cmp_glue_op_le ) , le_cx. llbb ) ;
2347
2347
2348
2348
auto last_result =
2349
2349
last_cx. build . Phi ( T_i1 ( ) , vec ( eq_result, lt_result, le_result) ,
@@ -2949,18 +2949,19 @@ fn trans_lit(@crate_ctxt cx, &ast.lit lit, &ast.ann ann) -> ValueRef {
2949
2949
// if target int width is larger than host, at the moment;
2950
2950
// re-do the mach-int types using 'big' when that works.
2951
2951
auto t = T_int ( ) ;
2952
+ auto s = True ;
2952
2953
alt ( tm) {
2953
- case ( common. ty_u8) { t = T_i8 ( ) ; }
2954
- case ( common. ty_u16) { t = T_i16 ( ) ; }
2955
- case ( common. ty_u32) { t = T_i32 ( ) ; }
2956
- case ( common. ty_u64) { t = T_i64 ( ) ; }
2954
+ case ( common. ty_u8) { t = T_i8 ( ) ; s = False ; }
2955
+ case ( common. ty_u16) { t = T_i16 ( ) ; s = False ; }
2956
+ case ( common. ty_u32) { t = T_i32 ( ) ; s = False ; }
2957
+ case ( common. ty_u64) { t = T_i64 ( ) ; s = False ; }
2957
2958
2958
2959
case ( common. ty_i8) { t = T_i8 ( ) ; }
2959
2960
case ( common. ty_i16) { t = T_i16 ( ) ; }
2960
2961
case ( common. ty_i32) { t = T_i32 ( ) ; }
2961
2962
case ( common. ty_i64) { t = T_i64 ( ) ; }
2962
2963
}
2963
- ret C_integral ( i , t ) ;
2964
+ ret C_integral ( t , i as uint , s ) ;
2964
2965
}
2965
2966
case( ast. lit_float( ?fs) ) {
2966
2967
ret C_float ( fs) ;
@@ -2974,7 +2975,7 @@ fn trans_lit(@crate_ctxt cx, &ast.lit lit, &ast.ann ann) -> ValueRef {
2974
2975
ret C_floating ( s, t) ;
2975
2976
}
2976
2977
case ( ast. lit_char( ?c) ) {
2977
- ret C_integral ( c as int , T_char ( ) ) ;
2978
+ ret C_integral ( T_char ( ) , c as uint , False ) ;
2978
2979
}
2979
2980
case ( ast. lit_bool( ?b) ) {
2980
2981
ret C_bool ( b) ;
@@ -3116,12 +3117,12 @@ fn trans_compare(@block_ctxt cx0, ast.binop op, ty.t t0,
3116
3117
// FIXME: Use or-patterns when we have them.
3117
3118
auto llop;
3118
3119
alt ( op) {
3119
- case ( ast. eq) { llop = C_i8 ( abi. cmp_glue_op_eq) ; }
3120
- case ( ast. lt) { llop = C_i8 ( abi. cmp_glue_op_lt) ; }
3121
- case ( ast. le) { llop = C_i8 ( abi. cmp_glue_op_le) ; }
3122
- case ( ast. ne) { llop = C_i8 ( abi. cmp_glue_op_eq) ; }
3123
- case ( ast. ge) { llop = C_i8 ( abi. cmp_glue_op_lt) ; }
3124
- case ( ast. gt) { llop = C_i8 ( abi. cmp_glue_op_le) ; }
3120
+ case ( ast. eq) { llop = C_u8 ( abi. cmp_glue_op_eq) ; }
3121
+ case ( ast. lt) { llop = C_u8 ( abi. cmp_glue_op_lt) ; }
3122
+ case ( ast. le) { llop = C_u8 ( abi. cmp_glue_op_le) ; }
3123
+ case ( ast. ne) { llop = C_u8 ( abi. cmp_glue_op_eq) ; }
3124
+ case ( ast. ge) { llop = C_u8 ( abi. cmp_glue_op_lt) ; }
3125
+ case ( ast. gt) { llop = C_u8 ( abi. cmp_glue_op_le) ; }
3125
3126
}
3126
3127
3127
3128
auto rslt = call_cmp_glue( cx, lhs, rhs, t, llop) ;
@@ -7347,7 +7348,7 @@ fn make_bzero_glue(ValueRef fun) -> ValueRef {
7347
7348
// Loop-body block
7348
7349
auto lb = new_builder ( loopbb) ;
7349
7350
i = lb. Load ( ip) ;
7350
- lb. Store ( C_integral ( 0 , T_i8 ( ) ) , lb. GEP ( dst, vec ( i) ) ) ;
7351
+ lb. Store ( C_u8 ( 0 u ) , lb. GEP ( dst, vec ( i) ) ) ;
7351
7352
lb. Store ( lb. Add ( i, C_int ( 1 ) ) , ip) ;
7352
7353
lb. Br ( hdrbb) ;
7353
7354
0 commit comments