[Feature][ZXW-33]merge ZXW 0428 version

Change-Id: I11f167edfea428d9fab198ff00ff1364932d1b0b
diff --git a/ap/libc/glibc/glibc-2.23/sysdeps/unix/make-syscalls.sh b/ap/libc/glibc/glibc-2.23/sysdeps/unix/make-syscalls.sh
new file mode 100644
index 0000000..58d165e
--- /dev/null
+++ b/ap/libc/glibc/glibc-2.23/sysdeps/unix/make-syscalls.sh
@@ -0,0 +1,320 @@
+#!/bin/sh
+
+# Usage: make-syscalls.sh ../sysdeps/unix/common
+# Expects $sysdirs in environment.
+
+##############################################################################
+#
+# This script is used to process the syscall data encoded in the various
+# syscalls.list files to produce thin assembly syscall wrappers around the
+# appropriate OS syscall. See syscall-template.s for more details on the
+# actual wrapper.
+#
+# Syscall Signature Prefixes:
+#
+# C: cancellable (i.e., this syscall is a cancellation point)
+# E: errno and return value are not set by the call
+# V: errno is not set, but errno or zero (success) is returned from the call
+#
+# Syscall Signature Key Letters:
+#
+# a: unchecked address (e.g., 1st arg to mmap)
+# b: non-NULL buffer (e.g., 2nd arg to read; return value from mmap)
+# B: optionally-NULL buffer (e.g., 4th arg to getsockopt)
+# f: buffer of 2 ints (e.g., 4th arg to socketpair)
+# F: 3rd arg to fcntl
+# i: scalar (any signedness & size: int, long, long long, enum, whatever)
+# I: 3rd arg to ioctl
+# n: scalar buffer length (e.g., 3rd arg to read)
+# N: pointer to value/return scalar buffer length (e.g., 6th arg to recvfrom)
+# p: non-NULL pointer to typed object (e.g., any non-void* arg)
+# P: optionally-NULL pointer to typed object (e.g., 2nd argument to gettimeofday)
+# s: non-NULL string (e.g., 1st arg to open)
+# S: optionally-NULL string (e.g., 1st arg to acct)
+# v: vararg scalar (e.g., optional 3rd arg to open)
+# V: byte-per-page vector (3rd arg to mincore)
+# W: wait status, optionally-NULL pointer to int (e.g., 2nd arg of wait4)
+#
+
+##############################################################################
+
+thisdir=$1; shift
+
+echo ''
+echo \#### DIRECTORY = $thisdir
+# Check each sysdep dir with higher priority than this one,
+# and remove from $calls all the functions found in other dirs.
+# Punt when we reach the directory defining these syscalls.
+sysdirs=`for dir in $sysdirs; do
+	 test $dir = $thisdir && break; echo $dir; done`
+echo \#### SYSDIRS = $sysdirs
+
+# Get the list of system calls for this directory.
+calls=`sed 's/#.*$//
+/^[ 	]*$/d' $thisdir/syscalls.list`
+
+calls=`echo "$calls" |
+while read file caller rest; do
+  # Remove each syscall that is implemented by a file in $dir.
+  # If a syscall specified a "caller", then only compile that syscall
+  # if the caller function is also implemented in this directory.
+  srcfile=-;
+  for dir in $sysdirs; do
+     { test -f $dir/$file.c && srcfile=$dir/$file.c; } ||
+     { test -f $dir/$file.S && srcfile=$dir/$file.S; } ||
+     { test x$caller != x- &&
+	{ { test -f $dir/$caller.c && srcfile=$dir/$caller.c; } ||
+	  { test -f $dir/$caller.S && srcfile=$dir/$caller.S; }; }; } && break;
+  done;
+  echo $file $srcfile $caller $rest;
+done`
+
+# Any calls left?
+test -n "$calls" || exit 0
+
+# This uses variables $weak, $strong, and $any_versioned.
+emit_weak_aliases()
+{
+  # A shortcoming in the current gas is that it will only allow one
+  # version-alias per symbol.  So we create new strong aliases as needed.
+  vcount=""
+
+  # We use the <shlib-compat.h> macros to generate the versioned aliases
+  # so that the version sets can be mapped to the configuration's
+  # minimum version set as per shlib-versions DEFAULT lines.  If an
+  # entry point is specified in the form NAME@VERSION:OBSOLETED, a
+  # SHLIB_COMPAT conditional is generated.
+  if [ $any_versioned = t ]; then
+    echo "	 echo '#include <shlib-compat.h>'; \\"
+  fi
+
+  for name in $weak; do
+    case $name in
+      *@@*)
+	base=`echo $name | sed 's/@@.*//'`
+	ver=`echo $name | sed 's/.*@@//;s/\./_/g'`
+	echo "	 echo '#if IS_IN (libc)'; \\"
+	if test -z "$vcount" ; then
+	  source=$strong
+	  vcount=1
+	else
+	  source="${strong}_${vcount}"
+	  vcount=`expr $vcount + 1`
+	  echo "	 echo 'strong_alias ($strong, $source)'; \\"
+	fi
+	echo "	 echo 'versioned_symbol (libc, $source, $base, $ver)'; \\"
+	echo "	 echo '#else'; \\"
+	echo "	 echo 'strong_alias ($strong, $base)'; \\"
+	echo "	 echo '#endif'; \\"
+	;;
+      *@*)
+	base=`echo $name | sed 's/@.*//'`
+	ver=`echo $name | sed 's/.*@//;s/\./_/g'`
+	case $ver in
+	  *:*)
+	    compat_ver=${ver#*:}
+	    ver=${ver%%:*}
+	    compat_cond=" && SHLIB_COMPAT (libc, $ver, $compat_ver)"
+	    ;;
+	  *)
+	    compat_cond=
+	    ;;
+	esac
+	echo "	 echo '#if defined SHARED && IS_IN (libc)$compat_cond'; \\"
+	if test -z "$vcount" ; then
+	  source=$strong
+	  vcount=1
+	else
+	  source="${strong}_${vcount}"
+	  vcount=`expr $vcount + 1`
+	  echo "	 echo 'strong_alias ($strong, $source)'; \\"
+	fi
+	echo "	 echo 'compat_symbol (libc, $source, $base, $ver)'; \\"
+	echo "	 echo '#endif'; \\"
+	;;
+      !*)
+	name=`echo $name | sed 's/.//'`
+	echo "	 echo 'strong_alias ($strong, $name)'; \\"
+	echo "	 echo 'hidden_def ($name)'; \\"
+	;;
+      *)
+	echo "	 echo 'weak_alias ($strong, $name)'; \\"
+	echo "	 echo 'hidden_weak ($name)'; \\"
+	;;
+    esac
+  done
+}
+
+
+# Emit rules to compile the syscalls remaining in $calls.
+echo "$calls" |
+while read file srcfile caller syscall args strong weak; do
+
+  vdso_syscall=
+  case x"$syscall" in
+  *:*@*)
+    vdso_syscall="${syscall#*:}"
+    syscall="${syscall%:*}"
+    ;;
+  esac
+
+  case x"$syscall" in
+  x-) callnum=_ ;;
+  *)
+  # Figure out if $syscall is defined with a number in syscall.h.
+  callnum=-
+  eval `{ echo "#include <sysdep.h>";
+	echo "callnum=SYS_ify ($syscall)"; } |
+	  $asm_CPP -D__OPTIMIZE__ - |
+	  sed -n -e "/^callnum=.*$syscall/d" \
+		 -e "/^\(callnum=\)[ 	]*\(.*\)/s//\1'\2'/p"`
+  ;;
+  esac
+
+  cancellable=0
+  noerrno=0
+  errval=0
+  case $args in
+  C*) cancellable=1; args=`echo $args | sed 's/C:\?//'`;;
+  E*) noerrno=1; args=`echo $args | sed 's/E:\?//'`;;
+  V*) errval=1; args=`echo $args | sed 's/V:\?//'`;;
+  esac
+
+  # Derive the number of arguments from the argument signature
+  case $args in
+  [0-9]) nargs=$args;;
+  ?:) nargs=0;;
+  ?:?) nargs=1;;
+  ?:??) nargs=2;;
+  ?:???) nargs=3;;
+  ?:????) nargs=4;;
+  ?:?????) nargs=5;;
+  ?:??????) nargs=6;;
+  ?:???????) nargs=7;;
+  ?:????????) nargs=8;;
+  ?:?????????) nargs=9;;
+  esac
+
+  # Make sure only the first syscall rule is used, if multiple dirs
+  # define the same syscall.
+  echo ''
+  echo "#### CALL=$file NUMBER=$callnum ARGS=$args SOURCE=$srcfile"
+
+  # If there are versioned aliases the entry is only generated for the
+  # shared library, unless it is a default version.
+  any_versioned=f
+  shared_only=f
+  case $weak in
+    *@@*) any_versioned=t ;;
+    *@*) any_versioned=t shared_only=t ;;
+  esac
+
+ case x$srcfile"$callnum" in
+ x--)
+  # Undefined callnum for an extra syscall.
+  if [ x$caller != x- ]; then
+    if [ $noerrno != 0 ]; then
+      echo >&2 "$0: no number for $fileno, no-error syscall ($strong $weak)"
+      exit 2
+    fi
+    echo "unix-stub-syscalls += $strong $weak"
+  fi
+  ;;
+ x*-) ;; ### Do nothing for undefined callnum
+ x-*)
+  echo "ifeq (,\$(filter $file,\$(unix-syscalls)))"
+
+  if test $shared_only = t; then
+    # The versioned symbols are only in the shared library.
+    echo "ifneq (,\$(filter .os,\$(object-suffixes)))"
+  fi
+  # Accumulate the list of syscall files for this directory.
+  echo "unix-syscalls += $file"
+  test x$caller = x- || echo "unix-extra-syscalls += $file"
+
+  # Emit a compilation rule for this syscall.
+  if test $shared_only = t; then
+    # The versioned symbols are only in the shared library.
+    echo "shared-only-routines += $file"
+    test -n "$vdso_syscall" || echo "\$(objpfx)${file}.os: \\"
+  else
+    object_suffixes='$(object-suffixes)'
+    test -z "$vdso_syscall" || object_suffixes='$(object-suffixes-noshared)'
+    echo "\
+\$(foreach p,\$(sysd-rules-targets),\
+\$(foreach o,${object_suffixes},\$(objpfx)\$(patsubst %,\$p,$file)\$o)): \\"
+  fi
+
+  echo "		\$(..)sysdeps/unix/make-syscalls.sh"
+  case x"$callnum" in
+  x_)
+  echo "\
+	\$(make-target-directory)
+	(echo '/* Dummy module requested by syscalls.list */'; \\"
+  ;;
+  x*)
+  echo "\
+	\$(make-target-directory)
+	(echo '#define SYSCALL_NAME $syscall'; \\
+	 echo '#define SYSCALL_NARGS $nargs'; \\
+	 echo '#define SYSCALL_SYMBOL $strong'; \\
+	 echo '#define SYSCALL_CANCELLABLE $cancellable'; \\
+	 echo '#define SYSCALL_NOERRNO $noerrno'; \\
+	 echo '#define SYSCALL_ERRVAL $errval'; \\
+	 echo '#include <syscall-template.S>'; \\"
+  ;;
+  esac
+
+  # Append any weak aliases or versions defined for this syscall function.
+  emit_weak_aliases
+
+  # And finally, pipe this all into the compiler.
+  echo '	) | $(compile-syscall) '"\
+\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))"
+
+  if test -n "$vdso_syscall"; then
+    # In the shared library, we're going to emit an IFUNC using a vDSO function.
+    # $vdso_syscall looks like "name@KERNEL_X.Y" where "name" is the symbol
+    # name in the vDSO and KERNEL_X.Y is its symbol version.
+    vdso_symbol="${vdso_syscall%@*}"
+    vdso_symver="${vdso_syscall#*@}"
+    vdso_symver=`echo "$vdso_symver" | sed 's/\./_/g'`
+    cat <<EOF
+
+\$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\
+		\$(..)sysdeps/unix/make-syscalls.sh
+	\$(make-target-directory)
+	(echo '#include <dl-vdso.h>'; \\
+	 echo 'extern void *${strong}_ifunc (void) __asm ("${strong}");'; \\
+	 echo 'void *'; \\
+	 echo '${strong}_ifunc (void)'; \\
+	 echo '{'; \\
+	 echo '  PREPARE_VERSION_KNOWN (symver, ${vdso_symver});'; \\
+	 echo '  return _dl_vdso_vsym ("${vdso_symbol}", &symver);'; \\
+	 echo '}'; \\
+	 echo 'asm (".type ${strong}, %gnu_indirect_function");'; \\
+EOF
+    # This is doing "hidden_def (${strong})", but the compiler
+    # doesn't know that we've defined ${strong} in the same file, so
+    # we can't do it the normal way.
+    cat <<EOF
+	 echo 'asm (".globl __GI_${strong}");'; \\
+	 echo 'asm ("__GI_${strong} = ${strong}");'; \\
+EOF
+    emit_weak_aliases
+    cat <<EOF
+	) | \$(compile-stdin.c) \
+\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))
+EOF
+  fi
+
+  if test $shared_only = t; then
+    # The versioned symbols are only in the shared library.
+    echo endif
+  fi
+
+  echo endif
+ ;;
+ esac
+
+done