diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/gen-syscall-h.awk')
-rw-r--r-- | sysdeps/unix/sysv/linux/gen-syscall-h.awk | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/gen-syscall-h.awk b/sysdeps/unix/sysv/linux/gen-syscall-h.awk new file mode 100644 index 0000000000..ef8eb6be52 --- /dev/null +++ b/sysdeps/unix/sysv/linux/gen-syscall-h.awk @@ -0,0 +1,81 @@ +# Generate SYS_* macros from a list in a text file. +# Copyright (C) 2017 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/>. + +# Emit a conditional definition for SYS_NAME. +function emit(name) { + print "#ifdef __NR_" name; + print "# define SYS_" name " __NR_" name; + print "#endif"; + print ""; +} + +# Bail out with an error. +function fatal(message) { + print FILENAME ":" FNR ": " message > "/dev/stderr"; + exit 1; +} + +BEGIN { + name = ""; + kernel = ""; +} + +# Skip empty lines and comments. +/^\s*(|#.*)$/ { + next; +} + +# Kernel version. Used for documentation purposes only. +/^kernel [0-9.]+$/ { + if (kernel != "") { + fatal("duplicate kernel directive"); + } + kernel = $2; + print "/* Generated at libc build time from syscall list. */"; + print "/* The system call list corresponds to kernel " kernel ". */"; + print ""; + print "#ifndef _SYSCALL_H" + print "# error \"Never use <bits/syscall.h> directly; include <sys/syscall.h> instead.\""; + print "#endif"; + print ""; + split($2, kernel_version, "."); + kernel_major = kernel_version[1]; + kernel_minor = kernel_version[2]; + kernel_version_code = kernel_major * 65536 + kernel_minor * 256; + print "#define __GLIBC_LINUX_VERSION_CODE " kernel_version_code; + print ""; + next; +} + +# If there is just one word, it is a system call. +/^[a-zA-Z_][a-zA-Z0-9_]+$/ { + if (kernel == "") { + fatal("expected kernel directive before this line"); + } + if ($1 <= name) { + fatal("name " name " violates ordering"); + } + emit($1); + name = $1; + next; +} + +# The rest has to be syntax errors. +// { + fatal("unrecognized syntax"); +} |