Fix segfault due to b64 encoding (#919)

* Fix segfault due to b64 encoding

Prior to this patch, bconst.b64 encoded its instruction with a 32-bit immediate that caused improper decoding of the MOV instruction; instead, use a REX prefix and rely on zero-extension of the immediate. Fixes #911.
This commit is contained in:
Andrew Brown
2019-08-23 09:04:34 -07:00
committed by Benjamin Bouvier
parent 1eb6cd93b2
commit cc57e84cbd
3 changed files with 18 additions and 4 deletions

View File

@@ -683,10 +683,7 @@ pub fn define(
for &ty in &[B1, B8, B16, B32] { for &ty in &[B1, B8, B16, B32] {
e.enc_both(bconst.bind(ty), rec_pu_id_bool.opcodes(vec![0xb8])); e.enc_both(bconst.bind(ty), rec_pu_id_bool.opcodes(vec![0xb8]));
} }
e.enc64( e.enc64(bconst.bind(B64), rec_pu_id_bool.opcodes(vec![0xb8]).rex());
bconst.bind(B64),
rec_pu_id_bool.opcodes(vec![0xb8]).rex().w(),
);
// Shifts and rotates. // Shifts and rotates.
// Note that the dynamic shift amount is only masked by 5 or 6 bits; the 8-bit // Note that the dynamic shift amount is only masked by 5 or 6 bits; the 8-bit

View File

@@ -0,0 +1,10 @@
test run
target x86_64
; this verifies that returning b64 immediates does not result in a segmentation fault, see https://github.com/CraneStation/cranelift/issues/911
function %test_b64() -> b64 {
ebb0:
[-, %r10] v0 = bconst.b64 true
return v0
}
; run

View File

@@ -1642,3 +1642,10 @@ ebb0:
return return
} }
function %B64() {
ebb0:
[-, %rax] v1 = bconst.b64 true ; bin: 40 b8 00000001
[-, %r10] v0 = bconst.b64 true ; bin: 41 ba 00000001
return
}