Introduce a fallible variant of LLVMConstIntGetZExtValue
which verifies that a constant bit width is within 64 bits or fails.
This commit is contained in:
parent
98f3001eec
commit
7279106166
@ -215,7 +215,11 @@ impl<'ll, 'tcx> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||
}
|
||||
|
||||
fn const_to_opt_uint(&self, v: &'ll Value) -> Option<u64> {
|
||||
try_as_const_integral(v).map(|v| unsafe { llvm::LLVMConstIntGetZExtValue(v) })
|
||||
try_as_const_integral(v).and_then(|v| unsafe {
|
||||
let mut i = 0u64;
|
||||
let success = llvm::LLVMRustConstIntGetZExtValue(v, &mut i);
|
||||
success.then_some(i)
|
||||
})
|
||||
}
|
||||
|
||||
fn const_to_opt_u128(&self, v: &'ll Value, sign_ext: bool) -> Option<u128> {
|
||||
|
@ -1096,7 +1096,7 @@ extern "C" {
|
||||
pub fn LLVMConstInt(IntTy: &Type, N: c_ulonglong, SignExtend: Bool) -> &Value;
|
||||
pub fn LLVMConstIntOfArbitraryPrecision(IntTy: &Type, Wn: c_uint, Ws: *const u64) -> &Value;
|
||||
pub fn LLVMConstReal(RealTy: &Type, N: f64) -> &Value;
|
||||
pub fn LLVMConstIntGetZExtValue(ConstantVal: &ConstantInt) -> c_ulonglong;
|
||||
pub fn LLVMRustConstIntGetZExtValue(ConstantVal: &ConstantInt, Value: &mut u64) -> bool;
|
||||
pub fn LLVMRustConstInt128Get(
|
||||
ConstantVal: &ConstantInt,
|
||||
SExt: bool,
|
||||
|
@ -1618,6 +1618,14 @@ extern "C" LLVMValueRef LLVMRustConstInBoundsGEP2(LLVMTypeRef Ty,
|
||||
return wrap(ConstantExpr::getInBoundsGetElementPtr(unwrap(Ty), Val, IdxList));
|
||||
}
|
||||
|
||||
extern "C" bool LLVMRustConstIntGetZExtValue(LLVMValueRef CV, uint64_t *value) {
|
||||
auto C = unwrap<llvm::ConstantInt>(CV);
|
||||
if (C->getBitWidth() > 64)
|
||||
return false;
|
||||
*value = C->getZExtValue();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns true if both high and low were successfully set. Fails in case constant wasn’t any of
|
||||
// the common sizes (1, 8, 16, 32, 64, 128 bits)
|
||||
extern "C" bool LLVMRustConstInt128Get(LLVMValueRef CV, bool sext, uint64_t *high, uint64_t *low)
|
||||
|
14
src/test/ui/codegen/issue-101585-128bit-repeat.rs
Normal file
14
src/test/ui/codegen/issue-101585-128bit-repeat.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Regression test for issue 101585.
|
||||
// run-pass
|
||||
|
||||
fn main() {
|
||||
fn min_array_ok() -> [i128; 1] {
|
||||
[i128::MIN]
|
||||
}
|
||||
assert_eq!(min_array_ok(), [-170141183460469231731687303715884105728i128]);
|
||||
|
||||
fn min_array_nok() -> [i128; 1] {
|
||||
[i128::MIN; 1]
|
||||
}
|
||||
assert_eq!(min_array_nok(), [-170141183460469231731687303715884105728i128]);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user