x86: instantiate i386_{op,reg}tab[] in gas instead of in libopcodes
authorJan Beulich <jbeulich@suse.com>
Mon, 12 Dec 2022 07:46:47 +0000 (08:46 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 12 Dec 2022 07:46:47 +0000 (08:46 +0100)
Unlike many other architectures, x86 does not share an opcode table
between assembly and disassembly. Any consumer of libopcodes would only
ever access one of the two. Since gas is the only consumer of the
assembly data, move it there. While doing so mark respective entities
"static" in i386-gen (we may want to do away with i386_regtab_size
altogether).

This also shrinks the number of relocations to be processed for
libopcodes.so by about 30%.

gas/config/tc-i386.c
opcodes/i386-gen.c
opcodes/i386-opc.c
opcodes/i386-opc.h
opcodes/i386-tbl.h

index d7bab7d77aaff5b35e6b723170ca8db6cee2fc47..e68ff2fafbf6ab0a33dcc9fd545c1ae23fda0a95 100644 (file)
@@ -2961,6 +2961,8 @@ i386_mach (void)
     as_fatal (_("unknown architecture"));
 }
 \f
+#include "opcodes/i386-tbl.h"
+
 void
 md_begin (void)
 {
index ee23c2dd01e993f30aabdd097f6630a290f7fd54..5551008a50a2467d3e683edfd1bf9abf367c075a 100644 (file)
@@ -1718,7 +1718,7 @@ process_i386_opcodes (FILE *table)
                                         xcalloc, free);
 
   fprintf (table, "\n/* i386 opcode table.  */\n\n");
-  fprintf (table, "const insn_template i386_optab[] =\n{\n");
+  fprintf (table, "static const insn_template i386_optab[] =\n{\n");
 
   /* Put everything on opcode array.  */
   while (!feof (fp))
@@ -1848,7 +1848,7 @@ process_i386_registers (FILE *table)
          xstrerror (errno));
 
   fprintf (table, "\n/* i386 register table.  */\n\n");
-  fprintf (table, "const reg_entry i386_regtab[] =\n{\n");
+  fprintf (table, "static const reg_entry i386_regtab[] =\n{\n");
 
   while (!feof (fp))
     {
@@ -1911,7 +1911,7 @@ process_i386_registers (FILE *table)
 
   fprintf (table, "};\n");
 
-  fprintf (table, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
+  fprintf (table, "\nstatic const unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
 }
 
 static void
index 729c22932b1d4a410e3b699db0e3ce75afd5f48c..4f0c948f4791cc7b6455a151426f6034dfbc64e0 100644 (file)
@@ -21,4 +21,3 @@
 #include "sysdep.h"
 #include "libiberty.h"
 #include "i386-opc.h"
-#include "i386-tbl.h"
index 215a72d18e169b4ff5c7d08f681e0d1e9af27bc1..59ba23fecd559c861de3a859cc2808a6b4921e0b 100644 (file)
@@ -918,7 +918,7 @@ typedef union i386_operand_type
 typedef struct insn_template
 {
   /* instruction name sans width suffix ("mov" for movl insns) */
-  char *name;
+  const char *name;
 
   /* Bitfield arrangement is such that individual fields can be easily
      extracted (in native builds at least) - either by at most a masking
@@ -984,8 +984,6 @@ typedef struct insn_template
 }
 insn_template;
 
-extern const insn_template i386_optab[];
-
 /* these are for register name --> number & type hash lookup */
 typedef struct
 {
@@ -1005,6 +1003,3 @@ typedef struct
 #define Dw2Inval (-1)
 }
 reg_entry;
-
-extern const reg_entry i386_regtab[];
-extern const unsigned int i386_regtab_size;
index 82861459eef7bc13dafd14c9d7d5e06f9c7cb2cf..ff84e222ffe86fa5536835c0e76806c4d217f220 100644 (file)
@@ -20,7 +20,7 @@
 
 /* i386 opcode table.  */
 
-const insn_template i386_optab[] =
+static const insn_template i386_optab[] =
 {
   { "mov", 0xa0, 2, None,
     { 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
@@ -59853,7 +59853,7 @@ const insn_template i386_optab[] =
 
 /* i386 register table.  */
 
-const reg_entry i386_regtab[] =
+static const reg_entry i386_regtab[] =
 {
   { "al",
     { { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
@@ -61009,4 +61009,4 @@ const reg_entry i386_regtab[] =
     0, 0, { 39, 64 } },
 };
 
-const unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);
+static const unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);