about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm/common.rs
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2019-10-13 12:19:14 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2019-10-13 14:43:58 +0200
commitf0e2fc76235cb5184e264d028d86e1ab718b6214 (patch)
treed077d57507219647263655c775cf1a4de1abc4f0 /src/librustc_codegen_llvm/common.rs
parentea60335c286f45ea14fb2049b395e1bced2a1b45 (diff)
downloadrust-f0e2fc76235cb5184e264d028d86e1ab718b6214.tar.gz
rust-f0e2fc76235cb5184e264d028d86e1ab718b6214.zip
Improve type safety
Diffstat (limited to 'src/librustc_codegen_llvm/common.rs')
-rw-r--r--src/librustc_codegen_llvm/common.rs34
1 files changed, 13 insertions, 21 deletions
diff --git a/src/librustc_codegen_llvm/common.rs b/src/librustc_codegen_llvm/common.rs
index 0d0ee2f6a15..a1a5232d588 100644
--- a/src/librustc_codegen_llvm/common.rs
+++ b/src/librustc_codegen_llvm/common.rs
@@ -2,7 +2,7 @@
 
 //! Code that is useful in various codegen modules.
 
-use crate::llvm::{self, True, False, Bool, BasicBlock, OperandBundleDef};
+use crate::llvm::{self, True, False, Bool, BasicBlock, OperandBundleDef, ConstantInt};
 use crate::abi;
 use crate::consts;
 use crate::type_::Type;
@@ -246,30 +246,22 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
     }
 
     fn const_to_opt_uint(&self, v: &'ll Value) -> Option<u64> {
-        if is_const_integral(v) {
-            unsafe {
-                Some(llvm::LLVMConstIntGetZExtValue(v))
-            }
-        } else {
-            None
-        }
+        try_as_const_integral(v).map(|v| unsafe {
+            llvm::LLVMConstIntGetZExtValue(v)
+        })
     }
 
     fn const_to_opt_u128(&self, v: &'ll Value, sign_ext: bool) -> Option<u128> {
-        unsafe {
-            if is_const_integral(v) {
-                let (mut lo, mut hi) = (0u64, 0u64);
-                let success = llvm::LLVMRustConstInt128Get(v, sign_ext,
-                                                           &mut hi, &mut lo);
-                if success {
-                    Some(hi_lo_to_u128(lo, hi))
-                } else {
-                    None
-                }
+        try_as_const_integral(v).and_then(|v| unsafe {
+            let (mut lo, mut hi) = (0u64, 0u64);
+            let success = llvm::LLVMRustConstInt128Get(v, sign_ext,
+                                                        &mut hi, &mut lo);
+            if success {
+                Some(hi_lo_to_u128(lo, hi))
             } else {
                 None
             }
-        }
+        })
     }
 
     fn scalar_to_backend(
@@ -387,8 +379,8 @@ fn hi_lo_to_u128(lo: u64, hi: u64) -> u128 {
     ((hi as u128) << 64) | (lo as u128)
 }
 
-fn is_const_integral(v: &'ll Value) -> bool {
+fn try_as_const_integral(v: &'ll Value) -> Option<&'ll ConstantInt> {
     unsafe {
-        llvm::LLVMIsAConstantInt(v).is_some()
+        llvm::LLVMIsAConstantInt(v)
     }
 }