]> git.sur5r.net Git - openocd/commitdiff
embedded: do not allocate large temporary structures on stack
authorØyvind Harboe <oyvind.harboe@zylin.com>
Sat, 21 Nov 2009 22:25:46 +0000 (23:25 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Sun, 22 Nov 2009 12:38:42 +0000 (13:38 +0100)
With -O3 when inlining aggressively the total stack usage will
be the sum of many fn's, which can easily get out of hand.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/target/image.c

index 76c8cc90bb4f132b5cfae678be25035b7a210719..ca7123adc37947c3adb2bb819a72cef8c9100aa3 100644 (file)
@@ -147,18 +147,16 @@ static int identify_image_type(struct image *image, const char *type_string, con
        return ERROR_OK;
 }
 
-static int image_ihex_buffer_complete(struct image *image)
+static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, struct imageection *section)
 {
        struct image_ihex *ihex = image->type_private;
        struct fileio *fileio = &ihex->fileio;
        uint32_t full_address = 0x0;
        uint32_t cooked_bytes;
        int i;
-       char lpszLine[1023];
 
        /* we can't determine the number of sections that we'll have to create ahead of time,
         * so we locally hold them until parsing is finished */
-       struct imageection section[IMAGE_MAX_SECTIONS];
 
        ihex->buffer = malloc(fileio->size >> 1);
        cooked_bytes = 0x0;
@@ -357,6 +355,35 @@ static int image_ihex_buffer_complete(struct image *image)
        return ERROR_IMAGE_FORMAT_ERROR;
 }
 
+/**
+ * Allocate memory dynamically instead of on the stack. This
+ * is important w/embedded hosts.
+ */
+static int image_ihex_buffer_complete(struct image *image)
+{
+       char *lpszLine = malloc(1023);
+       if (lpszLine == NULL)
+       {
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
+       struct imageection *section = malloc(sizeof(struct imageection) * IMAGE_MAX_SECTIONS);
+       if (section == NULL)
+       {
+               free(lpszLine);
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
+       int retval;
+
+       retval = image_ihex_buffer_complete_inner(image, lpszLine, section);
+
+       free(section);
+       free(lpszLine);
+
+       return retval;
+}
+
 static int image_elf_read_headers(struct image *image)
 {
        struct image_elf *elf = image->type_private;
@@ -499,18 +526,16 @@ static int image_elf_read_section(struct image *image, int section, uint32_t off
        return ERROR_OK;
 }
 
-static int image_mot_buffer_complete(struct image *image)
+static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, struct imageection *section)
 {
        struct image_mot *mot = image->type_private;
        struct fileio *fileio = &mot->fileio;
        uint32_t full_address = 0x0;
        uint32_t cooked_bytes;
        int i;
-       char lpszLine[1023];
 
        /* we can't determine the number of sections that we'll have to create ahead of time,
         * so we locally hold them until parsing is finished */
-       struct imageection section[IMAGE_MAX_SECTIONS];
 
        mot->buffer = malloc(fileio->size >> 1);
        cooked_bytes = 0x0;
@@ -669,6 +694,36 @@ static int image_mot_buffer_complete(struct image *image)
        return ERROR_IMAGE_FORMAT_ERROR;
 }
 
+/**
+ * Allocate memory dynamically instead of on the stack. This
+ * is important w/embedded hosts.
+ */
+static int image_mot_buffer_complete(struct image *image)
+{
+       char *lpszLine = malloc(1023);
+       if (lpszLine == NULL)
+       {
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
+       struct imageection *section = malloc(sizeof(struct imageection) * IMAGE_MAX_SECTIONS);
+       if (section == NULL)
+       {
+               free(lpszLine);
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
+       int retval;
+
+       retval = image_mot_buffer_complete_inner(image, lpszLine, section);
+
+       free(section);
+       free(lpszLine);
+
+       return retval;
+}
+
+
 int image_open(struct image *image, const char *url, const char *type_string)
 {
        int retval = ERROR_OK;