diff options
Diffstat (limited to 'nuttx/libxx')
-rw-r--r-- | nuttx/libxx/Makefile | 73 | ||||
-rw-r--r-- | nuttx/libxx/README.txt | 5 | ||||
-rw-r--r-- | nuttx/libxx/libxx_cxa_atexit.cxx | 146 | ||||
-rw-r--r-- | nuttx/libxx/libxx_eabi_atexit.cxx | 23 | ||||
-rw-r--r-- | nuttx/libxx/libxx_internal.hxx | 67 | ||||
-rw-r--r-- | nuttx/libxx/libxx_stdthrow.cxx | 74 |
6 files changed, 355 insertions, 33 deletions
diff --git a/nuttx/libxx/Makefile b/nuttx/libxx/Makefile index 4122931ac..2ab146e9c 100644 --- a/nuttx/libxx/Makefile +++ b/nuttx/libxx/Makefile @@ -1,7 +1,7 @@ ############################################################################ # libxx/Makefile # -# Copyright (C) 2009 Gregory Nutt. All rights reserved. +# Copyright (C) 2009, 2012 Gregory Nutt. All rights reserved. # Author: Gregory Nutt <gnutt@nuttx.org> # # Redistribution and use in source and binary forms, with or without @@ -35,20 +35,56 @@ -include $(TOPDIR)/Make.defs -ASRCS = -AOBJS = $(ASRCS:.S=$(OBJEXT)) -CSRCS = -COBJS = $(CSRCS:.c=$(OBJEXT)) -CXXSRCS = libxx_cxapurevirtual.cxx libxx_delete.cxx libxx_deletea.cxx \ - libxx_eabi_atexit.cxx libxx_new.cxx libxx_newa.cxx -CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT)) +# Sources -SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) -OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) +ASRCS = +CSRCS = -BIN = liblibxx$(LIBEXT) +CXXSRCS = libxx_cxapurevirtual.cxx libxx_eabi_atexit.cxx libxx_cxa_atexit.cxx -all: $(BIN) +# Some of the libxx/ files are not need if uClibc++ is installed because +# uClibx++ replaces them + +ifneq ($(CONFIG_UCLIBCXX),y) +CXXSRCS += libxx_delete.cxx libxx_deletea.cxx libxx_new.cxx libxx_newa.cxx +CXXSRCS += libxx_stdthrow.cxx +else +ifneq ($(UCLIBCXX_EXCEPTION),y) +CXXSRCS += libxx_stdthrow.cxx +endif +endif + +# Paths + +DEPPATH = --dep-path . +VPATH = . + +# Include the uClibc++ Make.defs file if selected. If it is included, +# the uClibc++/Make.defs file will add its files to the source file list, +# add its DEPPATH info, and will add the appropriate paths to the VPATH +# variable +# +# Note that an error will occur if you select CONFIG_LIBXX_UCLIBCXX +# without installing the uClibc++ package. This is intentional to let +# you know about the configuration problem. Refer to misc/uClibc++/README.txt +# for more information + +ifeq ($(CONFIG_UCLIBCXX),y) +include uClibc++/Make.defs +endif + +# Object Files + +AOBJS = $(ASRCS:.S=$(OBJEXT)) +COBJS = $(CSRCS:.c=$(OBJEXT)) +CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT)) + +SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) +OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) + +BIN = libcxx$(LIBEXT) + +all: $(BIN) $(AOBJS): %$(OBJEXT): %.S $(call ASSEMBLE, $<, $@) @@ -60,21 +96,20 @@ $(CXXOBJS): %$(OBJEXT): %.cxx $(call COMPILEXX, $<, $@) $(BIN): $(OBJS) - @( for obj in $(OBJS) ; do \ - $(call ARCHIVE, $@, $${obj}); \ - done ; ) + $(call ARCHIVE, $@, $(OBJS)) .depend: Makefile $(SRCS) - @$(MKDEP) $(CXX) -- $(CXXFLAGS) -- $(SRCS) >Make.dep - @touch $@ + $(Q) $(MKDEP) $(DEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $(SRCS) >Make.dep + $(Q) touch $@ depend: .depend clean: - @rm -f $(BIN) *~ .*.swp + $(call DELFILE, $(BIN)) $(call CLEAN) distclean: clean - @rm -f Make.dep .depend + $(call DELFILE, Make.dep) + $(call DELFILE, .depend) -include Make.dep diff --git a/nuttx/libxx/README.txt b/nuttx/libxx/README.txt index 6cf066f08..7a1c51fa7 100644 --- a/nuttx/libxx/README.txt +++ b/nuttx/libxx/README.txt @@ -12,6 +12,10 @@ are recommended: - uClibc++ http://cxx.uclibc.org/ - uSTL http://ustl.sourceforge.net/ +There is a version of uClibc++ that is customized for NuttX that can +be found here: misc/uClibc++. See misc/uClibc++ for installation +instructions. + At present, only the following are supported here: - void *operator new(std::size_t nbytes); @@ -19,6 +23,7 @@ At present, only the following are supported here: - void operator delete[](void *ptr); - void __cxa_pure_virtual(void); - int __aeabi_atexit(void* object, void (*destroyer)(void*), void *dso_handle); + - int __cxa_atexit(__cxa_exitfunc_t func, FAR void *arg, FAR void *dso_handle); operator new ------------ diff --git a/nuttx/libxx/libxx_cxa_atexit.cxx b/nuttx/libxx/libxx_cxa_atexit.cxx new file mode 100644 index 000000000..cd31f94f6 --- /dev/null +++ b/nuttx/libxx/libxx_cxa_atexit.cxx @@ -0,0 +1,146 @@ +//*************************************************************************** +// libxx/libxx_eabi_atexit.cxx +// +// Copyright (C) 2012 Gregory Nutt. All rights reserved. +// Author: Gregory Nutt <gnutt@nuttx.org> +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// 3. Neither the name NuttX nor the names of its contributors may be +// used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +//*************************************************************************** + +//*************************************************************************** +// Included Files +//*************************************************************************** + +#include <nuttx/config.h> + +#include <cstdlib> +#include <cassert> + +#include "libxx_internal.hxx" + +//*************************************************************************** +// Pre-processor Definitions +//*************************************************************************** + +//*************************************************************************** +// Private Types +//*************************************************************************** + +struct __cxa_atexit_s +{ + __cxa_exitfunc_t func; + FAR void *arg; +}; + +//*************************************************************************** +// Private Data +//*************************************************************************** + +extern "C" +{ + //************************************************************************* + // Public Data + //************************************************************************* + + FAR void *__dso_handle = NULL; + + //************************************************************************* + // Private Functions + //************************************************************************* + + //************************************************************************* + // Name: __cxa_callback + // + // Description: + // This is really just an "adaptor" function that matches the form of + // the __cxa_exitfunc_t to an onexitfunc_t using an allocated structure + // to marshall the call parameters. + // + //************************************************************************* + +#if CONFIG_SCHED_ONEXIT + static void __cxa_callback(int exitcode, FAR void *arg) + { + FAR struct __cxa_atexit_s *alloc = (FAR struct __cxa_atexit_s *)arg; + DEBUGASSERT(alloc && alloc->func); + + alloc->func(alloc->arg); + free(alloc); + } +#endif + + //************************************************************************* + // Public Functions + //************************************************************************* + + //************************************************************************* + // Name: __cxa_atexit + // + // Description: + // __cxa_atexit() registers a destructor function to be called by exit(). + // On a call to exit(), the registered functions should be called with + // the single argument 'arg'. Destructor functions shall always be + // called in the reverse order to their registration (i.e. the most + // recently registered function shall be called first), + // + // If shared libraries were supported, the callbacks should be invoked + // when the shared library is unloaded as well. + // + // Reference: + // Linux base + // + //************************************************************************* + + int __cxa_atexit(__cxa_exitfunc_t func, FAR void *arg, FAR void *dso_handle) + { +#if CONFIG_SCHED_ONEXIT + // Allocate memory to hold the marshaled __cxa_exitfunc_t call + // information. + + FAR struct __cxa_atexit_s *alloc = + (FAR struct __cxa_atexit_s *)malloc(sizeof(struct __cxa_atexit_s)); + + if (alloc) + { + // Register the function to be called when the task/thread exists. + + alloc->func = func; + alloc->arg = arg; + + return on_exit(__cxa_callback, alloc); + } + else +#endif + { + // What else can we do? + + return 0; + } + } +} diff --git a/nuttx/libxx/libxx_eabi_atexit.cxx b/nuttx/libxx/libxx_eabi_atexit.cxx index aa0ff6956..25f8306a8 100644 --- a/nuttx/libxx/libxx_eabi_atexit.cxx +++ b/nuttx/libxx/libxx_eabi_atexit.cxx @@ -40,27 +40,23 @@ #include <nuttx/config.h> #include <cstdlib> +#include "libxx_internal.hxx" + //*************************************************************************** -// Definitions +// Pre-processor Definitions //*************************************************************************** //*************************************************************************** // Private Data //*************************************************************************** +//*************************************************************************** +// Public Functions +//*************************************************************************** + extern "C" { //************************************************************************* - // Public Data - //************************************************************************* - - void *__dso_handle = NULL; - - //************************************************************************* - // Public Functions - //************************************************************************* - - //************************************************************************* // Name: __aeabi_atexit // // Description: @@ -75,9 +71,8 @@ extern "C" // //************************************************************************* - int __aeabi_atexit(void* object, void (*destroyer)(void*), void *dso_handle) + int __aeabi_atexit(FAR void *object, __cxa_exitfunc_t func, FAR void *dso_handle) { - //return __cxa_atexit(destroyer, object, dso_handle); // 0 ? OK; non-0 ? failed } - return 0; + return __cxa_atexit(func, object, dso_handle); // 0 ? OK; non-0 ? failed } } diff --git a/nuttx/libxx/libxx_internal.hxx b/nuttx/libxx/libxx_internal.hxx new file mode 100644 index 000000000..fe84c763e --- /dev/null +++ b/nuttx/libxx/libxx_internal.hxx @@ -0,0 +1,67 @@ +//*************************************************************************** +// lib/libxx_internal.h +// +// Copyright (C) 2012 Gregory Nutt. All rights reserved. +// Author: Gregory Nutt <gnutt@nuttx.org> +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// 3. Neither the name NuttX nor the names of its contributors may be +// used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +//*************************************************************************** + +#ifndef __LIBXX_LIBXX_INTERNAL_HXX +#define __LIBXX_LIBXX_INTERNAL_HXX + +//*************************************************************************** +// Included Files +//*************************************************************************** + +#include <nuttx/config.h> + +//*************************************************************************** +// Definitions +//*************************************************************************** + +//*************************************************************************** +// Public Types +//***************************************************************************/ + +typedef CODE void (*__cxa_exitfunc_t)(void *arg); + +//*************************************************************************** +// Public Variables +//*************************************************************************** + +extern "C" FAR void *__dso_handle; + +//*************************************************************************** +// Public Function Prototypes +//*************************************************************************** + +extern "C" int __cxa_atexit(__cxa_exitfunc_t func, void *arg, void *dso_handle); + +#endif // __LIBXX_LIBXX_INTERNAL_HXX diff --git a/nuttx/libxx/libxx_stdthrow.cxx b/nuttx/libxx/libxx_stdthrow.cxx new file mode 100644 index 000000000..588fae264 --- /dev/null +++ b/nuttx/libxx/libxx_stdthrow.cxx @@ -0,0 +1,74 @@ +//*************************************************************************** +// libxx/libxx_newa.cxx +// +// Copyright (C) 2012 Gregory Nutt. All rights reserved. +// Author: Petteri Aimonen <petteri.aimonen@gmail.com>; +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// 3. Neither the name NuttX nor the names of its contributors may be +// used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +//*************************************************************************** + +//*************************************************************************** +// Included Files +//*************************************************************************** + +#include <cstdlib> +#include <debug.h> + +//*************************************************************************** +// Definitions +//*************************************************************************** + +//*************************************************************************** +// Private Data +//*************************************************************************** + +//*************************************************************************** +// Public Functions +//*************************************************************************** + +namespace std +{ + void __throw_out_of_range(const char*) + { + dbg("C++: Vector .at() with argument out of range\n"); + abort(); + } + + void __throw_length_error(const char*) + { + dbg("C++: Vector resize to excessive length\n"); + abort(); + } + + void __throw_bad_alloc() + { + dbg("C++: Bad allocation\n"); + abort(); + } +} |