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
37e80fbb1c
commit
dfffe68303
|
@ -707,9 +707,9 @@ uint __heap_limit = 0xcafedead;
|
||||||
void * __attribute__((weak))
|
void * __attribute__((weak))
|
||||||
_sbrk (ptrdiff_t incr)
|
_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;
|
static char * heap_end;
|
||||||
char * prev_heap_end;
|
char * prev_heap_end;
|
||||||
|
|
||||||
if (heap_end == NULL)
|
if (heap_end == NULL)
|
||||||
heap_end = & end;
|
heap_end = & end;
|
||||||
|
|
|
@ -282,6 +282,13 @@
|
||||||
#endif
|
#endif
|
||||||
ldr r0, .LC0 /* Point at values read. */
|
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]
|
ldr r1, [r0, #0]
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
bne .LC32
|
bne .LC32
|
||||||
|
|
|
@ -487,10 +487,13 @@ _getpid (void)
|
||||||
return (pid_t)1;
|
return (pid_t)1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Heap limit returned from SYS_HEAPINFO Angel semihost call. */
|
||||||
|
uint __heap_limit = 0xcafedead;
|
||||||
|
|
||||||
void * __attribute__((weak))
|
void * __attribute__((weak))
|
||||||
_sbrk (ptrdiff_t incr)
|
_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;
|
static char * heap_end;
|
||||||
char * prev_heap_end;
|
char * prev_heap_end;
|
||||||
|
|
||||||
|
@ -499,7 +502,9 @@ _sbrk (ptrdiff_t incr)
|
||||||
|
|
||||||
prev_heap_end = heap_end;
|
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
|
/* Some of the libstdc++-v3 tests rely upon detecting
|
||||||
out of memory errors, so do not abort here. */
|
out of memory errors, so do not abort here. */
|
||||||
|
|
Loading…
Reference in New Issue