diff options
-rw-r--r-- | opcodes/ChangeLog | 14 | ||||
-rw-r--r-- | opcodes/Makefile.am | 2 | ||||
-rw-r--r-- | opcodes/Makefile.in | 2 | ||||
-rw-r--r-- | opcodes/i386-gen.c | 65 |
4 files changed, 56 insertions, 27 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3c9ee7b..c1cc6ce 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,5 +1,19 @@ 2007-09-06 H.J. Lu <hongjiu.lu@intel.com> + * i386-gen.c (table): New. + (process_i386_opcodes): Report errno when faied to open + i386-opc.tbl. Output opcodes to table. Close i386-opc.tbl + before return. + (process_i386_registers): Report errno when faied to open + i386-reg.tbl. Output opcodes to table. Close i386-reg.tbl + before return. + (main): Open i386-tbl.h for output. + + * Makefile.am ($(srcdir)/i386-tbl.h): Remove " > $@". + * Makefile.in: Regenerated. + +2007-09-06 H.J. Lu <hongjiu.lu@intel.com> + * i386-opc.tbl: Correct SVME instructions to allow 32bit register operand in 64bit mode. * i386-tbl.h: Regenerated. diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am index ff1cb39..b0d8114 100644 --- a/opcodes/Makefile.am +++ b/opcodes/Makefile.am @@ -576,7 +576,7 @@ i386-gen: i386-gen.o i386-gen.o: i386-gen.c i386-opc.h $(srcdir)/i386-tbl.h: @MAINT@ i386-gen i386-opc.tbl i386-reg.tbl - ./i386-gen --srcdir $(srcdir) > $@ + ./i386-gen --srcdir $(srcdir) ia64-gen: ia64-gen.o $(LINK) ia64-gen.o $(LIBIBERTY) diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in index 953f261..42f83ad 100644 --- a/opcodes/Makefile.in +++ b/opcodes/Makefile.in @@ -1127,7 +1127,7 @@ i386-gen: i386-gen.o i386-gen.o: i386-gen.c i386-opc.h $(srcdir)/i386-tbl.h: @MAINT@ i386-gen i386-opc.tbl i386-reg.tbl - ./i386-gen --srcdir $(srcdir) > $@ + ./i386-gen --srcdir $(srcdir) ia64-gen: ia64-gen.o $(LINK) ia64-gen.o $(LIBIBERTY) diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c index fc27504..2be26f1 100644 --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -33,6 +33,9 @@ static const char *program_name = NULL; static int debug = 0; +/* File of i386 opcode and register tables. */ +static FILE *table; + static void fail (const char *message, ...) { @@ -106,10 +109,11 @@ process_i386_opcodes (void) char *cpu_flags, *opcode_modifier, *operand_types [MAX_OPERANDS]; if (fp == NULL) - fail (_("can't find i386-opc.tbl for reading\n")); + fail (_("can't find i386-opc.tbl for reading, errno = %s\n"), + strerror (errno)); - printf ("\n/* i386 opcode table. */\n\n"); - printf ("const template i386_optab[] =\n{\n"); + fprintf (table, "\n/* i386 opcode table. */\n\n"); + fprintf (table, "const template i386_optab[] =\n{\n"); while (!feof (fp)) { @@ -129,7 +133,7 @@ process_i386_opcodes (void) switch (p[0]) { case '#': - printf ("%s\n", p); + fprintf (table, "%s\n", p); case '\0': continue; break; @@ -218,13 +222,13 @@ process_i386_opcodes (void) } } - printf (" { \"%s\", %s, %s, %s, %s,\n", - name, operands, base_opcode, extension_opcode, - cpu_flags); + fprintf (table, " { \"%s\", %s, %s, %s, %s,\n", + name, operands, base_opcode, extension_opcode, + cpu_flags); - printf (" %s,\n", opcode_modifier); + fprintf (table, " %s,\n", opcode_modifier); - printf (" { "); + fprintf (table, " { "); for (i = 0; i < ARRAY_SIZE (operand_types); i++) { @@ -232,20 +236,22 @@ process_i386_opcodes (void) || *operand_types[i] == '0') { if (i == 0) - printf ("0"); + fprintf (table, "0"); break; } if (i != 0) - printf (",\n "); + fprintf (table, ",\n "); - printf ("%s", operand_types[i]); + fprintf (table, "%s", operand_types[i]); } - printf (" } },\n"); + fprintf (table, " } },\n"); } - printf (" { NULL, 0, 0, 0, 0, 0, { 0 } }\n"); - printf ("};\n"); + fclose (fp); + + fprintf (table, " { NULL, 0, 0, 0, 0, 0, { 0 } }\n"); + fprintf (table, "};\n"); } static void @@ -257,10 +263,11 @@ process_i386_registers (void) char *reg_name, *reg_type, *reg_flags, *reg_num; if (fp == NULL) - fail (_("can't find i386-reg.tbl for reading\n")); + fail (_("can't find i386-reg.tbl for reading, errno = %s\n"), + strerror (errno)); - printf ("\n/* i386 register table. */\n\n"); - printf ("const reg_entry i386_regtab[] =\n{\n"); + fprintf (table, "\n/* i386 register table. */\n\n"); + fprintf (table, "const reg_entry i386_regtab[] =\n{\n"); while (!feof (fp)) { @@ -280,7 +287,7 @@ process_i386_registers (void) switch (p[0]) { case '#': - printf ("%s\n", p); + fprintf (table, "%s\n", p); case '\0': continue; break; @@ -311,13 +318,15 @@ process_i386_registers (void) /* Find reg_num. */ reg_num = next_field (str, &str); - printf (" { \"%s\", %s, %s, %s },\n", - reg_name, reg_type, reg_flags, reg_num); + fprintf (table, " { \"%s\", %s, %s, %s },\n", + reg_name, reg_type, reg_flags, reg_num); } - printf ("};\n"); + fclose (fp); + + fprintf (table, "};\n"); - printf ("\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n"); + fprintf (table, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n"); } /* Program options. */ @@ -386,8 +395,12 @@ main (int argc, char **argv) fail (_("unable to change directory to \"%s\", errno = %s\n"), srcdir, strerror (errno)); - printf ("/* This file is automatically generated by i386-gen. Do not edit! */\n"); - printf ("/* Copyright 2007 Free Software Foundation, Inc.\n\ + table = fopen ("i386-tbl.h", "w"); + if (table == NULL) + fail (_("can't create i386-tbl.h, errno = %s\n"), strerror (errno)); + + fprintf (table, "/* This file is automatically generated by i386-gen. Do not edit! */\n\ +/* Copyright 2007 Free Software Foundation, Inc.\n\ \n\ This file is part of the GNU opcodes library.\n\ \n\ @@ -409,5 +422,7 @@ main (int argc, char **argv) process_i386_opcodes (); process_i386_registers (); + fclose (table); + exit (0); } |