comparison tools/objlink.c @ 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
comparison
equal deleted inserted replaced
2562:5c9056f381ae 2563:8dd81ec802f4
26 } DMMemBlock; 26 } DMMemBlock;
27 27
28 28
29 typedef struct 29 typedef struct
30 { 30 {
31 int noverlaps;
32 int overlaps[SET_MAX_FILENAMES];
33 } DMMemBlockOverlap;
34
35
36 typedef struct
37 {
31 char *name; // Description of memory model 38 char *name; // Description of memory model
32 char *desc; 39 char *desc;
33 int size; // Total addressable memory size 40 int size; // Total addressable memory size
34 int nmemBlocks; // Defined memory areas 41 int nmemBlocks; // Defined memory areas
35 DMMemBlock memBlocks[SET_MAX_MEMBLOCKS]; 42 DMMemBlock memBlocks[SET_MAX_MEMBLOCKS];
142 int nsrcFiles = 0; // Number of source files 149 int nsrcFiles = 0; // Number of source files
143 DMSourceFile srcFiles[SET_MAX_FILENAMES]; // Source file names 150 DMSourceFile srcFiles[SET_MAX_FILENAMES]; // Source file names
144 151
145 int nmemBlocks = 0; 152 int nmemBlocks = 0;
146 DMMemBlock memBlocks[SET_MAX_FILENAMES]; 153 DMMemBlock memBlocks[SET_MAX_FILENAMES];
154 DMMemBlockOverlap memBlockOverlaps[SET_MAX_FILENAMES];
147 155
148 char *optDestName = NULL; 156 char *optDestName = NULL;
149 char *optLinkFileName = NULL; 157 char *optLinkFileName = NULL;
150 int optLinkFileFormat = FMT_GENERIC; 158 int optLinkFileFormat = FMT_GENERIC;
151 BOOL optDescribe = FALSE, 159 BOOL optDescribe = FALSE,
915 hasOverlaps = FALSE; 923 hasOverlaps = FALSE;
916 for (int bk1 = 0; bk1 < nmemBlocks; bk1++) 924 for (int bk1 = 0; bk1 < nmemBlocks; bk1++)
917 for (int bk2 = 0; bk2 < nmemBlocks; bk2++) 925 for (int bk2 = 0; bk2 < nmemBlocks; bk2++)
918 if (bk1 != bk2) 926 if (bk1 != bk2)
919 { 927 {
920 DMMemBlock *mb1 = &memBlocks[bk1], 928 DMMemBlockOverlap
921 *mb2 = &memBlocks[bk2]; 929 *olp1 = &memBlockOverlaps[bk1],
930 *olp2 = &memBlockOverlaps[bk2];
931 DMMemBlock
932 *mb1 = &memBlocks[bk1],
933 *mb2 = &memBlocks[bk2];
934 BOOL found = FALSE;
922 935
923 if (mb1->type != MTYPE_RES) 936 if (mb1->type != MTYPE_RES)
937 continue;
938
939 for (int no = 0; no < olp1->noverlaps; no++)
940 {
941 if (olp1->overlaps[no] == bk2)
942 {
943 found = TRUE;
944 break;
945 }
946 }
947 if (found)
924 continue; 948 continue;
925 949
926 // Check for per-file conflicts 950 // Check for per-file conflicts
927 if ((mb2->start >= mb1->start && mb2->start <= mb1->end) || 951 if ((mb2->start >= mb1->start && mb2->start <= mb1->end) ||
928 (mb2->end >= mb1->start && mb2->end <= mb1->end)) 952 (mb2->end >= mb1->start && mb2->end <= mb1->end))
929 { 953 {
930 dmPrint(-1, "* '%s' and '%s' overlap ($%.4x-$%.4x vs $%.4x-$%.4x)\n", 954 dmPrint(-1, "* '%s' and '%s' overlap ($%.4x-$%.4x vs $%.4x-$%.4x)\n",
931 mb1->name, mb2->name, mb1->start, 955 mb1->name, mb2->name, mb1->start,
932 mb1->end, mb2->start, mb2->end); 956 mb1->end, mb2->start, mb2->end);
933 957
958 olp1->overlaps[olp1->noverlaps++] = bk2;
959 olp2->overlaps[olp2->noverlaps++] = bk1;
934 hasOverlaps = TRUE; 960 hasOverlaps = TRUE;
935 } 961 }
936 } 962 }
937 963
938 if (!optAllowOverlap && hasOverlaps) 964 if (!optAllowOverlap && hasOverlaps)