add range assert when loading bools
This commit is contained in:
parent
0262e4b138
commit
12b43b274b
2 changed files with 11 additions and 6 deletions
|
@ -16,6 +16,7 @@ use lib::llvm::{Opcode, IntPredicate, RealPredicate, True, False};
|
||||||
use lib::llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef, ModuleRef};
|
use lib::llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef, ModuleRef};
|
||||||
use libc::{c_uint, c_int, c_ulonglong};
|
use libc::{c_uint, c_int, c_ulonglong};
|
||||||
use middle::trans::common::*;
|
use middle::trans::common::*;
|
||||||
|
use middle::trans::machine::llsize_of_real;
|
||||||
|
|
||||||
use core::cast::transmute;
|
use core::cast::transmute;
|
||||||
use core::cast;
|
use core::cast;
|
||||||
|
@ -540,13 +541,11 @@ pub fn LoadRangeAssert(cx: block, PointerVal: ValueRef, lo: c_ulonglong,
|
||||||
hi: c_ulonglong, signed: lib::llvm::Bool) -> ValueRef {
|
hi: c_ulonglong, signed: lib::llvm::Bool) -> ValueRef {
|
||||||
let value = Load(cx, PointerVal);
|
let value = Load(cx, PointerVal);
|
||||||
|
|
||||||
let ccx = cx.fcx.ccx;
|
|
||||||
let ty = val_ty(PointerVal);
|
|
||||||
unsafe {
|
unsafe {
|
||||||
assert llvm::LLVMGetTypeKind(ty) != lib::llvm::Array;
|
let t = llvm::LLVMGetElementType(llvm::LLVMTypeOf(PointerVal));
|
||||||
|
let min = llvm::LLVMConstInt(t, lo, signed);
|
||||||
|
let max = llvm::LLVMConstInt(t, hi, signed);
|
||||||
|
|
||||||
let min = llvm::LLVMConstInt(ccx.int_type, lo, signed);
|
|
||||||
let max = llvm::LLVMConstInt(ccx.int_type, hi, signed);
|
|
||||||
|
|
||||||
do vec::as_imm_buf([min, max]) |ptr, len| {
|
do vec::as_imm_buf([min, max]) |ptr, len| {
|
||||||
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
|
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
|
||||||
|
|
|
@ -431,7 +431,13 @@ pub impl Datum {
|
||||||
} else {
|
} else {
|
||||||
match self.mode {
|
match self.mode {
|
||||||
ByValue => self.val,
|
ByValue => self.val,
|
||||||
ByRef => Load(bcx, self.val)
|
ByRef => {
|
||||||
|
if ty::type_is_bool(self.ty) {
|
||||||
|
LoadRangeAssert(bcx, self.val, 0, 2, lib::llvm::True)
|
||||||
|
} else {
|
||||||
|
Load(bcx, self.val)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue