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;

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)