changeset 1679:7b0c76cd7686

Clean up and improve error handling.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 31 May 2018 13:18:44 +0300
parents bddedc2e0ebb
children dbffbd333a16
files tools/objlink.c
diffstat 1 files changed, 44 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/tools/objlink.c	Thu May 31 13:08:09 2018 +0300
+++ b/tools/objlink.c	Thu May 31 13:18:44 2018 +0300
@@ -200,13 +200,13 @@
 
 /* Memory block handling
  */
-void reserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType)
+BOOL dmReserveMemBlock(int startAddr, int endAddr, const char *blockName, int blockType)
 {
     if (startAddr > endAddr)
     {
         dmErrorMsg("ERROR! Block '%s' has startAddr=$%.4x > endAddr=$%.4x!\n",
             blockName, startAddr, endAddr);
-        exit(4);
+        return FALSE;
     }
 
     if (nmemBlocks < MAX_FILENAMES)
@@ -216,17 +216,18 @@
         memBlocks[nmemBlocks].name  = dm_strdup(blockName);
         memBlocks[nmemBlocks].type  = blockType;
         nmemBlocks++;
+        return TRUE;
     }
     else
     {
         dmErrorMsg("Maximum number of memBlock definitions (%d) exceeded!\n",
             MAX_FILENAMES);
-        exit(4);
+        return FALSE;
     }
 }
 
 
-int compareMemBlock(const void *cva, const void *cvb)
+int dmCompareMemBlock(const void *cva, const void *cvb)
 {
     const DMMemBlock *a = cva, *b = cvb;
     return a->start - b->start;
@@ -237,13 +238,14 @@
 {
     char sectMode, *sep, *str, *namesep;
     unsigned int tmpi;
+    BOOL res = FALSE;
 
     // Define reserved section
     // Create a copy of the argument
     if ((str = dm_strdup(arg)) == NULL)
     {
         dmErrorMsg("Could not allocate temporary string!\n");
-        exit(128);
+        goto out;
     }
 
     // Get start address
@@ -251,7 +253,7 @@
         (sep = strchr(str, ':')) == NULL)
     {
         dmErrorMsg("Section definition '%s' invalid.\n", arg);
-        goto error;
+        goto out;
     }
     sectMode = *sep;
     *sep = 0;
@@ -260,7 +262,7 @@
     if (!dmGetIntVal(str, sectStart))
     {
         dmErrorMsg("Section start address '%s' in '%s' invalid.\n", str, arg);
-        goto error;
+        goto out;
     }
 
     // Check for name
@@ -273,7 +275,7 @@
         {
             dmErrorMsg("Section definition '%s' name is empty. Either specify name or leave it out.\n",
                 arg);
-            goto error;
+            goto out;
         }
         *sectName = dm_strdup(namesep);
     }
@@ -282,7 +284,7 @@
     {
         dmErrorMsg("Section definition does not allow a name, syntax error in '%s' at '%s'.\n",
             arg, namesep);
-        goto error;
+        goto out;
     }
 
     // Get end address or length
@@ -291,7 +293,7 @@
         dmErrorMsg("Section %s '%s' in '%s' invalid.\n",
             sectMode == '-' ? "end address" : "length",
             sep + 1, arg);
-        goto error;
+        goto out;
     }
 
     if (sectMode == ':')
@@ -304,17 +306,16 @@
         {
             dmErrorMsg("Section start address > end address in '%s'.\n",
                 arg);
-            goto error;
+            goto out;
         }
         *sectEnd = tmpi;
     }
 
-    dmFree(str);
-    return TRUE;
+    res = TRUE;
 
-error:
+out:
     dmFree(str);
-    return FALSE;
+    return res;
 }
 
 
@@ -462,7 +463,8 @@
             dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as '%s'\n",
                 sectStart, sectEnd, sectLen, sectLen, sectName);
 
-            reserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES);
+            if (!dmReserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES))
+                return FALSE;
         }
         break;
 
@@ -569,7 +571,8 @@
     dmPrint(1, " .. OK\n");
 
     // Add to list of blocks
-    reserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES);
+    if (!dmReserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES))
+        res = DMERR_MALLOC;
 
 out:
     if (fh != NULL)
@@ -625,7 +628,8 @@
     dmPrint(1, " .. OK\n");
 
     // Add info to list
-    reserveMemBlock(destAddr, endAddr, filename, MTYPE_RES);
+    if (!dmReserveMemBlock(destAddr, endAddr, filename, MTYPE_RES))
+        res = DMERR_MALLOC;
 
 out:
     if (fh != NULL)
@@ -784,12 +788,12 @@
     // Parse arguments
     if (!dmArgsProcess(argc, argv, optList, optListN,
         argHandleOpt, NULL, OPTH_BAILOUT))
-        exit(1);
+        goto out;
 
     if (nsrcFiles < 1)
     {
         dmErrorMsg("Nothing to do. (try --help)\n");
-        exit(0);
+        goto out;
     }
 
     // Allocate memory
@@ -797,11 +801,10 @@
     dmMsg(1, "Using memory model #%d '%s', %d bytes.\n",
         optMemModel, memModel->name, memModel->size);
 
-    memory = (Uint8 *) dmMalloc(memModel->size + 32);
-    if (memory == NULL)
+    if ((memory = (Uint8 *) dmMalloc(memModel->size + 32)) == NULL)
     {
-        dmErrorMsg("Could not allocate memory.\n");
-        exit(2);
+        dmErrorMsg("Could not allocate memory for memory model!\n");
+        goto out;
     }
 
     // Initialize memory
@@ -853,15 +856,16 @@
     dmMsg(1, "Applying memory model restrictions...\n");
     for (int i = 0; i < memModel->nmemBlocks; i++)
     {
-        reserveMemBlock(
+        if (!dmReserveMemBlock(
             memModel->memBlocks[i].start,
             memModel->memBlocks[i].end,
             memModel->memBlocks[i].name,
-            memModel->memBlocks[i].type);
+            memModel->memBlocks[i].type))
+            goto out;
     }
 
     // Sort the blocks
-    qsort(memBlocks, nmemBlocks, sizeof(DMMemBlock), compareMemBlock);
+    qsort(memBlocks, nmemBlocks, sizeof(DMMemBlock), dmCompareMemBlock);
 
     // Check for overlapping conflicts
     hasOverlaps = FALSE;
@@ -886,7 +890,7 @@
     if (!optAllowOverlap && hasOverlaps)
     {
         dmErrorMsg("Error occured, overlaps not allowed.\n");
-        exit(5);
+        goto out;
     }
 
     // Find out start and end-addresses
@@ -909,8 +913,9 @@
 
     if (startAddr >= memModel->size || endAddr < startAddr)
     {
-        dmErrorMsg("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n", startAddr, endAddr);
-        exit(8);
+        dmErrorMsg("Invalid saveblock addresses (start=$%.4x, end=$%.4x)!\n",
+            startAddr, endAddr);
+        goto out;
     }
 
     // Output linkfile
@@ -922,7 +927,7 @@
             int err = dmGetErrno();
             dmErrorMsg("Error creating file '%s' #%d: %s.\n",
                 optLinkFileName, err, dmErrorStr(err));
-            exit(1);
+            goto out;
         }
 
         switch (optLinkFileFormat)
@@ -973,7 +978,7 @@
         int err = dmGetErrno();
         dmErrorMsg("Error creating output file '%s' #%d: %s.\n",
             optDestName, err, dmErrorStr(err));
-        exit(1);
+        goto out;
     }
     else
         dmPrint(1, "to '%s'\n", optDestName);
@@ -1001,13 +1006,16 @@
         int err = dmGetErrno();
         dmErrorMsg("Error writing to file #%d: %s.\n",
             err, dmErrorStr(err));
+        goto out;
     }
 
-    fclose(dfile);
+    // Describe the memory layout
+    if (optDescribe)
+        dmDescribeMemory(dfile != stdout ? stdout : stderr);
 
-    // Describe
-    if (optDescribe)
-        dmDescribeMemory(stdout);
+out:
+    if (dfile != NULL && dfile != stdout)
+        fclose(dfile);
 
     return 0;
 }