Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit
Applied changes from commit 8d98f95: * arm/crt0.S: Initialise __heap_limit when ARM_RDI_MONITOR is defined. * arm/syscalls.c: define __heap_limit global symbol. * arm/syscalls.c (_sbrk): Honour __heap_limit. Applied changes from commit 8d98f95: Fixed semihosting for ARM when heapinfo not provided by debugger
This commit is contained in:
parent
ecf2fbe4f3
commit
e538b63421
|
@ -707,15 +707,15 @@ uint __heap_limit = 0xcafedead;
|
|||
void * __attribute__((weak))
|
||||
_sbrk (ptrdiff_t incr)
|
||||
{
|
||||
extern char end asm ("end"); /* Defined by the linker. */
|
||||
extern char end asm ("end"); /* Defined by the linker. */
|
||||
static char * heap_end;
|
||||
char * prev_heap_end;
|
||||
char * prev_heap_end;
|
||||
|
||||
if (heap_end == NULL)
|
||||
heap_end = & end;
|
||||
|
||||
|
||||
prev_heap_end = heap_end;
|
||||
|
||||
|
||||
if ((heap_end + incr > stack_ptr)
|
||||
/* Honour heap limit if it's valid. */
|
||||
|| (__heap_limit != 0xcafedead && heap_end + incr > (char *)__heap_limit))
|
||||
|
@ -726,14 +726,14 @@ _sbrk (ptrdiff_t incr)
|
|||
extern void abort (void);
|
||||
|
||||
_write (1, "_sbrk: Heap and stack collision\n", 32);
|
||||
|
||||
|
||||
abort ();
|
||||
#else
|
||||
errno = ENOMEM;
|
||||
return (void *) -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
heap_end += incr;
|
||||
|
||||
return (void *) prev_heap_end;
|
||||
|
|
|
@ -282,6 +282,13 @@
|
|||
#endif
|
||||
ldr r0, .LC0 /* Point at values read. */
|
||||
|
||||
/* Set __heap_limit. */
|
||||
ldr r1, [r0, #4]
|
||||
cmp r1, #0
|
||||
beq .LC33
|
||||
ldr r2, =__heap_limit
|
||||
str r1, [r2]
|
||||
.LC33:
|
||||
ldr r1, [r0, #0]
|
||||
cmp r1, #0
|
||||
bne .LC32
|
||||
|
|
|
@ -487,10 +487,13 @@ _getpid (void)
|
|||
return (pid_t)1;
|
||||
}
|
||||
|
||||
/* Heap limit returned from SYS_HEAPINFO Angel semihost call. */
|
||||
uint __heap_limit = 0xcafedead;
|
||||
|
||||
void * __attribute__((weak))
|
||||
_sbrk (ptrdiff_t incr)
|
||||
{
|
||||
extern char end asm ("end"); /* Defined by the linker. */
|
||||
extern char end asm ("end"); /* Defined by the linker. */
|
||||
static char * heap_end;
|
||||
char * prev_heap_end;
|
||||
|
||||
|
@ -499,7 +502,9 @@ _sbrk (ptrdiff_t incr)
|
|||
|
||||
prev_heap_end = heap_end;
|
||||
|
||||
if (heap_end + incr > stack_ptr)
|
||||
if ((heap_end + incr > stack_ptr)
|
||||
/* Honour heap limit if it's valid. */
|
||||
|| (__heap_limit != 0xcafedead && heap_end + incr > (char *)__heap_limit))
|
||||
{
|
||||
/* Some of the libstdc++-v3 tests rely upon detecting
|
||||
out of memory errors, so do not abort here. */
|
||||
|
|
Loading…
Reference in New Issue