Mercurial > ecos-v2_0-branch
changeset 789:4eccdc2c0c7d
* tests/cxxsupp.cxx: Added this test program to check that basic
C++ support is present. It checks that pure virtual functions can
be defined, that new and delete are present and functional, and
that calls to as-yet undefined inline functions work. Most of
these are linker and runtime system issues, so the actual run of
the program is almost a non-event.
* cdl/infra.cdl:
Added CYGFUN_INFRA_DUMMY_ABORT and CYGFUN_INFRA_DUMMY_STRLEN
options to conrol inclusion of dummy abort() and strlen()
functions. These are needed to be present by the compiler's C++
runtime system, although they should never be called.
Added CYGPKG_INFRA_TESTS to define test programs.
Added CYGPKG_INFRA_LDFLAGS_REMOVE and CYGPKG_INFRA_LDFLAGS_ADD to
modify the linkage options for the infra package
tests. Specifically they remove the --gc-sections option and make
all linker warning fatal. This is necessary if cxxsupp.cxx is to
test what it needs correctly.
* src/abort.cxx: Added this dummy implementation of abort() to
satisfy references in the C++ runtime system.
* src/strlen.cxx: Added this dummy implementation of strlen() to
satisfy references in the C++ runtime system.
| author | nickg |
|---|---|
| date | Thu, 10 Apr 2003 18:08:36 +0000 |
| parents | c759da109f6b |
| children | 1dda0910a2bc |
| files | packages/infra/current/src/abort.cxx packages/infra/current/src/strlen.cxx packages/infra/current/tests/cxxsupp.cxx |
| diffstat | 3 files changed, 346 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/infra/current/src/abort.cxx @@ -0,0 +1,66 @@ +//========================================================================== +// +// abort.cxx +// +// Dummy abort() +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2003 Nick Garnett <nickg@calivar.com> +// +// 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): nickg +// Date: 2003-04-02 +// Purpose: provide a dummy abort() function +// Description: Parts of the C and C++ compiler runtime systems have +// references to abort() built in to them. This definition +// satisfies these references. Note that it is not expected +// that this function will ever be called. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/infra.h> +#include <cyg/infra/cyg_ass.h> + +//========================================================================== + +extern "C" void +abort( void ) +{ + CYG_FAIL("abort() called"); + for (;;) + continue; +} + +//========================================================================== +// EOF abort.cxx
new file mode 100644 --- /dev/null +++ b/packages/infra/current/src/strlen.cxx @@ -0,0 +1,104 @@ +//=========================================================================== +// +// strlen.cxx +// +// ANSI standard strlen() routine +// +//=========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2003 Nick Garnett <nickg@calivar.com> +// +// 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. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jlarmour +// Contributors: nickg +// Date: 2000-04-14 +// Purpose: +// Description: strlen() function, to satisfy C++ runtime needs. This +// function functions correctly, but in the interests of +// keeping code size down, it uses the smallest implementation +// possible, and is consequently not very fast. +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +// CONFIGURATION + +#include <pkgconf/system.h> // Configuration header +#include <pkgconf/infra.h> // Configuration header + +//========================================================================== +// INCLUDES + +#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 definitions such as size_t, NULL etc. + +//========================================================================== +// EXPORTED SYMBOLS + +extern "C" size_t +strlen( const char *s ) CYGBLD_ATTRIB_WEAK_ALIAS(__strlen); + +//========================================================================== +// FUNCTIONS + +extern "C" size_t +__strlen( const char *s ) +{ + int retval; + + CYG_REPORT_FUNCNAMETYPE( "__strlen", "returning length %d" ); + CYG_REPORT_FUNCARG1( "s=%08x", s ); + + CYG_CHECK_DATA_PTR( s, "s is not a valid pointer!" ); + + const char *start = s; + + while (*s) + s++; + + retval = s - start; + + CYG_REPORT_RETVAL( retval ); + + return retval; + +} // __strlen() + +//========================================================================== +// EOF strlen.cxx
new file mode 100644 --- /dev/null +++ b/packages/infra/current/tests/cxxsupp.cxx @@ -0,0 +1,176 @@ +//========================================================================== +// +// cxxsupp.cxx +// +// C++ runtime support test +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2003 Nick Garnett <nickg@calivar.com> +// +// 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. +// +// Alternative licenses for eCos may be arranged by contacting the copyright +// holders. +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 2003-04-01 +// Description: Simple test for C++ runtime support. +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <pkgconf/kernel.h> +#include <pkgconf/hal.h> +#include <pkgconf/isoinfra.h> + +#include <cyg/infra/testcase.h> +#include <cyg/infra/diag.h> + +#include <new> + +//========================================================================== + +class Pure +{ +protected: + int instance; +public: + Pure(int i); + virtual void pure_fun1(void) = 0; + virtual void pure_fun2(void) = 0; + virtual void impure_fun1(void); + inline void inline_fun1(void); +}; + +Pure::Pure(int i) +{ + instance = i; + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +void Pure::impure_fun1() +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +//========================================================================== + +class Derived : public Pure +{ +public: + Derived(int i); + void pure_fun1(void); + void pure_fun2(void); + void impure_fun2(void); +}; + +Derived::Derived(int i) + : Pure(i) +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +void Derived::pure_fun1(void) +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +void Derived::pure_fun2(void) +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + + +void Derived::impure_fun2(void) +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +//========================================================================== + +__externC void +cyg_start( void ) +{ + + CYG_TEST_INIT(); + + Derived derived(1); + Pure *pure = &derived; + + CYG_TEST_INFO("Calling derived members"); + derived.pure_fun1(); + derived.pure_fun2(); + derived.impure_fun1(); + derived.impure_fun2(); + derived.inline_fun1(); + + CYG_TEST_INFO("Calling pure members"); + pure->pure_fun1(); + pure->pure_fun2(); + pure->impure_fun1(); + pure->inline_fun1(); + +#ifdef CYGINT_ISO_MALLOC + Derived *derived2 = new Derived(2); + Pure *pure2 = derived2; + + CYG_TEST_INFO("Calling derived2 members"); + derived2->pure_fun1(); + derived2->pure_fun2(); + derived2->impure_fun1(); + derived2->impure_fun2(); + derived2->inline_fun1(); + + CYG_TEST_INFO("Calling pure2 members"); + pure2->pure_fun1(); + pure2->pure_fun2(); + pure2->impure_fun1(); + pure2->inline_fun1(); + + delete derived2; + +#else + CYG_TEST_INFO("No malloc support, new and delete not tested"); +#endif + + CYG_TEST_PASS_FINISH("C++ Support OK"); +} + +//========================================================================== + +void Pure::inline_fun1() +{ + diag_printf("%s(%d) called\n",__PRETTY_FUNCTION__,instance); +} + +//========================================================================== +// EOF cxxsupp.cxx
