]> granicus.if.org Git - yasm/commitdiff
Add support for second parameter (fill value) to .org directive in GAS
authorPeter Johnson <peter@tortall.net>
Fri, 20 Jul 2007 03:40:59 +0000 (03:40 -0000)
committerPeter Johnson <peter@tortall.net>
Fri, 20 Jul 2007 03:40:59 +0000 (03:40 -0000)
parser.

Add testcase for both local labels and .org fill.

Noticed by: Jung Lee <moorang@gmail.com>
Testcase from: Xiaoming Mo <xiaoming.mo@skelix.org>

svn path=/trunk/yasm/; revision=1899

libyasm/bc-org.c
libyasm/bytecode.h
modules/parsers/gas/gas-parse.c
modules/parsers/gas/tests/bin/Makefile.inc
modules/parsers/gas/tests/bin/gas-llabel.asm [new file with mode: 0644]
modules/parsers/gas/tests/bin/gas-llabel.hex [new file with mode: 0644]
tools/python-yasm/bytecode.pxi

index e354f23ead4da9aa9dfabc17c11a88e23cc4b801..ae0497a2523f893cd33e0634ecf1714621c5a3f1 100644 (file)
@@ -41,6 +41,7 @@
 
 typedef struct bytecode_org {
     unsigned long start;        /* target starting offset within section */
+    unsigned long fill;         /* fill value */
 } bytecode_org;
 
 static void bc_org_destroy(void *contents);
@@ -133,16 +134,17 @@ bc_org_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d,
     }
     len = org->start - bc->offset;
     for (i=0; i<len; i++)
-        YASM_WRITE_8(*bufp, 0);
+        YASM_WRITE_8(*bufp, org->fill);     /* XXX: handle more than 8 bit? */
     return 0;
 }
 
 yasm_bytecode *
-yasm_bc_create_org(unsigned long start, unsigned long line)
+yasm_bc_create_org(unsigned long start, unsigned long fill, unsigned long line)
 {
     bytecode_org *org = yasm_xmalloc(sizeof(bytecode_org));
 
     org->start = start;
+    org->fill = fill;
 
     return yasm_bc_create_common(&bc_org_callback, org, line);
 }
index afe8b147969291c6e13840ee3e66c18b6c539983..e53dc5426f5c1610866b39cdb00ecad6c8a6b6fc 100644 (file)
@@ -351,11 +351,12 @@ void yasm_bc_set_multiple(yasm_bytecode *bc, /*@keep@*/ yasm_expr *e);
 /** Create a bytecode that puts the following bytecode at a fixed section
  * offset.
  * \param start         section offset of following bytecode
+ * \param fill          fill value
  * \param line          virtual line (from yasm_linemap)
  * \return Newly allocated bytecode.
  */
 /*@only@*/ yasm_bytecode *yasm_bc_create_org
-    (unsigned long start, unsigned long line);
+    (unsigned long start, unsigned long fill, unsigned long line);
 
 /** Get the section that contains a particular bytecode.
  * \param bc    bytecode
index 6f92ebb2298853a8044d535f571d513ad71453dd..f45b35f850249d92144e660635f70ad228a4f3ae 100644 (file)
@@ -388,14 +388,32 @@ parse_line(yasm_parser_gas *parser_gas)
                                     (int)ival);
         }
         case DIR_ORG:
+        {
+            yasm_intnum *start, *value=NULL;
             get_next_token(); /* DIR_ORG */
-            if (!expect(INTNUM)) return NULL;
+
             /* TODO: support expr instead of intnum */
-            bc = yasm_bc_create_org(yasm_intnum_get_uint(INTNUM_val), cur_line);
-            yasm_intnum_destroy(INTNUM_val);
+            if (!expect(INTNUM)) return NULL;
+            start = INTNUM_val;
             get_next_token(); /* INTNUM */
+
+            if (curtok == ',') {
+                get_next_token(); /* ',' */
+                /* TODO: support expr instead of intnum */
+                if (!expect(INTNUM)) return NULL;
+                value = INTNUM_val;
+                get_next_token(); /* INTNUM */
+            }
+            if (value) {
+                bc = yasm_bc_create_org(yasm_intnum_get_uint(start),
+                                        yasm_intnum_get_uint(value), cur_line);
+                yasm_intnum_destroy(value);
+            } else
+                bc = yasm_bc_create_org(yasm_intnum_get_uint(start), 0,
+                                        cur_line);
+            yasm_intnum_destroy(start);
             return bc;
-    
+        }
         /* Data visibility directives */
         case DIR_LOCAL:
             get_next_token(); /* DIR_LOCAL */
index 8132e69ccedeb1f13e243aee98c8dd1674cba28b..196b82aac5ebd79fc5fc768bd7bae6d3be2fca36 100644 (file)
@@ -6,6 +6,8 @@ EXTRA_DIST += modules/parsers/gas/tests/bin/gas_bin_test.sh
 EXTRA_DIST += modules/parsers/gas/tests/bin/gas-comment.asm
 EXTRA_DIST += modules/parsers/gas/tests/bin/gas-comment.errwarn
 EXTRA_DIST += modules/parsers/gas/tests/bin/gas-comment.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/gas-llabel.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/gas-llabel.hex
 EXTRA_DIST += modules/parsers/gas/tests/bin/gas-set.asm
 EXTRA_DIST += modules/parsers/gas/tests/bin/gas-set.hex
 EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.asm
diff --git a/modules/parsers/gas/tests/bin/gas-llabel.asm b/modules/parsers/gas/tests/bin/gas-llabel.asm
new file mode 100644 (file)
index 0000000..11f3f54
--- /dev/null
@@ -0,0 +1,29 @@
+# Skelix by Xiaoming Mo (xiaoming.mo@skelix.org)
+# Licence: GPLv2
+                .text
+                #.globl  start
+                .code16
+start:
+                jmp             code
+msg:
+                .string "Hello World!\x0"
+code:
+                movw    $0xb800,%ax
+                movw    %ax,    %es
+                xorw    %ax,    %ax
+                movw    %ax,    %ds
+
+                movw    $msg,   %si
+                xorw    %di,    %di
+                                cld
+                movb    $0x07,  %al
+1:
+                cmpw    $0,     (%si)
+                je      1f
+                movsb
+                stosb
+                jmp     1b
+1:              jmp     1b
+.org    0x1fe, 0x90
+.word   0xaa55
+
diff --git a/modules/parsers/gas/tests/bin/gas-llabel.hex b/modules/parsers/gas/tests/bin/gas-llabel.hex
new file mode 100644 (file)
index 0000000..4bef5c7
--- /dev/null
@@ -0,0 +1,512 @@
+eb 
+0e 
+48 
+65 
+6c 
+6c 
+6f 
+20 
+57 
+6f 
+72 
+6c 
+64 
+21 
+00 
+00 
+b8 
+00 
+b8 
+8e 
+c0 
+31 
+c0 
+8e 
+d8 
+be 
+02 
+00 
+31 
+ff 
+fc 
+b0 
+07 
+83 
+3c 
+00 
+74 
+04 
+a4 
+aa 
+eb 
+f7 
+eb 
+fe 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+90 
+55 
+aa 
index 8a077b0d398fcf9df16f0c7157e0747aaffd9d5e..193e3a6cfac4818ab10495af2f59d8288df0acd0 100644 (file)
@@ -93,9 +93,9 @@ cdef object __make_bytecode(yasm_bytecode *bc):
     return bcobj
 
 # Org bytecode
-def __org__new__(cls, start, line=0):
+def __org__new__(cls, start, value=0, line=0):
     cdef yasm_bytecode *bc
-    bc = yasm_bc_create_org(start, line)
+    bc = yasm_bc_create_org(start, line, value)
     obj = Bytecode.__new__(cls, __pass_voidp(bc, Bytecode))
     __bytecode_map[PyCObject_FromVoidPtr(bc, NULL)] = obj
     return obj