From ab1449c2067c16b260d4681419ae595139b1a878 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 2 Jan 2009 20:46:57 +0000 Subject: [PATCH] gas parser: Allow segment register prefixes before instructions. svn path=/trunk/yasm/; revision=2169 --- modules/parsers/gas/gas-parse.c | 23 +- modules/parsers/gas/tests/Makefile.inc | 2 + modules/parsers/gas/tests/gas-segprefix.asm | 2 + modules/parsers/gas/tests/gas-segprefix.hex | 360 ++++++++++++++++++++ 4 files changed, 376 insertions(+), 11 deletions(-) create mode 100644 modules/parsers/gas/tests/gas-segprefix.asm create mode 100644 modules/parsers/gas/tests/gas-segprefix.hex diff --git a/modules/parsers/gas/gas-parse.c b/modules/parsers/gas/gas-parse.c index 27fb77fe..cabf5764 100644 --- a/modules/parsers/gas/gas-parse.c +++ b/modules/parsers/gas/gas-parse.c @@ -989,7 +989,6 @@ parse_instr(yasm_parser_gas *parser_gas) return bc; } case YASM_ARCH_PREFIX: - { /* Propagate errors in case we got a warning from the arch */ yasm_errwarn_propagate(parser_gas->errwarns, cur_line); @@ -1000,19 +999,21 @@ parse_instr(yasm_parser_gas *parser_gas) bc = yasm_arch_create_empty_insn(p_object->arch, cur_line); yasm_insn_add_prefix(yasm_bc_get_insn(bc), prefix); return bc; - } -#if 0 - /* TODO */ - case SEGREG: - { - uintptr_t segreg = SEGREG_val; - get_next_token(); /* SEGREG */ + default: + break; + } + + /* Check for segment register used as prefix */ + switch (yasm_arch_parse_check_regtmod(p_object->arch, ID_val, ID_len, + &prefix)) { + case YASM_ARCH_SEGREG: + yasm_xfree(id); + get_next_token(); /* ID */ bc = parse_instr(parser_gas); if (!bc) bc = yasm_arch_create_empty_insn(p_object->arch, cur_line); - yasm_insn_add_seg_prefix(yasm_bc_get_insn(bc), segreg); - } -#endif + yasm_insn_add_seg_prefix(yasm_bc_get_insn(bc), prefix); + return bc; default: return NULL; } diff --git a/modules/parsers/gas/tests/Makefile.inc b/modules/parsers/gas/tests/Makefile.inc index 756e3251..aee3c461 100644 --- a/modules/parsers/gas/tests/Makefile.inc +++ b/modules/parsers/gas/tests/Makefile.inc @@ -24,6 +24,8 @@ EXTRA_DIST += modules/parsers/gas/tests/gas-line2-err.asm EXTRA_DIST += modules/parsers/gas/tests/gas-line2-err.errwarn EXTRA_DIST += modules/parsers/gas/tests/gas-push.asm EXTRA_DIST += modules/parsers/gas/tests/gas-push.hex +EXTRA_DIST += modules/parsers/gas/tests/gas-segprefix.asm +EXTRA_DIST += modules/parsers/gas/tests/gas-segprefix.hex EXTRA_DIST += modules/parsers/gas/tests/gas-semi.asm EXTRA_DIST += modules/parsers/gas/tests/gas-semi.hex EXTRA_DIST += modules/parsers/gas/tests/gassectalign.asm diff --git a/modules/parsers/gas/tests/gas-segprefix.asm b/modules/parsers/gas/tests/gas-segprefix.asm new file mode 100644 index 00000000..9295b90a --- /dev/null +++ b/modules/parsers/gas/tests/gas-segprefix.asm @@ -0,0 +1,2 @@ +.text +es pushl %ebp diff --git a/modules/parsers/gas/tests/gas-segprefix.hex b/modules/parsers/gas/tests/gas-segprefix.hex new file mode 100644 index 00000000..932e1ea6 --- /dev/null +++ b/modules/parsers/gas/tests/gas-segprefix.hex @@ -0,0 +1,360 @@ +7f +45 +4c +46 +01 +01 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +01 +00 +03 +00 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +a0 +00 +00 +00 +00 +00 +00 +00 +34 +00 +00 +00 +00 +00 +28 +00 +05 +00 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +26 +55 +00 +00 +00 +2e +74 +65 +78 +74 +00 +2e +73 +74 +72 +74 +61 +62 +00 +2e +73 +79 +6d +74 +61 +62 +00 +2e +73 +68 +73 +74 +72 +74 +61 +62 +00 +00 +00 +00 +00 +2d +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +01 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +00 +f1 +ff +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +03 +00 +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +17 +00 +00 +00 +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +44 +00 +00 +00 +21 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +07 +00 +00 +00 +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +68 +00 +00 +00 +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0f +00 +00 +00 +02 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +6c +00 +00 +00 +30 +00 +00 +00 +02 +00 +00 +00 +03 +00 +00 +00 +04 +00 +00 +00 +10 +00 +00 +00 +01 +00 +00 +00 +01 +00 +00 +00 +06 +00 +00 +00 +00 +00 +00 +00 +40 +00 +00 +00 +02 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +00 +00 +00 +00 +00 +00 +00 -- 2.40.0