Is this expected gcc behaviour?

Jay Monkman jtm-list-crossgcc@smoothsmoothie.com
Tue Aug 3 15:27:00 GMT 2004


On Mon, Aug 02, 2004 at 10:05:30PM -0700, Dan Kegel wrote:
> Yes.   Perhaps if you gave a more realistic example, we
> could help a bit...

I guess I simplified my test case too much.

This code is from RTEMS, and is used in many (most?) board support packages 
for calculating memory sizes. In the linker script, there is a statement:

  _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;

Which can be overridden at final link time. Elsewhere, the code used
to calculate the size of the heap looks like:

   extern void          *_RamBase;
   extern void          *_HeapSize;
   extern void          *_WorkspaceBase;
   extern unsigned long  work_space_size;

   unsigned long  _M68k_Ramsize;

   void bsp_pretasking_hook(void)
   {
        void         *heapStart;
        unsigned long heapSize = (unsigned long)&_HeapSize;
        unsigned long ramSpace;

        heapStart =  (void *) ((unsigned long)&_WorkspaceBase +
                               work_space_size);
        ramSpace = (unsigned long) &_RamBase + 
                         (_M68k_Ramsize - (unsigned long) heapStart);

        if (heapSize == 0)
            heapSize = ramSpace;
        else if (heapSize > ramSpace)
            rtems_fatal_error_occurred (('H'<<24) | ('E'<<16) | ('A'<<8) | 'P');

        bsp_libc_init(heapStart, heapSize, 0);

   }

This is supposed to set the size of the heap to the size of  all the free memory, if 
no heap size (_HeapSize) is specified.

When I compile with -O1 (or greater), I get

        .file   "test.c"
        .text
        .align  2
        .globl  bsp_pretasking_hook
        .type   bsp_pretasking_hook, @function
    bsp_pretasking_hook:
        move.l %d3,-(%sp)
        move.l %d2,-(%sp)
        move.l #_HeapSize,%d3
        move.l work_space_size,%d2
        add.l #_WorkspaceBase,%d2
        move.l _M68k_Ramsize,%d0
        sub.l %d2,%d0
        add.l #_RamBase,%d0
        cmp.l %d3,%d0
        jbcc .L3
        move.l #1212498256,-(%sp)
        jbsr rtems_fatal_error_occurred
        addq.l #4,%sp
        .align  2
    .L3:
        clr.l -(%sp)
        move.l %d3,-(%sp)
        move.l %d2,-(%sp)
        jbsr bsp_libc_init
        lea (12,%sp),%sp
        move.l (%sp)+,%d2
        move.l (%sp)+,%d3
        rts
        .size   bsp_pretasking_hook, .-bsp_pretasking_hook
        .comm   _M68k_Ramsize,4,2
        .ident  "GCC: (GNU) 3.4.0"

You can see the test (HeapSize == 0) is missing. 

This used to work fine with older compilers, but no longer does with 3.4.0.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/crossgcc/attachments/20040803/46f08d89/attachment.sig>


More information about the crossgcc mailing list