| author | Alex Dowad <alexinbeijing@gmail.com> | 2015年10月13日 13:28:51 +0200 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2015年10月13日 18:02:36 -0400 | 
| commit | 1b0c9cd099e80a7557eb4ae36efb1897f7202a02 (patch) | |
| tree | dd1560366c12908070680d2382cd11cc48aae804 | |
| parent | 8cfdfa9c8fd84d4090bba54eb616a2c9361a076f (diff) | |
| download | musl-1b0c9cd099e80a7557eb4ae36efb1897f7202a02.tar.gz  | |
| -rw-r--r-- | tools/add-cfi.i386.awk | 29 | 
diff --git a/tools/add-cfi.i386.awk b/tools/add-cfi.i386.awk index bd7932f1..9162e309 100644 --- a/tools/add-cfi.i386.awk +++ b/tools/add-cfi.i386.awk @@ -27,20 +27,29 @@ function get_const1() {  match(0,ドル /-?(0x[0-9a-fA-F]+|[0-9]+),/)  return parse_const(substr(0,ドル RSTART, RLENGTH-1))  } + +function canonicalize_reg(register) { + if (match(register, /^e/)) + return register + else if (match(register, /[hl]$/)) # AH, AL, BH, BL, etc + return "e" substr(register, 1, 1) "x" + else # AX, BX, CX, etc + return "e" register +}  function get_reg() {  # only use if you already know there is 1 and only 1 register - match(0,ドル /%e(ax|bx|cx|dx|si|di|bp)/) - return substr(0,ドル RSTART+1, 3) + match(0,ドル /%e?([abcd][hlx]|si|di|bp)/) + return canonicalize_reg(substr(0,ドル RSTART+1, RLENGTH-1))  }  function get_reg1() {  # for instructions with 2 operands, get 1st operand (assuming it is register) - match(0,ドル /%e(ax|bx|cx|dx|si|di|bp),/) - return substr(0,ドル RSTART+1, 3) + match(0,ドル /%e?([abcd][hlx]|si|di|bp),/) + return canonicalize_reg(substr(0,ドル RSTART+1, RLENGTH-2))  }  function get_reg2() {  # for instructions with 2 operands, get 2nd operand (assuming it is register) - match(0,ドル /,%e(ax|bx|cx|dx|si|di|bp)/) - return substr(0,ドル RSTART+RLENGTH-3, 3) + match(0,ドル /,%e?([abcd][hlx]|si|di|bp)/) + return canonicalize_reg(substr(0,ドル RSTART+2, RLENGTH-2))  }  function adjust_sp_offset(delta) { @@ -184,14 +193,14 @@ 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)$/ { +/mov.*,%e?([abcd][hlx]|si|di|bp)$/ { trashed(get_reg2()) } +/(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr).*,%e?([abcd][hlx]|si|di|bp)$/ {  trashed(get_reg2())  }  /^i?mul [^,]*$/ { trashed("eax"); trashed("edx") } -/^i?mul.*,%e(ax|bx|cx|dx|si|di|bp)$/ { trashed(get_reg2()) } +/^i?mul.*,%e?([abcd][hlx]|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()) } +/(dec|inc|not|neg|pop) %e?([abcd][hlx]|si|di|bp)/ { trashed(get_reg()) }  /cpuid/ { trashed("eax"); trashed("ebx"); trashed("ecx"); trashed("edx") }  END {  |