@@ -14,8 +14,9 @@ use lib::llvm::llvm;
14
14
use lib:: llvm:: { CallConv , TypeKind , AtomicBinOp , AtomicOrdering } ;
15
15
use lib:: llvm:: { Opcode , IntPredicate , RealPredicate , True , False } ;
16
16
use lib:: llvm:: { ValueRef , TypeRef , BasicBlockRef , BuilderRef , ModuleRef } ;
17
- use libc:: { c_uint, c_int} ;
17
+ use libc:: { c_uint, c_int, c_ulonglong } ;
18
18
use middle:: trans:: common:: * ;
19
+ use middle:: trans:: machine:: llsize_of_real;
19
20
20
21
use core:: cast:: transmute;
21
22
use core:: cast;
@@ -536,6 +537,25 @@ pub fn Load(cx: block, PointerVal: ValueRef) -> ValueRef {
536
537
}
537
538
}
538
539
540
+ pub fn LoadRangeAssert(cx: block, PointerVal: ValueRef, lo: c_ulonglong,
541
+ hi: c_ulonglong, signed: lib::llvm::Bool) -> ValueRef {
542
+ let value = Load(cx, PointerVal);
543
+
544
+ unsafe {
545
+ let t = llvm::LLVMGetElementType(llvm::LLVMTypeOf(PointerVal));
546
+ let min = llvm::LLVMConstInt(t, lo, signed);
547
+ let max = llvm::LLVMConstInt(t, hi, signed);
548
+
549
+
550
+ do vec::as_imm_buf([min, max]) |ptr, len| {
551
+ llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
552
+ llvm::LLVMMDNode(ptr, len as c_uint));
553
+ }
554
+ }
555
+
556
+ value
557
+ }
558
+
539
559
pub fn Store(cx: block, Val: ValueRef, Ptr: ValueRef) {
540
560
unsafe {
541
561
if cx.unreachable { return; }
0 commit comments