x86: pre-process opcodes table before parsing
authorJan Beulich <jbeulich@novell.com>
Thu, 19 Jul 2018 06:28:29 +0000 (08:28 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 19 Jul 2018 06:28:29 +0000 (08:28 +0200)
Instead of expanding macro-like constructs in i386-gen, have the C pre-
processor do this for us. Besides being a prerequisite for the next
template folding steps, this also paves the way for removing various
hidden dependencies between #define-s in i386-opc.h and plain literal
numbers used in i386-opc.tbl.

The #undef of None is solely to leave the generated i386-tbl.h entirely
unchanged.

opcodes/ChangeLog
opcodes/Makefile.am
opcodes/Makefile.in
opcodes/i386-gen.c
opcodes/i386-opc.tbl

index ee3afb5dc4453b28a8f4314a0657b298ba99e4d2..10c0771af69bc9549ad4dcf096ae3d6994f34c61 100644 (file)
@@ -1,3 +1,15 @@
+2018-07-19  Jan Beulich  <jbeulich@suse.com>
+
+       * Makefile.am: Change dependencies and rule for
+       $(srcdir)/i386-init.h.
+       * Makefile.in: Re-generate.
+       * i386-gen.c (process_i386_opcodes): New local variable
+       "marker". Drop opening of input file. Recognize marker and line
+       number directives.
+       * i386-opc.tbl (OPCODE_I386_H): Define.
+       (i386-opc.h): Include it.
+       (None): Undefine.
+
 2018-07-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/23418
index 11d3f76ac30608b4aeea408c0eacfe86fc112654..a571f2b158a45818b996a36193744c66af1c856f 100644 (file)
@@ -544,8 +544,10 @@ i386-gen.o: i386-gen.c i386-opc.h $(srcdir)/../include/opcode/i386.h \
 $(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h
        @echo $@
 
-$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl
-       ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
+$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
+       $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - \
+               < $(srcdir)/i386-opc.tbl \
+               | ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
 
 i386-opc.lo: $(srcdir)/i386-tbl.h
 
index 1ddd0a6c081c8887c734894e676efcff3e94da76..31f7bf5c6258df4335348ebd0e9dc5d7723174dc 100644 (file)
@@ -1514,8 +1514,10 @@ i386-gen.o: i386-gen.c i386-opc.h $(srcdir)/../include/opcode/i386.h \
 $(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h
        @echo $@
 
-$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl
-       ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
+$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
+       $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - \
+               < $(srcdir)/i386-opc.tbl \
+               | ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
 
 i386-opc.lo: $(srcdir)/i386-tbl.h
 
index 9b5314cfbc75d8f9ece3657662ccde3aefdddb6d..860d318087be6721547cc8493dc273d56d0af3e6 100644 (file)
@@ -1262,14 +1262,10 @@ process_i386_opcodes (FILE *table)
   htab_t opcode_hash_table;
   struct opcode_hash_entry **opcode_array;
   unsigned int opcode_array_size = 1024;
-  int lineno = 0;
+  int lineno = 0, marker = 0;
 
   filename = "i386-opc.tbl";
-  fp = fopen (filename, "r");
-
-  if (fp == NULL)
-    fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
-         xstrerror (errno));
+  fp = stdin;
 
   i = 0;
   opcode_array = (struct opcode_hash_entry **)
@@ -1303,11 +1299,32 @@ process_i386_opcodes (FILE *table)
       switch (p[0])
        {
        case '#':
+         if (!strcmp("### MARKER ###", buf))
+           marker = 1;
+         else
+           {
+             /* Since we ignore all included files (we only care about their
+                #define-s here), we don't need to monitor filenames.  The final
+                line number directive is going to refer to the main source file
+                again.  */
+             char *end;
+             unsigned long ln;
+
+             p = remove_leading_whitespaces (p + 1);
+             if (!strncmp(p, "line", 4))
+               p += 4;
+             ln = strtoul (p, &end, 10);
+             if (ln > 1 && ln < INT_MAX
+                 && *remove_leading_whitespaces (end) == '"')
+               lineno = ln - 1;
+           }
          /* Ignore comments.  */
        case '\0':
          continue;
          break;
        default:
+         if (!marker)
+           continue;
          break;
        }
 
index a7fb06b59612f2540d124e3d2518d69ce0e3bca2..eb1bdf0f6117a12aac424a2458331ed955bb5fff 100644 (file)
 // Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
 // 02110-1301, USA.
 
+#define OPCODE_I386_H
+#include "i386-opc.h"
+#undef None
+
+### MARKER ###
+
 // Move instructions.
 // We put the 64bit displacement first and we only mark constants
 // larger than 32bit as Disp64.