mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ABI compatibility for lgamma functions.
 | 
						|
   Copyright (C) 2015-2016 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library 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
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef LGAMMA_COMPAT_H
 | 
						|
#define LGAMMA_COMPAT_H 1
 | 
						|
 | 
						|
#include <shlib-compat.h>
 | 
						|
 | 
						|
/* XSI POSIX requires lgamma to set signgam, but ISO C does not permit
 | 
						|
   this.  Namespace issues can be avoided if the functions set
 | 
						|
   __signgam and signgam is a weak alias, but this only works if both
 | 
						|
   signgam and __signgam were exported from the glibc version the
 | 
						|
   program was linked against.  Before glibc 2.23, lgamma functions
 | 
						|
   set signgam which was not a weak alias for __signgam, so old
 | 
						|
   binaries have dynamic symbols for signgam only and the versions of
 | 
						|
   lgamma used for old binaries must set both signgam and __signgam.
 | 
						|
   Those versions also do a check of _LIB_VERSION != _ISOC_ to match
 | 
						|
   old glibc.
 | 
						|
 | 
						|
   Users of this file define USE_AS_COMPAT to 0 when building the main
 | 
						|
   version of lgamma, 1 when building the compatibility version.  */
 | 
						|
 | 
						|
#define LGAMMA_OLD_VER GLIBC_2_0
 | 
						|
#define LGAMMA_NEW_VER GLIBC_2_23
 | 
						|
#define HAVE_LGAMMA_COMPAT SHLIB_COMPAT (libm, LGAMMA_OLD_VER, LGAMMA_NEW_VER)
 | 
						|
 | 
						|
/* Whether to build this version at all.  */
 | 
						|
#define BUILD_LGAMMA (HAVE_LGAMMA_COMPAT || !USE_AS_COMPAT)
 | 
						|
 | 
						|
/* The name to use for this version.  */
 | 
						|
#if USE_AS_COMPAT
 | 
						|
# define LGFUNC(FUNC) FUNC ## _compat
 | 
						|
#else
 | 
						|
# define LGFUNC(FUNC) FUNC
 | 
						|
#endif
 | 
						|
 | 
						|
/* If there is a compatibility version, gamma (not an ISO C function,
 | 
						|
   so never a problem for it to set signgam) points directly to it
 | 
						|
   rather than having separate versions.  */
 | 
						|
#define GAMMA_ALIAS (USE_AS_COMPAT ? HAVE_LGAMMA_COMPAT : !HAVE_LGAMMA_COMPAT)
 | 
						|
 | 
						|
/* How to call the underlying lgamma_r function.  */
 | 
						|
#define CALL_LGAMMA(TYPE, FUNC, ARG)			\
 | 
						|
  ({							\
 | 
						|
    TYPE lgamma_tmp;					\
 | 
						|
    int local_signgam;					\
 | 
						|
    if (USE_AS_COMPAT)					\
 | 
						|
      {							\
 | 
						|
	lgamma_tmp = FUNC ((ARG), &local_signgam);	\
 | 
						|
	if (_LIB_VERSION != _ISOC_)			\
 | 
						|
	  signgam = __signgam = local_signgam;		\
 | 
						|
      }							\
 | 
						|
    else						\
 | 
						|
      lgamma_tmp = FUNC ((ARG), &__signgam);		\
 | 
						|
    lgamma_tmp;						\
 | 
						|
  })
 | 
						|
 | 
						|
#endif /* lgamma-compat.h.  */
 |