Messages in this thread | | | Date | Mon, 14 Dec 2009 09:17:10 -0500 | From | Masami Hiramatsu <> | Subject | Re: [PATCH] x86: Fix kprobes build with non-gawk awk |
| |
Hi Jonathan,
Jonathan Nieder wrote: > The instruction attribute table generator fails when run by mawk > or original-awk: > > $ mawk -f arch/x86/tools/gen-insn-attr-x86.awk \ > arch/x86/lib/x86-opcode-map.txt > /dev/null > Semantic error at 240: Second IMM error > $ echo $? > 1 > > Line 240 contains "c8: ENTER Iw,Ib", which indicates that this > instruction has two immediate operands, the second of which is > one byte. The script loops through the immediate operands using > a for loop. > > Unfortunately, there is no guarantee in awk that a for (variable > in array) loop will return the indices in increasing order. > Internally, both original-awk and mawk iterate over a hash table > for this purpose, and both implementations happen to produce the > index 2 before 1. The supposed second immediate operand is more > than one byte wide, producing the error.
Oh, I see.
> > So loop over the indices in increasing order instead. As a > side-effect, with mawk this means the silly two-entry hash table > never has to be built.
Thank you for fixing it!
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
> > Cc: Masami Hiramatsu <mhiramat@redhat.com> > Cc: Jim Keniston <jkenisto@us.ibm.com> > Cc: Frederic Weisbecker <fweisbec@gmail.com> > Cc: x86@kernel.org > Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> > --- > arch/x86/tools/gen-insn-attr-x86.awk | 10 +++++----- > 1 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk > index e34e92a..7a68506 100644 > --- a/arch/x86/tools/gen-insn-attr-x86.awk > +++ b/arch/x86/tools/gen-insn-attr-x86.awk > @@ -226,12 +226,12 @@ function add_flags(old,new) { > } > > # convert operands to flags. > -function convert_operands(opnd, i,imm,mod) > +function convert_operands(count,opnd, i,j,imm,mod) > { > imm = null > mod = null > - for (i in opnd) { > - i = opnd[i] > + for (j = 1; j <= count; j++) { > + i = opnd[j] > if (match(i, imm_expr) == 1) { > if (!imm_flag[i]) > semantic_error("Unknown imm opnd: " i) > @@ -282,8 +282,8 @@ function convert_operands(opnd, i,imm,mod) > # parse one opcode > if (match($i, opnd_expr)) { > opnd = $i > - split($(i++), opnds, ",") > - flags = convert_operands(opnds) > + count = split($(i++), opnds, ",") > + flags = convert_operands(count, opnds) > } > if (match($i, ext_expr)) > ext = $(i++)
-- Masami Hiramatsu
Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division
e-mail: mhiramat@redhat.com
| |