embedded: do not allocate large temporary structures on stack
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>
This commit is contained in:
parent
31da0003dc
commit
964c3639e2
|
@ -147,18 +147,16 @@ static int identify_image_type(struct image *image, const char *type_string, con
|
||||||
return ERROR_OK;
|
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 image_ihex *ihex = image->type_private;
|
||||||
struct fileio *fileio = &ihex->fileio;
|
struct fileio *fileio = &ihex->fileio;
|
||||||
uint32_t full_address = 0x0;
|
uint32_t full_address = 0x0;
|
||||||
uint32_t cooked_bytes;
|
uint32_t cooked_bytes;
|
||||||
int i;
|
int i;
|
||||||
char lpszLine[1023];
|
|
||||||
|
|
||||||
/* we can't determine the number of sections that we'll have to create ahead of time,
|
/* 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 */
|
* so we locally hold them until parsing is finished */
|
||||||
struct imageection section[IMAGE_MAX_SECTIONS];
|
|
||||||
|
|
||||||
ihex->buffer = malloc(fileio->size >> 1);
|
ihex->buffer = malloc(fileio->size >> 1);
|
||||||
cooked_bytes = 0x0;
|
cooked_bytes = 0x0;
|
||||||
|
@ -357,6 +355,35 @@ static int image_ihex_buffer_complete(struct image *image)
|
||||||
return ERROR_IMAGE_FORMAT_ERROR;
|
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)
|
static int image_elf_read_headers(struct image *image)
|
||||||
{
|
{
|
||||||
struct image_elf *elf = image->type_private;
|
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;
|
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 image_mot *mot = image->type_private;
|
||||||
struct fileio *fileio = &mot->fileio;
|
struct fileio *fileio = &mot->fileio;
|
||||||
uint32_t full_address = 0x0;
|
uint32_t full_address = 0x0;
|
||||||
uint32_t cooked_bytes;
|
uint32_t cooked_bytes;
|
||||||
int i;
|
int i;
|
||||||
char lpszLine[1023];
|
|
||||||
|
|
||||||
/* we can't determine the number of sections that we'll have to create ahead of time,
|
/* 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 */
|
* so we locally hold them until parsing is finished */
|
||||||
struct imageection section[IMAGE_MAX_SECTIONS];
|
|
||||||
|
|
||||||
mot->buffer = malloc(fileio->size >> 1);
|
mot->buffer = malloc(fileio->size >> 1);
|
||||||
cooked_bytes = 0x0;
|
cooked_bytes = 0x0;
|
||||||
|
@ -669,6 +694,36 @@ static int image_mot_buffer_complete(struct image *image)
|
||||||
return ERROR_IMAGE_FORMAT_ERROR;
|
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 image_open(struct image *image, const char *url, const char *type_string)
|
||||||
{
|
{
|
||||||
int retval = ERROR_OK;
|
int retval = ERROR_OK;
|
||||||
|
|
Loading…
Reference in New Issue