-nostdlib option!
Drasko DRASKOVIC
drasko.draskovic@gmail.com
Mon Feb 7 16:48:00 GMT 2011
I hope that you are not pasting NDA covered SW to this list.
BR,
Drasko
On Mon, Feb 7, 2011 at 5:10 PM, Manuel Coutinho
<manuel.coutinho@edisoft.pt> wrote:
> Yes.
>
> Memset and memcpy are standalone functions. My team (at Edisoft) has a
> version for these files.
>
> For memcpy we have the file:
>
> /**
> * @brief check if either of the addresses are aligned
> *
> * Nonzero if either X or Y is not aligned on a "long" boundary.
> */
> #define UNALIGNED(X, Y) \
> (((uint32)X & (sizeof (uint32) - 1U)) | ((uint32)Y & (sizeof (uint32) -
> 1U)))
>
> /**
> * @brief determine how many bytes are copied each iteration of the 4X
> unrolled
> * loop
> */
> #define BIGBLOCKSIZE ((uint32)sizeof (sint32) << 2U)
>
> /**
> * @brief determine how many bytes are copied each iteration of the word
> copy
> * loop
> */
> #define LITTLEBLOCKSIZE ((uint32)sizeof (sint32))
>
> /**
> * @brief Threshhold for punting to the byte copier */ #define
> TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE)
>
>
> void *memcpy(void *dst0 , const void *src0 , rtems_size len0) {
>
> #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
>
> /* get destination address as a byte pointer */
> sint8 *dst = (sint8 *) dst0;
>
> /* get source address as a byte pointer */
> sint8 *src = (const sint8 *) src0;
>
>
> /* save the destination address */
> void * save = dst0;
>
> /* copy the source vector to destination for len0 bytes*/
> while(len0--)
> {
> /* copy the source to the destination */
> *dst++ = *src++;
> }
>
> /* return the saved destination address */
> return save;
>
> #else
>
> /* get destination address as a byte pointer */
> sint8 *dst = (sint8 *) dst0;
>
> /* get source address as a byte pointer */
> const sint8 *src = src0;
>
> /* alligned destination pointer */
> sint32 *aligned_dst;
>
> /* aligned source pointer */
> const sint32 *aligned_src;
>
> /* lenght in integer */
> uint32 len = (uint32) len0;
>
>
> /* If the size is small, or either SRC or DST is unaligned,
> * then punt into the byte copy loop. This should be rare. */
> if(( ( TOO_SMALL(len) ) == 0U ) &&
> ( ( UNALIGNED((uint32) src0 , (uint32) dst0) ) == FALSE ))
> {
> /* get the destination */
> aligned_dst = (sint32*) dst;
>
> /* get the source */
> aligned_src = (sint32*) src;
>
> /* Copy 4X long words at a time if possible. */
> while(len >= BIGBLOCKSIZE)
> {
> /* copy the first 4 bytes */
> *aligned_dst = *aligned_src;
> aligned_dst++;
> aligned_src++;
>
> /* copy the second 4 bytes */
> *aligned_dst = *aligned_src;
> aligned_dst++;
> aligned_src++;
>
> /* copy the third 4 bytes */
> *aligned_dst = *aligned_src;
> aligned_dst++;
> aligned_src++;
>
> /* copy the fourth 4 bytes */
> *aligned_dst = *aligned_src;
> aligned_dst++;
> aligned_src++;
>
> /* decrement the number of bytes left to copy */
> len -= BIGBLOCKSIZE;
> }
>
> /* Copy one long word at a time if possible. */
> while(len >= LITTLEBLOCKSIZE)
> {
> /* copy 4 bytes */
> *aligned_dst = *aligned_src;
> aligned_dst++;
> aligned_src++;
>
> /* decrement the number of bytes left to copy */
> len -= LITTLEBLOCKSIZE;
> }
>
> /* Pick up any residual with a byte copier. */
> dst = (sint8*) aligned_dst;
> src = (sint8*) aligned_src;
> }
>
> /* copy residual bytes (maximum of 3) */
> while(len > 0U)
> {
> /* copy each byte */
> *dst = *src;
>
> /* increment the pointer */
> dst++;
> src++;
>
> /* decrement number of bytes */
> len--;
> }
>
> /* return the destination address */
> return dst0;
>
> #endif /* not PREFER_SIZE_OVER_SPEED */
> }
>
>
>
>
> For the file memset.c we have the file:
>
>
> /**
> * @brief size of a block
> */
> #define LBLOCKSIZE ((uint32) sizeof(uintptr))
>
> /**
> * @brief check if the address is alligned */ #define UNALIGNED(X)
> ((uintptr)X & (LBLOCKSIZE - 1))
>
> /**
> * @brief check if the size is too small */ #define TOO_SMALL(LEN) ((LEN) <
> LBLOCKSIZE)
>
>
> void *memset(void *m , sint32 c , rtems_size n) {
>
> #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
>
> /* copy the destination address to another variable */
> sint8 *s = (sint8 *) m;
>
>
> /* while there are bytes left to copy */
> while(n != 0)
> {
> /* copy the byte */
> *s = (sint8) c;
>
> /* increment index on array */
> s++;
>
> /* decrement number of remaining bytes to copy */
> n--;
> }
>
> /* return the destination address */
> return m;
>
> #else
>
> /* pointer to address where to write */
> sint8 *s = (sint8 *) m;
>
> /* iterator */
> uint32 i;
>
> /* buffer where to place small array */
> uint32 buffer;
>
> /* pointer to address aligned */
> uintptr *aligned_addr;
>
> /* To avoid sign extension, copy c to an unsigned variable. */
> uint32 d = (uint32) c & 0xffU;
>
>
> /* check if the size is too small or the destination address in not
> aligned */
> if(( TOO_SMALL(n) == 0U ) && ( UNALIGNED(m) == 0U ))
> {
> /* If we get this far, we know that n is large and m is
> word-aligned. */
> aligned_addr = (uint32*) m;
>
> /* Store D into each char sized location in BUFFER so that
> we can set large blocks quickly. */
> if(LBLOCKSIZE == 4U)
> {
> /* copy to the buffer */
> buffer = (uint32) ( ( d << 8U ) | d );
> buffer = buffer | ( buffer << 16U );
> }
> else
> {
> /* reset the buffer */
> buffer = 0U;
>
> /* copy to the buffer the char */
> for(i = 0U; i < LBLOCKSIZE; i++)
> {
> buffer = ( buffer << 8U ) | d;
> }
> }
>
> /* copy the aligned bytes */
> while(n >= LBLOCKSIZE * 4U)
> {
> /* copy the first four byte word */
> *aligned_addr = buffer;
> aligned_addr++;
>
> /* copy the second four byte word */
> *aligned_addr = buffer;
> aligned_addr++;
>
> /* copy the third four byte word */
> *aligned_addr = buffer;
> aligned_addr++;
>
> /* copy the fourth four byte word */
> *aligned_addr = buffer;
> aligned_addr++;
>
> /* decrement the number of bytes copied */
> n -= (rtems_size) ( 4U * LBLOCKSIZE );
> }
>
> /* copy the remaining bytes */
> while(n >= LBLOCKSIZE)
> {
> /* copy the first four byte word */
> *aligned_addr = buffer;
> aligned_addr++;
>
> /* decrement the number of bytes copied */
> n -= LBLOCKSIZE;
> }
> /* Pick up the remainder with a bytewise loop. */
> s = (sint8*) aligned_addr;
> }
>
> /* copy the remaining bytes */
> while(n > 0U)
> {
> /* copy the byte */
> *s = (sint8) d;
> s++;
> /* decrement size */
> n--;
> }
>
> /* return the destination address */
> return m;
>
> #endif /* not PREFER_SIZE_OVER_SPEED */
> }
>
>
>
>
>
> Hope this help ;)
> Manuel Coutinho
>
> -----Original Message-----
> From: gcc-help-owner@gcc.gnu.org [mailto:gcc-help-owner@gcc.gnu.org] On
> Behalf Of Kai Ruottu
> Sent: 07 February 2011 14:43
> To: gcc-help@gcc.gnu.org
> Cc: ali hagigat
> Subject: Re: -nostdlib option!
>
> 7.2.2011 14:44, ali hagigat kirjoitti:
>
>> How will be memset, memcpy, etc. Can i copy them from the source code
>> of gcc? But they are dependent to other functions in other libraries
>> probably and some headers.
>
> Most probably these functions are standalone and don't
> call other functions... Does your program really call
> them? What does 'nm' say anout undefined symbols in the
> compiled object(s)?
>
>> Are those functions available stand alone some where?
>
> For instance in :
> newlib-1.18.0/newlib/libc/machine/i386
> in the current newlib sources.
>
>
>
More information about the Gcc-help
mailing list