about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--libc-abis44
-rw-r--r--scripts/gen-libc-abis26
2 files changed, 70 insertions, 0 deletions
diff --git a/libc-abis b/libc-abis
new file mode 100644
index 0000000000..6e9cce8904
--- /dev/null
+++ b/libc-abis
@@ -0,0 +1,44 @@
+# Definition of features which introduce new libc ABI versions.  This
+# file is used to create a header file with definitions for the various
+# versions.  The static linker will encode in the EI_ABIVERSION field in
+# the e_ident array in the ELF program header the required ABI version.
+# This is not a bitmask.  The maximum ABI version required must be
+# encoded.
+#
+# Adding new features should always happen by appending new lines.  Never
+# add entries in the middle or where they seem "logical".  Once a version
+# is assigned to a feature it must not change again.  Since some features
+# are conditionally added this can only ever be done securely without much
+# risk is by adding at the end.
+#
+# The following lines have one of two formats:
+#
+#	SYMBOL
+# With just a symbol on the line this is the name of a feature which
+# is architecture independent.
+#
+#	SYMBOL	PLATFORM
+# Using this form architecture (and platform) dependent features can be
+# specified.  The PLATFORM name can use the wildcards available in
+# the Bourne shell's case expression.
+#
+# Note that the same symbol can be used using different platform triples.
+# They don't have to be in the same order relative to other entries.  This
+# can happen if the feature is implemented for different architectures
+# at different times.
+#
+# This file is parsed by a script which produces a header file containing
+# a single enum definition.  An extra symbol is added as entry zero to
+# specify the default ABI with number 0 and an artificial last entry is
+# added to allow computing the maximum ABI version for the platform.
+#
+# Feature Name	Configuration
+# ------------	-------------
+#
+# Unique symbol definitions for C++.
+# Architecture independent, all ELF targets (== all targets)
+UNIQUE
+#
+# Indirect PLT relocations.  Architecture dependent.
+IFUNC		x86_64-*-linux*
+IFUNC		i?86-*-linux*
diff --git a/scripts/gen-libc-abis b/scripts/gen-libc-abis
new file mode 100644
index 0000000000..ce9ac5e20d
--- /dev/null
+++ b/scripts/gen-libc-abis
@@ -0,0 +1,26 @@
+#! /bin/sh
+triple="$1"
+
+printf "#ifndef _LIBC_ABIS_H\n#define _LIBC_ABIS_H 1\n\n"
+printf "enum\n{\n  LIBC_ABI_DEFAULT = 0,\n"
+
+while read s t; do
+  if test "$s" = "#" || test -z "$s"; then continue; fi
+  if test -z "$t"; then
+    printf "  LIBC_ABI_%s,\n" "$s"
+    features="$features $s"
+  else
+    case "$triple" in
+      $t) printf "  LIBC_ABI_%s,\n" "$s"
+	  features="$features $s" ;;
+       *) ;;
+    esac
+  fi
+done
+
+printf "  LIBC_ABI_MAX\n};\n"
+printf "\n#endif\n"
+
+if test -n "$features"; then
+  printf "#define LIBC_ABIS_STRING \"libc ABIs:%s\\\\n\"\n" "$features"
+fi