]> git.sur5r.net Git - cc65/commitdiff
Extend the map file to include a table of exports sorted by value.
authorChristian Groessler <chris@groessler.org>
Thu, 20 Mar 2014 01:01:21 +0000 (02:01 +0100)
committerChristian Groessler <chris@groessler.org>
Thu, 20 Mar 2014 01:01:52 +0000 (02:01 +0100)
src/ld65/exports.c
src/ld65/exports.h
src/ld65/mapfile.c

index 9caa2ba5713425d94fb4264615aee41b89f85bd6..937883d0d20f20bc7fae25b669e89957faca8b36 100644 (file)
@@ -870,8 +870,8 @@ static char GetAddrSizeCode (unsigned char AddrSize)
 
 
 
-void PrintExportMap (FILE* F)
-/* Print an export map to the given file */
+void PrintExportMapByName (FILE* F)
+/* Print an export map, sorted by symbol name, to the given file */
 {
     unsigned I;
     unsigned Count;
@@ -902,6 +902,61 @@ void PrintExportMap (FILE* F)
 
 
 
+static int CmpExpValue (const void* I1, const void* I2)
+/* Compare function for qsort */
+{
+    long V1 = GetExportVal (ExpPool [*(unsigned *)I1]);
+    long V2 = GetExportVal (ExpPool [*(unsigned *)I2]);
+
+    return V1 < V2 ? -1 : V1 == V2 ? 0 : 1;
+}
+
+
+
+void PrintExportMapByValue (FILE* F)
+/* Print an export map, sorted by symbol value, to the given file */
+{
+    unsigned I;
+    unsigned Count;
+    unsigned *ExpValXlat;
+
+    /* Create a translation table where the symbols are sorted by value. */
+    ExpValXlat = xmalloc (ExpCount * sizeof (unsigned));
+    for (I = 0; I < ExpCount; ++I) {
+        /* Initialize table with current sort order.  */
+        ExpValXlat [I] = I;
+    }
+
+    /* Sort them by value */
+    qsort (ExpValXlat, ExpCount, sizeof (unsigned), CmpExpValue);
+
+    /* Print all exports */
+    Count = 0;
+    for (I = 0; I < ExpCount; ++I) {
+        const Export* E = ExpPool [ExpValXlat [I]];
+
+        /* Print unreferenced symbols only if explictly requested */
+        if (VerboseMap || E->ImpCount > 0 || SYM_IS_CONDES (E->Type)) {
+            fprintf (F,
+                     "%-25s %06lX %c%c%c%c   ",
+                     GetString (E->Name),
+                     GetExportVal (E),
+                     E->ImpCount? 'R' : ' ',
+                     SYM_IS_LABEL (E->Type)? 'L' : 'E',
+                     GetAddrSizeCode ((unsigned char) E->AddrSize),
+                     SYM_IS_CONDES (E->Type)? 'I' : ' ');
+            if (++Count == 2) {
+                Count = 0;
+                fprintf (F, "\n");
+            }
+        }
+    }
+    fprintf (F, "\n");
+    xfree (ExpValXlat);
+}
+
+
+
 void PrintImportMap (FILE* F)
 /* Print an import map to the given file */
 {
index 2b7c55bed82bc9f9a2778830ca114cdda4dba6e3..2c0bbca952b2b8220237d0d7a81d11eb64f4ef2e 100644 (file)
@@ -186,8 +186,11 @@ void CheckUnresolvedImports (ExpCheckFunc F, void* Data);
  * called (see the comments on ExpCheckFunc in the data section).
  */
 
-void PrintExportMap (FILE* F);
-/* Print an export map to the given file */
+void PrintExportMapByName (FILE* F);
+/* Print an export map to the given file (sorted by symbol name) */
+
+void PrintExportMapByValue (FILE* F);
+/* Print an export map to the given file (sorted by export value) */
 
 void PrintImportMap (FILE* F);
 /* Print an import map to the given file */
index 6b13e46ec4c306cd7d36f05af3ea8d77e506e215..e1d0e809844220ebe37c644441f281e815edf2bd 100644 (file)
@@ -111,11 +111,17 @@ void CreateMapFile (int ShortMap)
     /* The remainder is not written for short map files */
     if (!ShortMap) {
 
-        /* Write the exports list */
+        /* Write the exports list by name */
         fprintf (F, "\n\n"
-                    "Exports list:\n"
-                    "-------------\n");
-        PrintExportMap (F);
+                    "Exports list by name:\n"
+                    "---------------------\n");
+        PrintExportMapByName (F);
+
+        /* Write the exports list by value */
+        fprintf (F, "\n\n"
+                    "Exports list by value\n"
+                    "---------------------\n");
+        PrintExportMapByValue (F);
 
         /* Write the imports list */
         fprintf (F, "\n\n"