about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Dowad <alexinbeijing@gmail.com>2015-10-13 13:28:50 +0200
committerRich Felker <dalias@aerifal.cx>2015-10-13 17:21:05 -0400
commitfef9c801feeccbb40623f0c2a6e4f2b19f58a34b (patch)
treeac12a2eb5585accced8bfb7e54dab8bf1465780d
parentc82d3bada30cb27e14abda7859da5d2e784830ff (diff)
downloadmusl-fef9c801feeccbb40623f0c2a6e4f2b19f58a34b.tar.gz
musl-fef9c801feeccbb40623f0c2a6e4f2b19f58a34b.tar.xz
musl-fef9c801feeccbb40623f0c2a6e4f2b19f58a34b.zip
fix misinterpretation of operand order in i386 CFI generation
binary ops like ADD, AND, etc. modify the 2nd operand, not 1st.
-rw-r--r--tools/add-cfi.i386.awk10
1 files changed, 5 insertions, 5 deletions
diff --git a/tools/add-cfi.i386.awk b/tools/add-cfi.i386.awk
index 5dc87941..231d67ed 100644
--- a/tools/add-cfi.i386.awk
+++ b/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") }