Fix overflow operations
This commit is contained in:
parent
0d773175cc
commit
4b5940ad77
1 changed files with 12 additions and 2 deletions
14
src/int.rs
14
src/int.rs
|
@ -404,7 +404,7 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
|
||||||
|
|
||||||
let ret_indirect = matches!(fn_abi.ret.mode, PassMode::Indirect { .. });
|
let ret_indirect = matches!(fn_abi.ret.mode, PassMode::Indirect { .. });
|
||||||
|
|
||||||
let result = if ret_indirect {
|
let call = if ret_indirect {
|
||||||
let res_value = self.current_func().new_local(self.location, res_type, "result_value");
|
let res_value = self.current_func().new_local(self.location, res_type, "result_value");
|
||||||
let res_addr = res_value.get_address(self.location);
|
let res_addr = res_value.get_address(self.location);
|
||||||
let res_param_type = res_type.make_pointer();
|
let res_param_type = res_type.make_pointer();
|
||||||
|
@ -432,8 +432,17 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
|
||||||
);
|
);
|
||||||
self.context.new_call(self.location, func, &[lhs, rhs, overflow_addr])
|
self.context.new_call(self.location, func, &[lhs, rhs, overflow_addr])
|
||||||
};
|
};
|
||||||
|
// NOTE: we must assign the result of the operation to a variable at this point to make
|
||||||
|
// sure it will be evaluated by libgccjit now.
|
||||||
|
// Otherwise, it will only be evaluated when the rvalue for the call is used somewhere else
|
||||||
|
// and overflow_value will not be initialized at the correct point in the program.
|
||||||
|
let result = self.current_func().new_local(self.location, res_type, "result");
|
||||||
|
self.block.add_assignment(self.location, result, call);
|
||||||
|
|
||||||
(result, self.context.new_cast(self.location, overflow_value, self.bool_type).to_rvalue())
|
(
|
||||||
|
result.to_rvalue(),
|
||||||
|
self.context.new_cast(self.location, overflow_value, self.bool_type).to_rvalue(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gcc_icmp(
|
pub fn gcc_icmp(
|
||||||
|
@ -865,6 +874,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
|
||||||
let value_type = value.get_type();
|
let value_type = value.get_type();
|
||||||
if self.is_native_int_type_or_bool(dest_typ) && self.is_native_int_type_or_bool(value_type)
|
if self.is_native_int_type_or_bool(dest_typ) && self.is_native_int_type_or_bool(value_type)
|
||||||
{
|
{
|
||||||
|
// TODO: use self.location.
|
||||||
self.context.new_cast(None, value, dest_typ)
|
self.context.new_cast(None, value, dest_typ)
|
||||||
} else if self.is_native_int_type_or_bool(dest_typ) {
|
} else if self.is_native_int_type_or_bool(dest_typ) {
|
||||||
self.context.new_cast(None, self.low(value), dest_typ)
|
self.context.new_cast(None, self.low(value), dest_typ)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue