From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8657 Path: news.gmane.org!not-for-mail From: Alex Dowad Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH 2/3] x86 CFI generation script recognizes when %ax, %ah, %al, etc. are overwritten Date: Tue, 13 Oct 2015 13:28:51 +0200 Message-ID: <1444735732-12265-2-git-send-email-alexinbeijing@gmail.com> References: <1444735732-12265-1-git-send-email-alexinbeijing@gmail.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1444735770 32466 80.91.229.3 (13 Oct 2015 11:29:30 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 13 Oct 2015 11:29:30 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-8668-gllmg-musl=m.gmane.org@lists.openwall.com Tue Oct 13 13:29:29 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1Zlxll-0004DR-T7 for gllmg-musl@m.gmane.org; Tue, 13 Oct 2015 13:29:26 +0200 Original-Received: (qmail 7723 invoked by uid 550); 13 Oct 2015 11:29:21 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 7321 invoked from network); 13 Oct 2015 11:29:10 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=4Ck7o7UEVIIbdRmAk8LgmfT7yY0Q+5/NTCYJMujB3/0=; b=fRr7SoGlq+5q7uEJ/nssP1BWIX8Yy9WXWjCk17pQ641Ctv6oOAPtDStxRaHcedUlQ6 1aI199oVA67xPlSDeuX8orQEyeRVHGB8T682ktIkzHJdvW5LnExtsJgR+FAwkW2GCoZW aadKlt7nM0XDb+etJ6FeMhcW9jfAw6j8DukJkunF0rbYdmdKe8dwUMFKtPlnItnMIqYI 1GACMCdEKVlPKuYMtVXtsSXw2AvLH6EkYo6iGKHyBx5vjgljixFBIvZ1JTi4BpLiyaqi gix465lwkchXI49XbdkYcSUf/juIVQcKPhpsXo5J64gnrkl+X5vMj9OO/0+Cm0DTM/jy xvvA== X-Received: by 10.180.87.1 with SMTP id t1mr19374985wiz.33.1444735738780; Tue, 13 Oct 2015 04:28:58 -0700 (PDT) X-Mailer: git-send-email 2.0.0.GIT In-Reply-To: <1444735732-12265-1-git-send-email-alexinbeijing@gmail.com> Xref: news.gmane.org gmane.linux.lib.musl.general:8657 Archived-At: this may help a debugger to know which variable values from higher stack frames are still available and can legitimately be printed. thanks to R. Felker for this suggestion. --- tools/add-cfi.i386.awk | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/tools/add-cfi.i386.awk b/tools/add-cfi.i386.awk index bd7932f..9162e30 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 { -- 2.0.0.GIT