1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-12 03:00:28 +00:00
freebsd-ports/lang/icc/files/cxa_atexit.c
Alexander Leidinger 9d47e3f9b5 - C++ support: fix to work also on -current, work around broken exception
handling when generating shared objects with binutils/ld 2.12.[0,1], link
  in the icc C++ ABI definitions not those of gcc
- remove libcprts (STL): it has unresolvable glibc dependencies in both,
  dynamic and static, versions, therefore is not usable and entirely unneeded
  when libstlport is used instead
- add libimf (Intel's optimized math functions library), while there's no
  measurable speed improvement (at least for the functions tested) in
  comparison to FreeBSD's libm beyond the "normal" icc vs. gcc boost icc
  occasionally produces code depending on libimf when told to optimize for
  Pentium 4
- replace the ld-script with a wrapper written in C as (c)sh is a bit limited
  and long winded for that purpose
- minor stuff and cleanup

Submitted by:	marius@alchemy.franken.de
2002-09-17 12:10:46 +00:00

53 lines
2.4 KiB
C

/*
* Copyright (c) 2002 Marius Strobl
* All rights reserved.
*
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
#include <stdlib.h>
/*
* The __cxa_atexit() function and friends are needed for full (IA64) C++ ABI
* compatibility but FreeBSD doesn't have implemented them, yet. In addition
* to the classic atexit() it is not only used to register functions to be
* called at program exit but also to call them (C++ destructors in that case)
* when a shared object is unloaded. For the later to work the dynamic linker
* assigns a unique dynamic shared object handle to every shared object while
* a handle of NULL represents a main program. When __cxa_finalize() is called
* with a specific (non-NULL) handle as an argument all functions registered
* via __cxa_atexit() and having the same handle are called.
* The best we can do here to emulate that behaviour until FreeBSD supports
* this is to register the functions via atexit(). While this certainly is a
* bad hack it seems to work, even the current dynamic linker is assigning
* the handles. I didn't see a function getting registered with an argument
* so far.
*/
int
__cxa_atexit(void (*fn)(), void *arg, void *handle)
{
return (handle ? atexit(fn) : 0);
}