Mercurial > flash_v2
changeset 929:a53170851807
* 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 | 6425a2421b16 |
| children | c978ff8efbfc |
| files | packages/infra/current/ChangeLog packages/infra/current/cdl/infra.cdl packages/infra/current/src/abort.cxx packages/infra/current/src/strlen.cxx packages/infra/current/tests/cxxsupp.cxx |
| diffstat | 5 files changed, 436 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/infra/current/ChangeLog +++ b/packages/infra/current/ChangeLog @@ -1,3 +1,30 @@ +2003-04-10 Nick Garnett <nickg@balti.calivar.com> + + * 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. + 2003-03-27 Bart Veer <bartv@ecoscentric.com> * src/pure.cxx, cdl/infra.cdl: new function __cxa_pure_virtual(),
--- a/packages/infra/current/cdl/infra.cdl +++ b/packages/infra/current/cdl/infra.cdl @@ -178,6 +178,39 @@ cdl_package CYGPKG_INFRA { } # ======================================================================== + + cdl_option CYGFUN_INFRA_DUMMY_ABORT { + display "Provide dummy abort() function" + requires !CYGINT_ISO_EXIT + default_value { CYGINT_ISO_EXIT == 0 } + compile abort.cxx + description " + This option controls the inclusion of a dummy abort() function. + Parts of the C and C++ compiler runtime systems contain references + to abort(), particulary in the C++ exception handling code. It is + not possible to eliminate these references, so this dummy function + in included to satisfy them. It is not expected that this function + will ever be called, so its current behaviour is to simply loop." + } + + # ======================================================================== + + cdl_option CYGFUN_INFRA_DUMMY_STRLEN { + display "Provide dummy strlen() function" + requires !CYGINT_ISO_STRING_STRFUNCS + default_value { CYGINT_ISO_STRING_STRFUNCS == 0 } + compile strlen.cxx + description " + This option controls the inclusion of a dummy strlen() function. + Parts of the C and C++ compiler runtime systems contain references + to strlen(), particulary in the C++ exception handling code. It is + not possible to eliminate these references, so this dummy function + in included to satisfy them. While it is not expected that this function + will ever be called, it is functional but uses the simplest, smallest + algorithm. There is a faster version of strlen() in the C library." + } + + # ======================================================================== # Debugging-related miscellania. define_proc { @@ -245,5 +278,35 @@ cdl_package CYGPKG_INFRA { building the eCos infra package. These flags are removed from the set of global flags if present." } + + cdl_option CYGPKG_INFRA_LDFLAGS_REMOVE { + display "Suppressed linker flags" + flavor data + no_define + default_value { "-Wl,--gc-sections" } + description " + This option modifies the set of linker flags for + building the eCos infra package tests. These flags are removed from + the set of global flags if present." + } + + cdl_option CYGPKG_INFRA_LDFLAGS_ADD { + display "Additional linker flags" + flavor data + no_define + default_value { "-Wl,--fatal-warnings" } + description " + This option modifies the set of linker flags for + building the eCos infra package tests. These flags are added to + the set of global flags if present." + } + + cdl_option CYGPKG_INFRA_TESTS { + display "Infra package tests" + flavor data + no_define + calculated { "tests/cxxsupp" } + } + } }
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
