[PATCH v5 4/5] Support different fragment ordering in frag_offset_ignore_align_p

Evgeny Karpov evgeny.karpov@arm.com
Tue Feb 24 09:49:22 GMT 2026


This patch extends frag_offset_ignore_align_p to support different fragment
order in the same way it is done in frag_offset_fixed_p.

Signed-off-by: Evgeny Karpov <evgeny@kmaps.co>

gas/ChangeLog:

	* frags.c (frag_offset_ignore_align_p): Update.
---
 gas/frags.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/gas/frags.c b/gas/frags.c
index fce6f7362af..ccdcb204df9 100644
--- a/gas/frags.c
+++ b/gas/frags.c
@@ -457,8 +457,8 @@ frag_offset_fixed_p (const fragS *frag1, const fragS *frag2, offsetT *offset)
   return false;
 }
 
-/* Return TRUE if FRAG2 follows FRAG1 with a fixed relationship
-   between the two assuming alignment frags do nothing.  Set OFFSET to
+/* Return TRUE if FRAG1 and FRAG2 have a fixed relationship between
+   their start addresses, assuming alignment frags do nothing.  Set OFFSET to
    the difference in address not already accounted for in the frag
    FR_ADDRESS.  */
 
@@ -478,6 +478,7 @@ frag_offset_ignore_align_p (const fragS *frag1, const fragS *frag2,
       return true;
     }
 
+  /* Maybe frag2 is after frag1.  */
   frag = frag1;
   while (frag->fr_type == rs_fill
 	 || frag->fr_type == rs_align
@@ -496,6 +497,25 @@ frag_offset_ignore_align_p (const fragS *frag1, const fragS *frag2,
 	}
     }
 
+  /* Maybe frag1 is after frag2.  */
+  off = frag1->fr_address - frag2->fr_address;
+  frag = frag2;
+  while (frag->fr_type == rs_fill
+	 || frag->fr_type == rs_align
+	 || frag->fr_type == rs_align_code
+	 || frag->fr_type == rs_align_test)
+    {
+      off -= frag->fr_fix + frag->fr_offset * frag->fr_var;
+      frag = frag->fr_next;
+      if (frag == NULL)
+	break;
+      if (frag == frag1)
+	{
+	  *offset = off;
+	  return true;
+	}
+    }
+
   return false;
 }
 


More information about the Binutils mailing list