arm.c (note_invalid_constants): No need to ignore ASMs, we can now rework these too.
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 3 Sep 1999 16:27:57 +0000 (16:27 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 3 Sep 1999 16:27:57 +0000 (16:27 +0000)
* arm.c (note_invalid_constants): No need to ignore ASMs, we can
now rework these too.
(arm_reorg): If an insn can't reach the end of the current pool,
ensure that we emit that pool before the insn.

From-SVN: r29084

gcc/ChangeLog
gcc/config/arm/arm.c

index edbc6d3643a4ff6977766738d2cea18692c482e4..da0b2045511e233a6072510a56a13bf9ac897055 100644 (file)
@@ -1,3 +1,10 @@
+Fri Sep  3 17:24:31 1999  Richard Earnshaw <rearnsha@arm.com>
+
+       * arm.c (note_invalid_constants): No need to ignore ASMs, we can
+       now rework these too.
+       (arm_reorg): If an insn can't reach the end of the current pool,
+       ensure that we emit that pool before the insn.
+
 Fri Sep  3 09:14:32 1999  Marc Espie <espie@tetto.liafa.jussieu.fr>
 
        * tlink.c (scan_linker_output): Skip the initial underscore in
index c2d9768a7e50e5a8d34d5d887257f49ce1cef248..69ec6fd847877cf2460723a8906eb4309fdca288 100644 (file)
@@ -4236,10 +4236,6 @@ note_invalid_constants (insn, address)
   /* Extract the operands of the insn */
   extract_insn(insn);
 
-  /* If this is an asm, we can't do anything about it (or can we?) */
-  if (INSN_CODE (insn) < 0)
-    return;
-
   /* Find the alternative selected */
   if (! constrain_operands (1))
     fatal_insn_not_found (insn);
@@ -4375,11 +4371,20 @@ arm_reorg (first)
          barrier = last_barrier->insn;
          ftmp = last_barrier;
        }
+      /* ftmp is last fix that we can fit into this pool and we
+        failed to find a barrier that we could use.  Insert a new
+        barrier in the code and arrange to jump around it.  */
       else
-       /* ftmp is last fix that we can fit into this pool and we
-          failed to find a barrier that we could use.  Insert a new
-          barrier in the code and arrange to jump around it.  */
-       barrier = find_barrier (ftmp->insn, max_range - ftmp->address);
+        {
+         /* Check that there isn't another fix that is in range that
+            we couldn't fit into this pool because the pool was
+            already too large: we need to put the pool before such an
+            instruction.  */
+         if (ftmp->next && ftmp->next->address < max_range)
+           max_range = ftmp->address;
+
+         barrier = find_barrier (ftmp->insn, max_range - ftmp->address);
+       }
 
       /* Scan over the fixes we have identified for this pool, fixing them
         up and adding the constants to the pool itself.  */