2004-11-08 Tomer Levi <Tomer.Levi@nsc.com>
authorTomer Levi <Tomer.Levi@nsc.com>
Mon, 8 Nov 2004 13:51:55 +0000 (13:51 +0000)
committerTomer Levi <Tomer.Levi@nsc.com>
Mon, 8 Nov 2004 13:51:55 +0000 (13:51 +0000)
* config/tc-crx.c (print_insn): Check and set insn_addr.
* config/tc-crx.h (md_frag_check): Define.

gas/ChangeLog
gas/config/tc-crx.c
gas/config/tc-crx.h

index 99121ec39400aa13338e1c63cbde918330359232..46acfb776507e2256e8e97054b4827e1394bdb99 100644 (file)
@@ -1,3 +1,8 @@
+2004-11-08  Tomer Levi  <Tomer.Levi@nsc.com>
+
+       * config/tc-crx.c (print_insn): Check and set insn_addr.
+       * config/tc-crx.h (md_frag_check): Define.
+
 2004-11-08  Inderpreet Singh   <inderpreetb@nioda.hcltech.com>
            Vineet Sharma      <vineets@noida.hcltech.com>
 
index e9b1538da07138adc7c9116fc4e97236981bf26a..8d1f95f81cf1531e3c073004661670ea1ff2c648 100644 (file)
@@ -1229,7 +1229,7 @@ set_operand (char *operand, ins * crx_ins)
       operandS++;
     case arg_c:            /* Case 0x18.  */
       /* Set constant.  */
-      process_label_constant (operandS, crx_ins/*, op_num*/);
+      process_label_constant (operandS, crx_ins);
       
       if (cur_arg->type != arg_ic)
        cur_arg->type = arg_c;
@@ -1242,7 +1242,7 @@ set_operand (char *operand, ins * crx_ins)
       while (*operandE != '(')
        operandE++;
       *operandE = '\0';
-      process_label_constant (operandS, crx_ins/*, op_num*/);
+      process_label_constant (operandS, crx_ins);
       operandS = operandE;    
     case arg_rbase: /* Case (r1).  */
       operandS++;
@@ -2382,6 +2382,7 @@ print_insn (ins *insn)
   unsigned int i, j, insn_size;
   char *this_frag;
   unsigned short words[4];
+  int addr_mod;
 
   /* Arrange the insn encodings in a WORD size array.  */
   for (i = 0, j = 0; i < 2; i++)
@@ -2443,6 +2444,13 @@ print_insn (ins *insn)
        }
     }
 
+  /* Verify a 2-byte code alignment.  */
+  addr_mod = frag_now_fix () & 1;
+  if (frag_now->has_code && frag_now->insn_addr != addr_mod)
+    as_bad (_("instruction address is not a multiple of 2"));
+  frag_now->insn_addr = addr_mod;
+  frag_now->has_code = 1;
+
   /* Write the instruction encoding to frag.  */
   for (i = 0; i < insn_size; i++)
     {
index 29e59fe49b08b8daefd44ddf391cdf1997c10a14..b3876513450a05c3f276f9ee2bee8f6677f98273 100644 (file)
@@ -69,4 +69,12 @@ extern int crx_force_relocation (struct fix *);
        : LEN == 4 ? BFD_RELOC_CRX_NUM32 \
        : BFD_RELOC_NONE);
 
+/* Give an error if a frag containing code is not aligned to a 2-byte 
+   boundary.  */
+#define md_frag_check(FRAGP) \
+  if ((FRAGP)->has_code                                                        \
+      && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 1) != 0)                \
+     as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line,                 \
+                  _("instruction address is not a multiple of 2"));
+
 #endif /* TC_CRX_H */