mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-01 19:23:50 +00:00
Calculate discriminant bounds within 64 bits
Since discriminants do not support i128 yet, lets just calculate the boundaries within the 64 bits that are supported. This also avoids an issue with bootstrapping on 32 bit systems due to #38727.
This commit is contained in:
parent
6b359635ec
commit
ee69cd7925
@ -20,7 +20,8 @@ use ty::{self, Ty, TyCtxt, TypeFoldable};
|
|||||||
use syntax::ast::{FloatTy, IntTy, UintTy};
|
use syntax::ast::{FloatTy, IntTy, UintTy};
|
||||||
use syntax::attr;
|
use syntax::attr;
|
||||||
use syntax_pos::DUMMY_SP;
|
use syntax_pos::DUMMY_SP;
|
||||||
use rustc_i128::{i128, u128};
|
use rustc_i128::u128;
|
||||||
|
use rustc_const_math::ConstInt;
|
||||||
|
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
@ -1198,20 +1199,25 @@ impl<'a, 'gcx, 'tcx> Layout {
|
|||||||
|
|
||||||
if def.is_enum() && def.variants.iter().all(|v| v.fields.is_empty()) {
|
if def.is_enum() && def.variants.iter().all(|v| v.fields.is_empty()) {
|
||||||
// All bodies empty -> intlike
|
// All bodies empty -> intlike
|
||||||
let (mut min, mut max, mut non_zero) = (i128::max_value(),
|
let (mut min, mut max, mut non_zero) = (i64::max_value(),
|
||||||
i128::min_value(),
|
i64::min_value(),
|
||||||
true);
|
true);
|
||||||
for v in &def.variants {
|
for v in &def.variants {
|
||||||
let x = v.disr_val.to_u128_unchecked() as i128;
|
let x = match v.disr_val.erase_type() {
|
||||||
|
ConstInt::InferSigned(i) => i as i64,
|
||||||
|
ConstInt::Infer(i) => i as u64 as i64,
|
||||||
|
_ => bug!()
|
||||||
|
};
|
||||||
if x == 0 { non_zero = false; }
|
if x == 0 { non_zero = false; }
|
||||||
if x < min { min = x; }
|
if x < min { min = x; }
|
||||||
if x > max { max = x; }
|
if x > max { max = x; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: should take i128?
|
// FIXME: should handle i128? signed-value based impl is weird and hard to
|
||||||
|
// grok.
|
||||||
let (discr, signed) = Integer::repr_discr(tcx, ty, &hints[..],
|
let (discr, signed) = Integer::repr_discr(tcx, ty, &hints[..],
|
||||||
min as i64,
|
min,
|
||||||
max as i64);
|
max);
|
||||||
return success(CEnum {
|
return success(CEnum {
|
||||||
discr: discr,
|
discr: discr,
|
||||||
signed: signed,
|
signed: signed,
|
||||||
|
@ -33,7 +33,7 @@ pub enum LLVMRustResult {
|
|||||||
// Consts for the LLVM CallConv type, pre-cast to usize.
|
// Consts for the LLVM CallConv type, pre-cast to usize.
|
||||||
|
|
||||||
/// LLVM CallingConv::ID. Should we wrap this?
|
/// LLVM CallingConv::ID. Should we wrap this?
|
||||||
#[derive(Copy, Clone, PartialEq)]
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub enum CallConv {
|
pub enum CallConv {
|
||||||
CCallConv = 0,
|
CCallConv = 0,
|
||||||
|
@ -313,7 +313,7 @@ impl ArgType {
|
|||||||
///
|
///
|
||||||
/// I will do my best to describe this structure, but these
|
/// I will do my best to describe this structure, but these
|
||||||
/// comments are reverse-engineered and may be inaccurate. -NDM
|
/// comments are reverse-engineered and may be inaccurate. -NDM
|
||||||
#[derive(Clone)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct FnType {
|
pub struct FnType {
|
||||||
/// The LLVM types of each argument.
|
/// The LLVM types of each argument.
|
||||||
pub args: Vec<ArgType>,
|
pub args: Vec<ArgType>,
|
||||||
|
@ -205,6 +205,7 @@ pub fn trans_mir<'a, 'tcx: 'a>(
|
|||||||
sig: &ty::FnSig<'tcx>,
|
sig: &ty::FnSig<'tcx>,
|
||||||
abi: Abi,
|
abi: Abi,
|
||||||
) {
|
) {
|
||||||
|
debug!("fn_ty: {:?}", fn_ty);
|
||||||
let debug_context =
|
let debug_context =
|
||||||
debuginfo::create_function_debug_context(fcx.ccx, instance, sig, abi, fcx.llfn, mir);
|
debuginfo::create_function_debug_context(fcx.ccx, instance, sig, abi, fcx.llfn, mir);
|
||||||
let bcx = fcx.get_entry_block();
|
let bcx = fcx.get_entry_block();
|
||||||
|
@ -79,7 +79,7 @@ impl<'a, 'tcx> OperandRef<'tcx> {
|
|||||||
pub fn immediate(self) -> ValueRef {
|
pub fn immediate(self) -> ValueRef {
|
||||||
match self.val {
|
match self.val {
|
||||||
OperandValue::Immediate(s) => s,
|
OperandValue::Immediate(s) => s,
|
||||||
_ => bug!()
|
_ => bug!("not immediate: {:?}", self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user