mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 13:27:26 +08:00
x86: pre-process opcodes table before parsing
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.
This commit is contained in:
@ -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>
|
2018-07-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR gas/23418
|
PR gas/23418
|
||||||
|
@ -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
|
$(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h
|
||||||
@echo $@
|
@echo $@
|
||||||
|
|
||||||
$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl
|
$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||||
./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
|
$(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
|
i386-opc.lo: $(srcdir)/i386-tbl.h
|
||||||
|
|
||||||
|
@ -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
|
$(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h
|
||||||
@echo $@
|
@echo $@
|
||||||
|
|
||||||
$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl
|
$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||||
./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
|
$(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
|
i386-opc.lo: $(srcdir)/i386-tbl.h
|
||||||
|
|
||||||
|
@ -1262,14 +1262,10 @@ process_i386_opcodes (FILE *table)
|
|||||||
htab_t opcode_hash_table;
|
htab_t opcode_hash_table;
|
||||||
struct opcode_hash_entry **opcode_array;
|
struct opcode_hash_entry **opcode_array;
|
||||||
unsigned int opcode_array_size = 1024;
|
unsigned int opcode_array_size = 1024;
|
||||||
int lineno = 0;
|
int lineno = 0, marker = 0;
|
||||||
|
|
||||||
filename = "i386-opc.tbl";
|
filename = "i386-opc.tbl";
|
||||||
fp = fopen (filename, "r");
|
fp = stdin;
|
||||||
|
|
||||||
if (fp == NULL)
|
|
||||||
fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
|
|
||||||
xstrerror (errno));
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
opcode_array = (struct opcode_hash_entry **)
|
opcode_array = (struct opcode_hash_entry **)
|
||||||
@ -1303,11 +1299,32 @@ process_i386_opcodes (FILE *table)
|
|||||||
switch (p[0])
|
switch (p[0])
|
||||||
{
|
{
|
||||||
case '#':
|
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. */
|
/* Ignore comments. */
|
||||||
case '\0':
|
case '\0':
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (!marker)
|
||||||
|
continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,12 @@
|
|||||||
// Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
// Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
||||||
// 02110-1301, USA.
|
// 02110-1301, USA.
|
||||||
|
|
||||||
|
#define OPCODE_I386_H
|
||||||
|
#include "i386-opc.h"
|
||||||
|
#undef None
|
||||||
|
|
||||||
|
### MARKER ###
|
||||||
|
|
||||||
// Move instructions.
|
// Move instructions.
|
||||||
// We put the 64bit displacement first and we only mark constants
|
// We put the 64bit displacement first and we only mark constants
|
||||||
// larger than 32bit as Disp64.
|
// larger than 32bit as Disp64.
|
||||||
|
Reference in New Issue
Block a user