Mercurial > nand-ecoscentric
changeset 2612:f5eb2b5ff37d
* src/gccsupport.cxx (fwrite, fputc): New functions since GCC can
now optimise certain builtins used by the libsupc++ runtime to
these.
* src/gccsupport.cxx: New file. Provide very simple defaults for
some dependencies of the GCC runtime.
* cdl/infra.cdl: Build it.
| author | jlarmour |
|---|---|
| date | Tue, 11 Nov 2008 04:31:44 +0000 |
| parents | 6e645dcefcb1 |
| children | e19a7a6154d0 |
| files | packages/infra/current/ChangeLog packages/infra/current/cdl/infra.cdl packages/infra/current/src/gccsupport.cxx |
| diffstat | 3 files changed, 205 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/infra/current/ChangeLog +++ b/packages/infra/current/ChangeLog @@ -1,3 +1,9 @@ +2008-10-02 Jonathan Larmour <jifl@eCosCentric.com> + + * src/gccsupport.cxx (fwrite, fputc): New functions since GCC can + now optimise certain builtins used by the libsupc++ runtime to + these. + 2008-07-10 Grant Edwards <grant.b.edwards@gmail.com> * src/diag.cxx: allow ASCII escape character in printf @@ -69,6 +75,12 @@ 2005-06-27 Andrew Lunn <andrew.lunn@as indicate to gcc 3.4.4 or above not to throw away a variable or function even when it appears to be not references. +2005-04-07 Jonathan Larmour <jifl@eCosCentric.com> + + * src/gccsupport.cxx: New file. Provide very simple defaults for + some dependencies of the GCC runtime. + * cdl/infra.cdl: Build it. + 2005-03-27 Andrew Lunn <andrew.lunn@ascom.ch> * include/diag.h: Added CYGBLD_ATTRIB_PRINTF_FORMAT where
--- a/packages/infra/current/cdl/infra.cdl +++ b/packages/infra/current/cdl/infra.cdl @@ -9,6 +9,7 @@ ## ------------------------------------------- ## This file is part of eCos, the Embedded Configurable Operating System. ## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## Copyright (C) 2005 eCosCentric Limited ## ## eCos is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free @@ -60,7 +61,7 @@ cdl_package CYGPKG_INFRA { compile startup.cxx prestart.cxx pkgstart.cxx userstart.cxx \ dummyxxmain.cxx null.cxx simple.cxx fancy.cxx buffer.cxx \ diag.cxx tcdiag.cxx memcpy.c memset.c delete.cxx eprintf.c \ - pure.cxx + pure.cxx gccsupport.cxx # ====================================================================
new file mode 100644 --- /dev/null +++ b/packages/infra/current/src/gccsupport.cxx @@ -0,0 +1,191 @@ +/*=========================================================================== +// +// gccsupport.cxx +// +// Miscellaneous generic support functions required by GCC +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2004, 2005, 2008 eCosCentric Ltd. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jlarmour +// Contributors: +// Date: 2005-03-06 +// Purpose: This file provides miscellaneous support functions that have +// been assumed to be present by GCC. +// Description: These functions and definitions are usually defaults +// for when the "real" implementation does not exist. +// These are intentionally very basic implementations. Users +// should pull in the real implementations from other packages +// rather than these. These are purely here for GCC's +// requirements and nothing more. +// +//####DESCRIPTIONEND#### +// +//==========================================================================*/ + + +/* INCLUDES */ + +#include <pkgconf/infra.h> /* Configuration of infra package */ +#include <pkgconf/isoinfra.h> /* Configuration of isoinfra package */ + +#include <cyg/infra/cyg_type.h> /* Common type definitions */ + //#include <cyg/infra/cyg_trac.h> /* Tracing support */ + //#include <cyg/infra/cyg_ass.h> /* Assertion support */ +#include <stddef.h> /* Compiler defns such as size_t, NULL etc. */ +#include <stdio.h> +#include <cyg/infra/diag.h> /* Diagnostic output */ + +/* GLOBALS */ + + +#ifndef CYGINT_ISO_STDIO_FILETYPES +typedef long FILE; +#endif +#ifndef CYGINT_ISO_STDIO_STREAMS +FILE *stdout, *stderr; /* In practice, ignored */ +#endif + + +/* FUNCTIONS */ +#ifndef CYGINT_ISO_STDIO_CHAR_IO +__externC int +fputs( const char *string, FILE * /* ignored */ ) __THROW +{ + diag_write_string( string ); + return 0; +} + +__externC int +fputc( int c, FILE * /* ignored */ ) __THROW +{ + diag_write_char( (char)c ); + return c; +} + +#endif + +#ifndef CYGINT_ISO_STDIO_DIRECT_IO +/* Recent GCC can "optimise" fputs(string, stream) + * to fwrite(string, 1, len, stream). + * No idea why they think that's a good idea though! */ +__externC size_t +fwrite( const void *ptr, size_t object_size, size_t num_objects, + FILE * /* ignored */ ) __THROW +{ + const char *str = static_cast<const char *>(ptr); + + /* double check GCC use before assuming. Hmm, is it possible + * GCC could optimise away the terminating NULL? + */ + if (object_size == 1 && str[num_objects] == '\0') + diag_write_string( str ); + else + return 0; + return num_objects; +} +#endif + +#ifndef CYGINT_ISO_STRING_MEMFUNCS +__externC int +memcmp( const void *s1, const void *s2, size_t n ) +{ + const unsigned char *m1 = (const unsigned char *) s1; + const unsigned char *m2 = (const unsigned char *) s2; + + while (n--) + { + if (*m1 != *m2) + { + return *m1 - *m2; + } + m1++; + m2++; + } + return 0; +} // memcmp() +#endif + +#ifndef CYGINT_ISO_STRING_STRFUNCS +__externC int +strncmp( const char *s1, const char *s2, size_t n ) +{ + if (n == 0) + { + return 0; + } + while (n-- != 0 && *s1 == *s2) + { + if (n == 0 || *s1 == '\0' || *s2 == '\0') + break; + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +} // strncmp() + +__externC int +strcmp( const char *s1, const char *s2 ) +{ + // Could do simple and direct implementation, but smaller is better + return strncmp( s1, s2, (size_t)-1 ); +} // strcmp() + +__externC char * +strcat( char *s1, const char *s2 ) +{ + char *s = s1; + + while (*s1) + s1++; + + while ((*s1++ = *s2++)) + ; + return s; +} // strcat() + +__externC char * +strcpy( char *s1, const char *s2 ) +{ + char *s = s1; + + while ((*s1++ = *s2++) != '\0') + ; + + return s; +} // strcpy() +#endif + + +/* EOF gccsupport.cxx */
