From 2e93e386fd228176aeb1100bfdf961bdae2b51b9 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 27 Mar 2015 01:37:10 +0100 Subject: [PATCH] rust_llvm: Add way to reflectively ask if a ValueRef is a known constant int. Add option-returning variants to `const_to_int`/`const_to_uint` that never assert fail. (These will be used for overflow checking from rustc_trans::trans::consts.) --- src/librustc_llvm/lib.rs | 1 + src/librustc_trans/trans/common.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index c7b5b2e7534..2c4305d3c45 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -1976,6 +1976,7 @@ extern { pub fn LLVMIsAArgument(value_ref: ValueRef) -> ValueRef; pub fn LLVMIsAAllocaInst(value_ref: ValueRef) -> ValueRef; + pub fn LLVMIsAConstantInt(value_ref: ValueRef) -> ValueRef; pub fn LLVMInitializeX86TargetInfo(); pub fn LLVMInitializeX86Target(); diff --git a/src/librustc_trans/trans/common.rs b/src/librustc_trans/trans/common.rs index 745098d6e87..995f3caf588 100644 --- a/src/librustc_trans/trans/common.rs +++ b/src/librustc_trans/trans/common.rs @@ -963,6 +963,32 @@ pub fn const_to_uint(v: ValueRef) -> u64 { } } +fn is_const_integral(v: ValueRef) -> bool { + unsafe { + !llvm::LLVMIsAConstantInt(v).is_null() + } +} + +pub fn const_to_opt_int(v: ValueRef) -> Option { + unsafe { + if is_const_integral(v) { + Some(llvm::LLVMConstIntGetSExtValue(v)) + } else { + None + } + } +} + +pub fn const_to_opt_uint(v: ValueRef) -> Option { + unsafe { + if is_const_integral(v) { + Some(llvm::LLVMConstIntGetZExtValue(v)) + } else { + None + } + } +} + pub fn is_undef(val: ValueRef) -> bool { unsafe { llvm::LLVMIsUndef(val) != False