91 lines · bash
1#!/bin/sh2# SPDX-License-Identifier: GPL-2.03#4# Generate C file mapping errno codes to errno names.5#6# Copyright IBM Corp. 20187# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>8 9gcc="$1"10toolsdir="$2"11include_path="-I$toolsdir/include/uapi"12 13arch_string()14{15 echo "$1" |sed -e 'y/- /__/' |tr '[[:upper:]]' '[[:lower:]]'16}17 18asm_errno_file()19{20 arch="$1"21 22 header="$toolsdir/arch/$arch/include/uapi/asm/errno.h"23 if test -r "$header"; then24 echo "$header"25 else26 echo "$toolsdir/include/uapi/asm-generic/errno.h"27 fi28}29 30create_errno_lookup_func()31{32 arch=$(arch_string "$1")33 34 printf "static const char *errno_to_name__%s(int err)\n{\n\tswitch (err) {\n" $arch35 36 while read name nr; do37 printf '\tcase %d: return "%s";\n' $nr $name38 done39 40 printf '\tdefault: return "(unknown)";\n\t}\n}\n'41}42 43process_arch()44{45 arch="$1"46 asm_errno=$(asm_errno_file "$arch")47 48 $gcc $CFLAGS $include_path -E -dM -x c $asm_errno \49 |grep -hE '^#define[[:blank:]]+(E[^[:blank:]]+)[[:blank:]]+([[:digit:]]+).*' \50 |awk '{ print $2","$3; }' \51 |sort -t, -k2 -nu \52 |IFS=, create_errno_lookup_func "$arch"53}54 55create_arch_errno_table_func()56{57 archlist="$1"58 default="$2"59 60 printf 'arch_syscalls__strerrno_t *arch_syscalls__strerrno_function(const char *arch)\n'61 printf '{\n'62 for arch in $archlist; do63 arch_str=$(arch_string "$arch")64 printf '\tif (!strcmp(arch, "%s"))\n' "$arch_str"65 printf '\t\treturn errno_to_name__%s;\n' "$arch_str"66 done67 arch_str=$(arch_string "$default")68 printf '\treturn errno_to_name__%s;\n' "$arch_str"69 printf '}\n'70}71 72cat <<EoHEADER73/* SPDX-License-Identifier: GPL-2.0 */74 75#include <string.h>76 77EoHEADER78 79# Create list of architectures that have a specific errno.h.80archlist=""81for f in $toolsdir/arch/*/include/uapi/asm/errno.h; do82 d=${f%/include/uapi/asm/errno.h}83 arch="${d##*/}"84 test -f $toolsdir/arch/$arch/include/uapi/asm/errno.h && archlist="$archlist $arch"85done86 87for arch in generic $archlist; do88 process_arch "$arch"89done90create_arch_errno_table_func "$archlist" "generic"91