X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=tools%2Fadd-cfi.i386.awk;h=d05037de1846a530cc9802580b9fa268b15a785d;hb=0a7b4323b0f2b944dbd47a813c0c6e6813e7fd67;hp=5dc8794145bc57c7c8c0bd5812c5cbe2e8b903ec;hpb=dc97951402b499023ce877dd2438bce0840b2c26;p=musl diff --git a/tools/add-cfi.i386.awk b/tools/add-cfi.i386.awk index 5dc87941..d05037de 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) { @@ -72,7 +81,7 @@ function adjust_sp_offset(delta) { in_function = 0 } } -/^\.type [a-zA-Z0-9_]+,\@function/ { +/^\.type [a-zA-Z0-9_]+,@function/ { functions[substr($2, 1, length($2)-10)] = 1 } # not interested in assembler directives beyond this, just pass them through @@ -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),/ { - trashed(get_reg1()) -} -/^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") } -/(dec|inc|not|neg|pop) %e(ax|bx|cx|dx|si|di|bp)/ { trashed(get_reg()) } +/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?([abcd][hlx]|si|di|bp)$/ { trashed(get_reg2()) } +/^i?div/ { trashed("eax"); trashed("edx") } +/(dec|inc|not|neg|pop) %e?([abcd][hlx]|si|di|bp)/ { trashed(get_reg()) } /cpuid/ { trashed("eax"); trashed("ebx"); trashed("ecx"); trashed("edx") } END {