Skip to content

Commit

Permalink
[0.39.0] Backport CI fixes (#4490)
Browse files Browse the repository at this point in the history
* Fix panics in s390x codegen related to aliases

This commit fixes an issue introduced as part of the fix for
GHSA-5fhj-g3p3-pq9g. The `reftyped_vregs` list given to `regalloc2` is
not allowed to have duplicates in it and while the list originally
doesn't have duplicates once aliases are applied the list may have
duplicates. The fix here is to perform another pass to remove duplicates
after the aliases have been processed.

* Fix a miscompile for s390x with constants

This carries over a narrow fix from #4427 to prior release branches. The
patch here was created by `@uweigand` during the investigation for #4487.

* Add release notes
  • Loading branch information
alexcrichton authored Jul 20, 2022
1 parent c780594 commit 0b0ee24
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
12 changes: 12 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
--------------------------------------------------------------------------------

## 0.39.1

Released 2022-07-20.

### Fixed

* An s390x-specific codegen bug in addition to a mistake introduced in the fix
of CVE-2022-31146 were fixed.
[#4490](https://github.com/bytecodealliance/wasmtime/pull/4490)

--------------------------------------------------------------------------------

## 0.39.0

Released 2022-07-20.
Expand Down
14 changes: 13 additions & 1 deletion cranelift/codegen/src/isa/s390x/lower/isle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ where
fn u64_from_value(&mut self, val: Value) -> Option<u64> {
let inst = self.lower_ctx.dfg().value_def(val).inst()?;
let constant = self.lower_ctx.get_constant(inst)?;
Some(constant)
let ty = self.lower_ctx.output_ty(inst, 0);
Some(zero_extend_to_u64(constant, self.ty_bits(ty).unwrap()))
}

#[inline]
Expand Down Expand Up @@ -597,6 +598,17 @@ where
}
}

/// Zero-extend the low `from_bits` bits of `value` to a full u64.
#[inline]
fn zero_extend_to_u64(value: u64, from_bits: u8) -> u64 {
assert!(from_bits <= 64);
if from_bits >= 64 {
value
} else {
value & ((1u64 << from_bits) - 1)
}
}

/// Sign-extend the low `from_bits` bits of `value` to a full u64.
#[inline]
fn sign_extend_to_u64(value: u64, from_bits: u8) -> u64 {
Expand Down
5 changes: 5 additions & 0 deletions cranelift/codegen/src/machinst/vcode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -598,9 +598,14 @@ impl<I: VCodeInst> VCodeBuilder<I> {
// will be returned directly to `regalloc2` eventually and all
// operands/results of instructions will use the alias-resolved vregs
// from `regalloc2`'s perspective.
//
// Also note that `reftyped_vregs` can't have duplicates, so after the
// aliases are applied duplicates are removed.
for reg in self.vcode.reftyped_vregs.iter_mut() {
*reg = Self::resolve_vreg_alias_impl(&self.vcode.vreg_aliases, *reg);
}
self.vcode.reftyped_vregs.sort();
self.vcode.reftyped_vregs.dedup();

self.compute_preds_from_succs();
self.vcode.debug_value_labels.sort_unstable();
Expand Down

0 comments on commit 0b0ee24

Please sign in to comment.