Browse Source

fix misinterpretation of operand order in i386 CFI generation

binary ops like ADD, AND, etc. modify the 2nd operand, not 1st.
master
Alex Dowad 11 years ago
committed by Rich Felker
parent
commit
fef9c801fe
  1. 10
      tools/add-cfi.i386.awk

10
tools/add-cfi.i386.awk

@ -185,12 +185,12 @@ function trashed(register) {
# this does NOT exhaustively check for all possible instructions which could
# overwrite a register value inherited from the caller (just the common ones)
/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),/ {
trashed(get_reg1())
/(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr).*,%e(ax|bx|cx|dx|si|di|bp)$/ {
trashed(get_reg2())
}
/^i?mul [^,]*$/ { trashed("eax"); trashed("edx") }
/^i?mul %e(ax|bx|cx|dx|si|di|bp),/ { trashed(get_reg1()) }
/^i?div/ { trashed("eax"); trashed("edx") }
/^i?mul [^,]*$/ { trashed("eax"); trashed("edx") }
/^i?mul.*,%e(ax|bx|cx|dx|si|di|bp)$/ { trashed(get_reg2()) }
/^i?div/ { trashed("eax"); trashed("edx") }
/(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") }

Loading…
Cancel
Save