]> granicus.if.org Git - yasm/commitdiff
gas parser: Allow segment register prefixes before instructions.
authorPeter Johnson <peter@tortall.net>
Fri, 2 Jan 2009 20:46:57 +0000 (20:46 -0000)
committerPeter Johnson <peter@tortall.net>
Fri, 2 Jan 2009 20:46:57 +0000 (20:46 -0000)
svn path=/trunk/yasm/; revision=2169

modules/parsers/gas/gas-parse.c
modules/parsers/gas/tests/Makefile.inc
modules/parsers/gas/tests/gas-segprefix.asm [new file with mode: 0644]
modules/parsers/gas/tests/gas-segprefix.hex [new file with mode: 0644]

index 27fb77fec587dc8b293383493c4a2bca252e4b58..cabf5764f13bfc804accca46146da9dc3ffe33cd 100644 (file)
@@ -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;
     }
index 756e32512619b663b40ee8bd5690347e22900d7a..aee3c461f05b4aef49e70ce9feba46ac4f620f30 100644 (file)
@@ -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 (file)
index 0000000..9295b90
--- /dev/null
@@ -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 (file)
index 0000000..932e1ea
--- /dev/null
@@ -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