Skip to content

Commit

Permalink
[0.38.0] Backport CI fixes (#4491)
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 committed Jul 20, 2022
1 parent 486c88b commit 3969e02
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
12 changes: 12 additions & 0 deletions RELEASES.md
@@ -1,5 +1,17 @@
--------------------------------------------------------------------------------

## 0.38.3

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.
[#4491](https://github.com/bytecodealliance/wasmtime/pull/4491)

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

## 0.38.2

Released 2022-07-20.
Expand Down
14 changes: 13 additions & 1 deletion cranelift/codegen/src/isa/s390x/lower/isle.rs
Expand Up @@ -226,7 +226,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 @@ -516,3 +517,14 @@ where
self.lower_ctx.emit(inst.clone());
}
}

/// 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)
}
}
5 changes: 5 additions & 0 deletions cranelift/codegen/src/machinst/vcode.rs
Expand Up @@ -607,9 +607,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 3969e02

Please sign in to comment.