]> git.lizzy.rs Git - rust.git/commit
Auto merge of #29543 - Amanieu:asm_mem_constraint, r=alexcrichton
authorbors <bors@rust-lang.org>
Wed, 4 Nov 2015 20:39:49 +0000 (20:39 +0000)
committerbors <bors@rust-lang.org>
Wed, 4 Nov 2015 20:39:49 +0000 (20:39 +0000)
commiteffcd29652bbf16981d9cd0d8a578681b2ed55bb
tree0c5991d752c859eb48c499d3850b6ed7419ad718
parent4ee11cd210ccb9a9be04ccab731cdaac5f4dea4c
parent59c5191c211711c8f51daa4911b1b734393a4011
Auto merge of #29543 - Amanieu:asm_mem_constraint, r=alexcrichton

The "m" memory constraint in inline assembly is broken (generates incorrect code or triggers LLVM asserts) and should not be used. Instead, indirect memory operands should be used with "\*m", "=\*m" and "+\*m".

Clang does this transparently by transforming "m" constraints into "\*m" indirect constraints, but for now just being able to use "\*m" directly is enough since asm! isn't stable.

While "\*m" works fine as an input operand, "=\*m" and "+\*m" need to be specified as input operands because they take a pointer value as an input. This PR relaxes the constraint checker to allow constraints starting with "=" or "+" if the constraint string contains a "\*", which indicates an indirect operand.

This (indirectly) fixes these issues: #29382, #16383 and #13366. The code will need to be changed to use "\*m" instead of "m".