Mercurial > hg > dmlib
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) |