提交 fef9c801 编写于 作者: A Alex Dowad 提交者: Rich Felker

fix misinterpretation of operand order in i386 CFI generation

binary ops like ADD, AND, etc. modify the 2nd operand, not 1st.
上级 c82d3bad
...@@ -185,12 +185,12 @@ function trashed(register) { ...@@ -185,12 +185,12 @@ function trashed(register) {
# this does NOT exhaustively check for all possible instructions which could # this does NOT exhaustively check for all possible instructions which could
# overwrite a register value inherited from the caller (just the common ones) # overwrite a register value inherited from the caller (just the common ones)
/mov.*,%e(ax|bx|cx|dx|si|di|bp)/ { trashed(get_reg2()) } /mov.*,%e(ax|bx|cx|dx|si|di|bp)/ { trashed(get_reg2()) }
/(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr) %e(ax|bx|cx|dx|si|di|bp),/ { /(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr).*,%e(ax|bx|cx|dx|si|di|bp)$/ {
trashed(get_reg1()) trashed(get_reg2())
} }
/^i?mul [^,]*$/ { trashed("eax"); trashed("edx") } /^i?mul [^,]*$/ { trashed("eax"); trashed("edx") }
/^i?mul %e(ax|bx|cx|dx|si|di|bp),/ { trashed(get_reg1()) } /^i?mul.*,%e(ax|bx|cx|dx|si|di|bp)$/ { trashed(get_reg2()) }
/^i?div/ { trashed("eax"); trashed("edx") } /^i?div/ { trashed("eax"); trashed("edx") }
/(dec|inc|not|neg|pop) %e(ax|bx|cx|dx|si|di|bp)/ { trashed(get_reg()) } /(dec|inc|not|neg|pop) %e(ax|bx|cx|dx|si|di|bp)/ { trashed(get_reg()) }
/cpuid/ { trashed("eax"); trashed("ebx"); trashed("ecx"); trashed("edx") } /cpuid/ { trashed("eax"); trashed("ebx"); trashed("ecx"); trashed("edx") }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册