mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	Mark internal functions with attribute_hidden to allow direct access to
internal functions within libc.so and libc.a without using GOT nor PLT.
Size comparison of libc.so:
On x86-64:
        text	   data	    bss	    dec	    hex
Before: 1728577	  20584	  17088	1766249	 1af369
After : 1728593	  20584	  17088	1766265	 1af379
The only change is __gconv_release_shlib in iconv/gconv_dl.c is inlined
since it is hidden, which increases the code size of gconv_dl.os by 18
bytes.
On i686:
        text	   data	    bss	    dec	    hex
Before: 1869039	  11444	  11112	1891595	 1cdd0b
After : 1868635	  11444	  11112	1891191	 1cdb77
The code size is decreased by avoiding GOT/PLT for hidden functions.
	[BZ #18822]
	* iconv/gconv_int.h (__gconv_open): Add attribute_hidden.
	(__gconv_close): Likewise.
	(__gconv): Likewise.
	(__gconv_find_transform): Likewise.
	(__gconv_lookup_cache): Likewise.
	(__gconv_compare_alias_cache): Likewise.
	(__gconv_load_cache): Likewise.
	(__gconv_get_path): Likewise.
	(__gconv_close_transform): Likewise.
	(__gconv_release_cache): Likewise.
	(__gconv_find_shlib): Likewise.
	(__gconv_release_shlib): Likewise.
	(__gconv_get_builtin_trans): Likewise.
	(__gconv_compare_alias): Likewise.
	* include/dlfcn.h (_dlerror_run): Likewise.
	* include/stdio.h (__fortify_fail_abort): Likewise.
	* include/time.h (__tz_compute): Likewise.
	(__strptime_internal): Likewise.
	* intl/gettextP.h (_nl_find_domain): Likewise.
	(_nl_load_domain): Likewise.
	(_nl_find_msg): Likewise.
	* intl/plural-exp.h (FREE_EXPRESSION): Likewise.
	(EXTRACT_PLURAL_EXPRESSION): Likewise.
	* locale/coll-lookup.h (__collidx_table_lookup): Likewise.
	* resolv/gai_misc.h (__gai_enqueue_request): Likewise.
	(__gai_find_request): Likewise.
	(__gai_remove_request): Likewise.
	(__gai_notify): Likewise.
	(__gai_notify_only): Likewise.
	* sysdeps/generic/aio_misc.h (__aio_sigqueue): Likewise.
	* sysdeps/generic/ldsodefs.h (_dl_fini): Likewise.
	(_dl_non_dynamic_init): Likewise.
	(_dl_aux_init): Likewise.
	* sysdeps/i386/machine-gmon.h (mcount_internal): Likewise.
	* sysdeps/unix/sysv/linux/i386/olddirent.h (__old_getdents64):
	Likewise.
	* wcsmbs/wcsmbsload.h (__wcsmbs_load_conv): Likewise.
	(__wcsmbs_clone_conv): Likewise.
	(__wcsmbs_named_conv): Likewise.
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Expression parsing and evaluation for plural form selection.
 | 
						|
   Copyright (C) 2000-2017 Free Software Foundation, Inc.
 | 
						|
   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
 | 
						|
 | 
						|
   This program 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.
 | 
						|
 | 
						|
   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef _PLURAL_EXP_H
 | 
						|
#define _PLURAL_EXP_H
 | 
						|
 | 
						|
#ifndef attribute_hidden
 | 
						|
# define attribute_hidden
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
enum expression_operator
 | 
						|
{
 | 
						|
  /* Without arguments:  */
 | 
						|
  var,				/* The variable "n".  */
 | 
						|
  num,				/* Decimal number.  */
 | 
						|
  /* Unary operators:  */
 | 
						|
  lnot,				/* Logical NOT.  */
 | 
						|
  /* Binary operators:  */
 | 
						|
  mult,				/* Multiplication.  */
 | 
						|
  divide,			/* Division.  */
 | 
						|
  module,			/* Modulo operation.  */
 | 
						|
  plus,				/* Addition.  */
 | 
						|
  minus,			/* Subtraction.  */
 | 
						|
  less_than,			/* Comparison.  */
 | 
						|
  greater_than,			/* Comparison.  */
 | 
						|
  less_or_equal,		/* Comparison.  */
 | 
						|
  greater_or_equal,		/* Comparison.  */
 | 
						|
  equal,			/* Comparison for equality.  */
 | 
						|
  not_equal,			/* Comparison for inequality.  */
 | 
						|
  land,				/* Logical AND.  */
 | 
						|
  lor,				/* Logical OR.  */
 | 
						|
  /* Ternary operators:  */
 | 
						|
  qmop				/* Question mark operator.  */
 | 
						|
};
 | 
						|
 | 
						|
/* This is the representation of the expressions to determine the
 | 
						|
   plural form.  */
 | 
						|
struct expression
 | 
						|
{
 | 
						|
  int nargs;			/* Number of arguments.  */
 | 
						|
  enum expression_operator operation;
 | 
						|
  union
 | 
						|
  {
 | 
						|
    unsigned long int num;	/* Number value for `num'.  */
 | 
						|
    struct expression *args[3];	/* Up to three arguments.  */
 | 
						|
  } val;
 | 
						|
};
 | 
						|
 | 
						|
/* This is the data structure to pass information to the parser and get
 | 
						|
   the result in a thread-safe way.  */
 | 
						|
struct parse_args
 | 
						|
{
 | 
						|
  const char *cp;
 | 
						|
  struct expression *res;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Names for the libintl functions are a problem.  This source code is used
 | 
						|
   1. in the GNU C Library library,
 | 
						|
   2. in the GNU libintl library,
 | 
						|
   3. in the GNU gettext tools.
 | 
						|
   The function names in each situation must be different, to allow for
 | 
						|
   binary incompatible changes in 'struct expression'.  Furthermore,
 | 
						|
   1. in the GNU C Library library, the names have a __ prefix,
 | 
						|
   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
 | 
						|
         must follow ANSI C and not start with __.
 | 
						|
   So we have to distinguish the three cases.  */
 | 
						|
#ifdef _LIBC
 | 
						|
# define FREE_EXPRESSION __gettext_free_exp
 | 
						|
# define PLURAL_PARSE __gettextparse
 | 
						|
# define GERMANIC_PLURAL __gettext_germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
 | 
						|
#elif defined (IN_LIBINTL)
 | 
						|
# define FREE_EXPRESSION libintl_gettext_free_exp
 | 
						|
# define PLURAL_PARSE libintl_gettextparse
 | 
						|
# define GERMANIC_PLURAL libintl_gettext_germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
 | 
						|
#else
 | 
						|
# define FREE_EXPRESSION free_plural_expression
 | 
						|
# define PLURAL_PARSE parse_plural_expression
 | 
						|
# define GERMANIC_PLURAL germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
 | 
						|
#endif
 | 
						|
 | 
						|
extern void FREE_EXPRESSION (struct expression *exp) attribute_hidden;
 | 
						|
extern int PLURAL_PARSE (struct parse_args *arg);
 | 
						|
extern const struct expression GERMANIC_PLURAL attribute_hidden;
 | 
						|
extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
 | 
						|
				       const struct expression **pluralp,
 | 
						|
				       unsigned long int *npluralsp)
 | 
						|
     attribute_hidden;
 | 
						|
 | 
						|
#if !defined (_LIBC) && !defined (IN_LIBINTL) && !defined (IN_LIBGLOCALE)
 | 
						|
extern unsigned long int plural_eval (const struct expression *pexp,
 | 
						|
				      unsigned long int n);
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _PLURAL_EXP_H */
 |