# HG changeset patch # User nickg # Date 1049998116 0 # Node ID 4eccdc2c0c7d138c3c906f3e7283f410938a93f1 # Parent c759da109f6bd010879475d975c289ba1ef5b7e1 * 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. diff --git a/packages/infra/current/src/abort.cxx b/packages/infra/current/src/abort.cxx 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 +// +// 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 +#include + +//========================================================================== + +extern "C" void +abort( void ) +{ + CYG_FAIL("abort() called"); + for (;;) + continue; +} + +//========================================================================== +// EOF abort.cxx diff --git a/packages/infra/current/src/strlen.cxx b/packages/infra/current/src/strlen.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 +// +// 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 // Configuration header +#include // Configuration header + +//========================================================================== +// INCLUDES + +#include // Common type definitions +#include // Tracing support +#include // Assertion support +#include // 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 diff --git a/packages/infra/current/tests/cxxsupp.cxx b/packages/infra/current/tests/cxxsupp.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 +// +// 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 +#include +#include + +#include +#include + +#include + +//========================================================================== + +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