changeset 2563:8dd81ec802f4

Prevent reporting same cross-overlap areas two times.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 27 Feb 2022 18:15:31 +0200
parents 5c9056f381ae
children 2cf4e995b50c
files tools/objlink.c
diffstat 1 files changed, 28 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/tools/objlink.c	Sun Feb 27 18:15:03 2022 +0200
+++ b/tools/objlink.c	Sun Feb 27 18:15:31 2022 +0200
@@ -28,6 +28,13 @@
 
 typedef struct
 {
+    int noverlaps;
+    int overlaps[SET_MAX_FILENAMES];
+} DMMemBlockOverlap;
+
+
+typedef struct
+{
     char *name;         // Description of memory model
     char *desc;
     int size;           // Total addressable memory size
@@ -144,6 +151,7 @@
 
 int        nmemBlocks = 0;
 DMMemBlock memBlocks[SET_MAX_FILENAMES];
+DMMemBlockOverlap memBlockOverlaps[SET_MAX_FILENAMES];
 
 char       *optDestName = NULL;
 char       *optLinkFileName = NULL;
@@ -917,12 +925,28 @@
     for (int bk2 = 0; bk2 < nmemBlocks; bk2++)
     if (bk1 != bk2)
     {
-        DMMemBlock *mb1 = &memBlocks[bk1],
-                   *mb2 = &memBlocks[bk2];
+        DMMemBlockOverlap
+            *olp1 = &memBlockOverlaps[bk1],
+            *olp2 = &memBlockOverlaps[bk2];
+        DMMemBlock
+            *mb1 = &memBlocks[bk1],
+            *mb2 = &memBlocks[bk2];
+        BOOL found = FALSE;
 
         if (mb1->type != MTYPE_RES)
             continue;
 
+        for (int no = 0; no < olp1->noverlaps; no++)
+        {
+            if (olp1->overlaps[no] == bk2)
+            {
+                found = TRUE;
+                break;
+            }
+        }
+        if (found)
+            continue;
+
         // Check for per-file conflicts
         if ((mb2->start >= mb1->start && mb2->start <= mb1->end) ||
             (mb2->end >= mb1->start && mb2->end <= mb1->end))
@@ -931,6 +955,8 @@
                 mb1->name, mb2->name, mb1->start,
                 mb1->end, mb2->start, mb2->end);
 
+            olp1->overlaps[olp1->noverlaps++] = bk2;
+            olp2->overlaps[olp2->noverlaps++] = bk1;
             hasOverlaps = TRUE;
         }
     }