* config/tc-xtensa.h (struct xtensa_frag_type): Add lit_frchain field.
authorBob Wilson <bob.wilson@acm.org>
Thu, 14 Apr 2005 22:38:49 +0000 (22:38 +0000)
committerBob Wilson <bob.wilson@acm.org>
Thu, 14 Apr 2005 22:38:49 +0000 (22:38 +0000)
* config/tc-xtensa.c (xg_translate_sysreg_op,
xtensa_translate_old_userregs_ops,
xtensa_find_unaligned_branch_targets,
xtensa_find_unaligned_loops, xtensa_fix_close_loop_end_frags,
relax_frag_add_nop): Support 64-bit host.
(xtensa_mark_literal_pool_location, xtensa_move_literals): Use
tc_frag_data lit_frchain and lit_seg fields instead of fr_var.

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

index 59a384aeeb2a24705ff5a4cc3f8f87b10191e4e4..3f03aa82b454218a1f2adf06b2fc358be38e3b47 100644 (file)
@@ -1,3 +1,15 @@
+2005-04-14  Bob Wilson  <bob.wilson@acm.org>
+           H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/tc-xtensa.h (struct xtensa_frag_type): Add lit_frchain field.
+       * config/tc-xtensa.c (xg_translate_sysreg_op,
+       xtensa_translate_old_userregs_ops,
+       xtensa_find_unaligned_branch_targets,
+       xtensa_find_unaligned_loops, xtensa_fix_close_loop_end_frags,
+       relax_frag_add_nop): Support 64-bit host.
+       (xtensa_mark_literal_pool_location, xtensa_move_literals): Use
+       tc_frag_data lit_frchain and lit_seg fields instead of fr_var.
+
 2005-04-14  Mark Kettenis  <kettenis@gnu.org>
 
        * configure.tgt: Add support for OpenBSD/sparc ELF.
index 0dadbfbecd2861d55ff581bc1e8dd4056ab6ef6d..cf71aad1b30715e69683c45a1bc47fc649d5a7f6 100644 (file)
@@ -2247,7 +2247,7 @@ xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
       if (sr == XTENSA_UNDEFINED)
        {
          as_bad (_("invalid register number (%ld) for '%s' instruction"),
-                 val, opname);
+                 (long) val, opname);
          return -1;
        }
     }
@@ -2316,7 +2316,7 @@ xtensa_translate_old_userreg_ops (char **popname)
       if (sr == XTENSA_UNDEFINED)
        {
          as_bad (_("invalid register number (%ld) for '%s'"),
-                 val, opname);
+                 (long) val, opname);
          return -1;
        }
     }
@@ -4645,15 +4645,15 @@ xtensa_mark_literal_pool_location (void)
   frag_align (2, 0, 0);
   record_alignment (now_seg, 2);
 
-  /* We stash info in the fr_var of these frags
-     so we can later move the literal's fixes into this
-     frchain's fix list.  We can use fr_var because fr_var's
-     interpretation depends solely on the fr_type and subtype.  */
+  /* We stash info in these frags so we can later move the literal's
+     fixes into this frchain's fix list.  */
   pool_location = frag_now;
-  frag_variant (rs_machine_dependent, 0, (int) frchain_now,
+  frag_now->tc_frag_data.lit_frchain = frchain_now;
+  frag_variant (rs_machine_dependent, 0, 0,
                RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
   xtensa_set_frag_assembly_state (frag_now);
-  frag_variant (rs_machine_dependent, 0, (int) now_seg,
+  frag_now->tc_frag_data.lit_seg = now_seg;
+  frag_variant (rs_machine_dependent, 0, 0,
                RELAX_LITERAL_POOL_END, NULL, 0, NULL);
   xtensa_set_frag_assembly_state (frag_now);
 
@@ -4882,7 +4882,7 @@ xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
              if (frag_addr + op_size > branch_align)
                as_warn_where (frag->fr_file, frag->fr_line,
                               _("unaligned branch target: %d bytes at 0x%lx"),
-                              op_size, frag->fr_address);
+                              op_size, (long) frag->fr_address);
            }
          frag = frag->fr_next;
        }
@@ -4921,7 +4921,7 @@ xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
              if (frag_addr + op_size > xtensa_fetch_width)
                as_warn_where (frag->fr_file, frag->fr_line,
                               _("unaligned loop: %d bytes at 0x%lx"),
-                              op_size, frag->fr_address);
+                              op_size, (long) frag->fr_address);
            }
          frag = frag->fr_next;
        }
@@ -7462,7 +7462,7 @@ xtensa_fix_close_loop_end_frags (void)
                          
                          if (fragP->fr_var < length)
                            as_fatal (_("fr_var %lu < length %d"),
-                                     fragP->fr_var, length);
+                                     (long) fragP->fr_var, length);
                          else
                            {
                              assemble_nop (length,
@@ -8410,7 +8410,7 @@ relax_frag_add_nop (fragS *fragP)
 
   if (fragP->fr_var < length)
     {
-      as_fatal (_("fr_var (%ld) < length (%d)"), fragP->fr_var, length);
+      as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
       return 0;
     }
 
@@ -9869,17 +9869,15 @@ xtensa_move_literals (void)
            {
              literal_pool = search_frag->tc_frag_data.literal_frag;
              assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
-             /* Note that we set this fr_var to be a fix
-                chain when we created the literal pool location
-                as RELAX_LITERAL_POOL_BEGIN.  */
-             frchain_to = (frchainS *) literal_pool->fr_var;
+             frchain_to = literal_pool->tc_frag_data.lit_frchain;
+             assert (frchain_to);
            }
          insert_after = literal_pool;
 
          while (insert_after->fr_next->fr_subtype != RELAX_LITERAL_POOL_END)
            insert_after = insert_after->fr_next;
 
-         dest_seg = (segT) insert_after->fr_next->fr_var;
+         dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
 
          *frag_splice = next_frag;
          search_frag->fr_next = insert_after->fr_next;
index 99032fd6c520c8cf5404b9aeedf470b4d0184fda..4b1ade3c631417bda3c6de246869352510626f02 100644 (file)
@@ -227,9 +227,13 @@ struct xtensa_frag_type
   fragS *literal_frag;
 
   /* The destination segment for literal frags.  (Note that this is only
-     valid after xtensa_move_literals.  */
+     valid after xtensa_move_literals.)  This field is also used for
+     LITERAL_POOL_END frags.  */
   segT lit_seg;
 
+  /* Frag chain for LITERAL_POOL_BEGIN frags.  */
+  struct frchain *lit_frchain;
+
   /* For the relaxation scheme, some literal fragments can have their
      expansions modified by an instruction that relaxes.  */
   int text_expansion[MAX_SLOTS];