use rustc_middle::mir;
use rustc_middle::ty;
use rustc_session::config::CrateType;
-use rustc_span::{symbol::sym, Symbol};
+use rustc_span::Symbol;
use rustc_target::{
abi::{Align, Size},
spec::abi::Abi,
};
use super::backtrace::EvalContextExt as _;
+use crate::helpers::convert::Truncate;
use crate::*;
/// Returned by `emulate_foreign_item_by_name`.
unwind: StackPopUnwind,
) -> InterpResult<'tcx, Option<(&'mir mir::Body<'tcx>, ty::Instance<'tcx>)>> {
let this = self.eval_context_mut();
- let attrs = this.tcx.get_attrs(def_id);
- let link_name = this
- .tcx
- .sess
- .first_attr_value_str_by_name(attrs, sym::link_name)
- .unwrap_or_else(|| this.tcx.item_name(def_id));
+ let link_name = this.item_link_name(def_id);
let tcx = this.tcx.tcx;
// First: functions that diverge.
let a = this.read_scalar(a)?.to_u64()?;
let b = this.read_scalar(b)?.to_u64()?;
- let wide_sum = c_in as u128 + a as u128 + b as u128;
- let (c_out, sum) = ((wide_sum >> 64) as u8, wide_sum as u64);
+ let wide_sum = u128::from(c_in) + u128::from(a) + u128::from(b);
+ let (c_out, sum) = ((wide_sum >> 64).truncate::<u8>(), wide_sum.truncate::<u64>());
let c_out_field = this.place_field(dest, 0)?;
this.write_scalar(Scalar::from_u8(c_out), &c_out_field)?;